54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import { Server } from "@/server/server"
|
|
import { InstanceRuntime } from "@/project/instance-runtime"
|
|
import { Rpc } from "@/util/rpc"
|
|
import { upgrade } from "@/cli/upgrade"
|
|
import { Config } from "@/config/config"
|
|
import { writeHeapSnapshot } from "node:v8"
|
|
import { Heap } from "@/cli/heap"
|
|
import { AppRuntime } from "@/effect/app-runtime"
|
|
import { Effect } from "effect"
|
|
import { disposeAllInstancesAndEmitGlobalDisposed } from "@/server/global-lifecycle"
|
|
|
|
Heap.start()
|
|
|
|
const onUnhandledRejection = (_error: unknown) => {}
|
|
|
|
const onUncaughtException = (_error: Error) => {}
|
|
|
|
process.on("unhandledRejection", onUnhandledRejection)
|
|
process.on("uncaughtException", onUncaughtException)
|
|
|
|
let server: Awaited<ReturnType<typeof Server.listen>> | undefined
|
|
|
|
export const rpc = {
|
|
snapshot() {
|
|
const result = writeHeapSnapshot("server.heapsnapshot")
|
|
return result
|
|
},
|
|
async server(input: { port: number; hostname: string; mdns?: boolean; cors?: string[] }) {
|
|
if (server) await server.stop(true)
|
|
server = await Server.listen(input)
|
|
return { url: server.url.toString() }
|
|
},
|
|
async checkUpgrade(input: { directory: string }) {
|
|
await InstanceRuntime.load({ directory: input.directory })
|
|
await upgrade().catch(() => {})
|
|
},
|
|
async reload() {
|
|
await AppRuntime.runPromise(
|
|
Effect.gen(function* () {
|
|
const cfg = yield* Config.Service
|
|
yield* cfg.invalidate()
|
|
yield* disposeAllInstancesAndEmitGlobalDisposed({ swallowErrors: true })
|
|
}),
|
|
)
|
|
},
|
|
async shutdown() {
|
|
await InstanceRuntime.disposeAllInstances()
|
|
if (server) await server.stop(true)
|
|
process.off("unhandledRejection", onUnhandledRejection)
|
|
process.off("uncaughtException", onUncaughtException)
|
|
},
|
|
}
|
|
|
|
Rpc.listen(rpc)
|