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> | 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)