1
0
forked from sent/waves
chunglloyd_unblocker/index.mjs
2025-04-16 23:12:14 -05:00

145 lines
5.2 KiB
JavaScript

import cluster from "cluster";
import os from "os";
import net from "net";
import express from "express";
import { createServer } from "http";
import path from "path";
import compression from "compression";
import WebSocket from "ws";
import { baremuxPath } from "@mercuryworkshop/bare-mux/node";
import { epoxyPath } from "@mercuryworkshop/epoxy-transport";
import { libcurlPath } from "@mercuryworkshop/libcurl-transport";
import { uvPath } from "@titaniumnetwork-dev/ultraviolet";
import wisp from "wisp-server-node";
import NodeCache from "node-cache";
const port = parseInt(process.env.PORT || "3000", 10);
cluster.schedulingPolicy = cluster.SCHED_RR;
function logInfo(message) {
console.info(`[INFO] ${message}`);
}
function logError(error) {
const msg = error instanceof Error ? error.message : error;
console.error(`[ERR] ${msg}`);
}
process.on("uncaughtException", (err) => logError(`Unhandled Exception: ${err}`));
process.on("unhandledRejection", (reason) => logError(`Unhandled Promise Rejection: ${reason}`));
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
logInfo(`Master started. Forking ${numCPUs} workers.`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on("exit", (worker, code, signal) => {
logError(`Worker ${worker.process.pid} terminated (code: ${code}, signal: ${signal}). Restarting...`);
cluster.fork();
});
let currentWorker = 0;
const server = net.createServer({ pauseOnConnect: true }, (connection) => {
const workerIds = Object.keys(cluster.workers);
if (workerIds.length === 0) {
connection.destroy();
return;
}
const worker = cluster.workers[workerIds[currentWorker % workerIds.length]];
currentWorker++;
if (worker) worker.send("sticky-session:connection", connection);
});
server.on("error", (err) => logError(`Server error: ${err}`));
server.listen(port, () => logInfo(`Server running at http://localhost:${port}`));
} else {
process.env.UV_THREADPOOL_SIZE = os.cpus().length * 2;
const __dirname = process.cwd();
const publicPath = path.join(__dirname, "public");
const app = express();
app.use(compression({ level: 9, threshold: 128, memLevel: 9 }));
const cache = new NodeCache({ stdTTL: 1, checkperiod: 1 });
app.use((req, res, next) => {
const key = req.originalUrl;
if (cache.has(key)) {
res.setHeader("X-Cache", "HIT");
return res.send(cache.get(key));
}
res.sendResponse = res.send;
res.send = (body) => {
cache.set(key, body);
res.setHeader("X-Cache", "MISS");
res.sendResponse(body);
};
next();
});
const staticOpts = { maxAge: "1s" };
app.use("/baremux/", express.static(baremuxPath, staticOpts));
app.use("/epoxy/", express.static(epoxyPath, staticOpts));
app.use("/libcurl/", express.static(libcurlPath, staticOpts));
app.use(express.static(publicPath, staticOpts));
app.use("/wah/", express.static(uvPath, staticOpts));
app.use(express.json());
app.get("/", (req, res) => res.sendFile(path.join(publicPath, "$.html")));
app.get("/g", (req, res) => res.sendFile(path.join(publicPath, "!.html")));
app.get("/a", (req, res) => res.sendFile(path.join(publicPath, "!!.html")));
app.get("/ai", (req, res) => res.sendFile(path.join(publicPath, "!!!.html")));
app.get("/resent", (req, res) => res.sendFile(path.join(publicPath, "resent", "index.html")));
app.use((req, res) => res.status(404).sendFile(path.join(publicPath, "404.html")));
const server = createServer(app);
server.keepAliveTimeout = 0;
server.headersTimeout = 0;
const pingWSS = new WebSocket.Server({ noServer: true, maxPayload: 1048576 });
pingWSS.on("connection", (ws, req) => {
const remoteAddress = req.socket.remoteAddress || "unknown";
let latencies = [];
const pingInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
const timestamp = Date.now();
ws.send(JSON.stringify({ type: "ping", timestamp }));
}
}, 1000);
ws.on("message", (message) => {
try {
const data = JSON.parse(message);
if (data.type === "pong" && data.timestamp) {
const latency = Date.now() - data.timestamp;
latencies.push(latency);
if (latencies.length > 5) latencies.shift();
ws.send(JSON.stringify({ type: "latency", latency }));
}
} catch (e) {
logError(`Ping error: ${e}`);
}
});
ws.on("close", () => {
clearInterval(pingInterval);
const avgLatency = latencies.length ? latencies.reduce((a, b) => a + b) / latencies.length : 0;
logInfo(`Conn from ${remoteAddress} closed. Avg: ${avgLatency.toFixed(2)}ms.`);
});
});
server.on("upgrade", (req, socket, head) => {
if (req.url === "/w/ping") {
pingWSS.handleUpgrade(req, socket, head, (ws) => pingWSS.emit("connection", ws, req));
} else if (req.url.startsWith("/w/")) {
wisp.routeRequest(req, socket, head);
} else {
socket.end();
}
});
server.on("error", (err) => logError(`Worker server error: ${err}`));
server.listen(0, () => logInfo(`Worker ${process.pid} ready.`));
process.on("message", (message, connection) => {
if (message === "sticky-session:connection") {
server.emit("connection", connection);
connection.resume();
}
});
}