server/app.ts

import morgan from 'morgan';
import express from 'express';
import session from 'express-session';

import SessionFileStore from 'session-file-store';
const FileStore = SessionFileStore(session);

import logger from './logger';
import config from '../config';

export const nodeEnv = process.env.NODE_ENV || 'development'

/**
 * Used to block the binding of the server until after this
 * promise is resolved. Until top level await is ubiquotous
 * this'll have to do.
 */
export const serverPromise = new Promise(resolve => resolve())

const app = express()
export default app

app.use(express.json({ limit: '50mb' }))
app.use(express.urlencoded({ limit: '50mb', extended: true }))

app.use(morgan('dev', {
  stream: { write: (msg: string) => logger.debug(msg.replace(/\n$/, '')) }
}))

app.use(session({
  secret: config.secret,
  resave: false,
  name: 'puddle-sid',
  saveUninitialized: true,
  store: new FileStore({
    path: config.sessionPath,
    retries: 0,
    // logFn: logger.log.bind(logger),
  })
}))