Utbyt meddelanden med Total Messaging Service
TMS (Total Messaging Service) är en liten meddelandebuss ovanpå en WebSocket. Du slår på den i filen config med $tms : true; slutpunkten är /$tms/ och secret_tms är den token som varje klient måste skicka i headern x-token (en felaktig token stänger anslutningen med kod 4001, och en adress som misslyckas mer än 5 gånger blockeras en stund). När en klient ansluter får den ett meta-meddelande som listar vad appen publicerar, vad den tar emot och vad den kan göra.
Tre saker kan exponeras, var och en beskriven av ett schema i samma name:Type-format som en actions input:
NEWPUBLISH(name, schema)deklarerar ett meddelande som appen skickar;PUBLISH(name, value)skickar det till varje klient som bett om det genom att skicka{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)deklarerar ett meddelande som appen tar emot: en klient skickar{ type: 'subscribe', id: name, data: {...} }ochcallback(message, client)körs bara när datan är giltig. Den validerade datan finns imessage.response(message.errorär alltidnulldär) ochclientär avsändaren.NEWCALL(name, schema, callback)deklarerar en funktion som klienten anropar: klienten skickar{ type: 'call', id: name, data: {...}, callbackid: '1' }och appen svarar med samma meddelande medsuccess: trueoch resultatet idata, eller mederror: truenär datan är ogiltig.callback(data, done, client)ger resultatet meddone(null, result).
Om du anger null som schema för NEWPUBLISH eller NEWSUBSCRIBE tas deklarationen bort. Total.js officiella klient (TMSCLIENT) talar det här protokollet åt dig från en annan Total.js-app; vilken WebSocket-klient som helst fungerar.
UNSUBSCRIBE(name, [callback]) tar bort lyssnarna för ett meddelande som applikationen tar emot: bara callback när du skickar den, annars alla. Den returnerar true när den tog bort något och false när det inte fanns något att ta bort.
$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 });
}