# Výměna zpráv přes Total Messaging Service

> Zapněte WebSocket endpoint TMS a nechte externí klienty přijímat publikované zprávy, posílat zprávy vaší aplikaci a volat její funkce.

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

TMS (Total Messaging Service) je malá sběrnice zpráv nad WebSocketem. Zapíná se v souboru `config` pomocí `$tms : true`; endpoint je `/$tms/` a `secret_tms` je token, který musí každý klient poslat v hlavičce `x-token` (nesprávný token zavře spojení s kódem 4001 a adresa, která selže více než 5krát, se na čas zablokuje). Když se klient připojí, dostane zprávu `meta`, která uvádí, co aplikace publikuje, co přijímá a co umí.

Zpřístupnit lze tři věci, každou popsanou schématem ve stejném formátu `name:Type` jako `input` akce:

- `NEWPUBLISH(name, schema)` deklaruje zprávu, kterou aplikace **posílá**; `PUBLISH(name, value)` ji pošle každému klientovi, který o ni požádal odesláním `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` deklaruje zprávu, kterou aplikace **přijímá**: klient pošle `{ type: 'subscribe', id: name, data: {...} }` a `callback(message, client)` se provede jen tehdy, když jsou data platná. Ověřená data jsou v `message.response` (`message.error` je tam vždy `null`) a `client` je odesílatel.
- `NEWCALL(name, schema, callback)` deklaruje funkci, kterou klient **volá**: klient pošle `{ type: 'call', id: name, data: {...}, callbackid: '1' }` a aplikace odpoví toutéž zprávou s `success: true` a výsledkem v `data`, nebo s `error: true`, když jsou data neplatná. `callback(data, done, client)` vytvoří výsledek přes `done(null, result)`.

Předání `null` jako schématu pro `NEWPUBLISH` nebo `NEWSUBSCRIBE` deklaraci odstraní. Oficiální klient Total.js (`TMSCLIENT`) tento protokol zvládá za vás z jiné aplikace Total.js; funguje jakýkoli klient WebSocket.

`UNSUBSCRIBE(name, [callback])` odstraní posluchače zprávy, kterou aplikace přijímá: jen `callback`, když ho předáte, jinak všechny. Vrátí `true`, když něco odstranil, a `false`, když nebylo co odstranit.

```text config
$tms : true
secret_tms : my-tms-token
```

```js definitions/tms.js
NEWPUBLISH('news', 'title:String');

NEWSUBSCRIBE('orders', 'id:String, qty:Number', function(message, client) {
	MAIN.orders.push(message.response);
});

NEWCALL('sum', 'a:Number, b:Number', function(data, done) {
	done(null, { total: data.a + data.b });
});

MAIN.orders = [];
```

```js controllers/tms.js
exports.install = function() {
	ROUTE('POST /news/ @json', news);
	ROUTE('GET /orders/', orders);
	ROUTE('GET /unsubscribe/', unsubscribe);
};

function news($) {
	PUBLISH('news', { title: $.body.title });
	$.success();
}

function orders($) {
	$.json(MAIN.orders);
}

function unsubscribe($) {
	const first = UNSUBSCRIBE('orders');
	const second = UNSUBSCRIBE('orders');
	$.json({ first: first, second: second });
}
```
