app.js 2.4 KB

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