start.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. URL: '${config.filesServeLocation}',
  54. baseURL: '${config.backendLocation}',
  55. serviceName: '${config.serviceName}',
  56. maxFileSize: '${config.uploads.uploadMaxSize}',
  57. chunkSize: '${config.uploads.chunkSize}',
  58. maxLinksPerAlbum: '${config.albums.maxLinksPerAlbum}'
  59. }`;
  60. jetpack.write(path.join(__dirname, 'site', 'config.js'), template);
  61. log.success('Frontend config file generated successfully');
  62. }
  63. /*
  64. Having multiple files for different scripts was mendokusai.
  65. */
  66. const args = process.argv[2];
  67. if (!args) startProduction();
  68. else if (args === 'api') startAPI();
  69. else if (args === 'site') startSite();
  70. else process.exit(0);