You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

158 line
3.7 KiB

  1. var app = require('express')();
  2. var http = require('http').Server(app);
  3. var io = require('socket.io')(http);
  4. var cookie = require('cookie')
  5. var fs = require('fs');
  6. var redis = require("redis")
  7. var subscriber = redis.createClient(12311);
  8. var r = redis.createClient(12311);
  9. var request = require('superagent')
  10. var default_site;
  11. if(fs.existsSync('sites/currentsite.txt')) {
  12. default_site = fs.readFileSync('sites/currentsite.txt').toString().trim();
  13. }
  14. app.get('/', function(req, res){
  15. res.sendfile('index.html');
  16. });
  17. io.on('connection', function(socket){
  18. if (get_hostname(socket.request.headers.host) != get_hostname(socket.request.headers.origin)) {
  19. return;
  20. }
  21. // console.log("connection!");
  22. var sid = cookie.parse(socket.request.headers.cookie).sid
  23. if(!sid) {
  24. return;
  25. }
  26. // console.log("firing get_user_info");
  27. request.post(get_url(socket, '/api/method/frappe.async.get_user_info'))
  28. .type('form')
  29. .send({
  30. sid: sid
  31. })
  32. .end(function(err, res) {
  33. if(err) {
  34. console.log(err);
  35. return;
  36. }
  37. if(res.status == 200) {
  38. var room = get_user_room(socket, res.body.message.user);
  39. // console.log('joining', room);
  40. socket.join(room);
  41. socket.join(get_site_room(socket));
  42. }
  43. });
  44. socket.on('task_subscribe', function(task_id) {
  45. var room = 'task:' + task_id;
  46. socket.join(room);
  47. });
  48. socket.on('progress_subscribe', function(task_id) {
  49. var room = 'task_progress:' + task_id;
  50. socket.join(room);
  51. send_existing_lines(task_id, socket);
  52. });
  53. socket.on('doc_subscribe', function(doctype, docname) {
  54. // console.log('trying to subscribe', doctype, docname)
  55. request.post(get_url(socket, '/api/method/frappe.async.can_subscribe_doc'))
  56. .type('form')
  57. .send({
  58. sid: sid,
  59. doctype: doctype,
  60. docname: docname
  61. })
  62. .end(function(err, res) {
  63. if(err) console.log(err);
  64. if(res.status == 200) {
  65. var room = get_doc_room(socket, doctype, docname);
  66. // console.log('joining', room)
  67. socket.join(room);
  68. }
  69. })
  70. });
  71. socket.on('doc_unsubscribe', function(doctype, docname) {
  72. var room = get_doc_room(socket, doctype, docname);
  73. socket.leave(room);
  74. });
  75. // socket.on('disconnect', function (arguments) {
  76. // console.log("user disconnected", arguments);
  77. // });
  78. });
  79. function send_existing_lines(task_id, socket) {
  80. r.hgetall('task_log:' + task_id, function(err, lines) {
  81. socket.emit('task_progress', {
  82. "task_id": task_id,
  83. "message": {
  84. "lines": lines
  85. }
  86. })
  87. })
  88. }
  89. subscriber.on("message", function(channel, message) {
  90. message = JSON.parse(message);
  91. io.to(message.room).emit(message.event, message.message);
  92. // console.log(message.room, message.event, message.message)
  93. });
  94. subscriber.subscribe("events");
  95. http.listen(3000, function(){
  96. console.log('listening on *:3000');
  97. });
  98. function get_doc_room(socket, doctype, docname) {
  99. return get_site_name(socket) + ':doc:'+ doctype + '/' + docname;
  100. }
  101. function get_user_room(socket, user) {
  102. return get_site_name(socket) + ':user:' + user;
  103. }
  104. function get_site_room(socket) {
  105. return get_site_name(socket) + ':all';
  106. }
  107. function get_site_name(socket) {
  108. if (default_site) {
  109. return default_site;
  110. }
  111. else if (socket.request.headers['x-frappe-site-name']) {
  112. return get_hostname(socket.request.headers['x-frappe-site-name']);
  113. }
  114. else if (socket.request.headers.origin) {
  115. return get_hostname(socket.request.headers.origin);
  116. }
  117. else {
  118. return get_hostname(socket.request.headers.host);
  119. }
  120. }
  121. function get_hostname(url) {
  122. if (!url) return undefined;
  123. if (url.indexOf("://") > -1) {
  124. url = url.split('/')[2];
  125. }
  126. return ( url.match(/:/g) ) ? url.slice( 0, url.indexOf(":") ) : url
  127. }
  128. function get_url(socket, path) {
  129. if (!path) {
  130. path = '';
  131. }
  132. return socket.request.headers.origin + path;
  133. }