index.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. require('tls').DEFAULT_MIN_VERSION = 'TLSv1';
  2. process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
  3. const fs = require('fs-extra');
  4. const express = require('express');
  5. const compression = require('compression');
  6. const http = require('http');
  7. const https = require('https');
  8. const WebSocket = require ('ws');
  9. const ayncExit = new (require('./core/AsyncExit'))();
  10. let log = null;
  11. let config;
  12. let argv;
  13. let branch = '';
  14. const argvStrings = ['host', 'port', 'app-dir', 'lib-dir', 'inpx'];
  15. const maxPayloadSize = 50;//in MB
  16. function versionText(config) {
  17. return `${config.name} v${config.version}, Node.js ${process.version}`;
  18. }
  19. function showHelp(defaultConfig) {
  20. console.log(versionText(defaultConfig));
  21. console.log(
  22. `Usage: ${defaultConfig.name} [options]
  23. Options:
  24. --help Print ${defaultConfig.name} command line options
  25. --app-dir=<dirpath> Set application working directory, default: <execDir>/.${defaultConfig.name}
  26. --auto-repair Force auto repairing of corrupted database on start
  27. `
  28. );
  29. }
  30. async function init() {
  31. argv = require('minimist')(process.argv.slice(2), {string: argvStrings});
  32. const dataDir = argv['app-dir'];
  33. //config
  34. const configManager = new (require('./config'))();//singleton
  35. await configManager.init(dataDir);
  36. const defaultConfig = configManager.config;
  37. await configManager.load();
  38. config = configManager.config;
  39. branch = config.branch;
  40. //dirs
  41. config.tempDir = `${config.dataDir}/tmp`;
  42. config.logDir = `${config.dataDir}/log`;
  43. config.publicDir = `${config.dataDir}/public`;
  44. config.publicFilesDir = `${config.dataDir}/public-files`;
  45. config.tempPublicDir = `${config.publicFilesDir}/tmp`;
  46. config.uploadPublicDir = `${config.publicFilesDir}/upload`;
  47. config.rootPathStatic = '';
  48. configManager.config = config;///!!!
  49. await fs.ensureDir(config.dataDir);
  50. await fs.ensureDir(config.publicDir);
  51. await fs.ensureDir(config.tempPublicDir);
  52. await fs.ensureDir(config.uploadPublicDir);
  53. await fs.ensureDir(config.tempDir);
  54. await fs.emptyDir(config.tempDir);
  55. //logger
  56. const appLogger = new (require('./core/AppLogger'))();//singleton
  57. await appLogger.init(config);
  58. log = appLogger.log;
  59. //cli
  60. if (argv.help) {
  61. showHelp(defaultConfig);
  62. ayncExit.exit(0);
  63. } else {
  64. log(versionText(config));
  65. log('Initializing');
  66. }
  67. //connections
  68. const jembaConnManager = new (require('./db/JembaConnManager'))();//singleton
  69. await jembaConnManager.init(config, argv['auto-repair']);
  70. //web app
  71. if (branch !== 'development') {
  72. const createWebApp = require('./createWebApp');
  73. await createWebApp(config);
  74. }
  75. }
  76. async function main() {
  77. const log = new (require('./core/AppLogger'))().log;//singleton
  78. const config = new (require('./config'))().config;//singleton
  79. //servers
  80. for (let serverCfg of config.servers) {
  81. if (serverCfg.mode !== 'none') {
  82. const app = express();
  83. let server;
  84. if (serverCfg.isHttps) {
  85. const key = fs.readFileSync(`${config.dataDir}/${serverCfg.keysFile}.key`);
  86. const cert = fs.readFileSync(`${config.dataDir}/${serverCfg.keysFile}.crt`);
  87. server = https.createServer({key, cert}, app);
  88. } else {
  89. server = http.createServer(app);
  90. }
  91. const wss = new WebSocket.Server({ server, maxPayload: maxPayloadSize*1024*1024 });
  92. const serverConfig = Object.assign({}, config, serverCfg);
  93. let devModule = undefined;
  94. if (serverConfig.branch == 'development') {
  95. const devFileName = './dev.js'; //require ignored by pkg -50Mb executable size
  96. devModule = require(devFileName);
  97. devModule.webpackDevMiddleware(app);
  98. }
  99. app.use(compression({ level: 1 }));
  100. app.use(express.json({limit: `${maxPayloadSize}mb`}));
  101. if (devModule)
  102. devModule.logQueries(app);
  103. require('./routes').initRoutes(app, wss, serverConfig);
  104. if (devModule) {
  105. devModule.logErrors(app);
  106. } else {
  107. app.use(function(err, req, res, next) {// eslint-disable-line no-unused-vars
  108. log(LM_ERR, err.stack);
  109. res.sendStatus(500);
  110. });
  111. }
  112. server.listen(serverConfig.port, serverConfig.ip, function() {
  113. log(`Server "${serverConfig.serverName}" is ready on ${(serverConfig.isHttps ? 'https://' : 'http://')}${serverConfig.ip}:${serverConfig.port}, mode: ${serverConfig.mode}`);
  114. });
  115. }
  116. }
  117. }
  118. (async() => {
  119. try {
  120. await init();
  121. await main();
  122. } catch (e) {
  123. if (log)
  124. log(LM_FATAL, e.stack);
  125. else
  126. console.error(e.stack);
  127. ayncExit.exit(1);
  128. }
  129. })();