diff options
Diffstat (limited to 'packages/sdk/js/src/process.ts')
| -rw-r--r-- | packages/sdk/js/src/process.ts | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/packages/sdk/js/src/process.ts b/packages/sdk/js/src/process.ts new file mode 100644 index 000000000..3111b424a --- /dev/null +++ b/packages/sdk/js/src/process.ts @@ -0,0 +1,31 @@ +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 +} |
