# Výmena správ cez Total Messaging Service

> Zapnite WebSocket endpoint TMS a nechajte externých klientov prijímať publikované správy, posielať správy vašej aplikácii a volať jej funkcie.

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

TMS (Total Messaging Service) je malá zbernica správ nad WebSocketom. Zapína sa v súbore `config` pomocou `$tms : true`; endpoint je `/$tms/` a `secret_tms` je token, ktorý musí každý klient poslať v hlavičke `x-token` (nesprávny token zatvorí spojenie s kódom 4001 a adresa, ktorá zlyhá viac než 5-krát, sa na čas zablokuje). Keď sa klient pripojí, dostane správu `meta`, ktorá uvádza, čo aplikácia publikuje, čo prijíma a čo vie urobiť.

Sprístupniť sa dajú tri veci, každá opísaná schémou v rovnakom formáte `name:Type` ako `input` akcie:

- `NEWPUBLISH(name, schema)` deklaruje správu, ktorú aplikácia **posiela**; `PUBLISH(name, value)` ju pošle každému klientovi, ktorý o ňu požiadal odoslaním `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` deklaruje správu, ktorú aplikácia **prijíma**: klient pošle `{ type: 'subscribe', id: name, data: {...} }` a `callback(message, client)` sa vykoná len vtedy, keď sú dáta platné. Overené dáta sú v `message.response` (`message.error` je tam vždy `null`) a `client` je odosielateľ.
- `NEWCALL(name, schema, callback)` deklaruje funkciu, ktorú klient **volá**: klient pošle `{ type: 'call', id: name, data: {...}, callbackid: '1' }` a aplikácia odpovie tou istou správou s `success: true` a výsledkom v `data`, alebo s `error: true`, keď sú dáta neplatné. `callback(data, done, client)` vytvorí výsledok cez `done(null, result)`.

Odovzdanie `null` ako schémy pre `NEWPUBLISH` alebo `NEWSUBSCRIBE` deklaráciu odstráni. Oficiálny klient Total.js (`TMSCLIENT`) tento protokol zvláda za vás z inej aplikácie Total.js; funguje akýkoľvek klient WebSocket.

`UNSUBSCRIBE(name, [callback])` odstráni poslucháčov správy, ktorú aplikácia prijíma: iba `callback`, keď ho odovzdáte, inak všetkých. Vráti `true`, keď niečo odstránil, a `false`, keď nebolo čo odstrániť.

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