mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-09 22:25:02 +03:00
30 lines
1.1 KiB
TypeScript
30 lines
1.1 KiB
TypeScript
import { NodeRuntime } from "@effect/platform-node"
|
|
import { CrossSpawnSpawner } from "@opencode/util/cross-spawn-spawner"
|
|
import { LayerNode } from "@opencode/util/effect/layer-node"
|
|
import { Context, Effect, Layer } from "effect"
|
|
import { ChildProcess } from "effect/process"
|
|
import { ShutdownDeadline } from "../../src/shutdown-deadline"
|
|
|
|
class Hung extends Context.Service<Hung, {}>()("test/Hung") {}
|
|
|
|
// Owns a running child, then a finalizer that never finishes, so releasing the layer hangs before the child stops.
|
|
const hung = LayerNode.make({
|
|
service: Hung,
|
|
layer: Layer.effect(
|
|
Hung,
|
|
Effect.gen(function* () {
|
|
const child = yield* ChildProcess.make(process.execPath, ["-e", "setInterval(() => {}, 1000)"])
|
|
yield* Effect.addFinalizer(() => Effect.never)
|
|
console.log(`SHUTDOWN_READY ${child.pid}`)
|
|
return Hung.of({})
|
|
}),
|
|
),
|
|
deps: [CrossSpawnSpawner.node],
|
|
})
|
|
|
|
Effect.gen(function* () {
|
|
yield* ShutdownDeadline.install(Number(process.argv[2]))
|
|
yield* Layer.build(LayerNode.compile(hung))
|
|
return yield* Effect.never
|
|
}).pipe(Effect.scoped, NodeRuntime.runMain)
|