Intercambia mensajes con el Total Messaging Service
TMS (Total Messaging Service) es un pequeño bus de mensajes sobre un WebSocket. Se activa en el archivo config con $tms : true; el endpoint es /$tms/ y secret_tms es el token que todo cliente debe enviar en la cabecera x-token (un token incorrecto cierra la conexión con el código 4001, y una dirección que falla más de 5 veces se bloquea durante un tiempo). Cuando un cliente se conecta recibe un mensaje meta que lista lo que la aplicación publica, lo que acepta y lo que sabe hacer.
Se pueden exponer tres cosas, cada una descrita por un schema en el mismo formato name:Type que el input de una acción:
NEWPUBLISH(name, schema)declara un mensaje que la aplicación envía;PUBLISH(name, value)lo envía a todos los clientes que lo pidieron enviando{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)declara un mensaje que la aplicación recibe: un cliente envía{ type: 'subscribe', id: name, data: {...} }ycallback(message, client)se ejecuta solo cuando los datos son válidos. Los datos validados están enmessage.response(message.errorsiempre esnullahí) yclientes quien lo envía.NEWCALL(name, schema, callback)declara una función que el cliente llama: el cliente envía{ type: 'call', id: name, data: {...}, callbackid: '1' }y la aplicación responde con el mismo mensaje consuccess: truey el resultado endata, o conerror: truecuando los datos no son válidos.callback(data, done, client)produce el resultado condone(null, result).
Pasar null como schema de NEWPUBLISH o NEWSUBSCRIBE elimina la declaración. El cliente oficial de Total.js (TMSCLIENT) habla este protocolo por ti desde otra aplicación Total.js; sirve cualquier cliente WebSocket.
UNSUBSCRIBE(name, [callback]) elimina los oyentes de un mensaje que la aplicación recibe: solo callback cuando lo pasas, todos cuando no. Devuelve true cuando eliminó algo y false cuando no había nada que eliminar.
$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 });
}