ForgeTotal.js 5
sk

Total.js 5

Sprístupnite lokálny server cez tunel pomocou PROXYSERVER() a PROXYCLIENT()

Total.js 5 · total5@0.0.19 proxytunnelwebsocketintegrations Spustené s Total.js 5

PROXY() presmeruje požiadavku na server, ku ktorému sa proxy dostane. Tunel je pre opačný prípad: program je na notebooku alebo za firewallom, takže sa k nemu nikto nepripojí, ale on sa môže pripojiť von. PROXYSERVER() a PROXYCLIENT() to dosiahnu jedným WebSocketom, ktorý otvorí súkromná strana:

  • PROXYSERVER([endpoint], [socketendpoint], [logger]) beží na verejnom serveri. Každá požiadavka pod endpoint (predvolene /) sa pošle cez tunel; socketendpoint (predvolene /) je adresa WebSocketu, kde sa pripája klient. Použite rôzne adresy, keď tá istá aplikácia obsluhuje aj niečo iné: proxy na / zoberie každú požiadavku, aj tie vašich vlastných rout (beží pred nimi). logger je funkcia (predvolene: vypisuje s dátumom); odovzdajte null, ak žiadny nechcete.
  • PROXYCLIENT(serverurl, port, [logger]) beží na súkromnej strane (v tomto príklade sa adresa servera zostaví z CONF.$port, portu aplikácie). serverurl je adresa WebSocketu servera (ws:// alebo wss://; http sa zmení na ws) a port je 3000 alebo ip:3000, lokálny program, ktorý prijíma požiadavky. Vráti klienta WebSocketu.
  • Jeden klient naraz: keď sa pripojí druhý klient, server ho zatvorí s kódom 4001. Bez klienta je odpoveďou servera Not yet available..
  • Lokálny program dostane celú cestu pôvodnej požiadavky vrátane endpoint (/tunnel/hello), hlavičky návštevníka a hlavičku x-proxy: Total.js, pričom host je nastavený na lokálnu adresu.
  • Route WebSocketu nemá vlastnú autentifikáciu: nezverejňujte ju bez niečoho pred ňou, čo rozhoduje, kto sa môže pripojiť (adresa je tajomstvo, vlastný check, firewall).

Tu je jedna aplikácia oboma stranami: malý lokálny program na porte 9511 (stačil by akýkoľvek program), server na /tunnel/ a klient, ktorý sa pripája k tej istej aplikácii.

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 });
}