# Nachrichten mit dem Total Messaging Service austauschen

> Aktiviere den TMS-WebSocket-Endpunkt und lasse externe Clients veröffentlichte Nachrichten empfangen, Nachrichten an deine App senden und ihre Funktionen aufrufen.

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

TMS (Total Messaging Service) ist ein kleiner Nachrichtenbus über einen WebSocket. Du schaltest ihn in der Datei `config` mit `$tms : true` ein; der Endpunkt ist `/$tms/`, und `secret_tms` ist das Token, das jeder Client im Header `x-token` senden muss (ein falsches Token schließt die Verbindung mit dem Code 4001, und eine Adresse, die mehr als 5-mal scheitert, wird für eine Weile gesperrt). Wenn sich ein Client verbindet, erhält er eine `meta`-Nachricht, die auflistet, was die App veröffentlicht, was sie annimmt und was sie kann.

Drei Dinge können bereitgestellt werden, jedes beschrieben durch ein Schema im selben Format `name:Type` wie das `input` einer Action:

- `NEWPUBLISH(name, schema)` deklariert eine Nachricht, die die App **sendet**; `PUBLISH(name, value)` sendet sie an jeden Client, der sie angefordert hat, indem er `{ type: 'subscribers', subscribers: [name] }` gesendet hat.
- `NEWSUBSCRIBE(name, schema, callback)` deklariert eine Nachricht, die die App **empfängt**: Ein Client sendet `{ type: 'subscribe', id: name, data: {...} }`, und `callback(message, client)` läuft nur, wenn die Daten gültig sind. Die validierten Daten stehen in `message.response` (`message.error` ist dort immer `null`), und `client` ist der Absender.
- `NEWCALL(name, schema, callback)` deklariert eine Funktion, die der Client **aufruft**: Der Client sendet `{ type: 'call', id: name, data: {...}, callbackid: '1' }`, und die App antwortet mit derselben Nachricht mit `success: true` und dem Ergebnis in `data`, oder mit `error: true`, wenn die Daten ungültig sind. `callback(data, done, client)` erzeugt das Ergebnis mit `done(null, result)`.

Wird `null` als Schema von `NEWPUBLISH` oder `NEWSUBSCRIBE` übergeben, wird die Deklaration entfernt. Der offizielle Client von Total.js (`TMSCLIENT`) spricht dieses Protokoll für dich aus einer anderen Total.js-App; jeder WebSocket-Client funktioniert.

`UNSUBSCRIBE(name, [callback])` entfernt die Listener einer Nachricht, die die Anwendung empfängt: nur `callback`, wenn du ihn übergibst, sonst alle. Es liefert `true`, wenn etwas entfernt wurde, und `false`, wenn nichts zu entfernen war.

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