shack/src/web/server.js

78 lines
2.0 KiB
JavaScript

// Note that this file isn't processed by Vite, see https://github.com/brillout/vite-plugin-ssr/issues/562
const config = require('config');
const express = require('express');
const Router = require('express-promise-router');
const session = require('express-session');
const RedisStore = require('connect-redis').default;
const bodyParser = require('body-parser');
const compression = require('compression');
const sirv = require('sirv');
const vite = require('vite');
const logger = require('../logger')(__filename);
const redis = require('../redis').client;
const initDefaultHandler = require('./default');
const setIp = require('./ip');
const errorHandler = require('./error');
const {
login,
logout,
fetchUser,
createUser,
} = require('./users');
const { createShelf } = require('./shelves');
const root = `${__dirname}/../..`;
async function startServer() {
const app = express();
const router = Router();
const sessionStore = new RedisStore({ client: redis });
const defaultHandler = await initDefaultHandler();
app.disable('x-powered-by');
app.set('trust proxy', 1);
router.use(session({ ...config.web.session, store: sessionStore }));
router.use(setIp);
router.use(bodyParser.json({ strict: false }));
app.use(compression());
if (process.env.NODE_ENV === 'production') {
app.use(sirv(`${root}/dist/client`));
} else {
const viteDevMiddleware = (await vite.createServer({
root,
server: { middlewareMode: true },
})).middlewares;
app.use(viteDevMiddleware);
}
router.get('/api/session', fetchUser);
router.post('/api/session', login);
router.delete('/api/session', logout);
router.post('/api/shelves', createShelf);
router.post('/api/users', createUser);
router.get('*', defaultHandler);
router.use(errorHandler);
app.use(router);
const server = app.listen(process.env.PORT || config.web.port, process.env.HOST || config.web.host, () => {
const { address, port } = server.address();
logger.info(`Server running at ${address}:${port}`);
});
}
startServer();