Berichten uitwisselen met de Total Messaging Service
TMS (Total Messaging Service) is een kleine berichtenbus bovenop een WebSocket. Je schakelt hem in het bestand config in met $tms : true; het eindpunt is /$tms/ en secret_tms is het token dat elke client in de header x-token moet sturen (een verkeerd token sluit de verbinding met code 4001, en een adres dat meer dan 5 keer faalt wordt een tijdje geblokkeerd). Wanneer een client verbindt, ontvangt hij een meta-bericht dat opsomt wat de app publiceert, wat ze accepteert en wat ze kan.
Drie dingen kunnen worden aangeboden, elk beschreven door een schema in hetzelfde formaat name:Type als de input van een actie:
NEWPUBLISH(name, schema)declareert een bericht dat de app verstuurt;PUBLISH(name, value)stuurt het naar elke client die erom vroeg door{ type: 'subscribers', subscribers: [name] }te sturen.NEWSUBSCRIBE(name, schema, callback)declareert een bericht dat de app ontvangt: een client stuurt{ type: 'subscribe', id: name, data: {...} }encallback(message, client)draait alleen als de gegevens geldig zijn. De gevalideerde gegevens staan inmessage.response(message.erroris daar altijdnull) enclientis de afzender.NEWCALL(name, schema, callback)declareert een functie die de client aanroept: de client stuurt{ type: 'call', id: name, data: {...}, callbackid: '1' }en de app antwoordt met hetzelfde bericht metsuccess: trueen het resultaat indata, of meterror: truewanneer de gegevens ongeldig zijn.callback(data, done, client)levert het resultaat metdone(null, result).
null als schema van NEWPUBLISH of NEWSUBSCRIBE verwijdert de declaratie. De officiële client van Total.js (TMSCLIENT) spreekt dit protocol voor je vanuit een andere Total.js-app; elke WebSocket-client werkt.
UNSUBSCRIBE(name, [callback]) verwijdert de listeners van een bericht dat de applicatie ontvangt: alleen callback als je die meegeeft, anders alle. Het geeft true terug als er iets is verwijderd en false als er niets te verwijderen was.
$tms : true
secret_tms : my-tms-tokenNEWPUBLISH('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 = [];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 });
}