Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

162 рядки
3.8 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.get(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.get(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) {
  65. console.log("No response for doc_subscribe");
  66. return;
  67. }
  68. if(res.status == 200) {
  69. var room = get_doc_room(socket, doctype, docname);
  70. // console.log('joining', room)
  71. socket.join(room);
  72. }
  73. })
  74. });
  75. socket.on('doc_unsubscribe', function(doctype, docname) {
  76. var room = get_doc_room(socket, doctype, docname);
  77. socket.leave(room);
  78. });
  79. // socket.on('disconnect', function (arguments) {
  80. // console.log("user disconnected", arguments);
  81. // });
  82. });
  83. function send_existing_lines(task_id, socket) {
  84. r.hgetall('task_log:' + task_id, function(err, lines) {
  85. socket.emit('task_progress', {
  86. "task_id": task_id,
  87. "message": {
  88. "lines": lines
  89. }
  90. })
  91. })
  92. }
  93. subscriber.on("message", function(channel, message) {
  94. message = JSON.parse(message);
  95. io.to(message.room).emit(message.event, message.message);
  96. // console.log(message.room, message.event, message.message)
  97. });
  98. subscriber.subscribe("events");
  99. http.listen(3000, function(){
  100. console.log('listening on *:3000');
  101. });
  102. function get_doc_room(socket, doctype, docname) {
  103. return get_site_name(socket) + ':doc:'+ doctype + '/' + docname;
  104. }
  105. function get_user_room(socket, user) {
  106. return get_site_name(socket) + ':user:' + user;
  107. }
  108. function get_site_room(socket) {
  109. return get_site_name(socket) + ':all';
  110. }
  111. function get_site_name(socket) {
  112. if (default_site) {
  113. return default_site;
  114. }
  115. else if (socket.request.headers['x-frappe-site-name']) {
  116. return get_hostname(socket.request.headers['x-frappe-site-name']);
  117. }
  118. else if (socket.request.headers.origin) {
  119. return get_hostname(socket.request.headers.origin);
  120. }
  121. else {
  122. return get_hostname(socket.request.headers.host);
  123. }
  124. }
  125. function get_hostname(url) {
  126. if (!url) return undefined;
  127. if (url.indexOf("://") > -1) {
  128. url = url.split('/')[2];
  129. }
  130. return ( url.match(/:/g) ) ? url.slice( 0, url.indexOf(":") ) : url
  131. }
  132. function get_url(socket, path) {
  133. if (!path) {
  134. path = '';
  135. }
  136. return socket.request.headers.origin + path;
  137. }