Publicera en lokal server genom en tunnel med PROXYSERVER() och PROXYCLIENT()
PROXY() vidarebefordrar en förfrågan till en server som proxyn kan nå. En tunnel är till för det motsatta fallet: programmet finns på en bärbar dator eller bakom en brandvägg, så ingen kan ansluta till det, men det kan ansluta utåt. PROXYSERVER() och PROXYCLIENT() åstadkommer det med en WebSocket som den privata sidan öppnar:
PROXYSERVER([endpoint], [socketendpoint], [logger])körs på den offentliga servern. Varje förfrågan underendpoint(standard/) skickas genom tunneln;socketendpoint(standard/) är WebSocket-adressen där klienten ansluter. Använd olika adresser när samma applikation serverar något annat: en proxy på/tar varje förfrågan, även dem till dina egna routes (den körs före dem).loggerär en funktion (standard: skriver ut med datum); skickanullför ingen.PROXYCLIENT(serverurl, port, [logger])körs på den privata sidan (i det här exemplet byggs serverns adress medCONF.$port, applikationens port).serverurlär serverns WebSocket-adress (ws://ellerwss://;httpändras tillws) ochportär3000ellerip:3000, det lokala programmet som tar emot förfrågningarna. Den returnerar WebSocket-klienten.- En klient i taget: när en andra klient ansluter stänger servern den med koden
4001. Utan klient är serverns svarNot yet available.. - Det lokala programmet får hela sökvägen för den ursprungliga förfrågan, inklusive
endpoint(/tunnel/hello), besökarens headers och en headerx-proxy: Total.js, medhostsatt till den lokala adressen. - WebSocket-routen har ingen egen autentisering: publicera den inte utan något framför den som avgör vem som får ansluta (adressen som hemlighet, en egen
check, en brandvägg).
Här är en applikation båda sidorna: ett litet lokalt program på port 9511 (vilket program som helst duger), servern på /tunnel/ och klienten som ansluter till samma applikation.
// 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 });
}