ForgeTotal.js 5
sk

Total.js 5

Výmena správ cez Total Messaging Service

Total.js 5 · total5@0.0.19 tmspublishsubscribewebsocketmessaging Spustené s Total.js 5

TMS (Total Messaging Service) je malá zbernica správ nad WebSocketom. Zapína sa v súbore config pomocou $tms : true; endpoint je /$tms/ a secret_tms je token, ktorý musí každý klient poslať v hlavičke x-token (nesprávny token zatvorí spojenie s kódom 4001 a adresa, ktorá zlyhá viac než 5-krát, sa na čas zablokuje). Keď sa klient pripojí, dostane správu meta, ktorá uvádza, čo aplikácia publikuje, čo prijíma a čo vie urobiť.

Sprístupniť sa dajú tri veci, každá opísaná schémou v rovnakom formáte name:Type ako input akcie:

  • NEWPUBLISH(name, schema) deklaruje správu, ktorú aplikácia posiela; PUBLISH(name, value) ju pošle každému klientovi, ktorý o ňu požiadal odoslaním { type: 'subscribers', subscribers: [name] }.
  • NEWSUBSCRIBE(name, schema, callback) deklaruje správu, ktorú aplikácia prijíma: klient pošle { type: 'subscribe', id: name, data: {...} } a callback(message, client) sa vykoná len vtedy, keď sú dáta platné. Overené dáta sú v message.response (message.error je tam vždy null) a client je odosielateľ.
  • NEWCALL(name, schema, callback) deklaruje funkciu, ktorú klient volá: klient pošle { type: 'call', id: name, data: {...}, callbackid: '1' } a aplikácia odpovie tou istou správou s success: true a výsledkom v data, alebo s error: true, keď sú dáta neplatné. callback(data, done, client) vytvorí výsledok cez done(null, result).

Odovzdanie null ako schémy pre NEWPUBLISH alebo NEWSUBSCRIBE deklaráciu odstráni. Oficiálny klient Total.js (TMSCLIENT) tento protokol zvláda za vás z inej aplikácie Total.js; funguje akýkoľvek klient WebSocket.

UNSUBSCRIBE(name, [callback]) odstráni poslucháčov správy, ktorú aplikácia prijíma: iba callback, keď ho odovzdáte, inak všetkých. Vráti true, keď niečo odstránil, a false, keď nebolo čo odstrániť.

config
$tms : true
secret_tms : my-tms-token
definitions/tms.js
NEWPUBLISH('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 = [];
controllers/tms.js
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 });
}