From 88f9281e3b5359f35d0c43c2b77b300c6b7557af Mon Sep 17 00:00:00 2001 From: Pratik Vyas Date: Wed, 22 Jul 2015 11:44:09 +0530 Subject: [PATCH] Namespace rooms to site --- frappe/async.py | 10 +++++--- socketio.js | 66 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/frappe/async.py b/frappe/async.py index c30db09694..27ffb0e1c6 100644 --- a/frappe/async.py +++ b/frappe/async.py @@ -196,14 +196,18 @@ def new_comment(doc, event): if doc.comment_docname == frappe.session.user: message = doc.as_dict() message['broadcast'] = True - emit_via_redis('new_message', message, room=get_url()) + emit_via_redis('new_message', message, room=get_site_room()) else: emit_via_redis('new_message', doc.as_dict(), room=get_user_room(doc.comment_docname)) else: emit_via_redis('new_comment', doc.as_dict(), room=get_doc_room(doc.comment_doctype, doc.comment_docname)) def get_doc_room(doctype, docname): - return ''.join(['doc:', doctype, '/', docname]) + return ''.join([frappe.local.site, ':doc:', doctype, '/', docname]) def get_user_room(user): - return ''.join(['user:', user]) + return ''.join([frappe.local.site, ':user:', user]) + +def get_site_room(): + return ''.join([frappe.local.site, ':all']) + diff --git a/socketio.js b/socketio.js index 3fabac99b0..2c361664d5 100644 --- a/socketio.js +++ b/socketio.js @@ -2,31 +2,46 @@ var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var cookie = require('cookie') +var fs = require('fs'); var redis = require("redis") var subscriber = redis.createClient(12311); var r = redis.createClient(12311); var request = require('superagent') +var default_site; + + + +if(fs.existsSync('sites/currentsite.txt')) { + default_site = fs.readFileSync('sites/currentsite.txt').toString().trim(); +} app.get('/', function(req, res){ res.sendfile('index.html'); }); io.on('connection', function(socket){ - socket.join(socket.request.headers.origin); + if (get_hostname(socket.request.headers.host) != get_hostname(socket.request.headers.origin)) { + return; + } var sid = cookie.parse(socket.request.headers.cookie).sid if(!sid) { return; } - request.post('http://localhost:8000/api/method/frappe.async.get_user_info') + request.post(get_url(socket, '/api/method/frappe.async.get_user_info')) .type('form') .send({ sid: sid }) .end(function(err, res) { + if(err) { + console.log(err); + return; + } if(res.status == 200) { - var room = get_user_room(res.body.message.user); + var room = get_user_room(socket, res.body.message.user); + // console.log('joining', room); socket.join(room); } }) @@ -55,7 +70,7 @@ io.on('connection', function(socket){ }) }); socket.on('doc_unsubscribe', function(doctype, docname) { - var room = get_doc_room(doctype, docname); + var room = get_doc_room(socket, doctype, docname); socket.leave(room); }); }); @@ -75,7 +90,7 @@ function send_existing_lines(task_id, socket) { subscriber.on("message", function(channel, message) { message = JSON.parse(message); io.to(message.room).emit(message.event, message.message); - console.log(message.room, message.event, message.message) + // console.log(message.room, message.event, message.message) }); subscriber.subscribe("events"); @@ -84,10 +99,43 @@ http.listen(3000, function(){ console.log('listening on *:3000'); }); -function get_doc_room(doctype, docname) { - return 'doc:'+ doctype + '/' + docname; +function get_doc_room(socket, doctype, docname) { + return get_site_room(socket) + ':doc:'+ doctype + '/' + docname; +} + +function get_user_room(socket, user) { + return get_site_room(socket) + ':user:' + user; +} + +function get_site_room(socket) { + return get_site_name(socket) + ':all'; +} + +function get_site_name(socket) { + if (default_site) { + return default_site; + } + else if (socket.request.headers['x-frappe-site-name']) { + return get_hostname(socket.request.headers['x-frappe-site-name']); + } + else if (socket.request.headers.origin) { + return get_hostname(socket.request.headers.origin); + } + else { + return get_hostname(socket.request.headers.host); + } +} + +function get_hostname(url) { + if (url.indexOf("://") > -1) { + url = url.split('/')[2]; + } + return ( url.match(/:/g) ) ? url.slice( 0, url.indexOf(":") ) : url } -function get_user_room(user) { - return 'user:' + user; +function get_url(socket, path) { + if (!path) { + path = ''; + } + return socket.request.headers.origin + path; }