fix(cancellation): retain caller reasons across digest and startup

This commit is contained in:
morluto committed 2026-10-25 07:31:31 +08:00
1 parent 9140deae63
commit f2fa951c00
5 files changed
+99 -20

No files matched your search

@@ -1057,7 +1057,11 @@ export const digestFile = async (
remainingMs,
);
const abort = (): void => {
stream.destroy(new AnalysisCancelledError("artifact_digest"));
stream.destroy(
new AnalysisCancelledError("artifact_digest", {
cause: signal?.reason,
}),
);
};
const cleanup = (): void => {
clearTimeout(timer);
@@ -1066,7 +1070,11 @@ export const digestFile = async (
if (signal?.aborted) {
cleanup();
stream.destroy();
rejectDigest(new AnalysisCancelledError("artifact_digest"));
rejectDigest(
new AnalysisCancelledError("artifact_digest", {
cause: signal.reason,
}),
);
return;
}
signal?.addEventListener("abort", abort, { once: true });
@@ -1139,7 +1147,9 @@ const statWithDeadline = (
timeoutMs: number,
): Promise<Stats> => {
if (signal?.aborted)
return Promise.reject(new AnalysisCancelledError("artifact_digest"));
return Promise.reject(
new AnalysisCancelledError("artifact_digest", { cause: signal.reason }),
);
return new Promise<Stats>((resolveStat, rejectStat) => {
let settled = false;
const finish = (outcome: Result<Stats, unknown>): void => {
@@ -1151,7 +1161,13 @@ const statWithDeadline = (
else rejectStat(outcome.error);
};
const abort = (): void =>
finish(err(new AnalysisCancelledError("artifact_digest")));
finish(
err(
new AnalysisCancelledError("artifact_digest", {
cause: signal?.reason,
}),
),
);
const timer = setTimeout(
() =>
finish(