ForgeTotal.js 5
hu

Total.js 5

WebSocket-útvonal beállítása jelzőkkel, hitelesítéssel és paraméterekkel

Total.js 5 · total5@0.0.19 websocketrealtimesecurity Total.js 5-tel lefuttatva

Egy SOCKET útvonal ugyanazokat az építőelemeket használja, mint egy HTTP-útvonal. Alapértelmezés szerint az üzenetek JSON-objektumok. A @text a bejövő üzeneteket egyszerű szöveggé, a @binary Bufferekké teszi. Egy szöveges útvonalon a send(message) továbbra is JSON-ként kódolja, amit küld, így a szöveg idézőjelekkel érkezik; adj meg true-t második argumentumként, send(message, true), hogy a szöveg változatlanul menjen ki. A SOCKET előtti + csak azokat a felhasználókat fogadja, akiket az AUTH() jóváhagy (különben a kapcsolatot elutasítja), a {name} szegmensek pedig a self.params-ban érhetők el. A @csrf a kapcsolat elfogadása előtt ellenőriz egy CSRF-tokent: küldd a csrf lekérdezési paraméterként (/secure/?csrf=...), a secret_csrf-ről és a $.csrf()-ről pedig lásd a CSRF-receptet. Middleware-t a #name-mel csatolsz, mint bármely útvonalra.

config
secret_csrf : change-this-secret-in-production
definitions/auth.js
AUTH(function($) {
	if ($.query.token === 'letmein')
		$.success({ id: '1', name: 'Louis' });
	else
		$.invalid();
});
controllers/sockets.js
exports.install = function() {
	ROUTE('SOCKET /text/ @text', text);
	ROUTE('SOCKET /bin/ @binary', binary);
	ROUTE('+SOCKET /private/', private_socket);
	ROUTE('SOCKET /room/{name}/', room);
	ROUTE('SOCKET /secure/ @csrf', secure);
	ROUTE('GET /where/', where);
	ROUTE('GET /csrf/', csrf);
};

function text() {
	this.on('message', function(client, message) {
		client.send(typeof(message) + ':' + message.toUpperCase(), true);
	});
}

function binary() {
	this.on('message', function(client, message) {
		client.send(Buffer.from(Buffer.isBuffer(message) ? 'buffer:' + message.length : 'other'));
	});
}

function private_socket() {
	this.on('open', function(client) {
		client.send({ hello: client.user.name });
	});
}

function room() {
	var self = this;
	self.on('open', function(client) {
		client.send({ room: self.params.name });
	});
}

function secure() {
	this.on('open', function(client) {
		client.send({ welcome: true });
	});
}

function where($) {
	$.json({ url: $.hostname('/bin/') });
}

function csrf($) {
	$.json({ csrf: $.csrf() });
}