Обмен на съобщения с Total Messaging Service
TMS (Total Messaging Service) е малка шина за съобщения върху WebSocket. Включвате я във файла config с $tms : true; крайната точка е /$tms/, а secret_tms е токенът, който всеки клиент трябва да изпрати в хедъра x-token (грешен токен затваря връзката с код 4001, а адрес, който се провали повече от 5 пъти, се блокира за известно време). Когато клиент се свърже, получава съобщение meta, което изброява какво публикува приложението, какво приема и какво може да прави.
Могат да се предоставят три неща, всяко описано със схема в същия формат name:Type като input на действие:
NEWPUBLISH(name, schema)декларира съобщение, което приложението изпраща;PUBLISH(name, value)го изпраща на всеки клиент, който го е поискал, като е изпратил{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)декларира съобщение, което приложението получава: клиент изпраща{ type: 'subscribe', id: name, data: {...} }, аcallback(message, client)се изпълнява само когато данните са валидни. Валидираните данни са вmessage.response(message.errorтам винаги еnull), аclientе изпращачът.NEWCALL(name, schema, callback)декларира функция, която клиентът извиква: клиентът изпраща{ type: 'call', id: name, data: {...}, callbackid: '1' }, а приложението отговаря със същото съобщение сsuccess: trueи резултата вdata, или сerror: true, когато данните са невалидни.callback(data, done, client)създава резултата сdone(null, result).
Подаването на null като схема на NEWPUBLISH или NEWSUBSCRIBE премахва декларацията. Официалният клиент на Total.js (TMSCLIENT) говори този протокол вместо вас от друго приложение на Total.js; върши работа всеки WebSocket клиент.
UNSUBSCRIBE(name, [callback]) премахва слушателите на съобщение, което приложението получава: само callback, когато го подадете, иначе всички. Връща true, когато е премахнало нещо, и false, когато не е имало какво да се премахне.
$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 });
}