ws-server.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // ===========================================
  2. // REQUARKS WIKI - WebSocket Server
  3. // 1.0.0
  4. // Licensed under AGPLv3
  5. // ===========================================
  6. global.ROOTPATH = __dirname;
  7. global.PROCNAME = 'WS';
  8. // ----------------------------------------
  9. // Load Winston
  10. // ----------------------------------------
  11. var _isDebug = process.env.NODE_ENV === 'development';
  12. global.winston = require('./lib/winston')(_isDebug);
  13. // ----------------------------------------
  14. // Fetch internal handshake key
  15. // ----------------------------------------
  16. if(!process.argv[2] || process.argv[2].length !== 40) {
  17. winston.error('[WS] Illegal process start. Missing handshake key.');
  18. process.exit(1);
  19. }
  20. global.internalAuth = require('./lib/internalAuth').init(process.argv[2]);;
  21. // ----------------------------------------
  22. // Load global modules
  23. // ----------------------------------------
  24. winston.info('[WS] WS Server is initializing...');
  25. var appconfig = require('./models/config')('./config.yml');
  26. global.db = require('./models/mongo').init(appconfig);
  27. global.upl = require('./models/ws/uploads').init(appconfig);
  28. global.entries = require('./models/entries').init(appconfig);
  29. global.mark = require('./models/markdown');
  30. global.search = require('./models/ws/search').init(appconfig);
  31. // ----------------------------------------
  32. // Load local modules
  33. // ----------------------------------------
  34. var _ = require('lodash');
  35. var express = require('express');
  36. var path = require('path');
  37. var http = require('http');
  38. var socketio = require('socket.io');
  39. var moment = require('moment');
  40. // ----------------------------------------
  41. // Define Express App
  42. // ----------------------------------------
  43. global.app = express();
  44. // ----------------------------------------
  45. // Controllers
  46. // ----------------------------------------
  47. app.get('/', function(req, res){
  48. res.send('Requarks Wiki WebSocket server');
  49. });
  50. // ----------------------------------------
  51. // Start WebSocket server
  52. // ----------------------------------------
  53. winston.info('[SERVER] Starting WebSocket server on port ' + appconfig.wsPort + '...');
  54. app.set('port', appconfig.wsPort);
  55. var server = http.Server(app);
  56. var io = socketio(server);
  57. server.on('error', (error) => {
  58. if (error.syscall !== 'listen') {
  59. throw error;
  60. }
  61. switch (error.code) {
  62. case 'EACCES':
  63. console.error('Listening on port ' + appconfig.port + ' requires elevated privileges!');
  64. process.exit(1);
  65. break;
  66. case 'EADDRINUSE':
  67. console.error('Port ' + appconfig.port + ' is already in use!');
  68. process.exit(1);
  69. break;
  70. default:
  71. throw error;
  72. }
  73. });
  74. server.listen(appconfig.wsPort, () => {
  75. winston.info('[WS] WebSocket server started successfully! [RUNNING]');
  76. });
  77. io.on('connection', (socket) => {
  78. //-----------------------------------------
  79. // SEARCH
  80. //-----------------------------------------
  81. socket.on('searchAdd', (data) => {
  82. if(internalAuth.validateKey(data.auth)) {
  83. search.add(data.content);
  84. }
  85. });
  86. socket.on('searchDel', (data, cb) => {
  87. cb = cb || _.noop;
  88. if(internalAuth.validateKey(data.auth)) {
  89. search.delete(data.entryPath);
  90. }
  91. });
  92. socket.on('search', (data, cb) => {
  93. cb = cb || _.noop;
  94. search.find(data.terms).then((results) => {
  95. cb(results);
  96. });
  97. });
  98. //-----------------------------------------
  99. // UPLOADS
  100. //-----------------------------------------
  101. socket.on('uploadsSetFolders', (data) => {
  102. if(internalAuth.validateKey(data.auth)) {
  103. upl.setUploadsFolders(data.content);
  104. }
  105. });
  106. socket.on('uploadsGetFolders', (data, cb) => {
  107. cb = cb || _.noop;
  108. cb(upl.getUploadsFolders());
  109. });
  110. socket.on('uploadsValidateFolder', (data, cb) => {
  111. cb = cb || _.noop;
  112. if(internalAuth.validateKey(data.auth)) {
  113. cb(upl.validateUploadsFolder(data.content));
  114. }
  115. });
  116. socket.on('uploadsCreateFolder', (data, cb) => {
  117. cb = cb || _.noop;
  118. upl.createUploadsFolder(data.foldername).then((fldList) => {
  119. cb(fldList);
  120. });
  121. });
  122. socket.on('uploadsSetFiles', (data) => {
  123. if(internalAuth.validateKey(data.auth)) {
  124. upl.setUploadsFiles(data.content);
  125. }
  126. });
  127. socket.on('uploadsAddFiles', (data) => {
  128. if(internalAuth.validateKey(data.auth)) {
  129. upl.addUploadsFiles(data.content);
  130. }
  131. });
  132. socket.on('uploadsGetImages', (data, cb) => {
  133. cb = cb || _.noop;
  134. cb(upl.getUploadsFiles('image', data.folder));
  135. });
  136. });
  137. // ----------------------------------------
  138. // Shutdown gracefully
  139. // ----------------------------------------
  140. process.on('disconnect', () => {
  141. winston.warn('[WS] Lost connection to main server. Exiting... [' + moment().toISOString() + ']');
  142. server.close();
  143. process.exit();
  144. });
  145. process.on('exit', () => {
  146. server.stop();
  147. });