# Sprístupnite lokálny server cez tunel pomocou PROXYSERVER() a PROXYCLIENT()

> Nechajte server Total.js s verejnou adresou presmerovať požiadavky na program, ktorý beží iba na súkromnom stroji, cez WebSocket tunel, ktorý otvorí súkromná strana.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: sk
Content-SHA256: d8410bd834e95819c1cf751b1985d1849b26b9dcdbb64ebed6100a1fc1ec84be
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`PROXY()` presmeruje požiadavku na server, ku ktorému sa proxy dostane. Tunel je pre opačný prípad: program je na notebooku alebo za firewallom, takže sa k nemu nikto nepripojí, ale on sa môže pripojiť von. `PROXYSERVER()` a `PROXYCLIENT()` to dosiahnu jedným WebSocketom, ktorý otvorí súkromná strana:

- `PROXYSERVER([endpoint], [socketendpoint], [logger])` beží na verejnom serveri. Každá požiadavka pod `endpoint` (predvolene `/`) sa pošle cez tunel; `socketendpoint` (predvolene `/`) je adresa WebSocketu, kde sa pripája klient. Použite **rôzne** adresy, keď tá istá aplikácia obsluhuje aj niečo iné: proxy na `/` zoberie každú požiadavku, aj tie vašich vlastných rout (beží pred nimi). `logger` je funkcia (predvolene: vypisuje s dátumom); odovzdajte `null`, ak žiadny nechcete.
- `PROXYCLIENT(serverurl, port, [logger])` beží na súkromnej strane (v tomto príklade sa adresa servera zostaví z `CONF.$port`, portu aplikácie). `serverurl` je adresa WebSocketu servera (`ws://` alebo `wss://`; `http` sa zmení na `ws`) a `port` je `3000` alebo `ip:3000`, lokálny program, ktorý prijíma požiadavky. Vráti klienta WebSocketu.
- **Jeden klient naraz:** keď sa pripojí druhý klient, server ho zatvorí s kódom `4001`. Bez klienta je odpoveďou servera `Not yet available.`.
- Lokálny program dostane **celú cestu pôvodnej požiadavky** vrátane `endpoint` (`/tunnel/hello`), hlavičky návštevníka a hlavičku `x-proxy: Total.js`, pričom `host` je nastavený na lokálnu adresu.
- Route WebSocketu nemá vlastnú autentifikáciu: nezverejňujte ju bez niečoho pred ňou, čo rozhoduje, kto sa môže pripojiť (adresa je tajomstvo, vlastný `check`, firewall).

Tu je jedna aplikácia oboma stranami: malý lokálny program na porte 9511 (stačil by akýkoľvek program), server na `/tunnel/` a klient, ktorý sa pripája k tej istej aplikácii.

```js 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');
```

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