ws-server.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. let lcdata = require('./models/localdata').init(appconfig, 'ws');
  27. global.entries = require('./models/entries').init(appconfig);
  28. global.mark = require('./models/markdown');
  29. global.search = require('./models/search').init(appconfig);
  30. // ----------------------------------------
  31. // Load local modules
  32. // ----------------------------------------
  33. var _ = require('lodash');
  34. var express = require('express');
  35. var path = require('path');
  36. var http = require('http');
  37. var socketio = require('socket.io');
  38. var moment = require('moment');
  39. // ----------------------------------------
  40. // Define Express App
  41. // ----------------------------------------
  42. global.app = express();
  43. // ----------------------------------------
  44. // Controllers
  45. // ----------------------------------------
  46. app.get('/', function(req, res){
  47. res.send('Requarks Wiki WebSocket server');
  48. });
  49. // ----------------------------------------
  50. // Start WebSocket server
  51. // ----------------------------------------
  52. winston.info('[SERVER] Starting WebSocket server on port ' + appconfig.wsPort + '...');
  53. app.set('port', appconfig.wsPort);
  54. var server = http.Server(app);
  55. var io = socketio(server);
  56. server.on('error', (error) => {
  57. if (error.syscall !== 'listen') {
  58. throw error;
  59. }
  60. switch (error.code) {
  61. case 'EACCES':
  62. console.error('Listening on port ' + appconfig.port + ' requires elevated privileges!');
  63. process.exit(1);
  64. break;
  65. case 'EADDRINUSE':
  66. console.error('Port ' + appconfig.port + ' is already in use!');
  67. process.exit(1);
  68. break;
  69. default:
  70. throw error;
  71. }
  72. });
  73. server.listen(appconfig.wsPort, () => {
  74. winston.info('[WS] WebSocket server started successfully! [RUNNING]');
  75. });
  76. io.on('connection', (socket) => {
  77. //-----------------------------------------
  78. // SEARCH
  79. //-----------------------------------------
  80. socket.on('searchAdd', (data) => {
  81. if(internalAuth.validateKey(data.auth)) {
  82. search.add(data.content);
  83. }
  84. });
  85. socket.on('searchDel', (data, cb) => {
  86. if(internalAuth.validateKey(data.auth)) {
  87. search.delete(data.entryPath);
  88. }
  89. });
  90. socket.on('search', (data, cb) => {
  91. search.find(data.terms).then((results) => {
  92. cb(results);
  93. });
  94. });
  95. //-----------------------------------------
  96. // UPLOADS
  97. //-----------------------------------------
  98. socket.on('uploadsSetFolders', (data, cb) => {
  99. if(internalAuth.validateKey(data.auth)) {
  100. lcdata.setUploadsFolders(data.content);
  101. }
  102. });
  103. socket.on('uploadsGetFolders', (data, cb) => {
  104. cb(lcdata.getUploadsFolders());
  105. });
  106. socket.on('uploadsCreateFolder', (data, cb) => {
  107. lcdata.createUploadsFolder(data.foldername).then((fldList) => {
  108. cb(fldList);
  109. });
  110. });
  111. socket.on('uploadsSetFiles', (data, cb) => {
  112. if(internalAuth.validateKey(data.auth)) {
  113. lcdata.setUploadsFiles(data.content);
  114. }
  115. });
  116. socket.on('uploadsGetImages', (data, cb) => {
  117. cb(lcdata.getUploadsFiles('image', data.folder));
  118. });
  119. });
  120. // ----------------------------------------
  121. // Shutdown gracefully
  122. // ----------------------------------------
  123. process.on('disconnect', () => {
  124. winston.warn('[WS] Lost connection to main server. Exiting... [' + moment().toISOString() + ']');
  125. server.close();
  126. process.exit();
  127. });
  128. process.on('exit', () => {
  129. server.stop();
  130. });