Opublikuj lokalny serwer przez tunel za pomocą PROXYSERVER() i PROXYCLIENT()
PROXY() przekazuje żądanie do serwera, do którego proxy może dotrzeć. Tunel jest na odwrotny przypadek: program jest na laptopie lub za zaporą, więc nikt nie może się z nim połączyć, ale on może połączyć się na zewnątrz. PROXYSERVER() i PROXYCLIENT() robią to jednym WebSocketem otwieranym przez stronę prywatną:
PROXYSERVER([endpoint], [socketendpoint], [logger])działa na serwerze publicznym. Każde żądanie poniżejendpoint(domyślnie/) jest wysyłane przez tunel;socketendpoint(domyślnie/) to adres WebSocketu, z którym łączy się klient. Używaj różnych adresów, gdy ta sama aplikacja obsługuje coś jeszcze: proxy na/przejmuje każde żądanie, także do Twoich własnych tras (działa przed nimi).loggerto funkcja (domyślnie: wypisuje z datą); przekażnull, jeśli ma go nie być.PROXYCLIENT(serverurl, port, [logger])działa po stronie prywatnej (w tym przykładzie adres serwera jest budowany zCONF.$port, portu aplikacji).serverurlto adres WebSocketu serwera (ws://lubwss://;httpjest zamieniane naws), aportto3000lubip:3000, lokalny program otrzymujący żądania. Zwraca klienta WebSocket.- Jeden klient naraz: gdy łączy się drugi klient, serwer zamyka go z kodem
4001. Bez klienta odpowiedzią serwera jestNot yet available.. - Lokalny program otrzymuje pełną ścieżkę oryginalnego żądania, razem z
endpoint(/tunnel/hello), nagłówkami odwiedzającego i nagłówkiemx-proxy: Total.js, zhostustawionym na adres lokalny. - Trasa WebSocket nie ma własnego uwierzytelniania: nie publikuj jej bez czegoś przed nią, co decyduje, kto może się połączyć (adres jako sekret, własny
check, zapora).
Tutaj jedna aplikacja jest obiema stronami: mały lokalny program na porcie 9511 (wystarczy dowolny program), serwer na /tunnel/ i klient łączący się z tą samą aplikacją.
// 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 });
}