@openclaw/fs-safe 0.14.0 → 0.16.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 +88 -0
- package/README.md +38 -10
- package/dist/advanced.d.ts +2 -1
- package/dist/advanced.d.ts.map +1 -1
- package/dist/advanced.js +2 -1
- package/dist/archive-kind.d.ts +0 -1
- package/dist/archive-kind.d.ts.map +1 -1
- package/dist/archive-kind.js +5 -17
- package/dist/archive-merge.d.ts.map +1 -1
- package/dist/archive-merge.js +113 -46
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-read.d.ts.map +1 -1
- package/dist/archive-read.js +10 -11
- package/dist/archive-tar-stream.d.ts +3 -0
- package/dist/archive-tar-stream.d.ts.map +1 -1
- package/dist/archive-tar-stream.js +56 -37
- package/dist/archive-tar-wasm.d.ts +16 -4
- package/dist/archive-tar-wasm.d.ts.map +1 -1
- package/dist/archive-tar-wasm.js +134 -34
- package/dist/archive-zip-directory.d.ts +4 -0
- package/dist/archive-zip-directory.d.ts.map +1 -1
- package/dist/archive-zip-directory.js +2 -0
- package/dist/archive-zip-entry.d.ts +6 -2
- package/dist/archive-zip-entry.d.ts.map +1 -1
- package/dist/archive-zip-entry.js +23 -8
- package/dist/archive-zip-integrity.d.ts.map +1 -1
- package/dist/archive-zip-integrity.js +3 -4
- package/dist/archive-zip-loader.d.ts.map +1 -1
- package/dist/archive-zip-loader.js +107 -31
- package/dist/archive-zip-names.d.ts +1 -0
- package/dist/archive-zip-names.d.ts.map +1 -1
- package/dist/archive-zip-names.js +6 -0
- package/dist/archive.d.ts.map +1 -1
- package/dist/archive.js +11 -11
- package/dist/bounded-read-stream.d.ts +0 -1
- package/dist/bounded-read-stream.d.ts.map +1 -1
- package/dist/bounded-read-stream.js +0 -6
- package/dist/clone-metadata.d.ts +1 -0
- package/dist/clone-metadata.d.ts.map +1 -1
- package/dist/clone-metadata.js +6 -2
- package/dist/copy-publication.d.ts +6 -0
- package/dist/copy-publication.d.ts.map +1 -1
- package/dist/copy-publication.js +3 -0
- package/dist/copy-tree-portable.d.ts.map +1 -1
- package/dist/copy-tree-portable.js +44 -24
- package/dist/copy.d.ts.map +1 -1
- package/dist/copy.js +29 -11
- package/dist/create-directory.d.ts +20 -0
- package/dist/create-directory.d.ts.map +1 -0
- package/dist/create-directory.js +130 -0
- package/dist/create-file-async.d.ts +7 -0
- package/dist/create-file-async.d.ts.map +1 -0
- package/dist/create-file-async.js +121 -0
- package/dist/create-file.d.ts +8 -0
- package/dist/create-file.d.ts.map +1 -0
- package/dist/create-file.js +190 -0
- package/dist/create-owned-file.d.ts +8 -0
- package/dist/create-owned-file.d.ts.map +1 -0
- package/dist/create-owned-file.js +16 -0
- package/dist/create.d.ts +4 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +2 -0
- package/dist/creation-darwin.d.ts +7 -0
- package/dist/creation-darwin.d.ts.map +1 -0
- package/dist/creation-darwin.js +79 -0
- package/dist/creation-file-state.d.ts +19 -0
- package/dist/creation-file-state.d.ts.map +1 -0
- package/dist/creation-file-state.js +118 -0
- package/dist/creation-path.d.ts +21 -0
- package/dist/creation-path.d.ts.map +1 -0
- package/dist/creation-path.js +71 -0
- package/dist/creation-permissions.d.ts +19 -0
- package/dist/creation-permissions.d.ts.map +1 -0
- package/dist/creation-permissions.js +125 -0
- package/dist/directory-durability.d.ts +1 -1
- package/dist/directory-durability.d.ts.map +1 -1
- package/dist/directory-durability.js +22 -80
- package/dist/directory-guard.d.ts +3 -0
- package/dist/directory-guard.d.ts.map +1 -1
- package/dist/directory-mode-node.d.ts +2 -0
- package/dist/directory-mode-node.d.ts.map +1 -1
- package/dist/directory-mode-node.js +8 -0
- package/dist/directory-mode-owner.js +5 -5
- package/dist/directory-receipt.d.ts +24 -0
- package/dist/directory-receipt.d.ts.map +1 -0
- package/dist/directory-receipt.js +127 -0
- package/dist/file-cleanup.d.ts +19 -0
- package/dist/file-cleanup.d.ts.map +1 -0
- package/dist/file-cleanup.js +78 -0
- package/dist/file-handle-transfer.d.ts +2 -0
- package/dist/file-handle-transfer.d.ts.map +1 -1
- package/dist/file-handle-transfer.js +57 -2
- package/dist/file-identity.d.ts.map +1 -1
- package/dist/file-identity.js +18 -4
- package/dist/file-lock-sync-admission.d.ts +19 -0
- package/dist/file-lock-sync-admission.d.ts.map +1 -0
- package/dist/file-lock-sync-admission.js +93 -0
- package/dist/file-lock-sync-root-acquire.d.ts +4 -0
- package/dist/file-lock-sync-root-acquire.d.ts.map +1 -0
- package/dist/file-lock-sync-root-acquire.js +370 -0
- package/dist/file-lock-sync-root-arbitration.d.ts +18 -0
- package/dist/file-lock-sync-root-arbitration.d.ts.map +1 -0
- package/dist/file-lock-sync-root-arbitration.js +66 -0
- package/dist/file-lock-sync-root-held.d.ts +34 -0
- package/dist/file-lock-sync-root-held.d.ts.map +1 -0
- package/dist/file-lock-sync-root-held.js +393 -0
- package/dist/file-lock-sync-root-io.d.ts +44 -0
- package/dist/file-lock-sync-root-io.d.ts.map +1 -0
- package/dist/file-lock-sync-root-io.js +209 -0
- package/dist/file-lock-sync-root-mutation.d.ts +17 -0
- package/dist/file-lock-sync-root-mutation.d.ts.map +1 -0
- package/dist/file-lock-sync-root-mutation.js +277 -0
- package/dist/file-lock-sync-root-options.d.ts +20 -0
- package/dist/file-lock-sync-root-options.d.ts.map +1 -0
- package/dist/file-lock-sync-root-options.js +58 -0
- package/dist/file-lock-sync-root-registration.d.ts +2 -0
- package/dist/file-lock-sync-root-registration.d.ts.map +1 -0
- package/dist/file-lock-sync-root-registration.js +90 -0
- package/dist/file-lock-sync-root.d.ts +36 -0
- package/dist/file-lock-sync-root.d.ts.map +1 -0
- package/dist/file-lock-sync-root.js +361 -0
- package/dist/file-lock-sync-stale-admission.d.ts +24 -0
- package/dist/file-lock-sync-stale-admission.d.ts.map +1 -0
- package/dist/file-lock-sync-stale-admission.js +205 -0
- package/dist/file-lock-sync.d.ts.map +1 -1
- package/dist/file-lock-sync.js +245 -205
- package/dist/file-observation.d.ts +1 -1
- package/dist/file-observation.d.ts.map +1 -1
- package/dist/file-store-boundary.d.ts +2 -6
- package/dist/file-store-boundary.d.ts.map +1 -1
- package/dist/file-store-boundary.js +3 -9
- package/dist/file-store-prune.d.ts.map +1 -1
- package/dist/file-store-prune.js +5 -1
- package/dist/file-store-sync-write.d.ts.map +1 -1
- package/dist/file-store-sync-write.js +5 -8
- package/dist/file-store.d.ts.map +1 -1
- package/dist/file-store.js +47 -12
- package/dist/guarded-mkdir.d.ts +1 -0
- package/dist/guarded-mkdir.d.ts.map +1 -1
- package/dist/guarded-mkdir.js +36 -7
- package/dist/json-document-store.d.ts.map +1 -1
- package/dist/json-document-store.js +22 -15
- package/dist/json-durable-queue-ownership.d.ts +0 -1
- package/dist/json-durable-queue-ownership.d.ts.map +1 -1
- package/dist/json-durable-queue-ownership.js +0 -6
- package/dist/move-path.js +1 -1
- package/dist/native-binding.d.ts +13 -1
- package/dist/native-binding.d.ts.map +1 -1
- package/dist/native-fallback-warning.d.ts +4 -0
- package/dist/native-fallback-warning.d.ts.map +1 -0
- package/dist/native-fallback-warning.js +11 -0
- package/dist/native-operations.d.ts +0 -2
- package/dist/native-operations.d.ts.map +1 -1
- package/dist/native-operations.js +0 -24
- package/dist/native-parent-admission.d.ts +5 -2
- package/dist/native-parent-admission.d.ts.map +1 -1
- package/dist/native-parent-admission.js +27 -7
- package/dist/native-pinned-write-windows.d.ts +1 -1
- package/dist/native-pinned-write-windows.d.ts.map +1 -1
- package/dist/native-pinned-write-windows.js +174 -29
- package/dist/native-pinned-write.d.ts.map +1 -1
- package/dist/native-pinned-write.js +26 -14
- package/dist/native-policy-parent-windows.d.ts +14 -0
- package/dist/native-policy-parent-windows.d.ts.map +1 -0
- package/dist/native-policy-parent-windows.js +209 -0
- package/dist/native-rename-outcome.d.ts +4 -0
- package/dist/native-rename-outcome.d.ts.map +1 -0
- package/dist/native-rename-outcome.js +8 -0
- package/dist/native-staged-file.d.ts +3 -2
- package/dist/native-staged-file.d.ts.map +1 -1
- package/dist/native-staged-file.js +121 -72
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +12 -8
- package/dist/owner-dacl.d.ts.map +1 -1
- package/dist/owner-dacl.js +10 -4
- package/dist/path-prefix.d.ts.map +1 -1
- package/dist/path-prefix.js +30 -8
- package/dist/path-suffix-aliases.d.ts +2 -0
- package/dist/path-suffix-aliases.d.ts.map +1 -1
- package/dist/path-suffix-aliases.js +25 -17
- package/dist/permission-exec.d.ts +2 -0
- package/dist/permission-exec.d.ts.map +1 -1
- package/dist/permission-exec.js +150 -21
- package/dist/permissions-windows.js +1 -1
- package/dist/pinned-mutation-admission.d.ts.map +1 -1
- package/dist/pinned-mutation-admission.js +10 -5
- package/dist/pinned-mutation-observation.d.ts +0 -1
- package/dist/pinned-mutation-observation.d.ts.map +1 -1
- package/dist/pinned-mutation-observation.js +0 -19
- package/dist/pinned-mutation-shared-route.d.ts +1 -0
- package/dist/pinned-mutation-shared-route.d.ts.map +1 -1
- package/dist/pinned-mutation-shared-route.js +1 -1
- package/dist/pinned-write-input.d.ts +4 -0
- package/dist/pinned-write-input.d.ts.map +1 -0
- package/dist/pinned-write-input.js +25 -0
- package/dist/pinned-write-mode.d.ts +5 -0
- package/dist/pinned-write-mode.d.ts.map +1 -0
- package/dist/pinned-write-mode.js +24 -0
- package/dist/pinned-write-staged.d.ts +6 -0
- package/dist/pinned-write-staged.d.ts.map +1 -0
- package/dist/pinned-write-staged.js +187 -0
- package/dist/pinned-write-types.d.ts +5 -0
- package/dist/pinned-write-types.d.ts.map +1 -1
- package/dist/pinned-write.d.ts.map +1 -1
- package/dist/pinned-write.js +35 -145
- package/dist/private-directory.d.ts.map +1 -1
- package/dist/private-directory.js +18 -4
- package/dist/private-producer-handoff-sync.d.ts +14 -0
- package/dist/private-producer-handoff-sync.d.ts.map +1 -0
- package/dist/private-producer-handoff-sync.js +114 -0
- package/dist/private-producer-handoff.d.ts +22 -4
- package/dist/private-producer-handoff.d.ts.map +1 -1
- package/dist/private-producer-handoff.js +140 -77
- package/dist/private-temp-workspace.d.ts.map +1 -1
- package/dist/private-temp-workspace.js +75 -121
- package/dist/publish-copy-stage.d.ts +2 -1
- package/dist/publish-copy-stage.d.ts.map +1 -1
- package/dist/publish-copy-stage.js +16 -7
- package/dist/publish-file.d.ts.map +1 -1
- package/dist/publish-file.js +2 -2
- package/dist/regular-file.d.ts.map +1 -1
- package/dist/regular-file.js +1 -15
- package/dist/replace-directory.d.ts.map +1 -1
- package/dist/replace-directory.js +256 -18
- package/dist/replace-file-copy-fallback.d.ts.map +1 -1
- package/dist/replace-file-copy-fallback.js +62 -70
- package/dist/replace-file-copy-source.d.ts.map +1 -1
- package/dist/replace-file-copy-source.js +10 -12
- package/dist/replace-file-temp-owner.d.ts +5 -9
- package/dist/replace-file-temp-owner.d.ts.map +1 -1
- package/dist/replace-file-temp-owner.js +56 -72
- package/dist/replace-file.js +6 -6
- package/dist/retained-directory-replacement.d.ts +26 -0
- package/dist/retained-directory-replacement.d.ts.map +1 -0
- package/dist/retained-directory-replacement.js +193 -0
- package/dist/root-boundary.d.ts +1 -0
- package/dist/root-boundary.d.ts.map +1 -1
- package/dist/root-boundary.js +4 -0
- package/dist/root-context.d.ts +0 -8
- package/dist/root-context.d.ts.map +1 -1
- package/dist/root-context.js +0 -3
- package/dist/root-create-input.d.ts +8 -1
- package/dist/root-create-input.d.ts.map +1 -1
- package/dist/root-create-input.js +17 -4
- package/dist/root-directory-creation.d.ts +3 -3
- package/dist/root-directory-creation.d.ts.map +1 -1
- package/dist/root-directory-creation.js +15 -3
- package/dist/root-directory-list.d.ts +1 -0
- package/dist/root-directory-list.d.ts.map +1 -1
- package/dist/root-directory-list.js +1 -0
- package/dist/root-impl.d.ts.map +1 -1
- package/dist/root-impl.js +46 -17
- package/dist/root-move-noreplace.d.ts.map +1 -1
- package/dist/root-move-noreplace.js +24 -15
- package/dist/root-options.d.ts +12 -4
- package/dist/root-options.d.ts.map +1 -1
- package/dist/root-path-errors.d.ts +1 -0
- package/dist/root-path-errors.d.ts.map +1 -1
- package/dist/root-path-errors.js +11 -2
- package/dist/root-path-existing.d.ts.map +1 -1
- package/dist/root-path-existing.js +11 -35
- package/dist/root-path-stat.d.ts.map +1 -1
- package/dist/root-path-stat.js +59 -7
- package/dist/root-path.js +1 -13
- package/dist/root-remove.d.ts +1 -0
- package/dist/root-remove.d.ts.map +1 -1
- package/dist/root-remove.js +4 -0
- package/dist/root-walk.d.ts +1 -1
- package/dist/root-walk.d.ts.map +1 -1
- package/dist/root-walk.js +17 -2
- package/dist/root-write-admission.d.ts +0 -2
- package/dist/root-write-admission.d.ts.map +1 -1
- package/dist/root-write-admission.js +1 -15
- package/dist/root-write-complete-parent.d.ts.map +1 -1
- package/dist/root-write-complete-parent.js +7 -23
- package/dist/root-write-publication.js +1 -1
- package/dist/root-write-verification.d.ts.map +1 -1
- package/dist/root-write-verification.js +29 -42
- package/dist/secret-file.d.ts.map +1 -1
- package/dist/secret-file.js +3 -24
- package/dist/secret-read-async.d.ts.map +1 -1
- package/dist/secret-read-async.js +3 -24
- package/dist/secret-read-policy.d.ts +6 -2
- package/dist/secret-read-policy.d.ts.map +1 -1
- package/dist/secret-read-policy.js +26 -2
- package/dist/secure-file-windows.d.ts +6 -0
- package/dist/secure-file-windows.d.ts.map +1 -1
- package/dist/secure-file-windows.js +34 -117
- package/dist/secure-file.js +2 -2
- package/dist/sibling-temp.d.ts.map +1 -1
- package/dist/sibling-temp.js +23 -12
- package/dist/sidecar-lock-acquire.d.ts +2 -28
- package/dist/sidecar-lock-acquire.d.ts.map +1 -1
- package/dist/sidecar-lock-acquire.js +288 -199
- package/dist/sidecar-lock-admission-context.d.ts +19 -0
- package/dist/sidecar-lock-admission-context.d.ts.map +1 -0
- package/dist/sidecar-lock-admission-context.js +60 -0
- package/dist/sidecar-lock-admission-parser.d.ts +43 -0
- package/dist/sidecar-lock-admission-parser.d.ts.map +1 -0
- package/dist/sidecar-lock-admission-parser.js +113 -0
- package/dist/sidecar-lock-admission.d.ts +35 -0
- package/dist/sidecar-lock-admission.d.ts.map +1 -0
- package/dist/sidecar-lock-admission.js +7 -0
- package/dist/sidecar-lock-reclaim.d.ts +9 -4
- package/dist/sidecar-lock-reclaim.d.ts.map +1 -1
- package/dist/sidecar-lock-reclaim.js +80 -25
- package/dist/sidecar-lock-root.d.ts.map +1 -1
- package/dist/sidecar-lock-root.js +2 -1
- package/dist/sidecar-lock-stale-admission.d.ts +39 -0
- package/dist/sidecar-lock-stale-admission.d.ts.map +1 -0
- package/dist/sidecar-lock-stale-admission.js +232 -0
- package/dist/sidecar-lock-target.d.ts +8 -0
- package/dist/sidecar-lock-target.d.ts.map +1 -0
- package/dist/sidecar-lock-target.js +55 -0
- package/dist/sidecar-lock.d.ts.map +1 -1
- package/dist/sidecar-lock.js +100 -16
- package/dist/staged-directory.d.ts.map +1 -1
- package/dist/staged-directory.js +6 -6
- package/dist/staged-file-settlement.d.ts +17 -0
- package/dist/staged-file-settlement.d.ts.map +1 -0
- package/dist/staged-file-settlement.js +57 -0
- package/dist/temp-workspace-descriptor.d.ts.map +1 -1
- package/dist/temp-workspace-descriptor.js +9 -27
- package/dist/temp-workspace-owner.d.ts.map +1 -1
- package/dist/temp-workspace-owner.js +8 -8
- package/dist/walk.d.ts +5 -1
- package/dist/walk.d.ts.map +1 -1
- package/dist/walk.js +19 -6
- package/dist/windows-owner.d.ts.map +1 -1
- package/dist/windows-owner.js +4 -3
- package/dist/windows-security-bridge.cs +336 -0
- package/dist/windows-security-bridge.ps1 +15 -0
- package/dist/windows-security-command.d.ts +26 -0
- package/dist/windows-security-command.d.ts.map +1 -0
- package/dist/windows-security-command.js +363 -0
- package/dist/windows-security-facts.d.ts +6 -0
- package/dist/windows-security-facts.d.ts.map +1 -0
- package/dist/windows-security-facts.js +108 -0
- package/docs/advanced.md +4 -2
- package/docs/archive.md +97 -46
- package/docs/atomic.md +85 -8
- package/docs/config.md +6 -2
- package/docs/contributing.md +44 -4
- package/docs/copy.md +37 -0
- package/docs/creation.md +128 -0
- package/docs/durability.md +24 -0
- package/docs/file-store.md +19 -0
- package/docs/install.md +31 -7
- package/docs/json-store.md +5 -0
- package/docs/migrating-to-0.5.md +15 -6
- package/docs/migrating-to-0.6.md +9 -4
- package/docs/native-helper.md +32 -12
- package/docs/native.md +38 -7
- package/docs/output.md +6 -0
- package/docs/path-prefix.md +10 -0
- package/docs/path-suffix-aliases.md +51 -6
- package/docs/permissions.md +50 -14
- package/docs/public-api.md +3 -2
- package/docs/root.md +56 -3
- package/docs/secret-file.md +11 -2
- package/docs/secure-file.md +9 -4
- package/docs/sidecar-lock.md +114 -8
- package/docs/staged-file.md +12 -3
- package/docs/temp.md +20 -3
- package/docs/walk.md +67 -1
- package/docs/writing.md +76 -6
- package/package.json +19 -16
- package/dist/darwin-acl.d.ts +0 -4
- package/dist/darwin-acl.d.ts.map +0 -1
- package/dist/darwin-acl.js +0 -24
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs, {} from "node:fs";
|
|
2
|
+
import { ownFileDescriptorSync } from "./create-owned-file.js";
|
|
3
|
+
import { FsSafeError } from "./errors.js";
|
|
4
|
+
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
5
|
+
import { assertInitialSource, assertParents, inspectLinkedFile, normalizeLinkError, } from "./private-producer-handoff.js";
|
|
6
|
+
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
7
|
+
export function handoffCreatedFileSync(params) {
|
|
8
|
+
let retained = params.source;
|
|
9
|
+
const owners = new Set([retained]);
|
|
10
|
+
const failures = [];
|
|
11
|
+
let publication = "not-published";
|
|
12
|
+
let cleanup = "preserved";
|
|
13
|
+
let closeFailed = false;
|
|
14
|
+
function close(owner) {
|
|
15
|
+
// A throwing close may already have released the descriptor for reuse.
|
|
16
|
+
owners.delete(owner);
|
|
17
|
+
try {
|
|
18
|
+
owner.close();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
closeFailed = true;
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function assertIdentityCurrent(owner, links) {
|
|
26
|
+
assertParents(params);
|
|
27
|
+
inspectLinkedFile(() => fs.fstatSync(owner.fd, { bigint: true }), params.identity, links, "created file descriptor");
|
|
28
|
+
if (cleanup !== "removed") {
|
|
29
|
+
inspectLinkedFile(() => fs.lstatSync(params.sourcePath, { bigint: true }), params.identity, links, "created file stage");
|
|
30
|
+
}
|
|
31
|
+
if (publication === "published") {
|
|
32
|
+
inspectLinkedFile(() => fs.lstatSync(params.targetPath, { bigint: true }), params.identity, links, "created file destination");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function verifyCurrent(owner, descriptorPath, links) {
|
|
36
|
+
assertIdentityCurrent(owner, links);
|
|
37
|
+
params.verifyDescriptor?.(owner.fd, descriptorPath, Number(links));
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
assertInitialSource(params.identity);
|
|
41
|
+
verifyCurrent(retained, params.sourcePath, 1n);
|
|
42
|
+
assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
43
|
+
assertIdentityCurrent(retained, 1n);
|
|
44
|
+
publication = "indeterminate";
|
|
45
|
+
try {
|
|
46
|
+
fs.linkSync(params.sourcePath, params.targetPath);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const normalized = normalizeLinkError(error);
|
|
50
|
+
if (normalized instanceof FsSafeError &&
|
|
51
|
+
(normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
|
|
52
|
+
publication = "not-published";
|
|
53
|
+
}
|
|
54
|
+
throw normalized;
|
|
55
|
+
}
|
|
56
|
+
publication = "published";
|
|
57
|
+
try {
|
|
58
|
+
params.onPublished?.();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
failures.push(error);
|
|
62
|
+
}
|
|
63
|
+
if (process.platform === "win32") {
|
|
64
|
+
verifyCurrent(retained, params.sourcePath, 2n);
|
|
65
|
+
// Keep the original pin until a verified published-name pin exists, so
|
|
66
|
+
// Windows can retire the staging name without leaving it delete-pending.
|
|
67
|
+
const sibling = ownFileDescriptorSync(fs.openSync(params.targetPath, fs.constants.O_RDWR | resolveReadOpenFlags()));
|
|
68
|
+
owners.add(sibling);
|
|
69
|
+
verifyCurrent(sibling, params.targetPath, 2n);
|
|
70
|
+
inspectLinkedFile(() => fs.fstatSync(retained.fd, { bigint: true }), params.identity, 2n, "created file descriptor");
|
|
71
|
+
close(retained);
|
|
72
|
+
retained = sibling;
|
|
73
|
+
}
|
|
74
|
+
const descriptorPath = process.platform === "win32" ? params.targetPath : params.sourcePath;
|
|
75
|
+
verifyCurrent(retained, descriptorPath, 2n);
|
|
76
|
+
assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
77
|
+
assertIdentityCurrent(retained, 2n);
|
|
78
|
+
cleanup = "failed";
|
|
79
|
+
// Link and unlink stay in one JS turn. Only the verified stage is removed;
|
|
80
|
+
// publication has committed and the destination is never rollback cleanup.
|
|
81
|
+
fs.unlinkSync(params.sourcePath);
|
|
82
|
+
cleanup = "removed";
|
|
83
|
+
verifyCurrent(retained, params.targetPath, 1n);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
failures.push(error);
|
|
87
|
+
}
|
|
88
|
+
if (failures.length === 0)
|
|
89
|
+
return retained;
|
|
90
|
+
for (const owner of owners) {
|
|
91
|
+
try {
|
|
92
|
+
close(owner);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
failures.push(error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const primary = failures[0];
|
|
99
|
+
// Collision-as-no-op callers must still observe a failed settlement.
|
|
100
|
+
const code = closeFailed || failures.length > 1
|
|
101
|
+
? "helper-failed"
|
|
102
|
+
: primary instanceof FsSafeError ? primary.code : "helper-failed";
|
|
103
|
+
throw new FsSafeError(code, "created file publication failed", {
|
|
104
|
+
cause: failures.length === 1 ? primary : new AggregateError(failures, "created file publication and settlement failed"),
|
|
105
|
+
details: {
|
|
106
|
+
publication: { status: publication },
|
|
107
|
+
cleanup,
|
|
108
|
+
resources: closeFailed ? "close-failed" : "closed",
|
|
109
|
+
path: params.targetPath,
|
|
110
|
+
dev: params.identity.dev,
|
|
111
|
+
ino: params.identity.ino,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
@@ -6,11 +6,29 @@ export type PrivateProducerHandoff = {
|
|
|
6
6
|
identity: BigIntStats;
|
|
7
7
|
unregister: TempPathRegistration;
|
|
8
8
|
};
|
|
9
|
-
|
|
10
|
-
sourcePath: string;
|
|
11
|
-
targetPath: string;
|
|
9
|
+
type HandoffParents = {
|
|
12
10
|
assertSourceParent: () => void;
|
|
13
11
|
assertTargetParent: () => void;
|
|
12
|
+
};
|
|
13
|
+
type HandoffPaths = HandoffParents & {
|
|
14
|
+
sourcePath: string;
|
|
15
|
+
targetPath: string;
|
|
16
|
+
};
|
|
17
|
+
type ProducerHandoffParams = HandoffPaths & {
|
|
14
18
|
readWrite: boolean;
|
|
15
|
-
}
|
|
19
|
+
};
|
|
20
|
+
type CreatedHandoffParams = HandoffPaths & {
|
|
21
|
+
source: FileHandle;
|
|
22
|
+
identity: BigIntStats;
|
|
23
|
+
assertBeforeMutation?: () => void;
|
|
24
|
+
verifyDescriptor?: (fd: number, path: string, links: number) => Promise<void>;
|
|
25
|
+
onPublished?: () => void;
|
|
26
|
+
};
|
|
27
|
+
export declare function assertInitialSource(stat: BigIntStats): void;
|
|
28
|
+
export declare function inspectLinkedFile(inspect: () => BigIntStats, expected: BigIntStats, links: bigint, label: string): BigIntStats;
|
|
29
|
+
export declare function assertParents(params: HandoffParents): void;
|
|
30
|
+
export declare function normalizeLinkError(error: unknown): unknown;
|
|
31
|
+
export declare function handoffPrivateProducerFile(params: ProducerHandoffParams): Promise<PrivateProducerHandoff>;
|
|
32
|
+
export declare function handoffCreatedFile(params: CreatedHandoffParams): Promise<FileHandle>;
|
|
33
|
+
export {};
|
|
16
34
|
//# sourceMappingURL=private-producer-handoff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private-producer-handoff.d.ts","sourceRoot":"","sources":["../src/private-producer-handoff.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"private-producer-handoff.d.ts","sourceRoot":"","sources":["../src/private-producer-handoff.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,oBAAoB,CAAC;CAClC,CAAC;AASF,KAAK,cAAc,GAAG;IACpB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,KAAK,YAAY,GAAG,cAAc,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAChF,KAAK,qBAAqB,GAAG,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AACnE,KAAK,oBAAoB,GAAG,YAAY,GAAG;IACzC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAU3D;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,WAAW,EAC1B,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,WAAW,CAQb;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAG1D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmB1D;AAiUD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAEzG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpF"}
|
|
@@ -2,13 +2,14 @@ import fsSync, {} from "node:fs";
|
|
|
2
2
|
import fs, {} from "node:fs/promises";
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { sameFileIdentityForCleanup } from "./file-identity.js";
|
|
5
|
+
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
5
6
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
6
7
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
7
8
|
import { registerTempPathForExit, } from "./temp-cleanup.js";
|
|
8
9
|
function pathMismatch(message) {
|
|
9
10
|
return new FsSafeError("path-mismatch", message);
|
|
10
11
|
}
|
|
11
|
-
function assertInitialSource(stat) {
|
|
12
|
+
export function assertInitialSource(stat) {
|
|
12
13
|
if (stat.isSymbolicLink()) {
|
|
13
14
|
throw new FsSafeError("path-alias", "isolated producer output must not be a symlink");
|
|
14
15
|
}
|
|
@@ -19,7 +20,7 @@ function assertInitialSource(stat) {
|
|
|
19
20
|
throw new FsSafeError("hardlink", "isolated producer output must have exactly one link");
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
|
-
function inspectLinkedFile(inspect, expected, links, label) {
|
|
23
|
+
export function inspectLinkedFile(inspect, expected, links, label) {
|
|
23
24
|
return inspectFileIdentitySync(() => {
|
|
24
25
|
const stat = inspect();
|
|
25
26
|
if (stat.isSymbolicLink() || !stat.isFile() || stat.nlink !== links) {
|
|
@@ -28,11 +29,11 @@ function inspectLinkedFile(inspect, expected, links, label) {
|
|
|
28
29
|
return stat;
|
|
29
30
|
}, expected);
|
|
30
31
|
}
|
|
31
|
-
function assertParents(params) {
|
|
32
|
+
export function assertParents(params) {
|
|
32
33
|
params.assertTargetParent();
|
|
33
34
|
params.assertSourceParent();
|
|
34
35
|
}
|
|
35
|
-
function normalizeLinkError(error) {
|
|
36
|
+
export function normalizeLinkError(error) {
|
|
36
37
|
const code = error?.code;
|
|
37
38
|
if (code === "EEXIST") {
|
|
38
39
|
return new FsSafeError("already-exists", "isolated producer sibling already exists", {
|
|
@@ -101,7 +102,7 @@ async function throwAfterClosing(primary, handles) {
|
|
|
101
102
|
throw combinedFailure(primary, settlement);
|
|
102
103
|
}
|
|
103
104
|
function inspectSourceDescriptor(handle, identity, links = 1n) {
|
|
104
|
-
inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, links, "isolated producer descriptor");
|
|
105
|
+
return inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, links, "isolated producer descriptor");
|
|
105
106
|
}
|
|
106
107
|
function historicalOpenFlags(readWrite) {
|
|
107
108
|
const access = readWrite ? fsSync.constants.O_RDWR : fsSync.constants.O_RDONLY;
|
|
@@ -164,109 +165,171 @@ async function openProducerSource(params, identity, links = 1n) {
|
|
|
164
165
|
}
|
|
165
166
|
return fallback;
|
|
166
167
|
}
|
|
167
|
-
function
|
|
168
|
+
function inspectHandoff(params, handle, identity, state, links) {
|
|
168
169
|
assertParents(params);
|
|
169
|
-
inspectSourceDescriptor(handle, identity,
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
const opened = inspectSourceDescriptor(handle, identity, links);
|
|
171
|
+
if (state.cleanup !== "removed") {
|
|
172
|
+
inspectLinkedFile(() => fsSync.lstatSync(params.sourcePath, { bigint: true }), identity, links, "isolated producer path");
|
|
173
|
+
}
|
|
174
|
+
const named = state.publication === "published" ? inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, links, "isolated producer sibling") : undefined;
|
|
175
|
+
return { opened, named };
|
|
172
176
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const identity = inspectFileIdentitySync(() => {
|
|
177
|
+
async function handoffFile(params) {
|
|
178
|
+
const created = "source" in params ? params : undefined;
|
|
179
|
+
const identity = created?.identity ?? inspectFileIdentitySync(() => {
|
|
180
|
+
assertParents(params);
|
|
176
181
|
const stat = fsSync.lstatSync(params.sourcePath, { bigint: true });
|
|
177
182
|
assertInitialSource(stat);
|
|
178
183
|
return stat;
|
|
179
184
|
});
|
|
180
|
-
let handle;
|
|
181
|
-
|
|
185
|
+
let handle = created?.source;
|
|
186
|
+
const owners = new Set(handle ? [handle] : []);
|
|
187
|
+
const failures = [];
|
|
182
188
|
let unregister;
|
|
183
|
-
const state = {
|
|
189
|
+
const state = {
|
|
190
|
+
siblingOwned: false, publication: "not-published", cleanup: "preserved", closeFailed: false,
|
|
191
|
+
};
|
|
192
|
+
async function close(owned) {
|
|
193
|
+
// Final creation consumes its pin before close can release and recycle it.
|
|
194
|
+
// Legacy temporary handoff retains its historical FileHandle close retry.
|
|
195
|
+
if (created)
|
|
196
|
+
owners.delete(owned);
|
|
197
|
+
try {
|
|
198
|
+
await owned.close();
|
|
199
|
+
owners.delete(owned);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
state.closeFailed = true;
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
184
206
|
try {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
207
|
+
assertInitialSource(identity);
|
|
208
|
+
if (!handle) {
|
|
209
|
+
handle = await openProducerSource({ ...params, readWrite: "readWrite" in params && params.readWrite }, identity);
|
|
210
|
+
owners.add(handle);
|
|
211
|
+
}
|
|
212
|
+
inspectHandoff(params, handle, identity, state, 1n);
|
|
213
|
+
if (created?.verifyDescriptor)
|
|
214
|
+
await created.verifyDescriptor(handle.fd, params.sourcePath, 1);
|
|
215
|
+
if (!created) {
|
|
216
|
+
unregister = registerTempPathForExit(params.targetPath, {
|
|
217
|
+
cleanupSync: () => removeSiblingIfOwned({
|
|
218
|
+
assertTargetParent: params.assertTargetParent, identity, state, targetPath: params.targetPath,
|
|
219
|
+
}),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
223
|
+
inspectHandoff(params, handle, identity, state, 1n);
|
|
224
|
+
state.publication = "indeterminate";
|
|
197
225
|
try {
|
|
198
226
|
fsSync.linkSync(params.sourcePath, params.targetPath);
|
|
199
227
|
}
|
|
200
228
|
catch (error) {
|
|
201
|
-
|
|
229
|
+
const normalized = normalizeLinkError(error);
|
|
230
|
+
if (normalized instanceof FsSafeError &&
|
|
231
|
+
(normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
|
|
232
|
+
state.publication = "not-published";
|
|
233
|
+
}
|
|
234
|
+
throw normalized;
|
|
202
235
|
}
|
|
203
|
-
state.
|
|
204
|
-
|
|
236
|
+
state.publication = "published";
|
|
237
|
+
state.siblingOwned = !created;
|
|
238
|
+
try {
|
|
239
|
+
assertSynchronousCallbackResult(created?.onPublished?.(), "onPublished");
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
failures.push(error);
|
|
243
|
+
}
|
|
244
|
+
inspectHandoff(params, handle, identity, state, 2n);
|
|
205
245
|
if (process.platform === "win32") {
|
|
206
246
|
// Legacy Windows unlink retains a delete-pending name until handles
|
|
207
247
|
// opened through that name close. Transfer the pin before retiring it.
|
|
208
|
-
|
|
209
|
-
|
|
248
|
+
const sibling = created
|
|
249
|
+
? await fs.open(params.targetPath, historicalOpenFlags(true))
|
|
250
|
+
: await openProducerSource({ ...params, sourcePath: params.targetPath,
|
|
251
|
+
readWrite: "readWrite" in params && params.readWrite }, identity, 2n);
|
|
252
|
+
owners.add(sibling);
|
|
253
|
+
inspectHandoff(params, sibling, identity, state, 2n);
|
|
254
|
+
if (created?.verifyDescriptor)
|
|
255
|
+
await created.verifyDescriptor(sibling.fd, params.targetPath, 2);
|
|
256
|
+
inspectHandoff(params, sibling, identity, state, 2n);
|
|
210
257
|
inspectSourceDescriptor(handle, identity, 2n);
|
|
211
|
-
await
|
|
212
|
-
handle =
|
|
213
|
-
siblingHandle = undefined;
|
|
258
|
+
await close(handle);
|
|
259
|
+
handle = sibling;
|
|
214
260
|
// The old handle's close yielded; both names must still be ours.
|
|
215
|
-
|
|
261
|
+
inspectHandoff(params, handle, identity, state, 2n);
|
|
216
262
|
}
|
|
217
|
-
|
|
263
|
+
if (created?.verifyDescriptor)
|
|
264
|
+
await created.verifyDescriptor(handle.fd, process.platform === "win32" ? params.targetPath : params.sourcePath, 2);
|
|
265
|
+
assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
266
|
+
inspectHandoff(params, handle, identity, state, 2n);
|
|
267
|
+
state.cleanup = "failed";
|
|
218
268
|
fsSync.unlinkSync(params.sourcePath);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
269
|
+
state.cleanup = "removed";
|
|
270
|
+
if (created?.verifyDescriptor)
|
|
271
|
+
await created.verifyDescriptor(handle.fd, params.targetPath, 1);
|
|
272
|
+
const { opened, named } = inspectHandoff(params, handle, identity, state, 1n);
|
|
222
273
|
const originalMode = identity.mode & 511n;
|
|
223
|
-
if (process.platform === "win32" && (originalMode & 128n) === 0n &&
|
|
224
|
-
((opened.mode & 511n) !== originalMode || (
|
|
274
|
+
if (!created && process.platform === "win32" && (originalMode & 128n) === 0n &&
|
|
275
|
+
((opened.mode & 511n) !== originalMode || (named.mode & 511n) !== originalMode)) {
|
|
225
276
|
// Legacy unlink clears the shared read-only attribute. Repair only the
|
|
226
277
|
// admitted sibling inode, without reopening or chmodding its pathname.
|
|
227
278
|
assertParents(params);
|
|
228
279
|
fsSync.fchmodSync(handle.fd, Number(originalMode));
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const restoredSibling = inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, 1n, "isolated producer sibling");
|
|
232
|
-
if ((restored.mode & 511n) !== originalMode || (restoredSibling.mode & 511n) !== originalMode) {
|
|
280
|
+
const restored = inspectHandoff(params, handle, identity, state, 1n);
|
|
281
|
+
if ((restored.opened.mode & 511n) !== originalMode || (restored.named.mode & 511n) !== originalMode) {
|
|
233
282
|
throw pathMismatch("isolated producer read-only mode could not be restored");
|
|
234
283
|
}
|
|
235
284
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
285
|
+
if (!created) {
|
|
286
|
+
const registered = unregister;
|
|
287
|
+
const release = (() => {
|
|
288
|
+
state.siblingOwned = false;
|
|
289
|
+
registered();
|
|
290
|
+
});
|
|
291
|
+
release.setIdentity = registered.setIdentity;
|
|
292
|
+
return { handle, identity, unregister: release };
|
|
293
|
+
}
|
|
243
294
|
}
|
|
244
295
|
catch (error) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
});
|
|
254
|
-
unregister();
|
|
255
|
-
}
|
|
256
|
-
catch (cleanupError) {
|
|
257
|
-
settlement.push(cleanupError);
|
|
258
|
-
}
|
|
296
|
+
failures.push(error);
|
|
297
|
+
}
|
|
298
|
+
if (failures.length === 0)
|
|
299
|
+
return handle;
|
|
300
|
+
if (unregister) {
|
|
301
|
+
try {
|
|
302
|
+
removeSiblingIfOwned({ assertTargetParent: params.assertTargetParent, identity, state, targetPath: params.targetPath });
|
|
303
|
+
unregister();
|
|
259
304
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
305
|
+
catch (error) {
|
|
306
|
+
failures.push(error);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
for (const owned of [...owners].reverse()) {
|
|
310
|
+
try {
|
|
311
|
+
await close(owned);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
failures.push(error);
|
|
269
315
|
}
|
|
270
|
-
throw combinedFailure(error, settlement);
|
|
271
316
|
}
|
|
317
|
+
const primary = failures[0];
|
|
318
|
+
const cause = combinedFailure(primary, failures.slice(1));
|
|
319
|
+
if (!created)
|
|
320
|
+
throw cause;
|
|
321
|
+
throw new FsSafeError(state.closeFailed || failures.length > 1 ? "helper-failed" : primary instanceof FsSafeError ? primary.code : "helper-failed", "created file publication failed", {
|
|
322
|
+
cause,
|
|
323
|
+
details: {
|
|
324
|
+
publication: { status: state.publication }, cleanup: state.cleanup,
|
|
325
|
+
resources: state.closeFailed ? "close-failed" : "closed",
|
|
326
|
+
path: params.targetPath, dev: identity.dev, ino: identity.ino,
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
export function handoffPrivateProducerFile(params) {
|
|
331
|
+
return handoffFile(params);
|
|
332
|
+
}
|
|
333
|
+
export function handoffCreatedFile(params) {
|
|
334
|
+
return handoffFile(params);
|
|
272
335
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private-temp-workspace.d.ts","sourceRoot":"","sources":["../src/private-temp-workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"private-temp-workspace.d.ts","sourceRoot":"","sources":["../src/private-temp-workspace.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAExG,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAsQxG,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAC5C,OAAO,CAAC,CAAC,CAAC,CAOZ;AAwGD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,GAC5B,iBAAiB,CAEnB;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,OAAO,EAAE,oBAAoB,EAC7B,GAAG,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,CAAC,GACvC,CAAC,CAOH"}
|