# Échanger des messages avec le Total Messaging Service

> Activez le point d'accès WebSocket de TMS et laissez des clients externes recevoir des messages publiés, envoyer des messages à votre application et appeler ses fonctions.

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

TMS (Total Messaging Service) est un petit bus de messages au-dessus d'un WebSocket. Activez-le dans le fichier `config` avec `$tms : true` ; le point d'accès est `/$tms/` et `secret_tms` est le jeton que chaque client doit envoyer dans l'en-tête `x-token` (un jeton incorrect ferme la connexion avec le code 4001, et une adresse qui échoue plus de 5 fois est bloquée pendant un moment). Quand un client se connecte, il reçoit un message `meta` qui liste ce que l'application publie, ce qu'elle accepte et ce qu'elle sait faire.

Trois choses peuvent être exposées, chacune décrite par un schéma dans le même format `name:Type` que l'`input` d'une action :

- `NEWPUBLISH(name, schema)` déclare un message que l'application **envoie** ; `PUBLISH(name, value)` l'envoie à chaque client qui l'a demandé en envoyant `{ type: 'subscribers', subscribers: [name] }`.
- `NEWSUBSCRIBE(name, schema, callback)` déclare un message que l'application **reçoit** : un client envoie `{ type: 'subscribe', id: name, data: {...} }` et `callback(message, client)` ne s'exécute que lorsque les données sont valides. Les données validées sont dans `message.response` (`message.error` y vaut toujours `null`) et `client` est l'expéditeur.
- `NEWCALL(name, schema, callback)` déclare une fonction que le client **appelle** : le client envoie `{ type: 'call', id: name, data: {...}, callbackid: '1' }`, et l'application répond avec le même message portant `success: true` et le résultat dans `data`, ou `error: true` quand les données sont invalides. `callback(data, done, client)` produit le résultat avec `done(null, result)`.

Passer `null` comme schéma de `NEWPUBLISH` ou de `NEWSUBSCRIBE` supprime la déclaration. Le client officiel de Total.js (`TMSCLIENT`) parle ce protocole pour vous depuis une autre application Total.js ; n'importe quel client WebSocket convient.

`UNSUBSCRIBE(name, [callback])` supprime les écouteurs d'un message que l'application reçoit : seulement `callback` si vous le passez, tous sinon. Il renvoie `true` s'il a supprimé quelque chose et `false` s'il n'y avait rien à supprimer.

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