ForgeTotal.js 5
pl

Total.js 5

Wymiana komunikatów przez Total Messaging Service

Total.js 5 · total5@0.0.19 tmspublishsubscribewebsocketmessaging Uruchomiono z Total.js 5

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: {...} }, a callback(message, client) wykonuje się tylko wtedy, gdy dane są poprawne. Zwalidowane dane są w message.response (message.error jest tam zawsze null), a client to 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 z success: true i wynikiem w data albo z error: true, gdy dane są niepoprawne. callback(data, done, client) tworzy wynik przez done(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ć.

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