ForgeTotal.js 5
bg

Total.js 5

Обмен на съобщения с Total Messaging Service

Total.js 5 · total5@0.0.19 tmspublishsubscribewebsocketmessaging Изпълнено с Total.js 5

TMS (Total Messaging Service) е малка шина за съобщения върху WebSocket. Включвате я във файла config с $tms : true; крайната точка е /$tms/, а secret_tms е токенът, който всеки клиент трябва да изпрати в хедъра x-token (грешен токен затваря връзката с код 4001, а адрес, който се провали повече от 5 пъти, се блокира за известно време). Когато клиент се свърже, получава съобщение meta, което изброява какво публикува приложението, какво приема и какво може да прави.

Могат да се предоставят три неща, всяко описано със схема в същия формат name:Type като input на действие:

  • NEWPUBLISH(name, schema) декларира съобщение, което приложението изпраща; PUBLISH(name, value) го изпраща на всеки клиент, който го е поискал, като е изпратил { type: 'subscribers', subscribers: [name] }.
  • NEWSUBSCRIBE(name, schema, callback) декларира съобщение, което приложението получава: клиент изпраща { type: 'subscribe', id: name, data: {...} }, а callback(message, client) се изпълнява само когато данните са валидни. Валидираните данни са в message.response (message.error там винаги е null), а client е изпращачът.
  • NEWCALL(name, schema, callback) декларира функция, която клиентът извиква: клиентът изпраща { type: 'call', id: name, data: {...}, callbackid: '1' }, а приложението отговаря със същото съобщение с success: true и резултата в data, или с error: true, когато данните са невалидни. callback(data, done, client) създава резултата с done(null, result).

Подаването на null като схема на NEWPUBLISH или NEWSUBSCRIBE премахва декларацията. Официалният клиент на Total.js (TMSCLIENT) говори този протокол вместо вас от друго приложение на Total.js; върши работа всеки WebSocket клиент.

UNSUBSCRIBE(name, [callback]) премахва слушателите на съобщение, което приложението получава: само callback, когато го подадете, иначе всички. Връща true, когато е премахнало нещо, и false, когато не е имало какво да се премахне.

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