Пробую писать чат на вебсоткетах.
На сервере код такой:
const WebSocket = require('ws');
const server = new WebSocket.Server({port: 3001});
const activeClients = [];
server.on('connection', ws => {
activeClients.push(ws);
ws.on('close', data => {
//Что мы тут полчаем? data = 1006
});
ws.on('message', message => {
//Как отправить сообщение конкретному пользователю?
});
});
Подскажите, пожалуйста:
1) Как мне отличать клиентов? Я не нашел у объекта ws (on connection) какого-то уникального поля, вроде id. В интернете пишут, что id нужно добавлять самостоятельно.
2) Как мне узнать какой из клиентов отсоединился? В событии ws.on('message') возвращается какая-то цифра. Я не понял что это.
3) Как мне отправлять сообщение конкретному пользователю? Этот пункт вытекает из пукта 1.
4) Ну и если действительно нет какого-то идентификатора по умолчанию, то почему они его не сделали? Почему не генерируют id сразу и не передают его в on('close')? Это ведь было бы очень удобно.
Вот мои костыли, которые работают, но я не уверен, что я делаю правильно:
const WebSocket = require('ws');
const server = new WebSocket.Server({port: 3001});
const activeClients = [];
function generateUniqueID() {
//return some random string
}
server.on('connection', ws => {
ws.uniqueID = generateUniqueID();//Костыль: Добавляем собственный ID
activeClients.push(ws);
ws.on('close', data => {
//Костыль: знаем что кто-то отсоединился, проходимся по массиву клиентов и смотрим, у кого статус "отключен"
activeClients.forEach(client, i => {
if (client.readyState !== WebSocket.CLOSE) {
activeClients.splice(i, 1);
}
});
});
ws.on('message', message => {
//Костыль: получаем из message ID пользователя, которому нужно отправлить сообщение (toUserID) и отправляем ему, перебрав весь массив
const data = JSON.parse(message);
activeClients.forEach(client, i => {
if (client.readyState === WebSocket.OPEN && client.uniqueID === data.toUserID) {
client.send(...)//Сообщение конкретному пользователю.
}
});
});
});
Мои костыли работают, скажите пожуйста, какие у меня ошибки? Как сделать проще и правильнее?
UPD:
Дайте какой-нибудь туториал по созданию настоящего чата. Во всех уроках создается банальный чат, который принимает сообщение и отправляет его
ВСЕМ остальным клиентам. Хотелось бы посмотреть, как делают более сложный функционал.