one to one chat app with node.js, socket.io and redis

user3455531 picture user3455531 · Aug 25, 2014 · Viewed 8.2k times · Source

I currently have a chat application(one to one) in node.js and socket.io. as the users in my website are increasing, i want to introduce redis in my chat app. Here is a small example of my current app:

// all requires and connections
io.sockets.on('connection', function(socket) {

socket.on('message', function(msg) {
// code to get receiverssocket 
io.sockets.sockets[receiverssocket].emit('message',
{"source": msg.sendersusername,"msg": msg.msg});

});

});

Now, i am trying to find examples of how to do this with redis, but i cannot find an example of one to one chats with redis. i can only find examples in which messages are sent to all the users. Here is one of the examples i looked at

http://garydengblog.wordpress.com/2013/06/28/simple-chat-application-using-redis-socket-io-and-node-js/

One way of i thought of doing this was to create channels for each user receiving messages, but that would result in thousands of channels. Any help on how i can do this?

Edit: added some code

io.sockets.on('connection', function (client) {

sub.on("message", function (channel, message) {
console.log("message received on server from publish ");
client.send(message);
});
client.on("message", function (msg) {
console.log(msg);
if(msg.type == "chat"){
    pub.publish("chatting." + msg.tousername,msg.message);
}
else if(msg.type == "setUsername"){
  sub.subscribe("chatting." + msg.user);
  sub.subscribe("chatting.all" );
  pub.publish("chatting.all","A new user in connected:" + msg.user);
  store.sadd("onlineUsers",msg.user);
}
});
client.on('disconnect', function () {
sub.quit();
pub.publish("chatting.all","User is disconnected :" + client.id);
});

});

Answer

Philippe T. picture Philippe T. · Aug 25, 2014

You have to publish on a dedicated User channel. I think that there is no other way. But don't worry, pub/sub channels are volatile, so that should work well.

Instead of publishing to chatting, publish your message on chatting.username, and subscribe to both.

io.sockets.on('connection', function (client) {

    sub.subscribe("chatting." + client.id);
    sub.subscribe("chatting.all" );

    sub.on("message", function (channel, message) {
        console.log("message received on server from publish ");
        client.send(message);
    });

    client.on("message", function (msg) {
        console.log(msg);
        // supose that msg have a iduserto that is the distant contact id
        if(msg.type == "chat") {
            pub.publish("chatting." + msg.iduserto,msg.message);
        }
        else if(msg.type == "setUsername") {
            pub.publish("chatting.all","A new user in connected:" + msg.user);
            store.sadd("onlineUsers",msg.user);
        }
    });

    client.on('disconnect', function () {
        sub.quit();
        pub.publish("chatting.all","User is disconnected :" + client.id);
    });
});