Использование websocket для отправки сообщений между двумя пользователями, но отправляет только один пользователь

Высокий уровень

< <

Я делаю это, подключая обоих пользователей к веб-сокету. После подключения каждый пользователь должен отправить сообщение другому пользователю вместе с идентификатором комнаты, в которую я буду перенаправлять пользователей.

Суть проблемы в том, что только пользователь, подключившийся к вебсокету последним, отправляет сообщение первому пользователю, а не наоборот

Желаемое действие

Это желаемое действие

  1. ПользовательА подключается к вебсокету
  2. ПользовательВ подключается к вебсокету
  3. UserA посылает обратно UserB, UserB's user_id, вместе с roomID
  4. UserB отправляет обратно UserA, UserA's user_id, вместе с roomID
  5. .

Это то, что происходит в настоящее время

  1. ПользовательА подключается к вебсокету
  2. ПользовательВ подключается к вебсокету
  3. UserB отправляет обратно UserA, UserA's user_id, вместе с roomID

Вот мой код фронтенда:

...
    connect() {
        const args = JSON.parse(localStorage.getItem('authTokens'))
        const queryString = args.refresh
        const path = `ws://127.0.0.1:8000/connect/testing/?${queryString}`;
        this.socketRef = new WebSocket(path);
        this.socketRef.onopen = (data) => {
            console.log('WebSocket open');
        }
        this.socketRef.onerror = e => {
            console.log(e);
        };
    }
    async sendData(data){
        if(this.socketRef.readyState !== WebSocket.OPEN) {
            console.log('we are still waiting')
            this.socketRef.onopen = () => this.socketRef.send(data);
            const socketResp = await new Promise((resolve, reject) => {
                this.socketRef.onmessage = e => {
                resolve(JSON.parse(e.data))
                }
            })
        }
    };
}

и вот код бэкенда:

class PracticeConsumer(AsyncWebsocketConsumer):
    async def websocket_connect(self, event):
        username = self.scope['user']
        username_id = str(await self.get_user(username))
        group_name = username_id
        #subscribe user to group
        await self.channel_layer.group_add(
            '{}'.format(group_name),
            self.channel_name
        )
        await self.accept()

    async def websocket_receive(self, event):
        received = event["text"]
        invite_data = received.split()
        matched_user = invite_data[0]
        room_id = invite_data[1]
        username = invite_data[2]
        user_id = str(await self.get_user(matched_user))
        my_response = {
            "message": {'matched_user': matched_user,
                        'username': username,
                        'user_id': user_id,
                        'room_id': room_id
                        }
        }
        sleep(1)
        await self.channel_layer.group_send(
            '{}'.format(user_id),
            {
                "type": "send.message",
                "message": json.dumps(my_response),
                "username": username
            })
    async def send_message(self, event):
        message = event['message']
        logger.info(f'sending message inside presenter{message}')
        await self.send(text_data=json.dumps({
            'type': 'send_message',
            'text': message
        }))
Вернуться на верх