Trocar mensagens com o Total Messaging Service
O TMS (Total Messaging Service) é um pequeno barramento de mensagens sobre um WebSocket. Ativa-se no ficheiro config com $tms : true; o endpoint é /$tms/ e secret_tms é o token que todos os clientes têm de enviar no cabeçalho x-token (um token errado fecha a ligação com o código 4001, e um endereço que falhe mais de 5 vezes é bloqueado durante algum tempo). Quando um cliente se liga, recebe uma mensagem meta que lista o que a aplicação publica, o que aceita e o que sabe fazer.
Podem expor-se três coisas, cada uma descrita por um schema no mesmo formato name:Type do input de uma ação:
NEWPUBLISH(name, schema)declara uma mensagem que a aplicação envia;PUBLISH(name, value)envia-a a todos os clientes que a pediram enviando{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)declara uma mensagem que a aplicação recebe: um cliente envia{ type: 'subscribe', id: name, data: {...} }ecallback(message, client)só corre quando os dados são válidos. Os dados validados estão emmessage.response(message.erroré semprenullaí) eclienté quem envia.NEWCALL(name, schema, callback)declara uma função que o cliente chama: o cliente envia{ type: 'call', id: name, data: {...}, callbackid: '1' }e a aplicação responde com a mesma mensagem comsuccess: truee o resultado emdata, ou comerror: truequando os dados são inválidos.callback(data, done, client)produz o resultado comdone(null, result).
Passar null como schema de NEWPUBLISH ou NEWSUBSCRIBE remove a declaração. O cliente oficial do Total.js (TMSCLIENT) fala este protocolo por si a partir de outra aplicação Total.js; qualquer cliente WebSocket serve.
UNSUBSCRIBE(name, [callback]) remove os ouvintes de uma mensagem que a aplicação recebe: apenas callback quando o passa, todos quando não. Devolve true quando removeu algo e false quando não havia nada a remover.
$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 });
}