|
import express from "express"; |
|
import { createServer } from "node:http"; |
|
import { publicPath } from "ultraviolet-static"; |
|
import { uvPath } from "@titaniumnetwork-dev/ultraviolet"; |
|
import { epoxyPath } from "@mercuryworkshop/epoxy-transport"; |
|
import { baremuxPath } from "@mercuryworkshop/bare-mux/node"; |
|
import { join } from "node:path"; |
|
import { hostname } from "node:os"; |
|
import wisp from "wisp-server-node" |
|
|
|
const app = express(); |
|
|
|
app.use(express.static(publicPath)); |
|
|
|
|
|
app.use("/uv/", express.static(uvPath)); |
|
app.use("/epoxy/", express.static(epoxyPath)); |
|
app.use("/baremux/", express.static(baremuxPath)); |
|
|
|
|
|
app.use((req, res) => { |
|
res.status(404); |
|
res.sendFile(join(publicPath, "404.html")); |
|
}); |
|
|
|
const server = createServer(); |
|
|
|
server.on("request", (req, res) => { |
|
res.setHeader("Cross-Origin-Opener-Policy", "same-origin"); |
|
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp"); |
|
app(req, res); |
|
}); |
|
server.on("upgrade", (req, socket, head) => { |
|
if (req.url.endsWith("/wisp/")) |
|
wisp.routeRequest(req, socket, head); |
|
else |
|
socket.end(); |
|
}); |
|
|
|
let port = parseInt(process.env.PORT || ""); |
|
|
|
if (isNaN(port)) port = 8080; |
|
|
|
server.on("listening", () => { |
|
const address = server.address(); |
|
|
|
|
|
|
|
console.log("Listening on:"); |
|
console.log(`\thttp://localhost:${address.port}`); |
|
console.log(`\thttp://${hostname()}:${address.port}`); |
|
console.log( |
|
`\thttp://${address.family === "IPv6" ? `[${address.address}]` : address.address |
|
}:${address.port}` |
|
); |
|
}); |
|
|
|
|
|
process.on("SIGINT", shutdown); |
|
process.on("SIGTERM", shutdown); |
|
|
|
function shutdown() { |
|
console.log("SIGTERM signal received: closing HTTP server"); |
|
server.close(); |
|
process.exit(0); |
|
} |
|
|
|
server.listen({ |
|
port, |
|
}); |
|
|