Я создал приложение в Ionic 4, а для бэкэнда я использую Lumen.Приложение должно иметь страницу чата, и для этого я добавляю Redis, Socket.io и nodejs.Я успешно создал публичную комнату, и чат между пользователями в этой комнате работает.Проблема в том, как отправить личное сообщение для пользователя, как инициализировать пользователей для их личной комнаты.
Вот как я создал публичную комнату:
constructor(private socket: Socket) {
this.getMessages().subscribe(message => {
this.messages.push(message);
});
}
getMessages() {
const observable = new Observable(observer => {
this.socket.on('message', (data) => {
observer.next(data);
});
});
return observable;
}
Я отправляю сообщение из приложения Lumen и Redis:
public function sendMessage()
{
$redis = Redis::Connection();
$sendMessage = json_encode(['user' => 'John Doe', 'text' => 'Some message, text', 'channel' => 'message']);
$redis->publish('add-message', $sendMessage);
}
И мой сервер узла:
let express = require('express');
let app = express();
let http = require('http').Server(app);
let redis = require('redis');
let client = redis.createClient("redis://127.0.0.1:6379");
let io = require('socket.io')(http);
app.use('/', express.static('www'));
http.listen(3000, '192.168.10.10', function(){
console.log('listening on *:3000');
});
client.on('message', function(chan, msg) {
let data = JSON.parse(msg);
io.sockets.emit(data.channel, msg);
});
client.subscribe('add-message');
В итоге все, кто подписан на канал 'message', получат сообщение.Проблема в том, что я подписываю пользователя на канал, когда захожу на страницу чата.Я не знаю, как подписать пользователя и когда на канале, где какой-то другой пользователь отправляет ему сообщение. Также как этот отправитель создает новую комнату, я предполагаю использовать id пользователей для имени комнаты (для экземпляра user1_user2).
Кто-нибудь знает, как я могу решить эту проблему?Я не знаю, даже я хорошо описал.
Заранее спасибо