# Utbyt meddelanden med Total Messaging Service

> Slå på TMS WebSocket-slutpunkten och låt externa klienter ta emot publicerade meddelanden, skicka meddelanden till din app och anropa dess funktioner.

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

TMS (Total Messaging Service) är en liten meddelandebuss ovanpå en WebSocket. Du slår på den i filen `config` med `$tms : true`; slutpunkten är `/$tms/` och `secret_tms` är den token som varje klient måste skicka i headern `x-token` (en felaktig token stänger anslutningen med kod 4001, och en adress som misslyckas mer än 5 gånger blockeras en stund). När en klient ansluter får den ett `meta`-meddelande som listar vad appen publicerar, vad den tar emot och vad den kan göra.

Tre saker kan exponeras, var och en beskriven av ett schema i samma `name:Type`-format som en actions `input`:

- `NEWPUBLISH(name, schema)` deklarerar ett meddelande som appen **skickar**; `PUBLISH(name, value)` skickar det till varje klient som bett om det genom att skicka `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` deklarerar ett meddelande som appen **tar emot**: en klient skickar `{ type: 'subscribe', id: name, data: {...} }` och `callback(message, client)` körs bara när datan är giltig. Den validerade datan finns i `message.response` (`message.error` är alltid `null` där) och `client` är avsändaren.
- `NEWCALL(name, schema, callback)` deklarerar en funktion som klienten **anropar**: klienten skickar `{ type: 'call', id: name, data: {...}, callbackid: '1' }` och appen svarar med samma meddelande med `success: true` och resultatet i `data`, eller med `error: true` när datan är ogiltig. `callback(data, done, client)` ger resultatet med `done(null, result)`.

Om du anger `null` som schema för `NEWPUBLISH` eller `NEWSUBSCRIBE` tas deklarationen bort. Total.js officiella klient (`TMSCLIENT`) talar det här protokollet åt dig från en annan Total.js-app; vilken WebSocket-klient som helst fungerar.

`UNSUBSCRIBE(name, [callback])` tar bort lyssnarna för ett meddelande som applikationen tar emot: bara `callback` när du skickar den, annars alla. Den returnerar `true` när den tog bort något och `false` när det inte fanns något att ta bort.

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