Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

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