您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

147 行
3.5 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. var sid = cookie.parse(socket.request.headers.cookie).sid
  22. if(!sid) {
  23. return;
  24. }
  25. request.post(get_url(socket, '/api/method/frappe.async.get_user_info'))
  26. .type('form')
  27. .send({
  28. sid: sid
  29. })
  30. .end(function(err, res) {
  31. if(err) {
  32. console.log(err);
  33. return;
  34. }
  35. if(res.status == 200) {
  36. var room = get_user_room(socket, res.body.message.user);
  37. // console.log('joining', room);
  38. socket.join(room);
  39. socket.join(get_site_room(socket));
  40. }
  41. })
  42. socket.on('task_subscribe', function(task_id) {
  43. var room = 'task:' + task_id;
  44. socket.join(room);
  45. })
  46. socket.on('progress_subscribe', function(task_id) {
  47. var room = 'task_progress:' + task_id;
  48. socket.join(room);
  49. send_existing_lines(task_id, socket);
  50. })
  51. socket.on('doc_subscribe', function(doctype, docname) {
  52. // console.log('trying to subscribe', doctype, docname)
  53. request.post(get_url(socket, '/api/method/frappe.async.can_subscribe_doc'))
  54. .type('form')
  55. .send({
  56. sid: sid,
  57. doctype: doctype,
  58. docname: docname
  59. })
  60. .end(function(err, res) {
  61. if(err) console.log(err);
  62. if(res.status == 200) {
  63. var room = get_doc_room(socket, doctype, docname);
  64. // console.log('joining', room)
  65. socket.join(room);
  66. }
  67. })
  68. });
  69. socket.on('doc_unsubscribe', function(doctype, docname) {
  70. var room = get_doc_room(socket, doctype, docname);
  71. socket.leave(room);
  72. });
  73. });
  74. function send_existing_lines(task_id, socket) {
  75. r.hgetall('task_log:' + task_id, function(err, lines) {
  76. socket.emit('task_progress', {
  77. "task_id": task_id,
  78. "message": {
  79. "lines": lines
  80. }
  81. })
  82. })
  83. }
  84. subscriber.on("message", function(channel, message) {
  85. message = JSON.parse(message);
  86. io.to(message.room).emit(message.event, message.message);
  87. // console.log(message.room, message.event, message.message)
  88. });
  89. subscriber.subscribe("events");
  90. http.listen(3000, function(){
  91. console.log('listening on *:3000');
  92. });
  93. function get_doc_room(socket, doctype, docname) {
  94. return get_site_name(socket) + ':doc:'+ doctype + '/' + docname;
  95. }
  96. function get_user_room(socket, user) {
  97. return get_site_name(socket) + ':user:' + user;
  98. }
  99. function get_site_room(socket) {
  100. return get_site_name(socket) + ':all';
  101. }
  102. function get_site_name(socket) {
  103. if (default_site) {
  104. return default_site;
  105. }
  106. else if (socket.request.headers['x-frappe-site-name']) {
  107. return get_hostname(socket.request.headers['x-frappe-site-name']);
  108. }
  109. else if (socket.request.headers.origin) {
  110. return get_hostname(socket.request.headers.origin);
  111. }
  112. else {
  113. return get_hostname(socket.request.headers.host);
  114. }
  115. }
  116. function get_hostname(url) {
  117. if (!url) return undefined;
  118. if (url.indexOf("://") > -1) {
  119. url = url.split('/')[2];
  120. }
  121. return ( url.match(/:/g) ) ? url.slice( 0, url.indexOf(":") ) : url
  122. }
  123. function get_url(socket, path) {
  124. if (!path) {
  125. path = '';
  126. }
  127. return socket.request.headers.origin + path;
  128. }