ForgeTotal.js 5
hu

Total.js 5

Helyi szerver közzététele alagúton át a PROXYSERVER() és a PROXYCLIENT() segítségével

Total.js 5 · total5@0.0.19 proxytunnelwebsocketintegrations Total.js 5-tel lefuttatva

A PROXY() egy olyan szervernek továbbít kérést, amelyet a proxy elér. Az alagút az ellenkező esetre való: a program egy laptopon vagy tűzfal mögött van, így senki nem tud csatlakozni hozzá, de ő ki tud csatlakozni. A PROXYSERVER() és a PROXYCLIENT() ezt egyetlen WebSocketen oldja meg, amelyet a privát oldal nyit meg:

  • A PROXYSERVER([endpoint], [socketendpoint], [logger]) a nyilvános szerveren fut. Minden kérés az endpoint alatt (alapértelmezés /) az alagúton át megy; a socketendpoint (alapértelmezés /) az a WebSocket-cím, ahol a kliens csatlakozik. Használjon különböző címeket, ha ugyanaz az alkalmazás mást is kiszolgál: egy /-en lévő proxy minden kérést elvisz, a saját útvonalaiét is (azok előtt fut). A logger egy függvény (alapértelmezés: dátummal kiír); null-t adjon át, ha nem kell.
  • A PROXYCLIENT(serverurl, port, [logger]) a privát oldalon fut (ebben a példában a szerver címe a CONF.$port-ból, az alkalmazás portjából készül). A serverurl a szerver WebSocket-címe (ws:// vagy wss://; a http ws-re változik), a port pedig 3000 vagy ip:3000, a kéréseket fogadó helyi program. A WebSocket klienst adja vissza.
  • Egyszerre egy kliens: ha egy második kliens csatlakozik, a szerver a 4001 kóddal lezárja. Kliens nélkül a szerver válasza Not yet available..
  • A helyi program az eredeti kérés teljes útvonalát kapja, az endpoint-tal együtt (/tunnel/hello), a látogató fejléceit és egy x-proxy: Total.js fejlécet, a host pedig a helyi címre van állítva.
  • A WebSocket útvonalnak nincs saját hitelesítése: ne tegye közzé úgy, hogy nincs előtte valami, ami eldönti, ki csatlakozhat (a cím mint titok, saját check, tűzfal).

Itt egy alkalmazás mindkét oldal: egy kis helyi program a 9511-es porton (bármelyik program megtenné), a szerver a /tunnel/ alatt és a kliens, amely ugyanahhoz az alkalmazáshoz csatlakozik.

definitions/local.js
// The program that is "private": an ordinary HTTP server that only listens on the loopback address
require('http').createServer(function(req, res) {
	res.writeHead(200, { 'content-type': 'application/json' });
	res.end(JSON.stringify({ path: req.url, via: req.headers['x-proxy'] || null, host: req.headers.host }));
}).listen(9511, '127.0.0.1');
controllers/tunnel.js
exports.install = function() {
	ROUTE('GET /status/', status);
	ROUTE('POST /connect/', connect);
};

// The public side: /tunnel/* goes through the tunnel, the WebSocket of the client is /tunnel-socket/. No logger.
PROXYSERVER('/tunnel/', '/tunnel-socket/', null);

let client = null;

function connect($) {
	client = PROXYCLIENT('ws://127.0.0.1:' + CONF.$port + '/tunnel-socket/', '9511', null);
	$.json({ connecting: true });
}

function status($) {
	$.json({ connected: !!client });
}