···
1
-
import { Server } from '#/server'
1
+
import events from 'node:events'
2
+
import type http from 'node:http'
3
+
import express, { type Express } from 'express'
4
+
import { pino } from 'pino'
6
+
import { createDb, migrateToLatest } from '#/db'
7
+
import { env } from '#/env'
8
+
import { Ingester } from '#/firehose/ingester'
9
+
import { createRouter } from '#/routes'
10
+
import { createClient } from '#/auth/client'
11
+
import { createResolver } from '#/ident/resolver'
12
+
import type { AppContext } from '#/config'
14
+
export class Server {
16
+
public app: express.Application,
17
+
public server: http.Server,
18
+
public ctx: AppContext
21
+
static async create() {
22
+
const { NODE_ENV, HOST, PORT, DB_PATH } = env
24
+
const logger = pino({ name: 'server start' })
25
+
const db = createDb(DB_PATH)
26
+
await migrateToLatest(db)
27
+
const ingester = new Ingester(db)
28
+
const oauthClient = await createClient(db)
29
+
const resolver = createResolver()
39
+
const app: Express = express()
41
+
// Set the application to trust the reverse proxy
42
+
app.set('trust proxy', true)
45
+
app.use(express.json())
46
+
app.use(express.urlencoded({ extended: true }))
49
+
const router = createRouter(ctx)
53
+
app.use((_req, res) => res.sendStatus(404))
55
+
const server = app.listen(env.PORT)
56
+
await events.once(server, 'listening')
57
+
logger.info(`Server (${NODE_ENV}) running on port http://${HOST}:${PORT}`)
59
+
return new Server(app, server, ctx)
63
+
this.ctx.logger.info('sigint received, shutting down')
64
+
this.ctx.ingester.destroy()
65
+
return new Promise<void>((resolve) => {
66
+
this.server.close(() => {
67
+
this.ctx.logger.info('server closed')
const run = async () => {
const server = await Server.create()