# Schimbă mesaje cu Total Messaging Service

> Activează endpoint-ul WebSocket TMS și lasă clienții externi să primească mesaje publicate, să trimită mesaje aplicației tale și să-i apeleze funcțiile.

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

TMS (Total Messaging Service) este un mic bus de mesaje peste un WebSocket. Îl activezi în fișierul `config` cu `$tms : true`; endpoint-ul este `/$tms/`, iar `secret_tms` este tokenul pe care fiecare client trebuie să-l trimită în antetul `x-token` (un token greșit închide conexiunea cu codul 4001, iar o adresă care eșuează de mai mult de 5 ori este blocată o vreme). Când un client se conectează, primește un mesaj `meta` care listează ce publică aplicația, ce acceptă și ce poate face.

Pot fi expuse trei lucruri, fiecare descris de o schemă în același format `name:Type` ca `input`-ul unei acțiuni:

- `NEWPUBLISH(name, schema)` declară un mesaj pe care aplicația îl **trimite**; `PUBLISH(name, value)` îl trimite fiecărui client care l-a cerut trimițând `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` declară un mesaj pe care aplicația îl **primește**: un client trimite `{ type: 'subscribe', id: name, data: {...} }`, iar `callback(message, client)` rulează doar când datele sunt valide. Datele validate sunt în `message.response` (`message.error` este acolo mereu `null`), iar `client` este expeditorul.
- `NEWCALL(name, schema, callback)` declară o funcție pe care clientul o **apelează**: clientul trimite `{ type: 'call', id: name, data: {...}, callbackid: '1' }`, iar aplicația răspunde cu același mesaj cu `success: true` și rezultatul în `data`, sau cu `error: true` când datele sunt invalide. `callback(data, done, client)` produce rezultatul cu `done(null, result)`.

Transmiterea lui `null` ca schemă pentru `NEWPUBLISH` sau `NEWSUBSCRIBE` elimină declarația. Clientul oficial al Total.js (`TMSCLIENT`) vorbește acest protocol pentru tine dintr-o altă aplicație Total.js; orice client WebSocket funcționează.

`UNSUBSCRIBE(name, [callback])` elimină ascultătorii unui mesaj pe care aplicația îl primește: doar `callback` când îl transmiți, altfel pe toți. Returnează `true` când a eliminat ceva și `false` când nu era nimic de eliminat.

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