File size: 2,718 Bytes
26e4986
 
4f4e3e8
26e4986
 
4f4e3e8
26e4986
e6d1d06
 
26e4986
e6d1d06
 
a4436c6
8bd4d27
26e4986
e6d1d06
7d21ec1
e6d1d06
 
 
 
 
 
 
 
a4436c6
 
 
e6d1d06
 
 
 
 
 
 
7d21ec1
e6d1d06
7d21ec1
a4436c6
 
7d21ec1
 
e6d1d06
 
 
8bd4d27
7ee4127
26e4986
 
e6d1d06
26e4986
7d21ec1
e6d1d06
 
7d21ec1
 
26e4986
 
e6d1d06
4f4e3e8
 
 
 
 
e6d1d06
 
 
 
 
 
 
 
4f4e3e8
 
 
 
 
8bd4d27
e6d1d06
 
26e4986
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const express = require("express");
const { createProxyMiddleware } = require("http-proxy-middleware");
const http = require("http");

const app = express();
const server = http.createServer(app);

// Lista de portas ativas
const activePorts = new Set(["5000"]); // começa com 5000 só

// Função que cria proxy HTTP/WS
function makeProxy(port, wsOnly = false) {
    return createProxyMiddleware({
        target: `http://127.0.0.1:${port}`,
        changeOrigin: true,
        ws: true, // 🔥 suporte WebSocket
        pathRewrite: { [`^/s${port}`]: "" },
        logLevel: "warn",
        // Se wsOnly for true, bloqueia requests HTTP normais
        onProxyReq: (proxyReq, req, res) => {
            if (wsOnly && req.method !== "GET" && req.headers.upgrade !== "websocket") {
                res.writeHead(400, { "Content-Type": "text/plain" });
                res.end("Somente conexões WebSocket são aceitas nesta rota");
            }
        }
    });
}

// 🔒 Rotas fixas dedicadas a WS
app.use("/s8000", (req, res, next) => {
    res.status(400).send("Use WebSocket (wss://) nesta rota");
});
app.use("/s8080", (req, res, next) => {
    res.status(400).send("Use WebSocket (wss://) nesta rota");
});

// HTTP dinâmico para outras portas
app.use("/s:port", (req, res, next) => {
    const port = req.params.port;
    if (!/^\d+$/.test(port)) {
        return res.status(400).send("Porta inválida");
    }
    if (port === "8000" || port === "8080") {
        return res.status(400).send("Esta porta aceita apenas WebSocket (wss://)");
    }
    activePorts.add(port);
    return makeProxy(port)(req, res, next);
});

// Página inicial
app.get("/", (req, res) => {
    const list = Array.from(activePorts)
        .concat(["8000 (WS only)", "8080 (WS only)"])
        .map(p => `<li><a href="/s${p.replace(' (WS only)','')}" target="_blank">/s${p}</a></li>`)
        .join("");
    res.send(`<h1>Portas ativas</h1><ul>${list}</ul>`);
});

// 🔥 Upgrade WS (inclui 8000 e 8080)
server.on("upgrade", (req, socket, head) => {
    const url = req.url || "";
    const match = url.match(/^\/s(\d+)/);
    if (match) {
        const port = match[1];
        if (port === "8000" || port === "8080") {
            console.log(`Conexão WebSocket em /s${port}`);
            makeProxy(port, true).upgrade(req, socket, head);
        } else {
            activePorts.add(port);
            console.log(`Conexão WebSocket em /s${port}`);
            makeProxy(port).upgrade(req, socket, head);
        }
    } else {
        socket.destroy();
    }
});

server.listen(7860, "0.0.0.0", () => {
    console.log("Proxy ativo em http://localhost:7860");
    console.log("Portas WS dedicadas: 8000, 8080");
});