Публикувайте локален сървър през тунел с PROXYSERVER() и PROXYCLIENT()
PROXY() препраща заявка към сървър, до който прокситата може да стигне. Тунелът е за обратния случай: програмата е на лаптоп или зад защитна стена, така че никой не може да се свърже с нея, но тя може да се свърже навън. PROXYSERVER() и PROXYCLIENT() постигат това с един WebSocket, който отваря частната страна:
PROXYSERVER([endpoint], [socketendpoint], [logger])работи на публичния сървър. Всяка заявка подendpoint(по подразбиране/) се изпраща през тунела;socketendpoint(по подразбиране/) е WebSocket адресът, където се свързва клиентът. Използвайте различни адреси, когато същото приложение обслужва и нещо друго: проксито на/поема всяка заявка, дори тези към вашите собствени маршрути (работи преди тях).loggerе функция (по подразбиране: печата с дата); подайтеnullза никакъв.PROXYCLIENT(serverurl, port, [logger])работи на частната страна (в този пример адресът на сървъра се изгражда сCONF.$port, порта на приложението).serverurlе WebSocket адресът на сървъра (ws://илиwss://;httpсе сменя сws), аportе3000илиip:3000, локалната програма, която получава заявките. Връща WebSocket клиента.- Един клиент наведнъж: когато се свърже втори клиент, сървърът го затваря с кода
4001. Без клиент отговорът на сървъра еNot yet available.. - Локалната програма получава пълния път на оригиналната заявка, включително
endpoint(/tunnel/hello), заглавията на посетителя и заглавиеx-proxy: Total.js, катоhostе зададен на локалния адрес. - WebSocket маршрутът няма собствена автентикация: не го публикувайте без нещо пред него, което решава кой може да се свърже (адресът като тайна, ваш собствен
check, защитна стена).
Тук едно приложение е и двете страни: малка локална програма на порт 9511 (върши работа всяка програма), сървърът на /tunnel/ и клиентът, който се свързва със същото приложение.
// 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 });
}