@agent-teams/repository-mutation 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/README.md +10 -0
- package/dist/canonical-json.d.ts +12 -0
- package/dist/canonical-json.d.ts.map +1 -0
- package/dist/canonical-json.js +137 -0
- package/dist/canonical-json.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/installed-artifact-identity.d.ts +15 -0
- package/dist/installed-artifact-identity.d.ts.map +1 -0
- package/dist/installed-artifact-identity.js +127 -0
- package/dist/installed-artifact-identity.js.map +1 -0
- package/dist/node.d.ts +29 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +19 -0
- package/dist/node.js.map +1 -0
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +11 -0
- package/dist/package-version.js.map +1 -0
- package/dist/qualification/index.d.ts +24 -0
- package/dist/qualification/index.d.ts.map +1 -0
- package/dist/qualification/index.js +11 -0
- package/dist/qualification/index.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts +19 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js +74 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts +35 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication.js +181 -0
- package/dist/repository-mutation/adapters/node/node-absent-file-publication.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts +23 -0
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js +134 -0
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts +26 -0
- package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js +172 -0
- package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts +14 -0
- package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js +23 -0
- package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts +17 -0
- package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-directory-durability.js +47 -0
- package/dist/repository-mutation/adapters/node/node-directory-durability.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts +37 -0
- package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-directory-materialization.js +244 -0
- package/dist/repository-mutation/adapters/node/node-directory-materialization.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts +13 -0
- package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js +67 -0
- package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts +84 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js +232 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts +9 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js +2 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts +6 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js +30 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts +11 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js +159 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts +9 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js +22 -0
- package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts +9 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js +203 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts +17 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js +22 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts +28 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js +213 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts +15 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js +51 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts +29 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js +72 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts +31 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js +254 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts +13 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js +210 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts +15 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js +181 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts +12 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js +18 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts +25 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js +150 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts +12 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js +56 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts +22 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js +246 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts +21 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js +34 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts +4 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js +43 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts +14 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js +109 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts +21 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.js +215 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts +18 -0
- package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js +30 -0
- package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts +31 -0
- package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js +50 -0
- package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-repository-path.d.ts +2 -0
- package/dist/repository-mutation/adapters/node/node-repository-path.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-repository-path.js +7 -0
- package/dist/repository-mutation/adapters/node/node-repository-path.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts +21 -0
- package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js +59 -0
- package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js.map +1 -0
- package/dist/repository-mutation/application/model/directory-materialization.d.ts +35 -0
- package/dist/repository-mutation/application/model/directory-materialization.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/directory-materialization.js +11 -0
- package/dist/repository-mutation/application/model/directory-materialization.js.map +1 -0
- package/dist/repository-mutation/application/model/exact-postimage.d.ts +17 -0
- package/dist/repository-mutation/application/model/exact-postimage.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/exact-postimage.js +11 -0
- package/dist/repository-mutation/application/model/exact-postimage.js.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts +69 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.js +15 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.js.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction.d.ts +64 -0
- package/dist/repository-mutation/application/model/known-file-transaction.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction.js +2 -0
- package/dist/repository-mutation/application/model/known-file-transaction.js.map +1 -0
- package/dist/repository-mutation/application/model/path-identity.d.ts +7 -0
- package/dist/repository-mutation/application/model/path-identity.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/path-identity.js +2 -0
- package/dist/repository-mutation/application/model/path-identity.js.map +1 -0
- package/dist/repository-mutation/application/model/repository-path.d.ts +8 -0
- package/dist/repository-mutation/application/model/repository-path.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/repository-path.js +74 -0
- package/dist/repository-mutation/application/model/repository-path.js.map +1 -0
- package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts +33 -0
- package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts.map +1 -0
- package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js +21 -0
- package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts +9 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js +214 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts +7 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.js +253 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.js.map +1 -0
- package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts +7 -0
- package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts.map +1 -0
- package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js +2 -0
- package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js.map +1 -0
- package/dist/repository-mutation-envelope.d.ts +32 -0
- package/dist/repository-mutation-envelope.d.ts.map +1 -0
- package/dist/repository-mutation-envelope.js +292 -0
- package/dist/repository-mutation-envelope.js.map +1 -0
- package/dist/state-contract.d.ts +6 -0
- package/dist/state-contract.d.ts.map +1 -0
- package/dist/state-contract.js +6 -0
- package/dist/state-contract.js.map +1 -0
- package/dist/strict-json.d.ts +7 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +131 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts +29 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js +139 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts +151 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js +29 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts +25 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js +303 -0
- package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts +16 -0
- package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-operation-lock.js +359 -0
- package/dist/transaction-coordination/adapters/node/node-operation-lock.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts +11 -0
- package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-state-directory.js +91 -0
- package/dist/transaction-coordination/adapters/node/node-state-directory.js.map +1 -0
- package/dist/transaction-coordination/mutation-lease.d.ts +38 -0
- package/dist/transaction-coordination/mutation-lease.d.ts.map +1 -0
- package/dist/transaction-coordination/mutation-lease.js +351 -0
- package/dist/transaction-coordination/mutation-lease.js.map +1 -0
- package/package.json +52 -0
- package/schemas/known-file-transaction-plan/v1.schema.json +65 -0
- package/schemas/known-file-transaction-receipt/v1.schema.json +36 -0
- package/schemas/repository-mutation-transaction-envelope/v1.schema.json +46 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { constants, lstat, open } from "node:fs/promises";
|
|
2
|
+
function identityFromStat(metadata) {
|
|
3
|
+
return {
|
|
4
|
+
birthtimeNs: metadata.birthtimeNs,
|
|
5
|
+
dev: metadata.dev,
|
|
6
|
+
ino: metadata.ino
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function isMissing(error) {
|
|
10
|
+
return (error instanceof Error &&
|
|
11
|
+
"code" in error &&
|
|
12
|
+
error.code === "ENOENT");
|
|
13
|
+
}
|
|
14
|
+
function hasErrorCode(error, code) {
|
|
15
|
+
return (error instanceof Error &&
|
|
16
|
+
"code" in error &&
|
|
17
|
+
error.code === code);
|
|
18
|
+
}
|
|
19
|
+
async function isExistingNonRegularPath(path) {
|
|
20
|
+
try {
|
|
21
|
+
const metadata = await lstat(path);
|
|
22
|
+
return metadata.isSymbolicLink() || !metadata.isFile();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function sameFileObservation(left, right) {
|
|
29
|
+
return (left.dev === right.dev &&
|
|
30
|
+
left.ino === right.ino &&
|
|
31
|
+
left.birthtimeNs === right.birthtimeNs &&
|
|
32
|
+
left.ctimeNs === right.ctimeNs &&
|
|
33
|
+
left.mtimeNs === right.mtimeNs &&
|
|
34
|
+
left.nlink === right.nlink &&
|
|
35
|
+
left.size === right.size);
|
|
36
|
+
}
|
|
37
|
+
async function readAtMost(handle, maximumBytes) {
|
|
38
|
+
const chunks = [];
|
|
39
|
+
let total = 0;
|
|
40
|
+
while (total <= maximumBytes) {
|
|
41
|
+
const remaining = maximumBytes + 1 - total;
|
|
42
|
+
const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));
|
|
43
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.byteLength, null);
|
|
44
|
+
if (bytesRead === 0) {
|
|
45
|
+
return Buffer.concat(chunks, total);
|
|
46
|
+
}
|
|
47
|
+
chunks.push(buffer.subarray(0, bytesRead));
|
|
48
|
+
total += bytesRead;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
export async function readBoundedRegularFileWithFaults(path, maximumBytes, faultInjector) {
|
|
53
|
+
if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0) {
|
|
54
|
+
throw new TypeError("maximumBytes must be a non-negative safe integer.");
|
|
55
|
+
}
|
|
56
|
+
if (await isExistingNonRegularPath(path)) {
|
|
57
|
+
return { outcome: "invalid" };
|
|
58
|
+
}
|
|
59
|
+
const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
|
|
60
|
+
const nonBlocking = process.platform === "win32" ? 0 : constants.O_NONBLOCK;
|
|
61
|
+
let handle;
|
|
62
|
+
try {
|
|
63
|
+
handle = await open(path, constants.O_RDONLY | noFollow | nonBlocking);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (hasErrorCode(error, "ELOOP") ||
|
|
67
|
+
(await isExistingNonRegularPath(path))) {
|
|
68
|
+
return { outcome: "invalid" };
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
return await readBoundedRegularFileHandle(handle, path, maximumBytes, faultInjector);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await handle.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function readBoundedRegularFile(path, maximumBytes) {
|
|
80
|
+
return readBoundedRegularFileWithFaults(path, maximumBytes);
|
|
81
|
+
}
|
|
82
|
+
export async function readBoundedRegularFileHandle(handle, path, maximumBytes, faultInjector) {
|
|
83
|
+
if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0) {
|
|
84
|
+
throw new TypeError("maximumBytes must be a non-negative safe integer.");
|
|
85
|
+
}
|
|
86
|
+
const before = await handle.stat({ bigint: true });
|
|
87
|
+
if (!before.isFile() || before.size > BigInt(maximumBytes)) {
|
|
88
|
+
return { outcome: "invalid" };
|
|
89
|
+
}
|
|
90
|
+
const identity = identityFromStat(before);
|
|
91
|
+
const bytes = await readAtMost(handle, maximumBytes);
|
|
92
|
+
if (bytes === undefined) {
|
|
93
|
+
return { outcome: "invalid" };
|
|
94
|
+
}
|
|
95
|
+
await faultInjector?.({ phase: "before-stability-check", path });
|
|
96
|
+
const after = await handle.stat({ bigint: true });
|
|
97
|
+
if (!after.isFile() ||
|
|
98
|
+
!sameFileObservation(before, after) ||
|
|
99
|
+
after.size !== BigInt(bytes.byteLength) ||
|
|
100
|
+
(await pathMatchesRegularFileIdentity(path, identity)) !== "match") {
|
|
101
|
+
return { outcome: "changed" };
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
outcome: "read",
|
|
105
|
+
bytes,
|
|
106
|
+
identity,
|
|
107
|
+
linkCount: after.nlink,
|
|
108
|
+
mode: Number(after.mode)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export async function captureFileHandleIdentity(handle) {
|
|
112
|
+
return identityFromStat(await handle.stat({ bigint: true }));
|
|
113
|
+
}
|
|
114
|
+
export async function pathMatchesRegularFileIdentity(path, expected) {
|
|
115
|
+
try {
|
|
116
|
+
const metadata = await lstat(path, { bigint: true });
|
|
117
|
+
if (metadata.isSymbolicLink() || !metadata.isFile()) {
|
|
118
|
+
return "different";
|
|
119
|
+
}
|
|
120
|
+
const observed = identityFromStat(metadata);
|
|
121
|
+
return observed.dev === expected.dev &&
|
|
122
|
+
observed.ino === expected.ino &&
|
|
123
|
+
observed.birthtimeNs === expected.birthtimeNs
|
|
124
|
+
? "match"
|
|
125
|
+
: "different";
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (isMissing(error)) {
|
|
129
|
+
return "missing";
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=node-bounded-regular-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-bounded-regular-file.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-bounded-regular-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { link, mkdir, rename } from "node:fs/promises";
|
|
2
|
+
import type { PortablePathIdentity } from "../../application/model/path-identity.js";
|
|
3
|
+
import type { OwnedTemporaryCleanupTransitionPort } from "../../application/ports/owned-temporary-cleanup-transition.js";
|
|
4
|
+
import { pathMatchesRegularFileIdentity } from "./node-bounded-regular-file.js";
|
|
5
|
+
import type { DirectoryDurability } from "./node-directory-durability.js";
|
|
6
|
+
export declare const OWNED_TEMPORARY_CLEANUP_RESIDUE_MARKER = ".foundation-owned-cleanup-";
|
|
7
|
+
export declare function ownedTemporaryCleanupResiduePrefix(temporaryPath: string): string;
|
|
8
|
+
export declare function cleanupIdentityMatchingOwnedTemporary(options: {
|
|
9
|
+
readonly allowUnsupportedDirectoryDurability: boolean;
|
|
10
|
+
readonly displayPath: string;
|
|
11
|
+
readonly expectedIdentity: PortablePathIdentity;
|
|
12
|
+
readonly parent: string;
|
|
13
|
+
readonly rm: (path: string) => Promise<void>;
|
|
14
|
+
readonly syncDirectory: (path: string) => Promise<DirectoryDurability>;
|
|
15
|
+
readonly temporaryPath: string;
|
|
16
|
+
readonly transition?: OwnedTemporaryCleanupTransitionPort;
|
|
17
|
+
readonly operations?: {
|
|
18
|
+
readonly beforeLogicalRetirement?: (path: string) => Promise<void> | void;
|
|
19
|
+
readonly mkdir?: typeof mkdir;
|
|
20
|
+
readonly link?: typeof link;
|
|
21
|
+
readonly pathMatchesRegularFileIdentity?: typeof pathMatchesRegularFileIdentity;
|
|
22
|
+
readonly quarantineToken?: () => string;
|
|
23
|
+
readonly rename?: typeof rename;
|
|
24
|
+
};
|
|
25
|
+
}): Promise<"different" | "missing" | "removed">;
|
|
26
|
+
//# sourceMappingURL=node-cleanup-owned-temporary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-cleanup-owned-temporary.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-cleanup-owned-temporary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,eAAO,MAAM,sCAAsC,+BACrB,CAAC;AAI/B,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,MAAM,GACpB,MAAM,CAER;AAkHD,wBAAsB,qCAAqC,CAAC,OAAO,EAAE;IACnE,QAAQ,CAAC,mCAAmC,EAAE,OAAO,CAAC;IACtD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,CACtB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,mCAAmC,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC;QAC5B,QAAQ,CAAC,8BAA8B,CAAC,EAAE,OAAO,8BAA8B,CAAC;QAChF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;QACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC;KACjC,CAAC;CACH,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,CAuH/C"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { link, mkdir, rename } from "node:fs/promises";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { pathMatchesRegularFileIdentity } from "./node-bounded-regular-file.js";
|
|
5
|
+
import { syncPublicationDirectory } from "./node-absent-file-publication-private.js";
|
|
6
|
+
import { assertTerminalEvidenceDirectory, ensureTerminalEvidenceDirectory } from "./node-terminal-evidence-directory.js";
|
|
7
|
+
export const OWNED_TEMPORARY_CLEANUP_RESIDUE_MARKER = ".foundation-owned-cleanup-";
|
|
8
|
+
const OWNED_TEMPORARY_RETIRED_EVIDENCE_MARKER = ".foundation-retired-evidence-";
|
|
9
|
+
export function ownedTemporaryCleanupResiduePrefix(temporaryPath) {
|
|
10
|
+
return `.${basename(temporaryPath)}${OWNED_TEMPORARY_CLEANUP_RESIDUE_MARKER}`;
|
|
11
|
+
}
|
|
12
|
+
function cleanupOperations(operations) {
|
|
13
|
+
return {
|
|
14
|
+
beforeLogicalRetirement: operations?.beforeLogicalRetirement,
|
|
15
|
+
identityMatch: operations?.pathMatchesRegularFileIdentity ?? pathMatchesRegularFileIdentity,
|
|
16
|
+
makeDirectory: operations?.mkdir ?? mkdir,
|
|
17
|
+
restore: operations?.link ?? link,
|
|
18
|
+
move: operations?.rename ?? rename,
|
|
19
|
+
token: operations?.quarantineToken?.() ?? randomUUID()
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function beginCleanupTransition(options) {
|
|
23
|
+
const initialOwnership = await options.identityMatch(options.temporaryPath, options.expectedIdentity);
|
|
24
|
+
if (initialOwnership !== "match") {
|
|
25
|
+
return { outcome: initialOwnership };
|
|
26
|
+
}
|
|
27
|
+
const transition = await options.transition?.begin();
|
|
28
|
+
if (transition !== undefined &&
|
|
29
|
+
(await options.identityMatch(options.temporaryPath, options.expectedIdentity)) !== "match") {
|
|
30
|
+
throw new Error(`Owned temporary changed after its cleanup transition began: ${options.displayPath}.`);
|
|
31
|
+
}
|
|
32
|
+
return { outcome: "owned", transition };
|
|
33
|
+
}
|
|
34
|
+
async function removeEmptyQuarantineAfterMissing(options) {
|
|
35
|
+
const terminalRoot = await ensureTerminalEvidenceDirectory(options.retiredEvidenceRoot, { mkdir: options.makeDirectory });
|
|
36
|
+
await assertTerminalEvidenceDirectory(terminalRoot);
|
|
37
|
+
await options.move(options.quarantineDirectory, options.retiredDirectory);
|
|
38
|
+
await syncPublicationDirectory({
|
|
39
|
+
...options.cleanupOptions,
|
|
40
|
+
parent: options.retiredEvidenceRoot
|
|
41
|
+
});
|
|
42
|
+
await syncPublicationDirectory(options.cleanupOptions);
|
|
43
|
+
if ((await options.identityMatch(options.temporaryPath, options.expectedIdentity)) !== "missing") {
|
|
44
|
+
return "different";
|
|
45
|
+
}
|
|
46
|
+
await options.transition?.complete();
|
|
47
|
+
return "missing";
|
|
48
|
+
}
|
|
49
|
+
async function logicallyRetireQuarantine(options) {
|
|
50
|
+
await options.beforeLogicalRetirement?.(options.quarantinedPath);
|
|
51
|
+
if ((await options.identityMatch(options.quarantinedPath, options.expectedIdentity)) !== "match") {
|
|
52
|
+
return "different";
|
|
53
|
+
}
|
|
54
|
+
await assertTerminalEvidenceDirectory(options.terminalRoot);
|
|
55
|
+
await options.move(options.quarantineDirectory, options.retiredDirectory);
|
|
56
|
+
await syncPublicationDirectory({
|
|
57
|
+
...options.cleanupOptions,
|
|
58
|
+
parent: options.terminalRoot.path
|
|
59
|
+
});
|
|
60
|
+
await syncPublicationDirectory(options.cleanupOptions);
|
|
61
|
+
return "removed";
|
|
62
|
+
}
|
|
63
|
+
export async function cleanupIdentityMatchingOwnedTemporary(options) {
|
|
64
|
+
const { beforeLogicalRetirement, identityMatch, makeDirectory, move, restore, token } = cleanupOperations(options.operations);
|
|
65
|
+
const quarantineDirectory = join(options.parent, `${ownedTemporaryCleanupResiduePrefix(options.temporaryPath)}${token}`);
|
|
66
|
+
const quarantinedPath = join(quarantineDirectory, "owned-temporary");
|
|
67
|
+
const retiredEvidenceRoot = join(options.parent, OWNED_TEMPORARY_RETIRED_EVIDENCE_MARKER);
|
|
68
|
+
const retiredDirectory = join(retiredEvidenceRoot, token);
|
|
69
|
+
const begun = await beginCleanupTransition({
|
|
70
|
+
displayPath: options.displayPath,
|
|
71
|
+
expectedIdentity: options.expectedIdentity,
|
|
72
|
+
identityMatch,
|
|
73
|
+
temporaryPath: options.temporaryPath,
|
|
74
|
+
...(options.transition === undefined
|
|
75
|
+
? {}
|
|
76
|
+
: { transition: options.transition })
|
|
77
|
+
});
|
|
78
|
+
if (begun.outcome !== "owned") {
|
|
79
|
+
return begun.outcome;
|
|
80
|
+
}
|
|
81
|
+
const { transition } = begun;
|
|
82
|
+
try {
|
|
83
|
+
await makeDirectory(quarantineDirectory, { mode: 0o700 });
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (errorCode(error) === "EEXIST") {
|
|
87
|
+
return "different";
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
await move(options.temporaryPath, quarantinedPath);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (errorCode(error) === "ENOENT") {
|
|
96
|
+
return removeEmptyQuarantineAfterMissing({
|
|
97
|
+
cleanupOptions: options,
|
|
98
|
+
expectedIdentity: options.expectedIdentity,
|
|
99
|
+
identityMatch,
|
|
100
|
+
makeDirectory,
|
|
101
|
+
quarantineDirectory,
|
|
102
|
+
move,
|
|
103
|
+
retiredEvidenceRoot,
|
|
104
|
+
retiredDirectory,
|
|
105
|
+
temporaryPath: options.temporaryPath,
|
|
106
|
+
transition
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
// Persist the atomic capture before deciding whether it grants deletion
|
|
112
|
+
// authority. Rename changes both directories, so durability requires the
|
|
113
|
+
// destination quarantine first and the source parent second.
|
|
114
|
+
await syncCleanupDirectory(options, quarantineDirectory);
|
|
115
|
+
await syncCleanupDirectory(options, options.parent);
|
|
116
|
+
const ownership = await identityMatch(quarantinedPath, options.expectedIdentity);
|
|
117
|
+
if (ownership === "missing") {
|
|
118
|
+
return "different";
|
|
119
|
+
}
|
|
120
|
+
if (ownership === "different") {
|
|
121
|
+
try {
|
|
122
|
+
await restore(quarantinedPath, options.temporaryPath);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (errorCode(error) === "EEXIST") {
|
|
126
|
+
return "different";
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
await syncCleanupDirectory(options, options.parent);
|
|
131
|
+
return "different";
|
|
132
|
+
}
|
|
133
|
+
const terminalRoot = await ensureTerminalEvidenceDirectory(retiredEvidenceRoot, { mkdir: makeDirectory });
|
|
134
|
+
await syncCleanupDirectory(options, options.parent);
|
|
135
|
+
// Node exposes no unlink-by-handle or identity-conditional unlink. Moving
|
|
136
|
+
// the whole private directory into a terminal namespace is atomic and can
|
|
137
|
+
// never delete a pathname replacement introduced after the final proof.
|
|
138
|
+
const retirement = await logicallyRetireQuarantine({
|
|
139
|
+
cleanupOptions: options,
|
|
140
|
+
expectedIdentity: options.expectedIdentity,
|
|
141
|
+
identityMatch,
|
|
142
|
+
move,
|
|
143
|
+
quarantinedPath,
|
|
144
|
+
quarantineDirectory,
|
|
145
|
+
retiredDirectory,
|
|
146
|
+
terminalRoot,
|
|
147
|
+
...(beforeLogicalRetirement === undefined
|
|
148
|
+
? {}
|
|
149
|
+
: { beforeLogicalRetirement })
|
|
150
|
+
});
|
|
151
|
+
if (retirement === "different") {
|
|
152
|
+
return retirement;
|
|
153
|
+
}
|
|
154
|
+
// Retirement proves the captured evidence is durable, but success also
|
|
155
|
+
// requires the original source name to remain absent. A repopulated source
|
|
156
|
+
// is foreign evidence: retain both names and the begun transition so the
|
|
157
|
+
// PUBLISHING transaction cannot be falsely completed.
|
|
158
|
+
if ((await identityMatch(options.temporaryPath, options.expectedIdentity)) !== "missing") {
|
|
159
|
+
return "different";
|
|
160
|
+
}
|
|
161
|
+
await transition?.complete();
|
|
162
|
+
return "removed";
|
|
163
|
+
}
|
|
164
|
+
async function syncCleanupDirectory(options, parent) {
|
|
165
|
+
await syncPublicationDirectory({ ...options, parent });
|
|
166
|
+
}
|
|
167
|
+
function errorCode(error) {
|
|
168
|
+
return error instanceof Error && "code" in error
|
|
169
|
+
? error.code
|
|
170
|
+
: undefined;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=node-cleanup-owned-temporary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-cleanup-owned-temporary.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-cleanup-owned-temporary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface NodeDirectoryCreateAndBindOperations<Parent, Observed, Bound> {
|
|
2
|
+
readonly ambiguousError: (error: unknown) => Error;
|
|
3
|
+
readonly bind: (bound: Bound) => Promise<void>;
|
|
4
|
+
readonly captureParent: () => Promise<Parent>;
|
|
5
|
+
readonly createAndObserve: (parent: Parent, markCreated: () => void) => Promise<Observed>;
|
|
6
|
+
readonly recapture: (parent: Parent, observed: Observed) => Promise<Bound>;
|
|
7
|
+
readonly syncParent: (parent: Parent) => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Shared no-cancellation directory critical section. Callers retain their own
|
|
11
|
+
* full-chain authority model, while this kernel fixes the mutation ordering.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createAndBindNodeDirectory<Parent, Observed, Bound>(operations: NodeDirectoryCreateAndBindOperations<Parent, Observed, Bound>): Promise<Bound>;
|
|
14
|
+
//# sourceMappingURL=node-create-and-bind-directory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-create-and-bind-directory.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-create-and-bind-directory.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oCAAoC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK;IAC3E,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,CACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,IAAI,KACpB,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3E,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EACtE,UAAU,EAAE,oCAAoC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,GACxE,OAAO,CAAC,KAAK,CAAC,CAmBhB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared no-cancellation directory critical section. Callers retain their own
|
|
3
|
+
* full-chain authority model, while this kernel fixes the mutation ordering.
|
|
4
|
+
*/
|
|
5
|
+
export async function createAndBindNodeDirectory(operations) {
|
|
6
|
+
const parent = await operations.captureParent();
|
|
7
|
+
const mutation = { created: false };
|
|
8
|
+
try {
|
|
9
|
+
const observed = await operations.createAndObserve(parent, () => { mutation.created = true; });
|
|
10
|
+
await operations.recapture(parent, observed);
|
|
11
|
+
await operations.syncParent(parent);
|
|
12
|
+
const bound = await operations.recapture(parent, observed);
|
|
13
|
+
await operations.bind(bound);
|
|
14
|
+
return bound;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (!mutation.created) {
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
throw operations.ambiguousError(error);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=node-create-and-bind-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-create-and-bind-directory.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-create-and-bind-directory.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAyE;IAEzE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAChD,MAAM,EACN,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CACnC,CAAC;QACF,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type DirectoryDurability = "durable" | "unsupported";
|
|
2
|
+
export declare class StrictDirectoryDurabilityError extends Error {
|
|
3
|
+
constructor(path: string);
|
|
4
|
+
}
|
|
5
|
+
export interface DirectorySyncHandle {
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
sync(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface DirectoryDurabilityOperations {
|
|
10
|
+
readonly open: (path: string) => Promise<DirectorySyncHandle>;
|
|
11
|
+
readonly platform: NodeJS.Platform;
|
|
12
|
+
}
|
|
13
|
+
export declare function syncDirectoryDurably(path: string, operations?: DirectoryDurabilityOperations): Promise<DirectoryDurability>;
|
|
14
|
+
/** For evidence whose protocol cannot honestly admit best-effort durability. */
|
|
15
|
+
export declare function syncDirectoryStrictly(path: string): Promise<void>;
|
|
16
|
+
export declare function syncDirectoryStrictlyWith(path: string, syncDirectory: (path: string) => Promise<DirectoryDurability>): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=node-directory-durability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-directory-durability.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-directory-durability.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE5D,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,YAAmB,IAAI,EAAE,MAAM,EAG9B;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CACpC;AAeD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,6BAAiE,GAC5E,OAAO,CAAC,mBAAmB,CAAC,CAkB9B;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
export class StrictDirectoryDurabilityError extends Error {
|
|
3
|
+
constructor(path) {
|
|
4
|
+
super(`Strict directory durability is unsupported: ${path}.`);
|
|
5
|
+
this.name = "StrictDirectoryDurabilityError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
const nodeDirectoryDurabilityOperations = {
|
|
9
|
+
async open(path) {
|
|
10
|
+
return open(path, "r");
|
|
11
|
+
},
|
|
12
|
+
platform: process.platform
|
|
13
|
+
};
|
|
14
|
+
function errorCode(error) {
|
|
15
|
+
return error instanceof Error && "code" in error
|
|
16
|
+
? error.code
|
|
17
|
+
: undefined;
|
|
18
|
+
}
|
|
19
|
+
export async function syncDirectoryDurably(path, operations = nodeDirectoryDurabilityOperations) {
|
|
20
|
+
try {
|
|
21
|
+
const handle = await operations.open(path);
|
|
22
|
+
try {
|
|
23
|
+
await handle.sync();
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await handle.close();
|
|
27
|
+
}
|
|
28
|
+
return "durable";
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (operations.platform === "win32" &&
|
|
32
|
+
["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(errorCode(error) ?? "")) {
|
|
33
|
+
return "unsupported";
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** For evidence whose protocol cannot honestly admit best-effort durability. */
|
|
39
|
+
export async function syncDirectoryStrictly(path) {
|
|
40
|
+
return syncDirectoryStrictlyWith(path, syncDirectoryDurably);
|
|
41
|
+
}
|
|
42
|
+
export async function syncDirectoryStrictlyWith(path, syncDirectory) {
|
|
43
|
+
if ((await syncDirectory(path)) === "unsupported") {
|
|
44
|
+
throw new StrictDirectoryDurabilityError(path);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=node-directory-durability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-directory-durability.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-directory-durability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAIxC,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,YAAmB,IAAY;QAC7B,KAAK,CAAC,+CAA+C,IAAI,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAYD,MAAM,iCAAiC,GAAkC;IACvE,KAAK,CAAC,IAAI,CAAC,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;CAC3B,CAAC;AAEF,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK;QAC9C,CAAC,CAAE,KAA+B,CAAC,IAAI;QACvC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,UAAU,GAAkC,iCAAiC;IAE7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,UAAU,CAAC,QAAQ,KAAK,OAAO;YAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EACxE,CAAC;YACD,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,OAAO,yBAAyB,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAY,EACZ,aAA6D;IAE7D,IAAI,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;QAClD,MAAM,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BoundDirectoryCreation, CapturedDirectory, DirectoryCreatePolicy, DirectoryMaterializationProjection, UnboundDirectoryCreationRecovery } from "../../application/model/directory-materialization.js";
|
|
2
|
+
import type { PortablePathIdentity } from "../../application/model/path-identity.js";
|
|
3
|
+
export interface DirectoryIdentityBindingPort {
|
|
4
|
+
bindCreatedDirectory(directory: CapturedDirectory & {
|
|
5
|
+
readonly parentIdentity: PortablePathIdentity;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
interface DirectoryCreationFaultPoint {
|
|
9
|
+
readonly phase: "after-mkdir-before-capture" | "after-parent-sync-before-bind";
|
|
10
|
+
readonly repositoryPath: string;
|
|
11
|
+
}
|
|
12
|
+
export type DirectoryCreationFaultInjector = (point: DirectoryCreationFaultPoint) => Promise<void> | void;
|
|
13
|
+
export declare function projectDirectoryMaterialization(options: {
|
|
14
|
+
readonly createPolicy: DirectoryCreatePolicy;
|
|
15
|
+
readonly repositoryPath: string;
|
|
16
|
+
readonly repositoryRoot: string;
|
|
17
|
+
}): Promise<DirectoryMaterializationProjection>;
|
|
18
|
+
export declare function recaptureExactDirectoryIdentity(options: {
|
|
19
|
+
readonly expectedIdentity: PortablePathIdentity;
|
|
20
|
+
readonly repositoryPath: string;
|
|
21
|
+
readonly repositoryRoot: string;
|
|
22
|
+
}): Promise<CapturedDirectory>;
|
|
23
|
+
export declare function createAndBindOneDirectory(options: {
|
|
24
|
+
readonly binding: Pick<DirectoryIdentityBindingPort, "bindCreatedDirectory">;
|
|
25
|
+
readonly createPolicy: DirectoryCreatePolicy;
|
|
26
|
+
readonly expectedParentIdentity: PortablePathIdentity;
|
|
27
|
+
readonly faultInjector?: DirectoryCreationFaultInjector;
|
|
28
|
+
readonly mode?: number;
|
|
29
|
+
readonly repositoryPath: string;
|
|
30
|
+
readonly repositoryRoot: string;
|
|
31
|
+
}): Promise<BoundDirectoryCreation>;
|
|
32
|
+
export declare function classifyUnboundDirectoryCreation(options: {
|
|
33
|
+
readonly repositoryPath: string;
|
|
34
|
+
readonly repositoryRoot: string;
|
|
35
|
+
}): Promise<UnboundDirectoryCreationRecovery>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=node-directory-materialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-directory-materialization.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-directory-materialization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,kCAAkC,EAElC,gCAAgC,EACjC,MAAM,sDAAsD,CAAC;AAE9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AASrF,MAAM,WAAW,4BAA4B;IAC3C,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,GAAG;QAClD,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;KAC/C,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,UAAU,2BAA2B;IACnC,QAAQ,CAAC,KAAK,EAAE,4BAA4B,GAAG,+BAA+B,CAAC;IAC/E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,8BAA8B,GAAG,CAC3C,KAAK,EAAE,2BAA2B,KAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAwL1B,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAuC9C;AAED,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW7B;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,4BAA4B,EAAE,sBAAsB,CAAC,CAAC;IAC7E,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC7C,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,8BAA8B,CAAC;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAoFlC;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAY5C"}
|