Schimbă mesaje cu Total Messaging Service
TMS (Total Messaging Service) este un mic bus de mesaje peste un WebSocket. Îl activezi în fișierul config cu $tms : true; endpoint-ul este /$tms/, iar secret_tms este tokenul pe care fiecare client trebuie să-l trimită în antetul x-token (un token greșit închide conexiunea cu codul 4001, iar o adresă care eșuează de mai mult de 5 ori este blocată o vreme). Când un client se conectează, primește un mesaj meta care listează ce publică aplicația, ce acceptă și ce poate face.
Pot fi expuse trei lucruri, fiecare descris de o schemă în același format name:Type ca input-ul unei acțiuni:
NEWPUBLISH(name, schema)declară un mesaj pe care aplicația îl trimite;PUBLISH(name, value)îl trimite fiecărui client care l-a cerut trimițând{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)declară un mesaj pe care aplicația îl primește: un client trimite{ type: 'subscribe', id: name, data: {...} }, iarcallback(message, client)rulează doar când datele sunt valide. Datele validate sunt înmessage.response(message.erroreste acolo mereunull), iarclienteste expeditorul.NEWCALL(name, schema, callback)declară o funcție pe care clientul o apelează: clientul trimite{ type: 'call', id: name, data: {...}, callbackid: '1' }, iar aplicația răspunde cu același mesaj cusuccess: trueși rezultatul îndata, sau cuerror: truecând datele sunt invalide.callback(data, done, client)produce rezultatul cudone(null, result).
Transmiterea lui null ca schemă pentru NEWPUBLISH sau NEWSUBSCRIBE elimină declarația. Clientul oficial al Total.js (TMSCLIENT) vorbește acest protocol pentru tine dintr-o altă aplicație Total.js; orice client WebSocket funcționează.
UNSUBSCRIBE(name, [callback]) elimină ascultătorii unui mesaj pe care aplicația îl primește: doar callback când îl transmiți, altfel pe toți. Returnează true când a eliminat ceva și false când nu era nimic de eliminat.
$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 });
}