소스 검색

Namespace rooms to site

version-14
Pratik Vyas 10 년 전
부모
커밋
88f9281e3b
2개의 변경된 파일64개의 추가작업 그리고 12개의 파일을 삭제
  1. +7
    -3
      frappe/async.py
  2. +57
    -9
      socketio.js

+ 7
- 3
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'])

+ 57
- 9
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;
}

불러오는 중...
취소
저장