ForgeTotal.js 5
cs

Total.js 5

Zpřístupněte lokální server přes tunel pomocí PROXYSERVER() a PROXYCLIENT()

Total.js 5 · total5@0.0.19 proxytunnelwebsocketintegrations Spuštěno s Total.js 5

PROXY() přepošle požadavek serveru, ke kterému se proxy dostane. Tunel je pro opačný případ: program je na notebooku nebo za firewallem, takže se k němu nikdo nepřipojí, ale on se může připojit ven. PROXYSERVER() a PROXYCLIENT() to dosáhnou jedním WebSocketem, který otevře soukromá strana:

  • PROXYSERVER([endpoint], [socketendpoint], [logger]) běží na veřejném serveru. Každý požadavek pod endpoint (výchozí /) se pošle přes tunel; socketendpoint (výchozí /) je adresa WebSocketu, kde se připojuje klient. Použijte různé adresy, když stejná aplikace obsluhuje i něco jiného: proxy na / vezme každý požadavek, i ty vašich vlastních rout (běží před nimi). logger je funkce (výchozí: vypisuje s datem); předejte null, pokud žádný nechcete.
  • PROXYCLIENT(serverurl, port, [logger]) běží na soukromé straně (v tomto příkladu se adresa serveru sestaví z CONF.$port, portu aplikace). serverurl je adresa WebSocketu serveru (ws:// nebo wss://; http se změní na ws) a port je 3000 nebo ip:3000, lokální program, který přijímá požadavky. Vrátí klienta WebSocketu.
  • Jeden klient najednou: když se připojí druhý klient, server jej zavře s kódem 4001. Bez klienta je odpovědí serveru Not yet available..
  • Lokální program dostane celou cestu původního požadavku včetně endpoint (/tunnel/hello), hlavičky návštěvníka a hlavičku x-proxy: Total.js, přičemž host je nastaven na lokální adresu.
  • Routa WebSocketu nemá vlastní autentizaci: nezveřejňujte ji bez něčeho před ní, co rozhoduje, kdo se může připojit (adresa jako tajemství, vlastní check, firewall).

Zde je jedna aplikace oběma stranami: malý lokální program na portu 9511 (stačil by jakýkoli program), server na /tunnel/ a klient, který se připojuje ke stejné aplikaci.

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