# Ρυθμίστε μια διαδρομή WebSocket με σημαίες, πιστοποίηση και παραμέτρους

> Επιλέξτε τον τύπο μηνυμάτων με το @text ή @binary, απαιτήστε συνδεδεμένο χρήστη με το πρόθεμα +, ελέγξτε ένα token CSRF με το @csrf και διαβάστε παραμέτρους URL σε διαδρομές SOCKET.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: el
Content-SHA256: c431ff7346c05d3a81d36fd509b80f6f1ac03883946d443f2366491b0f0a922c
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Μια διαδρομή `SOCKET` χρησιμοποιεί τα ίδια δομικά στοιχεία με μια διαδρομή HTTP. Από προεπιλογή τα μηνύματα είναι αντικείμενα JSON. Το `@text` κάνει τα εισερχόμενα μηνύματα απλά κείμενα και το `@binary` τα κάνει `Buffer`. Σε μια διαδρομή κειμένου, το `send(message)` εξακολουθεί να κωδικοποιεί σε JSON ό,τι στέλνει, οπότε ένα κείμενο φτάνει με εισαγωγικά· περάστε `true` ως δεύτερο όρισμα, `send(message, true)`, για να σταλεί το κείμενο ως έχει. Ένα `+` πριν από το `SOCKET` δέχεται μόνο χρήστες που εγκρίνει το `AUTH()` (αλλιώς η σύνδεση απορρίπτεται) και τα τμήματα `{name}` είναι διαθέσιμα στο `self.params`. Το `@csrf` ελέγχει ένα token CSRF πριν γίνει δεκτή η σύνδεση: στείλτε το ως την παράμετρο `csrf` του query string (`/secure/?csrf=...`) και δείτε τη συνταγή CSRF για τα `secret_csrf` και `$.csrf()`. Ένα middleware συνδέεται με `#name` όπως σε οποιαδήποτε διαδρομή.

```text config
secret_csrf : change-this-secret-in-production
```

```js definitions/auth.js
AUTH(function($) {
	if ($.query.token === 'letmein')
		$.success({ id: '1', name: 'Louis' });
	else
		$.invalid();
});
```

```js 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() });
}
```
