Výměna zpráv přes Total Messaging Service
TMS (Total Messaging Service) je malá sběrnice zpráv nad WebSocketem. Zapíná se v souboru config pomocí $tms : true; endpoint je /$tms/ a secret_tms je token, který musí každý klient poslat v hlavičce x-token (nesprávný token zavře spojení s kódem 4001 a adresa, která selže více než 5krát, se na čas zablokuje). Když se klient připojí, dostane zprávu meta, která uvádí, co aplikace publikuje, co přijímá a co umí.
Zpřístupnit lze tři věci, každou popsanou schématem ve stejném formátu name:Type jako input akce:
NEWPUBLISH(name, schema)deklaruje zprávu, kterou aplikace posílá;PUBLISH(name, value)ji pošle každému klientovi, který o ni požádal odesláním{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)deklaruje zprávu, kterou aplikace přijímá: klient pošle{ type: 'subscribe', id: name, data: {...} }acallback(message, client)se provede jen tehdy, když jsou data platná. Ověřená data jsou vmessage.response(message.errorje tam vždynull) aclientje odesílatel.NEWCALL(name, schema, callback)deklaruje funkci, kterou klient volá: klient pošle{ type: 'call', id: name, data: {...}, callbackid: '1' }a aplikace odpoví toutéž zprávou ssuccess: truea výsledkem vdata, nebo serror: true, když jsou data neplatná.callback(data, done, client)vytvoří výsledek přesdone(null, result).
Předání null jako schématu pro NEWPUBLISH nebo NEWSUBSCRIBE deklaraci odstraní. Oficiální klient Total.js (TMSCLIENT) tento protokol zvládá za vás z jiné aplikace Total.js; funguje jakýkoli klient WebSocket.
UNSUBSCRIBE(name, [callback]) odstraní posluchače zprávy, kterou aplikace přijímá: jen callback, když ho předáte, jinak všechny. Vrátí true, když něco odstranil, a false, když nebylo co odstranit.
$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 });
}