Publică un server local printr-un tunel cu PROXYSERVER() și PROXYCLIENT()
PROXY() redirecționează o cerere către un server la care proxy-ul poate ajunge. Un tunel este pentru cazul opus: programul este pe un laptop sau în spatele unui firewall, deci nimeni nu se poate conecta la el, dar el se poate conecta spre exterior. PROXYSERVER() și PROXYCLIENT() fac asta cu un singur WebSocket pe care îl deschide partea privată:
PROXYSERVER([endpoint], [socketendpoint], [logger])rulează pe serverul public. Fiecare cerere subendpoint(implicit/) este trimisă prin tunel;socketendpoint(implicit/) este adresa WebSocket unde se conectează clientul. Folosește adrese diferite când aceeași aplicație servește și altceva: un proxy pe/preia orice cerere, și pe cele ale rutelor tale (rulează înaintea lor).loggereste o funcție (implicit: tipărește cu data); transmitenullpentru niciuna.PROXYCLIENT(serverurl, port, [logger])rulează pe partea privată (în acest exemplu adresa serverului este construită cuCONF.$port, portul aplicației).serverurleste adresa WebSocket a serverului (ws://sauwss://;httpse schimbă înws) șiporteste3000sauip:3000, programul local care primește cererile. Returnează clientul WebSocket.- Un singur client odată: când se conectează un al doilea client, serverul îl închide cu codul
4001. Fără client, răspunsul serverului esteNot yet available.. - Programul local primește calea întreagă a cererii originale, inclusiv
endpoint(/tunnel/hello), antetele vizitatorului și un antetx-proxy: Total.js, cuhostsetat la adresa locală. - Ruta WebSocket nu are autentificare proprie: nu o publica fără ceva în față care să decidă cine se poate conecta (adresa ca secret, un
checkal tău, un firewall).
Aici o aplicație este ambele părți: un mic program local pe portul 9511 (ar merge orice program), serverul pe /tunnel/ și clientul care se conectează la aceeași aplicație.
// 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');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 });
}