# Üzenetek cseréje a Total Messaging Service-szel

> Kapcsold be a TMS WebSocket végpontot, és engedd, hogy külső kliensek közzétett üzeneteket fogadjanak, üzeneteket küldjenek az alkalmazásodnak és meghívják a függvényeit.

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

A TMS (Total Messaging Service) egy kis üzenetbusz egy WebSocket fölött. A `config` fájlban kapcsolod be a `$tms : true`-val; a végpont a `/$tms/`, a `secret_tms` pedig az a token, amelyet minden kliensnek az `x-token` fejlécben kell küldenie (rossz token 4001-es kóddal zárja a kapcsolatot, az a cím pedig, amely 5-nél többször hibázik, egy időre blokkolódik). Amikor egy kliens csatlakozik, kap egy `meta` üzenetet, amely felsorolja, mit tesz közzé az alkalmazás, mit fogad el és mit tud.

Három dolog tehető elérhetővé, mindegyiket egy séma írja le, ugyanabban a `name:Type` formátumban, mint egy akció `input`-ja:

- a `NEWPUBLISH(name, schema)` olyan üzenetet deklarál, amelyet az alkalmazás **küld**; a `PUBLISH(name, value)` minden olyan kliensnek elküldi, amely ezt a `{ type: 'subscribers', subscribers: [name] }` elküldésével kérte.
- a `NEWSUBSCRIBE(name, schema, callback)` olyan üzenetet deklarál, amelyet az alkalmazás **fogad**: a kliens `{ type: 'subscribe', id: name, data: {...} }` értéket küld, a `callback(message, client)` pedig csak akkor fut, ha az adatok érvényesek. A validált adatok a `message.response`-ban vannak (a `message.error` itt mindig `null`), a `client` pedig a feladó.
- a `NEWCALL(name, schema, callback)` olyan függvényt deklarál, amelyet a kliens **hív**: a kliens `{ type: 'call', id: name, data: {...}, callbackid: '1' }` értéket küld, az alkalmazás pedig ugyanazzal az üzenettel válaszol, `success: true` jelzéssel és az eredménnyel a `data`-ban, vagy `error: true` jelzéssel, ha az adatok érvénytelenek. A `callback(data, done, client)` a `done(null, result)`-tel állítja elő az eredményt.

A `NEWPUBLISH` vagy a `NEWSUBSCRIBE` sémájaként átadott `null` eltávolítja a deklarációt. A Total.js hivatalos kliense (`TMSCLIENT`) beszéli helyetted ezt a protokollt egy másik Total.js-alkalmazásból; bármely WebSocket-kliens megfelel.

Az `UNSUBSCRIBE(name, [callback])` eltávolítja az alkalmazás által fogadott üzenet figyelőit: csak a `callback`-et, ha átadod, különben mindet. `true`-t ad vissza, ha eltávolított valamit, és `false`-t, ha nem volt mit eltávolítani.

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