ForgeTotal.js 5
fr

Total.js 5

Échanger des messages avec le Total Messaging Service

Total.js 5 · total5@0.0.19 tmspublishsubscribewebsocketmessaging Exécutée avec Total.js 5

TMS (Total Messaging Service) est un petit bus de messages au-dessus d'un WebSocket. Activez-le dans le fichier config avec $tms : true ; le point d'accès est /$tms/ et secret_tms est le jeton que chaque client doit envoyer dans l'en-tête x-token (un jeton incorrect ferme la connexion avec le code 4001, et une adresse qui échoue plus de 5 fois est bloquée pendant un moment). Quand un client se connecte, il reçoit un message meta qui liste ce que l'application publie, ce qu'elle accepte et ce qu'elle sait faire.

Trois choses peuvent être exposées, chacune décrite par un schéma dans le même format name:Type que l'input d'une action :

  • NEWPUBLISH(name, schema) déclare un message que l'application envoie ; PUBLISH(name, value) l'envoie à chaque client qui l'a demandé en envoyant { type: 'subscribers', subscribers: [name] }.
  • NEWSUBSCRIBE(name, schema, callback) déclare un message que l'application reçoit : un client envoie { type: 'subscribe', id: name, data: {...} } et callback(message, client) ne s'exécute que lorsque les données sont valides. Les données validées sont dans message.response (message.error y vaut toujours null) et client est l'expéditeur.
  • NEWCALL(name, schema, callback) déclare une fonction que le client appelle : le client envoie { type: 'call', id: name, data: {...}, callbackid: '1' }, et l'application répond avec le même message portant success: true et le résultat dans data, ou error: true quand les données sont invalides. callback(data, done, client) produit le résultat avec done(null, result).

Passer null comme schéma de NEWPUBLISH ou de NEWSUBSCRIBE supprime la déclaration. Le client officiel de Total.js (TMSCLIENT) parle ce protocole pour vous depuis une autre application Total.js ; n'importe quel client WebSocket convient.

UNSUBSCRIBE(name, [callback]) supprime les écouteurs d'un message que l'application reçoit : seulement callback si vous le passez, tous sinon. Il renvoie true s'il a supprimé quelque chose et false s'il n'y avait rien à supprimer.

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