Wymiana komunikatów przez Total Messaging Service
TMS (Total Messaging Service) to mała szyna komunikatów nad WebSocketem. Włączasz ją w pliku config przez $tms : true; punkt końcowy to /$tms/, a secret_tms to token, który każdy klient musi wysłać w nagłówku x-token (zły token zamyka połączenie kodem 4001, a adres, który zawiedzie więcej niż 5 razy, jest na jakiś czas blokowany). Gdy klient się połączy, dostaje komunikat meta, który wymienia, co aplikacja publikuje, co przyjmuje i co potrafi.
Można udostępnić trzy rzeczy, każdą opisaną schematem w tym samym formacie name:Type co input akcji:
NEWPUBLISH(name, schema)deklaruje komunikat, który aplikacja wysyła;PUBLISH(name, value)wysyła go do każdego klienta, który o to poprosił, wysyłając{ type: 'subscribers', subscribers: [name] }.NEWSUBSCRIBE(name, schema, callback)deklaruje komunikat, który aplikacja odbiera: klient wysyła{ type: 'subscribe', id: name, data: {...} }, acallback(message, client)wykonuje się tylko wtedy, gdy dane są poprawne. Zwalidowane dane są wmessage.response(message.errorjest tam zawszenull), aclientto nadawca.NEWCALL(name, schema, callback)deklaruje funkcję, którą klient wywołuje: klient wysyła{ type: 'call', id: name, data: {...}, callbackid: '1' }, a aplikacja odpowiada tym samym komunikatem zsuccess: truei wynikiem wdataalbo zerror: true, gdy dane są niepoprawne.callback(data, done, client)tworzy wynik przezdone(null, result).
Przekazanie null jako schematu w NEWPUBLISH lub NEWSUBSCRIBE usuwa deklarację. Oficjalny klient Total.js (TMSCLIENT) mówi tym protokołem za Ciebie z innej aplikacji Total.js; działa każdy klient WebSocket.
UNSUBSCRIBE(name, [callback]) usuwa nasłuchiwaczy wiadomości, którą aplikacja odbiera: tylko callback, gdy go przekażesz, w przeciwnym razie wszystkich. Zwraca true, gdy coś usunął, i false, gdy nie było czego usuwać.
$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 });
}