Üzenetek cseréje a Total Messaging Service-szel
A TMS (Total Messaging Service) egy kis üzenetbusz egy WebSocket fölött. A config fájlban kapcsolod be a $tms : true-val; a végpont a /$tms/, a secret_tms pedig az a token, amelyet minden kliensnek az x-token fejlécben kell küldenie (rossz token 4001-es kóddal zárja a kapcsolatot, az a cím pedig, amely 5-nél többször hibázik, egy időre blokkolódik). Amikor egy kliens csatlakozik, kap egy meta üzenetet, amely felsorolja, mit tesz közzé az alkalmazás, mit fogad el és mit tud.
Három dolog tehető elérhetővé, mindegyiket egy séma írja le, ugyanabban a name:Type formátumban, mint egy akció input-ja:
- a
NEWPUBLISH(name, schema)olyan üzenetet deklarál, amelyet az alkalmazás küld; aPUBLISH(name, value)minden olyan kliensnek elküldi, amely ezt a{ type: 'subscribers', subscribers: [name] }elküldésével kérte. - a
NEWSUBSCRIBE(name, schema, callback)olyan üzenetet deklarál, amelyet az alkalmazás fogad: a kliens{ type: 'subscribe', id: name, data: {...} }értéket küld, acallback(message, client)pedig csak akkor fut, ha az adatok érvényesek. A validált adatok amessage.response-ban vannak (amessage.erroritt mindignull), aclientpedig a feladó. - a
NEWCALL(name, schema, callback)olyan függvényt deklarál, amelyet a kliens hív: a kliens{ type: 'call', id: name, data: {...}, callbackid: '1' }értéket küld, az alkalmazás pedig ugyanazzal az üzenettel válaszol,success: truejelzéssel és az eredménnyel adata-ban, vagyerror: truejelzéssel, ha az adatok érvénytelenek. Acallback(data, done, client)adone(null, result)-tel állítja elő az eredményt.
A NEWPUBLISH vagy a NEWSUBSCRIBE sémájaként átadott null eltávolítja a deklarációt. A Total.js hivatalos kliense (TMSCLIENT) beszéli helyetted ezt a protokollt egy másik Total.js-alkalmazásból; bármely WebSocket-kliens megfelel.
Az UNSUBSCRIBE(name, [callback]) eltávolítja az alkalmazás által fogadott üzenet figyelőit: csak a callback-et, ha átadod, különben mindet. true-t ad vissza, ha eltávolított valamit, és false-t, ha nem volt mit eltávolítani.
$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 });
}