Skip to content

Instantly share code, notes, and snippets.

@jandosul
Created September 20, 2013 18:00
Show Gist options
  • Save jandosul/6641366 to your computer and use it in GitHub Desktop.
Save jandosul/6641366 to your computer and use it in GitHub Desktop.
Node.js chat with redis pub/sub php session
//var express = require('express');
var sockjs = require('sockjs');
var http = require('http');
var redis = require('redis');
// Redis publisher
var publisher = redis.createClient();
// Sockjs server
var sockjs_opts = {sockjs_url: "http://cdn.sockjs.org/sockjs-0.3.min.js"};
var sockjs_chat = sockjs.createServer(sockjs_opts);
sockjs_chat.on('connection', function(conn) {
conn.authenticated = false;
console.log(conn.headers);
var browser = redis.createClient();
// Set channel name to channel-{userid}
// var channel = 'channel-1';
// browser.subscribe(channel);
// When we see a message on chat_channel, send it to the browser
browser.on("message", function(channel, message){
console.log('Writing to channel '+channel+' the message '+message);
conn.write(message);
});
// When we receive a message from browser, send it to be published
conn.on('data', function(message) {
console.log('New message from client '+message);
message = message.split(',');
// console.log('New message from client '+message[0]+':'+message[1]);
var req = {type:message[0],body:message[1]};
// message = JSON.parse(message);
if(req.type!='auth' && !conn.authenticated)
return;
if(req.type=='auth'){
// Authenticate user
browser.get("sessions/"+req.body, function(error, result){
if(error != null){
console.log("error : "+error);
}
if(result != null){
conn.authenticated = true;
console.log('Successful auth');
result = JSON.parse(result);
console.log("Result exist: "+result.guid);
channel = 'channel-'+parseInt(result.guid);
browser.subscribe(channel);
conn.write('auth,ok,subscribed to channel:'+channel);
// console.log(result.toString());
}else{
console.log('Unsuccessfull auth with token '+req.body);
console.log("session does not exist");
conn.write('auth,error,sessionnotfound');
}
});
}else if(req.type=='data'){
// Parse user message
console.log('Publish message '+message[3]);
// console.log('Wrinting to channel-'+message[1]);
// console.log('Wrinting to channel-'+message[2]);
message.shift();
var msg = message.join(',');
console.log('Publishing message '+msg+' to channels '+message[0]+','+message[1]);
publisher.publish('channel-'+message[0], msg);
publisher.publish('channel-'+message[1], msg);
}
});
conn.on('close', function(){
conn.authenticated = false;
});
});
var server = http.createServer();
sockjs_chat.installHandlers(server, {prefix:'/chat'});
console.log(' [*] Listening on 0.0.0.0:9999' );
server.listen(9999, '0.0.0.0');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment