the statusphere demo reworked into a vite/react app in a monorepo
1import events from "node:events";
2import type http from "node:http";
3import cors from "cors";
4import express, { type Express } from "express";
5import helmet from "helmet";
6import { pino } from "pino";
7
8import errorHandler from "#/common/middleware/errorHandler";
9import rateLimiter from "#/common/middleware/rateLimiter";
10import requestLogger from "#/common/middleware/requestLogger";
11import { env } from "#/common/utils/envConfig";
12import { Database } from "#/db";
13import { Firehose } from "#/firehose";
14import router from "#/router";
15
16export class Server {
17 constructor(
18 public app: express.Application,
19 public server: http.Server,
20 public firehose: Firehose,
21 public logger: pino.Logger,
22 ) {}
23
24 static async create() {
25 const { NODE_ENV, HOST, PORT } = env;
26
27 await Database.sync({ force: true });
28
29 const logger = pino({ name: "server start" });
30 const app: Express = express();
31
32 // Set the application to trust the reverse proxy
33 app.set("trust proxy", true);
34
35 // TODO: middleware for sqlite server
36 // TODO: middleware for OAuth
37
38 // Middlewares
39 app.use(express.json());
40 app.use(express.urlencoded({ extended: true }));
41 app.use(cors({ origin: env.CORS_ORIGIN, credentials: true }));
42 app.use(helmet());
43 app.use(rateLimiter);
44
45 // Request logging
46 app.use(requestLogger);
47
48 // Routes
49 app.use(router);
50
51 // Error handlers
52 app.use(errorHandler());
53
54 const server = app.listen(env.PORT);
55 await events.once(server, "listening");
56 logger.info(`Server (${NODE_ENV}) running on port http://${HOST}:${PORT}`);
57
58 const firehose = new Firehose("https://bsky.network");
59 firehose.run(10);
60
61 return new Server(app, server, firehose, logger);
62 }
63
64 async close() {
65 this.logger.info("sigint received, shutting down");
66 return new Promise<void>((resolve) => {
67 this.server.close(() => {
68 this.logger.info("server closed");
69 resolve();
70 });
71 });
72 }
73}