refactor(reference): share resource failure projection

This commit is contained in:
morluto committed 2026-10-22 10:19:28 +08:00
1 parent 81ab0ddc95
commit 34fd7bdf7d
3 files changed
+16 -14

No files matched your search

+2 -7
View File
@@ -9,6 +9,7 @@ import {
RegularFileCleanupFailure,
retryRegularFileCleanup,
} from "./RegularFileRead.js";
import { referenceSourceResourceFailure } from "../reference/ReferenceSourceReaderErrors.js";
import type { ReferenceSourceReaderError } from "../reference/ReferenceSourceReaderTypes.js";
export type ReferenceSourceVcsInfo =
@@ -59,13 +60,7 @@ export const readReferenceSourceVcs = async (
});
} catch (cause: unknown) {
if (!(cause instanceof ArtifactReaderFailure)) throw cause;
return err({
tag: "reference-source-reader",
code: cause.reason === "cancelled" ? "cancelled" : "io",
message: cause.message,
...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
cause,
});
return err(referenceSourceResourceFailure(cause));
}
};
+2 -7
View File
@@ -19,6 +19,7 @@ import {
noFollowOpenSupported,
prepareRoot,
} from "./ReferenceSourceReaderValidate.js";
import { referenceSourceResourceFailure } from "./ReferenceSourceReaderErrors.js";
const PATH_RACE_LIMITATION =
"Path identity is revalidated around operations; Node lacks portable descriptor-relative openat traversal, so a syscall-boundary pathname race remains.";
@@ -33,13 +34,7 @@ export const readReferenceSource = async (
return await resources.run(() => readSource(root, resources, options));
} catch (cause: unknown) {
if (!(cause instanceof ArtifactReaderFailure)) throw cause;
return err({
tag: "reference-source-reader",
code: cause.reason === "cancelled" ? "cancelled" : "io",
message: cause.message,
...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
cause,
});
return err(referenceSourceResourceFailure(cause));
}
};
@@ -1,3 +1,4 @@
import type { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
import type {
ReferenceSourceEntry,
ReferenceSourceFailureCode,
@@ -16,6 +17,17 @@ export const failure = (
export const cancelled = (): ReferenceSourceReaderError =>
failure("cancelled", "Reference source traversal cancelled");
/** Project resource failures into the reference-source error contract. */
export const referenceSourceResourceFailure = (
cause: ArtifactReaderFailure,
): ReferenceSourceReaderError => ({
tag: "reference-source-reader",
code: cause.reason === "cancelled" ? "cancelled" : "io",
message: cause.message,
...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
cause,
});
export const safeSize = (size: bigint): number | undefined => {
const value = Number(size);
return Number.isSafeInteger(value) && value >= 0 ? value : undefined;