@effect-vfs/core 0.6.0 → 0.7.1
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/README.md +14 -9
- package/dist/BytePath.d.ts +2 -1
- package/dist/BytePath.d.ts.map +1 -1
- package/dist/LiveVolume.d.ts +6 -3
- package/dist/LiveVolume.d.ts.map +1 -1
- package/dist/LiveVolume.js +2 -0
- package/dist/Snapshot.d.ts +2 -1
- package/dist/Snapshot.d.ts.map +1 -1
- package/dist/Snapshot.js +2 -1
- package/dist/Testing.d.ts +9 -5
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js +7 -18
- package/dist/VfsError.d.ts +2 -1
- package/dist/VfsError.d.ts.map +1 -1
- package/dist/VfsError.js +2 -1
- package/dist/VirtualFileSystem.d.ts +89 -47
- package/dist/VirtualFileSystem.d.ts.map +1 -1
- package/dist/VirtualFileSystem.js +62 -29
- package/dist/internal/canonicalBase64.js +3 -3
- package/dist/internal/fixture.d.ts +1 -1
- package/dist/internal/fixture.d.ts.map +1 -1
- package/dist/internal/overlayDiff.d.ts.map +1 -1
- package/dist/internal/overlayDiff.js +6 -14
- package/dist/internal/path.d.ts.map +1 -1
- package/dist/internal/path.js +3 -3
- package/dist/internal/snapshotDelta.d.ts.map +1 -1
- package/dist/internal/snapshotDelta.js +9 -15
- package/dist/internal/tree.d.ts.map +1 -1
- package/dist/internal/tree.js +14 -14
- package/dist/internal/virtualFileSystem.d.ts +13 -7
- package/dist/internal/virtualFileSystem.d.ts.map +1 -1
- package/dist/internal/virtualFileSystem.js +442 -399
- package/dist/internal/volumeState.d.ts +3 -2
- package/dist/internal/volumeState.d.ts.map +1 -1
- package/dist/internal/volumeState.js +28 -30
- package/package.json +7 -7
- package/dist/internal/stagedState.d.ts +0 -18
- package/dist/internal/stagedState.d.ts.map +0 -1
- package/dist/internal/stagedState.js +0 -18
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import * as Arr from "effect/Array";
|
|
1
2
|
import * as Data from "effect/Data";
|
|
2
|
-
import * as
|
|
3
|
+
import * as Hex from "effect/encoding/Hex";
|
|
3
4
|
import * as Order from "effect/Order";
|
|
4
5
|
import * as Predicate from "effect/Predicate";
|
|
5
6
|
import { bytesOrder, sameBytes } from "./bytes.js";
|
|
@@ -22,7 +23,7 @@ const tagOrder = {
|
|
|
22
23
|
Renamed: 3,
|
|
23
24
|
Updated: 4
|
|
24
25
|
};
|
|
25
|
-
const key =
|
|
26
|
+
const key = Hex.encode;
|
|
26
27
|
const sourcePath = (change) => Predicate.isTagged("Renamed")(change) ? change.from : change.path;
|
|
27
28
|
const changeOrder = Order.combine(Order.mapInput(bytesOrder, sourcePath), Order.mapInput(Order.Number, (change) => tagOrder[change._tag]));
|
|
28
29
|
const differences = (before, after, includeTimestamps) => Object.freeze(differenceOrder.filter((field) => {
|
|
@@ -59,16 +60,8 @@ export const compareOverlay = (base, current, includeTimestamps = false) => {
|
|
|
59
60
|
const afterEntries = currentLineages.get(lineage);
|
|
60
61
|
if (afterEntries === undefined)
|
|
61
62
|
continue;
|
|
62
|
-
const removed = [];
|
|
63
|
-
|
|
64
|
-
if (!afterEntries.has(pathKey))
|
|
65
|
-
removed.push(entry);
|
|
66
|
-
}
|
|
67
|
-
const added = [];
|
|
68
|
-
for (const [pathKey, entry] of afterEntries) {
|
|
69
|
-
if (!beforeEntries.has(pathKey))
|
|
70
|
-
added.push(entry);
|
|
71
|
-
}
|
|
63
|
+
const removed = Arr.filter(beforeEntries, ([pathKey]) => !afterEntries.has(pathKey)).map(([, entry]) => entry);
|
|
64
|
+
const added = Arr.filter(afterEntries, ([pathKey]) => !beforeEntries.has(pathKey)).map(([, entry]) => entry);
|
|
72
65
|
if (removed.length !== 1 || added.length !== 1)
|
|
73
66
|
continue;
|
|
74
67
|
const before = removed[0];
|
|
@@ -111,7 +104,6 @@ export const compareOverlay = (base, current, includeTimestamps = false) => {
|
|
|
111
104
|
changes.push(RawOverlayChange.Added({ path: after.path.slice(), kind: after.kind }));
|
|
112
105
|
}
|
|
113
106
|
}
|
|
114
|
-
changes.sort(changeOrder);
|
|
115
107
|
// Every record owns its byte buffers and is frozen, so callers may wrap paths without copying.
|
|
116
|
-
return Object.freeze(changes.map((change) => Object.freeze(change)));
|
|
108
|
+
return Object.freeze(Arr.sort(changes, changeOrder).map((change) => Object.freeze(change)));
|
|
117
109
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/internal/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,gBAAgB;AAChB,eAAO,MAAM,SAAS,OAAO,CAAA;AAC7B,gBAAgB;AAChB,eAAO,MAAM,OAAO,OAAO,CAAA;AAC3B,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAS,CAAA;AACjC,gBAAgB;AAChB,eAAO,MAAM,UAAU,KAAK,CAAA;AAE5B,gBAAgB;AAChB,eAAO,MAAM,QAAQ,IAAI,CAAA;AACzB,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,gBAAgB;AAChB,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAU,UAAU,KAAG,OAEuE,CAAA;AAEtH,gBAAgB;AAChB,eAAO,MAAM,SAAS,yBAA+B,CAAA;AAErD,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,UAAU,QAAQ,UAAU,KAAG,UAS/D,CAAA;AAGD,gBAAgB;AAChB,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,SAAS,KAAG,IAAI,IAAI,SAAS,GAAG,OAAO,OAAO,GAAG,OAAO,WACtC,CAAA;AAEhE,gBAAgB;AAChB,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,QAA+B,CAAA;AAE7E,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,UAAU,aAAa,MAAM,4CAI7D,CAAA;AAEJ,gBAAgB;AAChB,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/internal/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,gBAAgB;AAChB,eAAO,MAAM,SAAS,OAAO,CAAA;AAC7B,gBAAgB;AAChB,eAAO,MAAM,OAAO,OAAO,CAAA;AAC3B,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAS,CAAA;AACjC,gBAAgB;AAChB,eAAO,MAAM,UAAU,KAAK,CAAA;AAE5B,gBAAgB;AAChB,eAAO,MAAM,QAAQ,IAAI,CAAA;AACzB,gBAAgB;AAChB,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,gBAAgB;AAChB,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,gBAAgB;AAChB,eAAO,MAAM,WAAW,SAAU,UAAU,KAAG,OAEuE,CAAA;AAEtH,gBAAgB;AAChB,eAAO,MAAM,SAAS,yBAA+B,CAAA;AAErD,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,UAAU,QAAQ,UAAU,KAAG,UAS/D,CAAA;AAGD,gBAAgB;AAChB,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,SAAS,KAAG,IAAI,IAAI,SAAS,GAAG,OAAO,OAAO,GAAG,OAAO,WACtC,CAAA;AAEhE,gBAAgB;AAChB,eAAO,MAAM,SAAS,UAAW,UAAU,KAAG,QAA+B,CAAA;AAE7E,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,UAAU,aAAa,MAAM,4CAI7D,CAAA;AAEJ,gBAAgB;AAChB,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,UAAiD,CAAA;AAe1F,gBAAgB;AAChB,eAAO,MAAM,eAAe,UAAW,UAAU,KAAG,OAC2C,CAAA;AAE/F,gBAAgB;AAChB,eAAO,MAAM,aAAa,mFASxB,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,WAAW,8EAMtB,CAAA;AAEF,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAGD,gBAAgB;AAChB,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,OAY5C,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,UAAU,UAAW,SAAS,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,iBAAiB,CAG5B,CAAA;AAErF,gBAAgB;AAChB,eAAO,MAAM,WAAW,UACf,SAAS,aACL,MAAM,gBACH,QAAQ,CAAC,QAAQ,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAgDvC,CAAA"}
|
package/dist/internal/path.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as ByteSize from "effect/ByteSize";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as
|
|
3
|
+
import * as Hex from "effect/encoding/Hex";
|
|
4
4
|
import * as Predicate from "effect/Predicate";
|
|
5
5
|
import * as Result from "effect/Result";
|
|
6
6
|
import { getBytes as getBytePathBytes, make as makeBytePath } from "./bytePath.js";
|
|
@@ -46,7 +46,7 @@ export const strictString = (bytes, operation) => Effect.try({
|
|
|
46
46
|
catch: () => fsFailure("UnrepresentableName", operation)
|
|
47
47
|
});
|
|
48
48
|
/** @internal */
|
|
49
|
-
export const nameBytes = (name) => Result.getOrThrow(
|
|
49
|
+
export const nameBytes = (name) => Result.getOrThrow(Hex.decode(name));
|
|
50
50
|
// Constructing a view detects detached buffers, including empty ones.
|
|
51
51
|
const attachedBuffer = (bytes) => {
|
|
52
52
|
try {
|
|
@@ -125,7 +125,7 @@ export const preparePath = (input, operation, maxPathBytes) => {
|
|
|
125
125
|
if (index - start > MAX_NAME_BYTES) {
|
|
126
126
|
return Result.fail(fsFailure("PathTooLong", operation, { path: input }));
|
|
127
127
|
}
|
|
128
|
-
components.push(
|
|
128
|
+
components.push(Hex.encode(bytes.subarray(start, index)));
|
|
129
129
|
suffixes.push(bytes.subarray(index));
|
|
130
130
|
}
|
|
131
131
|
start = index + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotDelta.d.ts","sourceRoot":"","sources":["../../src/internal/snapshotDelta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"snapshotDelta.d.ts","sourceRoot":"","sources":["../../src/internal/snapshotDelta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAMvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAKlD,OAAO,EAA4C,QAAQ,EAAE,MAAM,aAAa,CAAA;AA61BhF,gBAAgB;AAChB,eAAO,MAAM,aAAa;;;;;;;;;;;+HA2BxB,CAAA;AA2BF,gBAAgB;AAChB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;8FAchC,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,kBAAkB;;;;;;;;;;;sHAI9B,CAAA;AAID,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iEAe9B,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;;;;;;;;;uDAyB9B,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as ByteSize from "effect/ByteSize";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as
|
|
3
|
+
import * as Hex from "effect/encoding/Hex";
|
|
4
|
+
import * as Match from "effect/Match";
|
|
5
|
+
import * as Order from "effect/Order";
|
|
4
6
|
import * as Result from "effect/Result";
|
|
5
7
|
import * as Schema from "effect/Schema";
|
|
6
8
|
import { SnapshotChange, SnapshotDifference, SnapshotNodeKind } from "../SnapshotDelta.js";
|
|
@@ -52,7 +54,7 @@ const VersionProbe = Schema.Struct({
|
|
|
52
54
|
});
|
|
53
55
|
const differenceOrder = SnapshotDifference.literals;
|
|
54
56
|
const timestampFields = new Set(["atimeNs", "mtimeNs", "ctimeNs", "birthtimeNs"]);
|
|
55
|
-
const key =
|
|
57
|
+
const key = Hex.encode;
|
|
56
58
|
const validPath = (path) => {
|
|
57
59
|
if (path[0] !== SLASH_BYTE)
|
|
58
60
|
return false;
|
|
@@ -261,17 +263,9 @@ const deltaNode = (target, path, node, withPayload) => {
|
|
|
261
263
|
return DeltaNode.cases.link.make({ to: CanonicalBase64.encode(first) }, UNCHECKED);
|
|
262
264
|
}
|
|
263
265
|
const metadata = storedMetadata(node.metadata);
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
return node.kind === "file"
|
|
268
|
-
? DeltaNode.cases.file.make({ metadata }, UNCHECKED)
|
|
269
|
-
: DeltaNode.cases.symlink.make({ metadata }, UNCHECKED);
|
|
270
|
-
}
|
|
271
|
-
const bytes = CanonicalBase64.encode(payloadOf(node));
|
|
272
|
-
return node.kind === "file"
|
|
273
|
-
? DeltaNode.cases.file.make({ metadata, content: InlineContent.make({ bytes }, UNCHECKED) }, UNCHECKED)
|
|
274
|
-
: DeltaNode.cases.symlink.make({ metadata, target: bytes }, UNCHECKED);
|
|
266
|
+
return Match.value(node).pipe(Match.discriminator("kind")("directory", () => DeltaNode.cases.directory.make({ metadata }, UNCHECKED)), Match.discriminator("kind")("file", (file) => DeltaNode.cases.file.make(withPayload
|
|
267
|
+
? { metadata, content: InlineContent.make({ bytes: CanonicalBase64.encode(file.data) }, UNCHECKED) }
|
|
268
|
+
: { metadata }, UNCHECKED)), Match.discriminator("kind")("symlink", (symlink) => DeltaNode.cases.symlink.make(withPayload ? { metadata, target: CanonicalBase64.encode(symlink.target) } : { metadata }, UNCHECKED)), Match.exhaustive);
|
|
275
269
|
};
|
|
276
270
|
const lookup = (get, entriesOf, path) => {
|
|
277
271
|
let parent = ROOT_INO;
|
|
@@ -365,7 +359,7 @@ const compare = (base, target) => {
|
|
|
365
359
|
}
|
|
366
360
|
}
|
|
367
361
|
}
|
|
368
|
-
return changes.sort((
|
|
362
|
+
return changes.sort(Order.mapInput(bytesOrder, (entry) => entry.path)).map(({ change }) => change);
|
|
369
363
|
};
|
|
370
364
|
const getDocument = (delta) => Effect.suspend(() => {
|
|
371
365
|
const value = SnapshotDeltaModel.value(delta);
|
|
@@ -622,7 +616,7 @@ const foldedIdentity = Effect.fnUntraced(function* (base, folded, identity, limi
|
|
|
622
616
|
// Digest children before their directories.
|
|
623
617
|
const ordered = [
|
|
624
618
|
...nodes.filter((node) => node.kind !== "directory"),
|
|
625
|
-
...directories.sort((
|
|
619
|
+
...directories.sort(Order.flip(Order.mapInput(Order.Number, depth)))
|
|
626
620
|
];
|
|
627
621
|
for (const node of ordered)
|
|
628
622
|
digests.set(node.ino, yield* Merkle.nodeDigest(node, digestOf, measure));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/internal/tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/internal/tree.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/tree.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Validate each tree line as it arrives; check cross-node graph rules after the final line.
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as
|
|
3
|
+
import * as Hex from "effect/encoding/Hex";
|
|
4
|
+
import * as Match from "effect/Match";
|
|
4
5
|
import * as Predicate from "effect/Predicate";
|
|
5
6
|
import * as Result from "effect/Result";
|
|
6
7
|
import * as Schema from "effect/Schema";
|
|
@@ -147,7 +148,7 @@ const makeReader = (options, decodeHeader, decodeNode, runtimeOf) => {
|
|
|
147
148
|
if (bytes === undefined || !isNameBytes(bytes)) {
|
|
148
149
|
return broken(at([...path, "name"], "a name is 1 to 255 bytes without a NUL or a slash, and neither . nor .."));
|
|
149
150
|
}
|
|
150
|
-
const key =
|
|
151
|
+
const key = Hex.encode(bytes);
|
|
151
152
|
names.push({ parent, key, bytes: bytes.length, path, directory });
|
|
152
153
|
entries++;
|
|
153
154
|
return Result.succeed(key);
|
|
@@ -323,18 +324,17 @@ export const UNCHECKED = { disableChecks: true };
|
|
|
323
324
|
/** @internal */
|
|
324
325
|
export const treeNode = (node) => {
|
|
325
326
|
const metadata = storedMetadata(node.metadata);
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
: TreeNode.cases.symlink.make({ ino: node.ino, links: named, target: CanonicalBase64.encode(node.target), metadata }, UNCHECKED);
|
|
327
|
+
return Match.value(node).pipe(Match.discriminator("kind")("directory", (directory) => TreeNode.cases.directory.make({ ino: directory.ino, parent: directory.parent, name: encodeName(directory.name), metadata }, UNCHECKED)), Match.discriminator("kind")("file", (file) => TreeNode.cases.file.make({
|
|
328
|
+
ino: file.ino,
|
|
329
|
+
links: file.links.map((link) => ({ parent: link.parent, name: encodeName(link.name) })),
|
|
330
|
+
content: TreeContent.cases.Inline.make({ bytes: CanonicalBase64.encode(file.data) }, UNCHECKED),
|
|
331
|
+
metadata
|
|
332
|
+
}, UNCHECKED)), Match.discriminator("kind")("symlink", (symlink) => TreeNode.cases.symlink.make({
|
|
333
|
+
ino: symlink.ino,
|
|
334
|
+
links: symlink.links.map((link) => ({ parent: link.parent, name: encodeName(link.name) })),
|
|
335
|
+
target: CanonicalBase64.encode(symlink.target),
|
|
336
|
+
metadata
|
|
337
|
+
}, UNCHECKED)), Match.exhaustive);
|
|
338
338
|
};
|
|
339
339
|
/** @internal */
|
|
340
340
|
export const treeNodes = Effect.fnUntraced(function* (value, extra = []) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as ByteSize from "effect/ByteSize";
|
|
2
|
+
import * as Crypto from "effect/Crypto";
|
|
2
3
|
import * as Data from "effect/Data";
|
|
3
4
|
import * as Effect from "effect/Effect";
|
|
4
5
|
import type { Snapshot } from "../Snapshot.js";
|
|
@@ -6,8 +7,13 @@ import { type FsFailure, type ImageFailure } from "../VfsError.js";
|
|
|
6
7
|
import type { OverlayVolume, Volume, VolumeLimits } from "../VirtualFileSystem.js";
|
|
7
8
|
import * as LiveImage from "./liveImage.js";
|
|
8
9
|
import { type ObservationEntry } from "./overlayDiff.js";
|
|
9
|
-
import { type CommitProvider } from "./stagedState.js";
|
|
10
10
|
import { type VolumeState } from "./volumeState.js";
|
|
11
|
+
type CommitOutcome = "committed" | "rejected" | "unknown";
|
|
12
|
+
interface CommitProvider<State> {
|
|
13
|
+
/** Preparation failures leave the volume available. */
|
|
14
|
+
readonly prepare?: (candidate: State) => Effect.Effect<void, FsFailure>;
|
|
15
|
+
readonly commit: (candidate: State) => Effect.Effect<CommitOutcome>;
|
|
16
|
+
}
|
|
11
17
|
type VolumeSource = {
|
|
12
18
|
readonly _tag: "Empty";
|
|
13
19
|
} | {
|
|
@@ -74,7 +80,7 @@ export declare const makeVolume: (source: VolumeSource, options?: {
|
|
|
74
80
|
observation: ObservationEntry[];
|
|
75
81
|
}, FsFailure, never>;
|
|
76
82
|
}>;
|
|
77
|
-
}>, import("../VfsError.js").ArgumentFailure | ImageFailure,
|
|
83
|
+
}>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
|
|
78
84
|
/** @internal */
|
|
79
85
|
export declare const make: (options?: {
|
|
80
86
|
readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
|
|
@@ -84,7 +90,7 @@ export declare const make: (options?: {
|
|
|
84
90
|
readonly maxBytes?: ByteSize.ByteSize;
|
|
85
91
|
readonly maxFileBytes?: ByteSize.ByteSize;
|
|
86
92
|
readonly maxPathBytes?: ByteSize.ByteSize;
|
|
87
|
-
} | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure,
|
|
93
|
+
} | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure, Crypto.Crypto>;
|
|
88
94
|
/** @internal */
|
|
89
95
|
export declare const prepareEmptyLiveImage: (options?: {
|
|
90
96
|
readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
|
|
@@ -94,12 +100,12 @@ export declare const prepareEmptyLiveImage: (options?: {
|
|
|
94
100
|
readonly maxBytes?: ByteSize.ByteSize;
|
|
95
101
|
readonly maxFileBytes?: ByteSize.ByteSize;
|
|
96
102
|
readonly maxPathBytes?: ByteSize.ByteSize;
|
|
97
|
-
} | undefined) => Effect.Effect<Uint8Array<ArrayBufferLike>, import("../VfsError.js").ArgumentFailure | ImageFailure,
|
|
103
|
+
} | undefined) => Effect.Effect<Uint8Array<ArrayBufferLike>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
|
|
98
104
|
/** @internal */
|
|
99
105
|
export declare const openImageVolume: (image: Uint8Array<ArrayBufferLike>, maxImageBytes: ByteSize.ByteSize, commit: (image: Uint8Array) => Effect.Effect<"committed" | "rejected" | "unknown">, durability?: "memory-only" | "survives-operating-system-crash" | "survives-power-loss" | "survives-process-crash" | undefined) => Effect.Effect<Readonly<{
|
|
100
106
|
volume: Volume;
|
|
101
107
|
shutdown: Effect.Effect<void, never, never>;
|
|
102
|
-
}>, import("../VfsError.js").ArgumentFailure | ImageFailure,
|
|
108
|
+
}>, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
|
|
103
109
|
/** @internal */
|
|
104
110
|
export declare const fromSnapshot: (snapshot: Snapshot, options?: {
|
|
105
111
|
readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
|
|
@@ -109,7 +115,7 @@ export declare const fromSnapshot: (snapshot: Snapshot, options?: {
|
|
|
109
115
|
readonly maxBytes?: ByteSize.ByteSize;
|
|
110
116
|
readonly maxFileBytes?: ByteSize.ByteSize;
|
|
111
117
|
readonly maxPathBytes?: ByteSize.ByteSize;
|
|
112
|
-
} | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure | ImageFailure,
|
|
118
|
+
} | undefined) => Effect.Effect<Volume, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
|
|
113
119
|
/** @internal */
|
|
114
120
|
export declare const makeOverlay: (base: Snapshot, options?: {
|
|
115
121
|
readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
|
|
@@ -119,6 +125,6 @@ export declare const makeOverlay: (base: Snapshot, options?: {
|
|
|
119
125
|
readonly maxBytes?: ByteSize.ByteSize;
|
|
120
126
|
readonly maxFileBytes?: ByteSize.ByteSize;
|
|
121
127
|
readonly maxPathBytes?: ByteSize.ByteSize;
|
|
122
|
-
} | undefined) => Effect.Effect<OverlayVolume, import("../VfsError.js").ArgumentFailure | ImageFailure,
|
|
128
|
+
} | undefined) => Effect.Effect<OverlayVolume, import("../VfsError.js").ArgumentFailure | ImageFailure, Crypto.Crypto>;
|
|
123
129
|
export {};
|
|
124
130
|
//# sourceMappingURL=virtualFileSystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"virtualFileSystem.d.ts","sourceRoot":"","sources":["../../src/internal/virtualFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AA6BvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAqB,MAAM,gBAAgB,CAAA;AACrF,OAAO,KAAK,EAMV,aAAa,EAEb,MAAM,EACN,YAAY,EAIb,MAAM,yBAAyB,CAAA;AA2BhC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAkB,KAAK,gBAAgB,EAAyB,MAAM,kBAAkB,CAAA;AAqB/F,OAAO,EAgBL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAA;AAWzB,KAAK,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzD,UAAU,cAAc,CAAC,KAAK;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACvE,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;CACpE;AAqXD,KAAK,YAAY,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAA;AAE9D,gBAAgB;AAChB,eAAO,MAAM,YAAY;;uBALJ,OAAO;;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;;uBAC7C,UAAU;wBAAkB,WAAW;;;;;;;;;;;;;uBAFvC,OAAO;;;uBACP,MAAM;2BAAqB,SAAS,CAAC,QAAQ;;;uBAC7C,UAAU;wBAAkB,WAAW;;CAGD,CAAA;AAsD3D,gBAAgB;AAChB,eAAO,MAAM,UAAU;;;;;;;;mGAMV,WAAW,UACV,SAAS,CAAC,MAAM,UAChB,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC;;;;;;;;;;;2EA+pG/C,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,IAAI;;;;;;;;gGAIf,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,qBAAqB;;;;;;;;oIAShC,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,eAAe,yFAGV,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;;;2EA+ClF,CAAA;AAeF,gBAAgB;AAChB,eAAO,MAAM,YAAY;;;;;;;;+GAKxB,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,WAAW;;;;;;;;sHAkCvB,CAAA"}
|