import createExpressApp, { static as staticMiddleware } from "express" import { listen } from "listhen" import { WebSocketServer } from "ws" import { appRouter } from "./trpc" import { createExpressMiddleware as createTrpcMiddleware } from "@trpc/server/adapters/express" import { applyWSSHandler } from "@trpc/server/adapters/ws" import { createContext } from "./trpc/base" import cookieParser from "cookie-parser" import { parse as parseCookie } from "cookie" import { isDev } from "./isDev" import { resolve } from "node:path" const expressApp = createExpressApp() expressApp.use(cookieParser()) expressApp.use("/trpc", createTrpcMiddleware({ router: appRouter, createContext: ({ req, res }) => createContext(req.cookies.token ?? null, res), })) if (!isDev) expressApp.use(staticMiddleware(resolve(import.meta.dirname, "../dist"))) const { server } = await listen(expressApp, { isProd: !isDev, autoClose: false }) const wss = new WebSocketServer({ server, path: "/ws" }) const wssTrpcHandler = applyWSSHandler({ wss, router: appRouter, createContext: ({ req }) => { const cookies = parseCookie(req.headers.cookie ?? "") return createContext(cookies.token ?? null, undefined) }, keepAlive: { enabled: true, pingMs: 30000, pongWaitMs: 5000, } }) const stop = () => { console.log("Received stop signal") server.close() wssTrpcHandler.broadcastReconnectNotification() wss.close(console.error) } process.on("SIGTERM", stop) process.on("SIGINT", stop) process.on("exit", () => { console.log("exit") })