app.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const express = require('express');
  2. const path = require('path');
  3. const session = require('express-session');
  4. const flash = require('connect-flash');
  5. const rateLimit = require('express-rate-limit');
  6. const compression = require('compression');
  7. const cookieParser = require('cookie-parser');
  8. const logger = require('morgan');
  9. const http = require('http');
  10. const serveStatic = require('serve-static');
  11. const config = require('./config');
  12. const indexRouter = require('./routers/index');
  13. const messageRouter = require('./routers/message');
  14. const userRouter = require('./routers/user');
  15. const { refreshToken } = require('./common/wechat');
  16. const { initializeTokenStore, registerWebSocket } = require('./common/token');
  17. const app = express();
  18. const WebSocket = require('ws');
  19. app.locals.isLogged = false;
  20. app.locals.isAdmin = false;
  21. app.locals.message = '';
  22. app.locals.isErrorMessage = false;
  23. setTimeout(async () => {
  24. // TODO: Here we need an improvement! I have tried EventEmitter but it's not working. :(
  25. await initializeTokenStore();
  26. await refreshToken();
  27. setInterval(async () => refreshToken(), 100 * 60 * 1000);
  28. }, 1000);
  29. app.set('views', path.join(__dirname, 'views'));
  30. app.set('view engine', 'ejs');
  31. app.set('trust proxy', true);
  32. app.use(
  33. rateLimit({
  34. windowMs: 30 * 1000,
  35. max: 30,
  36. })
  37. );
  38. app.use(
  39. '/login',
  40. rateLimit({
  41. windowMs: 60 * 1000,
  42. max: 5,
  43. })
  44. );
  45. app.use(compression());
  46. app.use(logger('dev'));
  47. app.use(express.json());
  48. app.use(express.urlencoded({ extended: false }));
  49. app.use(cookieParser(config.cookie_secret));
  50. app.use(
  51. session({
  52. resave: true,
  53. saveUninitialized: true,
  54. secret: config.session_secret,
  55. })
  56. );
  57. app.use(flash());
  58. app.use(express.static(path.join(__dirname, 'public')));
  59. app.use(
  60. '/public',
  61. serveStatic(path.join(__dirname, `public`), {
  62. maxAge: '600000',
  63. })
  64. );
  65. app.use('*', (req, res, next) => {
  66. if (req.session.user !== undefined) {
  67. res.locals.isLogged = true;
  68. res.locals.isAdmin = req.session.user.isAdmin;
  69. }
  70. next();
  71. });
  72. app.use('/message', messageRouter);
  73. app.use('/', indexRouter);
  74. app.use('/', userRouter);
  75. const server = http.createServer(app);
  76. const wss = new WebSocket.Server({ server });
  77. server.listen(config.port);
  78. wss.on('connection', (ws) => {
  79. ws.on('message', (data) => {
  80. let message = JSON.parse(data.toString());
  81. registerWebSocket(message.prefix, message.token, ws);
  82. });
  83. });
  84. module.exports = app;