start.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const Backend = require('./api/structures/Server');
  2. const express = require('express');
  3. const compression = require('compression');
  4. const ream = require('ream');
  5. const config = require('../config');
  6. const path = require('path');
  7. const log = require('./api/utils/Log');
  8. const dev = process.env.NODE_ENV !== 'production';
  9. const oneliner = require('one-liner');
  10. const jetpack = require('fs-jetpack');
  11. function startProduction() {
  12. startAPI();
  13. startSite();
  14. }
  15. function startAPI() {
  16. new Backend().start();
  17. }
  18. function startSite() {
  19. /*
  20. Make sure the frontend has enough data to prepare the service
  21. */
  22. writeFrontendConfig();
  23. /*
  24. Starting ream's custom server
  25. */
  26. const server = express();
  27. const app = ream({
  28. dev,
  29. entry: path.join(__dirname, 'site', 'index.js')
  30. });
  31. app.getRequestHandler().then(handler => {
  32. server.use(compression());
  33. /*
  34. This option is mostly for development, since serving the files with nginx is better.
  35. */
  36. if (config.serveFilesWithNode) {
  37. server.use('/', express.static(`./${config.uploads.uploadFolder}`));
  38. }
  39. server.get('*', handler);
  40. server.listen(config.server.ports.frontend, error => {
  41. if (error) log.error(error);
  42. });
  43. });
  44. app.on('renderer-ready', () => log.info(`> Frontend ready and listening on port ${config.server.ports.frontend}`));
  45. }
  46. function writeFrontendConfig() {
  47. /*
  48. Since ream can't execute getInitialData on non-routes we write a config file for it.
  49. */
  50. const template = oneliner`
  51. module.exports = {
  52. version: '${process.env.npm_package_version}',
  53. baseURL: '${config.backendLocation}',
  54. serviceName: '${config.serviceName}',
  55. maxFileSize: '${config.uploads.uploadMaxSize}',
  56. chunkSize: '${config.uploads.chunkSize}'
  57. }`;
  58. jetpack.write(path.join(__dirname, 'site', 'config.js'), template);
  59. log.success('Frontend config file generated successfully');
  60. }
  61. /*
  62. Having multiple files for different scripts was mendokusai.
  63. */
  64. const args = process.argv[2];
  65. if (!args) startProduction();
  66. else if (args === 'api') startAPI();
  67. else if (args === 'site') startSite();
  68. else process.exit(0);