File size: 1,330 Bytes
76289e7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import { createAbortError, isAbortError } from "../infra/abort-signal.js";
export function contextEngineAbortSignal(methodParams: unknown): AbortSignal | undefined {
// SAFETY: host method parameters are read structurally only for the optional abortSignal field.
const signal = (methodParams as { abortSignal?: unknown } | null | undefined)?.abortSignal;
if (!signal || typeof signal !== "object" || !("aborted" in signal)) {
return undefined;
}
// SAFETY: the host supplies AbortSignal here; the structural guard above rejects non-signal data.
const abortSignal = signal as AbortSignal;
if (!abortSignal.aborted) {
return abortSignal;
}
const reason = abortSignal.reason;
throw reason instanceof Error
? reason
: createAbortError(String(reason || "Context engine operation aborted."));
}
export function isContextEngineAbortRejection(
error: unknown,
signal: AbortSignal | undefined,
): boolean {
if (!signal?.aborted) {
return false;
}
if (error === signal.reason || isAbortError(error)) {
return true;
}
const seen = new Set<Error>();
for (
let current = error;
current instanceof Error && !seen.has(current);
current = current.cause
) {
seen.add(current);
if (current.cause === signal.reason) {
return true;
}
}
return false;
}
|