twenty-one/backend/main.ts

49 lines
No EOL
1.3 KiB
TypeScript

import createExpressApp 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"
const expressApp = createExpressApp()
expressApp.use(cookieParser())
expressApp.use("/trpc", createTrpcMiddleware({
router: appRouter,
createContext: ({ req, res }) => createContext(req.cookies.token ?? null, res),
}))
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")
})