Как индексировать WebSocket соединения библиотеки ws?

привет я делаю простой чатик но с одной фишкой что отвечать на сообщения людям можно через telegram бота, так вот такая проблема что когда я пишу ответ с телеграма сообщение отправляется всем пользователям которые соеденины, и я уже многое испробовал но вот что у меня получилось
bot.start((ctx) => {
      console.log(ctx.update.message.chat)
      ctx.reply('Welcome')
    })
    
    wss.on('error', err => {
      console.log(err)
    })
    wss.on('connection', async ws => {
      const newConnection = {
        uid: uid(16),
        connection: ws
      }
      clients.add(newConnection)

      bot.command('send', (ctx) => {
        const telegramMessage = ctx.message.text.replace('/send', '')
        const queryConnectionUID = telegramMessage.substr(telegramMessage.indexOf('uid: ') + 5, telegramMessage.indexOf(';') - 6)
        ctx.reply(queryConnectionUID)
        clients.forEach(client => {
          if (client.uid === queryConnectionUID) {
            client.connection.send(JSON.stringify({
              action: 'sendMessage',
              agent: 'telegram',
              data: {
                result: true,
                phoneNumber: '+7(777)-777-77-77',
                userName: 'Administrator',
                message: telegramMessage.substr(telegramMessage.indexOf(';') + 2)
              }
            }))
          } else {
            ctx.reply(`uid is wrong; ${client.uid} != ${queryConnectionUID}`)
          }
        })
      })
      bot.launch()

      ws.on('message', async msg => {
        msg = JSON.parse(msg)
        const data = msg.data

        if (msg.action === 'check') {
          bot.telegram.sendMessage('-32432344', 
            `new message sended from\nuid: ${newConnection.uid}\nname: ${data.userName}\nphone: ${data.phoneNumber}\nmessage:\n  ${data.message}`
          )
        }
        else if (msg.action === 'message') {
          const result = await mongoMessages.updateOne({ phoneNumber: data.phoneNumber }, {$push: { messages: data.message }})
          ws.send(JSON.stringify({
            action: 'sendMessage',
            agent: 'server',
            data: {
              result: result,
              phoneNumber: data.phoneNumber,
              userName: data.userName,
              message: data.message
            }
          }))
        }
      })

      ws.on('close', () => {
        clients.delete(ws)
        console.log(`deleted: ${ws}`, clients)
      })
    })
    bot.launch()

вот это основной кусок кода, я думаю что я слишком намудрил и думаю что это можно сделать проще, основная проблема в том что при создании соединения я даю ему uid а при disconnect я не знаю какое соединение из массива удалить ведь на сколько я понимаю disconnect ничего не возвращает
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@Bazyn
Если я правельно понял проблему
wss.on('connection', async ws => {
    const newConnection = {
        uid: uid(16),
        connection: ws
    }
    clients.add(newConnection)

    ws.on('disconnect', () => {
       //clients похоже на Set, тогда так. Или отфильтровать через newConnection.uid если простой массив.
       //newConnection доступна нам тут вследствии замыкание.
        clients.delete(newConnection);       
    });
})
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы