52 lines
No EOL
1.5 KiB
TypeScript
52 lines
No EOL
1.5 KiB
TypeScript
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")
|
|
}) |