mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 06:45:22 +00:00
32 lines
1.0 KiB
TypeScript
32 lines
1.0 KiB
TypeScript
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
|
|
}
|