2022-07-17 20:21:49 +08:00
|
|
|
require('dotenv').config();
|
2021-01-17 10:49:19 +08:00
|
|
|
const express = require('express');
|
|
|
|
|
const path = require('path');
|
2021-01-17 14:26:33 +08:00
|
|
|
const session = require('express-session');
|
|
|
|
|
const flash = require('connect-flash');
|
|
|
|
|
const rateLimit = require('express-rate-limit');
|
|
|
|
|
const compression = require('compression');
|
2021-01-17 10:49:19 +08:00
|
|
|
const cookieParser = require('cookie-parser');
|
|
|
|
|
const logger = require('morgan');
|
|
|
|
|
const http = require('http');
|
2021-01-17 14:26:33 +08:00
|
|
|
const serveStatic = require('serve-static');
|
2021-01-17 10:49:19 +08:00
|
|
|
const config = require('./config');
|
|
|
|
|
const indexRouter = require('./routers/index');
|
|
|
|
|
const messageRouter = require('./routers/message');
|
2021-01-17 14:26:33 +08:00
|
|
|
const userRouter = require('./routers/user');
|
2021-01-17 10:49:19 +08:00
|
|
|
const { refreshToken } = require('./common/wechat');
|
2021-06-13 17:52:41 +08:00
|
|
|
const { initializeTokenStore, registerWebSocket } = require('./common/token');
|
2020-09-01 15:21:10 +08:00
|
|
|
|
|
|
|
|
const app = express();
|
2021-06-13 17:52:41 +08:00
|
|
|
const WebSocket = require('ws');
|
2020-09-01 15:21:10 +08:00
|
|
|
|
2021-01-17 14:26:33 +08:00
|
|
|
app.locals.isLogged = false;
|
|
|
|
|
app.locals.isAdmin = false;
|
2021-01-17 15:18:55 +08:00
|
|
|
app.locals.message = '';
|
|
|
|
|
app.locals.isErrorMessage = false;
|
2021-01-17 14:26:33 +08:00
|
|
|
|
2021-01-17 10:49:19 +08:00
|
|
|
setTimeout(async () => {
|
|
|
|
|
// TODO: Here we need an improvement! I have tried EventEmitter but it's not working. :(
|
|
|
|
|
await initializeTokenStore();
|
2021-03-28 11:15:57 +08:00
|
|
|
await refreshToken();
|
2021-01-17 10:49:19 +08:00
|
|
|
setInterval(async () => refreshToken(), 100 * 60 * 1000);
|
|
|
|
|
}, 1000);
|
2020-09-01 16:28:09 +08:00
|
|
|
|
2021-01-17 10:49:19 +08:00
|
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
|
app.set('view engine', 'ejs');
|
|
|
|
|
app.set('trust proxy', true);
|
2020-09-01 19:27:16 +08:00
|
|
|
|
2021-01-17 14:26:33 +08:00
|
|
|
app.use(
|
|
|
|
|
rateLimit({
|
|
|
|
|
windowMs: 30 * 1000,
|
2022-07-17 20:21:49 +08:00
|
|
|
max: 30
|
2021-01-17 14:26:33 +08:00
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
app.use(
|
|
|
|
|
'/login',
|
|
|
|
|
rateLimit({
|
|
|
|
|
windowMs: 60 * 1000,
|
2022-07-17 20:21:49 +08:00
|
|
|
max: 5
|
2021-01-17 14:26:33 +08:00
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
app.use(compression());
|
2021-01-17 10:49:19 +08:00
|
|
|
app.use(logger('dev'));
|
2020-09-01 15:21:10 +08:00
|
|
|
app.use(express.json());
|
|
|
|
|
app.use(express.urlencoded({ extended: false }));
|
2021-01-17 14:26:33 +08:00
|
|
|
app.use(cookieParser(config.cookie_secret));
|
|
|
|
|
app.use(
|
|
|
|
|
session({
|
|
|
|
|
resave: true,
|
|
|
|
|
saveUninitialized: true,
|
2022-07-17 20:21:49 +08:00
|
|
|
secret: config.session_secret
|
2021-01-17 14:26:33 +08:00
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
app.use(flash());
|
2021-01-17 10:49:19 +08:00
|
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
2021-01-17 14:26:33 +08:00
|
|
|
app.use(
|
|
|
|
|
'/public',
|
|
|
|
|
serveStatic(path.join(__dirname, `public`), {
|
2022-07-17 20:21:49 +08:00
|
|
|
maxAge: '600000'
|
2021-01-17 14:26:33 +08:00
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
app.use('*', (req, res, next) => {
|
|
|
|
|
if (req.session.user !== undefined) {
|
|
|
|
|
res.locals.isLogged = true;
|
|
|
|
|
res.locals.isAdmin = req.session.user.isAdmin;
|
|
|
|
|
}
|
|
|
|
|
next();
|
|
|
|
|
});
|
2021-01-17 10:49:19 +08:00
|
|
|
app.use('/message', messageRouter);
|
2021-01-17 14:26:33 +08:00
|
|
|
app.use('/', indexRouter);
|
|
|
|
|
app.use('/', userRouter);
|
2020-09-01 15:21:10 +08:00
|
|
|
|
|
|
|
|
const server = http.createServer(app);
|
2021-06-13 17:52:41 +08:00
|
|
|
const wss = new WebSocket.Server({ server });
|
2021-01-17 10:49:19 +08:00
|
|
|
server.listen(config.port);
|
2020-09-01 15:21:10 +08:00
|
|
|
|
2021-06-13 17:52:41 +08:00
|
|
|
wss.on('connection', (ws) => {
|
|
|
|
|
ws.on('message', (data) => {
|
|
|
|
|
let message = JSON.parse(data.toString());
|
2022-07-29 23:53:06 +08:00
|
|
|
if (message.prefix) {
|
|
|
|
|
registerWebSocket(message.prefix, message.token, ws);
|
|
|
|
|
}
|
2021-06-13 17:52:41 +08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2020-09-01 15:21:10 +08:00
|
|
|
module.exports = app;
|