Download src/process/supervisor/adapters/process-events.ts from SaylorTwift/openclaw: direct link, hf CLI and curl.
- Browser
- Download file 1.69 kB
-
https://huggingface.co/SaylorTwift/openclaw/resolve/main/src/process/supervisor/adapters/process-events.ts
- Command line
-
hf download hf://SaylorTwift/openclaw/src/process/supervisor/adapters/process-events.ts
-
curl -L -o process-events.ts https://huggingface.co/SaylorTwift/openclaw/resolve/main/src/process/supervisor/adapters/process-events.ts
1.69 kB
| import type { SpawnProcessAdapter } from "../types.js"; | |
| type ProcessEvents = Required< | |
| Pick<SpawnProcessAdapter<NodeJS.Signals | null>, "onExit" | "onError"> | |
| >; | |
| type ErrorListener = Parameters<ProcessEvents["onError"]>[0]; | |
| /** Preserve terminal facts and startup errors until the transport owner subscribes. */ | |
| export function createProcessAdapterEvents() { | |
| let exit: { code: number | null; signal: NodeJS.Signals | null } | undefined; | |
| const exitListeners = new Set<Parameters<ProcessEvents["onExit"]>[0]>(); | |
| const errorListeners = new Set<ErrorListener>(); | |
| const pendingErrors = new Map<Parameters<ErrorListener>[1], Error>(); | |
| return { | |
| onExit: (listener: Parameters<ProcessEvents["onExit"]>[0]) => { | |
| exitListeners.add(listener); | |
| if (exit) { | |
| listener(exit.code, exit.signal); | |
| } | |
| }, | |
| onError: (listener: ErrorListener) => { | |
| errorListeners.add(listener); | |
| for (const [source, error] of pendingErrors) { | |
| listener(error, source); | |
| } | |
| pendingErrors.clear(); | |
| }, | |
| emitExit: (code: number | null, signal: NodeJS.Signals | null) => { | |
| exit = { code, signal }; | |
| for (const listener of exitListeners) { | |
| listener(code, signal); | |
| } | |
| }, | |
| emitError: (error: Error, source: Parameters<ErrorListener>[1]) => { | |
| if (errorListeners.size === 0) { | |
| if (!pendingErrors.has(source)) { | |
| pendingErrors.set(source, error); | |
| } | |
| } else { | |
| for (const listener of errorListeners) { | |
| listener(error, source); | |
| } | |
| } | |
| }, | |
| clear: () => { | |
| exitListeners.clear(); | |
| errorListeners.clear(); | |
| pendingErrors.clear(); | |
| }, | |
| }; | |
| } | |