# Zpřístupněte lokální server přes tunel pomocí PROXYSERVER() a PROXYCLIENT()

> Nechte server Total.js s veřejnou adresou přeposílat požadavky programu, který běží jen na soukromém stroji, přes WebSocket tunel, který otevře soukromá strana.

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

`PROXY()` přepošle požadavek serveru, ke kterému se proxy dostane. Tunel je pro opačný případ: program je na notebooku nebo za firewallem, takže se k němu nikdo nepřipojí, ale on se může připojit ven. `PROXYSERVER()` a `PROXYCLIENT()` to dosáhnou jedním WebSocketem, který otevře soukromá strana:

- `PROXYSERVER([endpoint], [socketendpoint], [logger])` běží na veřejném serveru. Každý požadavek pod `endpoint` (výchozí `/`) se pošle přes tunel; `socketendpoint` (výchozí `/`) je adresa WebSocketu, kde se připojuje klient. Použijte **různé** adresy, když stejná aplikace obsluhuje i něco jiného: proxy na `/` vezme každý požadavek, i ty vašich vlastních rout (běží před nimi). `logger` je funkce (výchozí: vypisuje s datem); předejte `null`, pokud žádný nechcete.
- `PROXYCLIENT(serverurl, port, [logger])` běží na soukromé straně (v tomto příkladu se adresa serveru sestaví z `CONF.$port`, portu aplikace). `serverurl` je adresa WebSocketu serveru (`ws://` nebo `wss://`; `http` se změní na `ws`) a `port` je `3000` nebo `ip:3000`, lokální program, který přijímá požadavky. Vrátí klienta WebSocketu.
- **Jeden klient najednou:** když se připojí druhý klient, server jej zavře s kódem `4001`. Bez klienta je odpovědí serveru `Not yet available.`.
- Lokální program dostane **celou cestu původního požadavku** včetně `endpoint` (`/tunnel/hello`), hlavičky návštěvníka a hlavičku `x-proxy: Total.js`, přičemž `host` je nastaven na lokální adresu.
- Routa WebSocketu nemá vlastní autentizaci: nezveřejňujte ji bez něčeho před ní, co rozhoduje, kdo se může připojit (adresa jako tajemství, vlastní `check`, firewall).

Zde je jedna aplikace oběma stranami: malý lokální program na portu 9511 (stačil by jakýkoli program), server na `/tunnel/` a klient, který se připojuje ke stejné aplikaci.

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