# Обмен на съобщения с Total Messaging Service

> Включете WebSocket крайната точка на TMS и оставете външни клиенти да получават публикувани съобщения, да изпращат съобщения към вашето приложение и да извикват неговите функции.

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

TMS (Total Messaging Service) е малка шина за съобщения върху WebSocket. Включвате я във файла `config` с `$tms : true`; крайната точка е `/$tms/`, а `secret_tms` е токенът, който всеки клиент трябва да изпрати в хедъра `x-token` (грешен токен затваря връзката с код 4001, а адрес, който се провали повече от 5 пъти, се блокира за известно време). Когато клиент се свърже, получава съобщение `meta`, което изброява какво публикува приложението, какво приема и какво може да прави.

Могат да се предоставят три неща, всяко описано със схема в същия формат `name:Type` като `input` на действие:

- `NEWPUBLISH(name, schema)` декларира съобщение, което приложението **изпраща**; `PUBLISH(name, value)` го изпраща на всеки клиент, който го е поискал, като е изпратил `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` декларира съобщение, което приложението **получава**: клиент изпраща `{ type: 'subscribe', id: name, data: {...} }`, а `callback(message, client)` се изпълнява само когато данните са валидни. Валидираните данни са в `message.response` (`message.error` там винаги е `null`), а `client` е изпращачът.
- `NEWCALL(name, schema, callback)` декларира функция, която клиентът **извиква**: клиентът изпраща `{ type: 'call', id: name, data: {...}, callbackid: '1' }`, а приложението отговаря със същото съобщение с `success: true` и резултата в `data`, или с `error: true`, когато данните са невалидни. `callback(data, done, client)` създава резултата с `done(null, result)`.

Подаването на `null` като схема на `NEWPUBLISH` или `NEWSUBSCRIBE` премахва декларацията. Официалният клиент на Total.js (`TMSCLIENT`) говори този протокол вместо вас от друго приложение на Total.js; върши работа всеки WebSocket клиент.

`UNSUBSCRIBE(name, [callback])` премахва слушателите на съобщение, което приложението получава: само `callback`, когато го подадете, иначе всички. Връща `true`, когато е премахнало нещо, и `false`, когато не е имало какво да се премахне.

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