index.js 4.8 KB

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