# Wymiana komunikatów przez Total Messaging Service

> Włącz punkt końcowy WebSocket TMS i pozwól zewnętrznym klientom odbierać publikowane komunikaty, wysyłać komunikaty do aplikacji i wywoływać jej funkcje.

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

TMS (Total Messaging Service) to mała szyna komunikatów nad WebSocketem. Włączasz ją w pliku `config` przez `$tms : true`; punkt końcowy to `/$tms/`, a `secret_tms` to token, który każdy klient musi wysłać w nagłówku `x-token` (zły token zamyka połączenie kodem 4001, a adres, który zawiedzie więcej niż 5 razy, jest na jakiś czas blokowany). Gdy klient się połączy, dostaje komunikat `meta`, który wymienia, co aplikacja publikuje, co przyjmuje i co potrafi.

Można udostępnić trzy rzeczy, każdą opisaną schematem w tym samym formacie `name:Type` co `input` akcji:

- `NEWPUBLISH(name, schema)` deklaruje komunikat, który aplikacja **wysyła**; `PUBLISH(name, value)` wysyła go do każdego klienta, który o to poprosił, wysyłając `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` deklaruje komunikat, który aplikacja **odbiera**: klient wysyła `{ type: 'subscribe', id: name, data: {...} }`, a `callback(message, client)` wykonuje się tylko wtedy, gdy dane są poprawne. Zwalidowane dane są w `message.response` (`message.error` jest tam zawsze `null`), a `client` to nadawca.
- `NEWCALL(name, schema, callback)` deklaruje funkcję, którą klient **wywołuje**: klient wysyła `{ type: 'call', id: name, data: {...}, callbackid: '1' }`, a aplikacja odpowiada tym samym komunikatem z `success: true` i wynikiem w `data` albo z `error: true`, gdy dane są niepoprawne. `callback(data, done, client)` tworzy wynik przez `done(null, result)`.

Przekazanie `null` jako schematu w `NEWPUBLISH` lub `NEWSUBSCRIBE` usuwa deklarację. Oficjalny klient Total.js (`TMSCLIENT`) mówi tym protokołem za Ciebie z innej aplikacji Total.js; działa każdy klient WebSocket.

`UNSUBSCRIBE(name, [callback])` usuwa nasłuchiwaczy wiadomości, którą aplikacja odbiera: tylko `callback`, gdy go przekażesz, w przeciwnym razie wszystkich. Zwraca `true`, gdy coś usunął, i `false`, gdy nie było czego usuwać.

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