Как правильно экспортировать объект WebSocket из закрытия обратного вызова WSConnect onConnect с помощью ws lib?Проще сделать это в Socket.IO - PullRequest
0 голосов
/ 31 декабря 2018

Возникают проблемы при создании модулей с использованием 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")
     }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...