Skonfiguruj trasę WebSocket z flagami, uwierzytelnianiem i parametrami
Trasa SOCKET korzysta z tych samych elementów co trasa HTTP. Domyślnie wiadomości są obiektami JSON. @text sprawia, że przychodzące wiadomości są zwykłymi ciągami znaków, a @binary, że są Bufferami. W trasie tekstowej send(message) nadal koduje wysyłane dane jako JSON, więc ciąg znaków dociera w cudzysłowach; przekaż true jako drugi argument, send(message, true), aby wysłać ciąg bez zmian. + przed SOCKET przyjmuje tylko użytkowników zatwierdzonych przez AUTH() (w przeciwnym razie połączenie jest odrzucane), a segmenty {name} są dostępne w self.params. @csrf sprawdza token CSRF przed przyjęciem połączenia: wyślij go jako parametr csrf w query stringu (/secure/?csrf=...), a o secret_csrf i $.csrf() zobacz przepis o CSRF. Middleware dołącza się przez #name, jak w każdej trasie.
secret_csrf : change-this-secret-in-productionAUTH(function($) {
if ($.query.token === 'letmein')
$.success({ id: '1', name: 'Louis' });
else
$.invalid();
});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() });
}