Výmena správ cez Total Messaging Service
TMS (Total Messaging Service) je malá zbernica správ nad WebSocketom. Zapína sa v súbore config pomocou $tms : true; endpoint je /$tms/ a secret_tms je token, ktorý musí každý klient poslať v hlavičke x-token (nesprávny token zatvorí spojenie s kódom 4001 a adresa, ktorá zlyhá viac než 5-krát, sa na čas zablokuje). Keď sa klient pripojí, dostane správu meta, ktorá uvádza, čo aplikácia publikuje, čo prijíma a čo vie urobiť.
Sprístupniť sa dajú tri veci, každá opísaná schémou v rovnakom formáte name:Type ako input akcie:
NEWPUBLISH(name, schema)deklaruje správu, ktorú aplikácia posiela;PUBLISH(name, value)ju pošle každému klientovi, ktorý o ňu požiadal odoslaním{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)deklaruje správu, ktorú aplikácia prijíma: klient pošle{ type: 'subscribe', id: name, data: {...} }acallback(message, client)sa vykoná len vtedy, keď sú dáta platné. Overené dáta sú vmessage.response(message.errorje tam vždynull) aclientje odosielateľ.NEWCALL(name, schema, callback)deklaruje funkciu, ktorú klient volá: klient pošle{ type: 'call', id: name, data: {...}, callbackid: '1' }a aplikácia odpovie tou istou správou ssuccess: truea výsledkom vdata, alebo serror: true, keď sú dáta neplatné.callback(data, done, client)vytvorí výsledok cezdone(null, result).
Odovzdanie null ako schémy pre NEWPUBLISH alebo NEWSUBSCRIBE deklaráciu odstráni. Oficiálny klient Total.js (TMSCLIENT) tento protokol zvláda za vás z inej aplikácie Total.js; funguje akýkoľvek klient WebSocket.
UNSUBSCRIBE(name, [callback]) odstráni poslucháčov správy, ktorú aplikácia prijíma: iba callback, keď ho odovzdáte, inak všetkých. Vráti true, keď niečo odstránil, a false, keď nebolo čo odstrániť.
$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 });
}