ForgeTotal.js 5
cs

Total.js 5

Výměna zpráv přes Total Messaging Service

Total.js 5 · total5@0.0.19 tmspublishsubscribewebsocketmessaging Spuštěno s Total.js 5

TMS (Total Messaging Service) je malá sběrnice zpráv nad WebSocketem. Zapíná se v souboru config pomocí $tms : true; endpoint je /$tms/ a secret_tms je token, který musí každý klient poslat v hlavičce x-token (nesprávný token zavře spojení s kódem 4001 a adresa, která selže více než 5krát, se na čas zablokuje). Když se klient připojí, dostane zprávu meta, která uvádí, co aplikace publikuje, co přijímá a co umí.

Zpřístupnit lze tři věci, každou popsanou schématem ve stejném formátu name:Type jako input akce:

  • NEWPUBLISH(name, schema) deklaruje zprávu, kterou aplikace posílá; PUBLISH(name, value) ji pošle každému klientovi, který o ni požádal odesláním { type: 'subscribers', subscribers: [name] }.
  • NEWSUBSCRIBE(name, schema, callback) deklaruje zprávu, kterou aplikace přijímá: klient pošle { type: 'subscribe', id: name, data: {...} } a callback(message, client) se provede jen tehdy, když jsou data platná. Ověřená data jsou v message.response (message.error je tam vždy null) a client je odesílatel.
  • NEWCALL(name, schema, callback) deklaruje funkci, kterou klient volá: klient pošle { type: 'call', id: name, data: {...}, callbackid: '1' } a aplikace odpoví toutéž zprávou s success: true a výsledkem v data, nebo s error: true, když jsou data neplatná. callback(data, done, client) vytvoří výsledek přes done(null, result).

Předání null jako schématu pro NEWPUBLISH nebo NEWSUBSCRIBE deklaraci odstraní. Oficiální klient Total.js (TMSCLIENT) tento protokol zvládá za vás z jiné aplikace Total.js; funguje jakýkoli klient WebSocket.

UNSUBSCRIBE(name, [callback]) odstraní posluchače zprávy, kterou aplikace přijímá: jen callback, když ho předáte, jinak všechny. Vrátí true, když něco odstranil, a false, když nebylo co odstranit.

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 });
}