diff --git a/src/process/ProcessOwnership.runId.test.ts b/src/process/ProcessOwnership.runId.test.ts new file mode 100644 index 000000000..f9893d0e2 --- /dev/null +++ b/src/process/ProcessOwnership.runId.test.ts @@ -0,0 +1,28 @@ +import { expect, it } from "vitest"; + +import type { ProcessOwnershipHost } from "./ProcessOwnership.js"; +import { readProcessRunId } from "./ProcessOwnership.js"; + +it("passes cancellation through run-token reads", async () => { + const controller = new AbortController(); + const cancellation = new Error("cancelled"); + const host: ProcessOwnershipHost = { + listProcesses: async () => [], + environment: async (_pid, signal) => { + if (signal === undefined) throw new Error("run-token signal was omitted"); + return await new Promise>>( + (_resolve, reject) => { + signal.addEventListener("abort", () => reject(signal.reason), { + once: true, + }); + }, + ); + }, + signalGroup: () => undefined, + }; + + const reading = readProcessRunId(42, host, controller.signal); + controller.abort(cancellation); + + await expect(reading).rejects.toBe(cancellation); +}); diff --git a/src/process/ProcessOwnership.ts b/src/process/ProcessOwnership.ts index af85d23b4..983d840e5 100644 --- a/src/process/ProcessOwnership.ts +++ b/src/process/ProcessOwnership.ts @@ -223,8 +223,9 @@ const systemWindowsProcessTreeHost: WindowsProcessTreeHost = { export const readProcessRunId = async ( pid: number, host: ProcessOwnershipHost = systemHost, + signal?: AbortSignal, ): Promise => - (await host.environment(pid)).REA_PROCESS_RUN_ID; + (await host.environment(pid, signal)).REA_PROCESS_RUN_ID; /** Token-validate every rooted POSIX process group before signaling any. */ export const cleanupOwnedProcessGroup = async ( diff --git a/src/process/capture/ProcessSampling.ts b/src/process/capture/ProcessSampling.ts index 518d91932..69e7dd343 100644 --- a/src/process/capture/ProcessSampling.ts +++ b/src/process/capture/ProcessSampling.ts @@ -358,7 +358,7 @@ const inspectInitializedPtyRoot = async ( return undefined; let observedRunId: string | undefined; try { - observedRunId = await readProcessRunId(rootPid); + observedRunId = await readProcessRunId(rootPid, undefined, signal); } catch (cause: unknown) { // Unreadable run identity means the root cannot be attributed. void cause;