Возникают проблемы при создании модулей с использованием WebSockets и совместном использовании экземпляра объекта между различными файлами. Интересно, может ли кто-нибудь помочь.
Как для Socket.IO, так и для ws
lib необходимо создать экземпляр WebSocket Serverприложение Node, передавая экземпляр server
в библиотеку.
Модуль index.js
const server = require('http').createServer(app);
require('./socketController/initialize.js').initialize(server);
Модуль ./socketController/initialize.js
const sio = require('socket.io')
let io;
exports.io = () => {
return io
}
exports.initialize = (server) => {
io = sio(server, {
origins: '*:*',
})
io.on('connection', (client) => {
console.log("User Connected.")
client.on('disconnect', () => {
console.log("A user disconnected.")
})
})
}
Теперь в других файлах мы можем получить доступ к инициализированному соединению WebSocket с помощью
const io = require('path/socketController/initialize.js).io
Мы можем генерировать события в пространстве имен, выполняя что-то вроде этого
emitEvent(param) {
io.emit(`${param}_message`, someObject);
}
Однако я не уверен, как это сделать с библиотекой ws
, поскольку, похоже, нетобобщенное событие "emit", которое может легко транслировать сообщение в пространстве имен.Из документов похоже, что нам нужно сделать цикл forEach
через wss.clients ...
wss.broadcast = function broadcast(data) {
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(data);
}
});
Так что это лучшее, что я могу придумать, есть ли способ экспортировать этоws
непосредственно из замыкания onConnect, по желанию, во время некоторого другого промежуточного программного обеспечения, чтобы программно использовать конкретный ws
сокет, который подключен к клиенту?
const WebSocket = require('ws');
let webSocketServer;
module.exports.getSocket = () => {
return webSocketServer;
}
module.exports.initialize = (server) => {
webSocketServer = new WebSocket.Server({ server });
webSocketServer.on("connection", (ws) => {
ws.on('message', (msg) => {
console.log(`Server received ${msg}`)
})
ws.send(`Connection Received.`)
})
}
Что я пытаюсь выяснитьесли есть способ избежать использования чего-то подобного циклу forEach
для отправки событий в конкретный сокет, но кажется невозможным без необходимости повторять их для разрешения цели
const sendMessage = (param) => {
wss.clients.forEach((client) => {
if(customNamespaceHashResolution(client)) {
client.send("You should get this message for your namespace only")
}
});
}