# Helyi szerver közzététele alagúton át a PROXYSERVER() és a PROXYCLIENT() segítségével

> Hagyja, hogy egy nyilvános címmel rendelkező Total.js szerver továbbítson kéréseket egy olyan programnak, amely csak egy privát gépen fut, egy WebSocket alagúton át, amelyet a privát oldal nyit meg.

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

A `PROXY()` egy olyan szervernek továbbít kérést, amelyet a proxy elér. Az alagút az ellenkező esetre való: a program egy laptopon vagy tűzfal mögött van, így senki nem tud csatlakozni hozzá, de ő ki tud csatlakozni. A `PROXYSERVER()` és a `PROXYCLIENT()` ezt egyetlen WebSocketen oldja meg, amelyet a privát oldal nyit meg:

- A `PROXYSERVER([endpoint], [socketendpoint], [logger])` a nyilvános szerveren fut. Minden kérés az `endpoint` alatt (alapértelmezés `/`) az alagúton át megy; a `socketendpoint` (alapértelmezés `/`) az a WebSocket-cím, ahol a kliens csatlakozik. Használjon **különböző** címeket, ha ugyanaz az alkalmazás mást is kiszolgál: egy `/`-en lévő proxy minden kérést elvisz, a saját útvonalaiét is (azok előtt fut). A `logger` egy függvény (alapértelmezés: dátummal kiír); `null`-t adjon át, ha nem kell.
- A `PROXYCLIENT(serverurl, port, [logger])` a privát oldalon fut (ebben a példában a szerver címe a `CONF.$port`-ból, az alkalmazás portjából készül). A `serverurl` a szerver WebSocket-címe (`ws://` vagy `wss://`; a `http` `ws`-re változik), a `port` pedig `3000` vagy `ip:3000`, a kéréseket fogadó helyi program. A WebSocket klienst adja vissza.
- **Egyszerre egy kliens:** ha egy második kliens csatlakozik, a szerver a `4001` kóddal lezárja. Kliens nélkül a szerver válasza `Not yet available.`.
- A helyi program az **eredeti kérés teljes útvonalát** kapja, az `endpoint`-tal együtt (`/tunnel/hello`), a látogató fejléceit és egy `x-proxy: Total.js` fejlécet, a `host` pedig a helyi címre van állítva.
- A WebSocket útvonalnak nincs saját hitelesítése: ne tegye közzé úgy, hogy nincs előtte valami, ami eldönti, ki csatlakozhat (a cím mint titok, saját `check`, tűzfal).

Itt egy alkalmazás mindkét oldal: egy kis helyi program a 9511-es porton (bármelyik program megtenné), a szerver a `/tunnel/` alatt és a kliens, amely ugyanahhoz az alkalmazáshoz csatlakozik.

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