Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

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