summaryrefslogtreecommitdiffhomepage
path: root/packages/sdk/js/src/process.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/sdk/js/src/process.ts')
-rw-r--r--packages/sdk/js/src/process.ts31
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
+}