| 12345678910111213141516171819202122232425262728293031 |
- import { type ChildProcess, spawnSync } from "node:child_process"
- // Duplicated from `packages/opencode/src/util/process.ts` because the SDK cannot
- // import `opencode` without creating a cycle (`opencode` depends on `@opencode-ai/sdk`).
- export function stop(proc: ChildProcess) {
- if (proc.exitCode !== null || proc.signalCode !== null) return
- if (process.platform === "win32" && proc.pid) {
- const out = spawnSync("taskkill", ["/pid", String(proc.pid), "/T", "/F"], { windowsHide: true })
- if (!out.error && out.status === 0) return
- }
- proc.kill()
- }
- export function bindAbort(proc: ChildProcess, signal?: AbortSignal, onAbort?: () => void) {
- if (!signal) return () => {}
- const abort = () => {
- clear()
- stop(proc)
- onAbort?.()
- }
- const clear = () => {
- signal.removeEventListener("abort", abort)
- proc.off("exit", clear)
- proc.off("error", clear)
- }
- signal.addEventListener("abort", abort, { once: true })
- proc.on("exit", clear)
- proc.on("error", clear)
- if (signal.aborted) abort()
- return clear
- }
|