@effect-vfs/core 0.7.1 → 0.9.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.
Files changed (79) hide show
  1. package/README.md +21 -235
  2. package/dist/Caller.d.ts +2 -0
  3. package/dist/Caller.d.ts.map +1 -1
  4. package/dist/Caller.js +3 -1
  5. package/dist/LiveVolume.d.ts +69 -1
  6. package/dist/LiveVolume.d.ts.map +1 -1
  7. package/dist/LiveVolume.js +89 -12
  8. package/dist/Search.d.ts +730 -0
  9. package/dist/Search.d.ts.map +1 -0
  10. package/dist/Search.js +576 -0
  11. package/dist/SnapshotDelta.d.ts +234 -0
  12. package/dist/SnapshotDelta.d.ts.map +1 -1
  13. package/dist/SnapshotDelta.js +107 -0
  14. package/dist/VfsError.d.ts +3 -1
  15. package/dist/VfsError.d.ts.map +1 -1
  16. package/dist/VfsError.js +3 -1
  17. package/dist/VirtualFileSystem.d.ts +78 -2
  18. package/dist/VirtualFileSystem.d.ts.map +1 -1
  19. package/dist/VirtualFileSystem.js +68 -4
  20. package/dist/Watch.d.ts +18 -0
  21. package/dist/Watch.d.ts.map +1 -1
  22. package/dist/Watch.js +12 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -0
  26. package/dist/internal/callerWatch.d.ts +32 -0
  27. package/dist/internal/callerWatch.d.ts.map +1 -0
  28. package/dist/internal/callerWatch.js +184 -0
  29. package/dist/internal/confinement.d.ts +16 -0
  30. package/dist/internal/confinement.d.ts.map +1 -0
  31. package/dist/internal/confinement.js +79 -0
  32. package/dist/internal/directoryEntries.d.ts +6 -0
  33. package/dist/internal/directoryEntries.d.ts.map +1 -0
  34. package/dist/internal/directoryEntries.js +79 -0
  35. package/dist/internal/fixture.js +4 -4
  36. package/dist/internal/glob.d.ts +66 -0
  37. package/dist/internal/glob.d.ts.map +1 -0
  38. package/dist/internal/glob.js +248 -0
  39. package/dist/internal/image.d.ts +7 -1
  40. package/dist/internal/image.d.ts.map +1 -1
  41. package/dist/internal/image.js +9 -7
  42. package/dist/internal/liveImage.d.ts +1 -1
  43. package/dist/internal/liveImage.d.ts.map +1 -1
  44. package/dist/internal/liveImage.js +2 -10
  45. package/dist/internal/path.js +2 -2
  46. package/dist/internal/resolution.d.ts +139 -0
  47. package/dist/internal/resolution.d.ts.map +1 -0
  48. package/dist/internal/resolution.js +332 -0
  49. package/dist/internal/search.d.ts +24 -0
  50. package/dist/internal/search.d.ts.map +1 -0
  51. package/dist/internal/search.js +78 -0
  52. package/dist/internal/searchContent.d.ts +77 -0
  53. package/dist/internal/searchContent.d.ts.map +1 -0
  54. package/dist/internal/searchContent.js +223 -0
  55. package/dist/internal/searchModel.d.ts +83 -0
  56. package/dist/internal/searchModel.d.ts.map +1 -0
  57. package/dist/internal/searchModel.js +23 -0
  58. package/dist/internal/snapshotDelta.d.ts +470 -1
  59. package/dist/internal/snapshotDelta.d.ts.map +1 -1
  60. package/dist/internal/snapshotDelta.js +59 -25
  61. package/dist/internal/snapshotMerge.d.ts +54 -0
  62. package/dist/internal/snapshotMerge.d.ts.map +1 -0
  63. package/dist/internal/snapshotMerge.js +959 -0
  64. package/dist/internal/tokenRegistry.d.ts +83 -0
  65. package/dist/internal/tokenRegistry.d.ts.map +1 -0
  66. package/dist/internal/tokenRegistry.js +146 -0
  67. package/dist/internal/virtualFileSystem.d.ts +32 -17
  68. package/dist/internal/virtualFileSystem.d.ts.map +1 -1
  69. package/dist/internal/virtualFileSystem.js +503 -736
  70. package/dist/internal/volumeLimits.d.ts +53 -0
  71. package/dist/internal/volumeLimits.d.ts.map +1 -0
  72. package/dist/internal/volumeLimits.js +63 -0
  73. package/dist/internal/volumeState.d.ts +2 -0
  74. package/dist/internal/volumeState.d.ts.map +1 -1
  75. package/dist/internal/volumeState.js +9 -0
  76. package/dist/internal/watchHub.d.ts +6 -2
  77. package/dist/internal/watchHub.d.ts.map +1 -1
  78. package/dist/internal/watchHub.js +31 -6
  79. package/package.json +9 -3
@@ -0,0 +1,53 @@
1
+ import * as ByteSize from "effect/ByteSize";
2
+ import * as Result from "effect/Result";
3
+ import type { VolumeLimits } from "../VirtualFileSystem.js";
4
+ import { type VolumeIdentity, VolumeOptions } from "../Volume.js";
5
+ import type * as Tree from "./tree.js";
6
+ type StoredLimits = Tree.Runtime["limits"];
7
+ /** @internal */
8
+ export declare const defaults: VolumeLimits;
9
+ /** @internal */
10
+ export declare const configuration: (options?: VolumeOptions, operation?: string) => Result.Result<{
11
+ options: {
12
+ readonly identity?: string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">;
13
+ readonly maxEntries?: number;
14
+ readonly maxPendingOperations?: number;
15
+ readonly maxWatchEvents?: number;
16
+ readonly maxBytes?: ByteSize.ByteSize;
17
+ readonly maxFileBytes?: ByteSize.ByteSize;
18
+ readonly maxPathBytes?: ByteSize.ByteSize;
19
+ };
20
+ identity: (string & import("effect/Brand").Brand<"@effect-vfs/core/VolumeIdentity">) | undefined;
21
+ limits: Readonly<{
22
+ maxEntries: number | undefined;
23
+ maxBytes: ByteSize.ByteSize | undefined;
24
+ maxFileBytes: ByteSize.ByteSize;
25
+ maxPathBytes: ByteSize.ByteSize | undefined;
26
+ maxPendingOperations: number;
27
+ maxWatchEvents: number;
28
+ }>;
29
+ }, import("../VfsError.js").ArgumentFailure>;
30
+ /** @internal */
31
+ export declare const fromOptions: (options?: VolumeOptions, operation?: string) => Result.Result<Readonly<{
32
+ maxEntries: number | undefined;
33
+ maxBytes: ByteSize.ByteSize | undefined;
34
+ maxFileBytes: ByteSize.ByteSize;
35
+ maxPathBytes: ByteSize.ByteSize | undefined;
36
+ maxPendingOperations: number;
37
+ maxWatchEvents: number;
38
+ }>, import("../VfsError.js").ArgumentFailure>;
39
+ /** @internal */
40
+ export declare const fromStored: (stored: StoredLimits, runtime?: VolumeLimits) => Result.Result<Readonly<{
41
+ maxEntries: number | undefined;
42
+ maxBytes: ByteSize.ByteSize | undefined;
43
+ maxFileBytes: ByteSize.ByteSize;
44
+ maxPathBytes: ByteSize.ByteSize | undefined;
45
+ maxPendingOperations: number;
46
+ maxWatchEvents: number;
47
+ }>, import("../VfsError.js").ArgumentFailure>;
48
+ /** @internal */
49
+ export declare const toStored: (limits: VolumeLimits) => StoredLimits;
50
+ /** @internal */
51
+ export declare const compatible: (stored: VolumeLimits, requested: VolumeLimits, identity: VolumeIdentity, requestedIdentity?: VolumeIdentity) => boolean;
52
+ export {};
53
+ //# sourceMappingURL=volumeLimits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volumeLimits.d.ts","sourceRoot":"","sources":["../../src/internal/volumeLimits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjE,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAA;AAGtC,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AAM1C,gBAAgB;AAChB,eAAO,MAAM,QAAQ,EAAE,YAOrB,CAAA;AAEF,gBAAgB;AAChB,eAAO,MAAM,aAAa,aAAc,aAAa;;;;;;;;;;;;;;;;;;;4CAelD,CAAA;AAEH,gBAAgB;AAChB,eAAO,MAAM,WAAW,aAAc,aAAa;;;;;;;6CACyB,CAAA;AAE5E,gBAAgB;AAChB,eAAO,MAAM,UAAU,WAAY,YAAY,YAAW,YAAY;;;;;;;6CAerE,CAAA;AAED,gBAAgB;AAChB,eAAO,MAAM,QAAQ,WAAY,YAAY,KAAG,YAY/C,CAAA;AAKD,gBAAgB;AAChB,eAAO,MAAM,UAAU,WACb,YAAY,aACT,YAAY,YACb,cAAc,sBACJ,cAAc,KACjC,OAGkE,CAAA"}
@@ -0,0 +1,63 @@
1
+ import * as ByteSize from "effect/ByteSize";
2
+ import * as Result from "effect/Result";
3
+ import { VolumeOptions } from "../Volume.js";
4
+ import { decodeConfiguration } from "./errors.js";
5
+ import { MAX_FILE_BYTES } from "./volumeState.js";
6
+ /** @internal */
7
+ export const defaults = Object.freeze({
8
+ maxEntries: undefined,
9
+ maxBytes: undefined,
10
+ maxFileBytes: ByteSize.bytes(MAX_FILE_BYTES),
11
+ maxPathBytes: undefined,
12
+ maxPendingOperations: 64,
13
+ maxWatchEvents: 256
14
+ });
15
+ /** @internal */
16
+ export const configuration = (options, operation = "make") => Result.map(decodeConfiguration(VolumeOptions, options === undefined ? {} : options, operation), (decoded) => ({
17
+ options: decoded,
18
+ identity: decoded.identity,
19
+ limits: Object.freeze({
20
+ maxEntries: decoded.maxEntries,
21
+ maxBytes: decoded.maxBytes,
22
+ maxFileBytes: decoded.maxFileBytes ?? defaults.maxFileBytes,
23
+ maxPathBytes: decoded.maxPathBytes,
24
+ maxPendingOperations: decoded.maxPendingOperations ?? defaults.maxPendingOperations,
25
+ maxWatchEvents: decoded.maxWatchEvents ?? defaults.maxWatchEvents
26
+ })
27
+ }));
28
+ /** @internal */
29
+ export const fromOptions = (options, operation = "make") => Result.map(configuration(options, operation), (decoded) => decoded.limits);
30
+ /** @internal */
31
+ export const fromStored = (stored, runtime = defaults) => {
32
+ const options = {
33
+ maxPendingOperations: runtime.maxPendingOperations,
34
+ maxWatchEvents: runtime.maxWatchEvents
35
+ };
36
+ if (stored.maxEntries !== undefined)
37
+ options.maxEntries = stored.maxEntries;
38
+ if (stored.maxBytes !== undefined)
39
+ options.maxBytes = ByteSize.bytes(stored.maxBytes);
40
+ if (stored.maxFileBytes !== undefined)
41
+ options.maxFileBytes = ByteSize.bytes(stored.maxFileBytes);
42
+ if (stored.maxPathBytes !== undefined)
43
+ options.maxPathBytes = ByteSize.bytes(stored.maxPathBytes);
44
+ return fromOptions(options);
45
+ };
46
+ /** @internal */
47
+ export const toStored = (limits) => {
48
+ const stored = {
49
+ maxFileBytes: ByteSize.toBigInt(limits.maxFileBytes)
50
+ };
51
+ if (limits.maxEntries !== undefined)
52
+ stored.maxEntries = limits.maxEntries;
53
+ if (limits.maxBytes !== undefined)
54
+ stored.maxBytes = ByteSize.toBigInt(limits.maxBytes);
55
+ if (limits.maxPathBytes !== undefined)
56
+ stored.maxPathBytes = ByteSize.toBigInt(limits.maxPathBytes);
57
+ return stored;
58
+ };
59
+ const sameSize = (left, right) => left === undefined || right === undefined ? left === right : ByteSize.toBigInt(left) === ByteSize.toBigInt(right);
60
+ /** @internal */
61
+ export const compatible = (stored, requested, identity, requestedIdentity) => stored.maxEntries === requested.maxEntries && sameSize(stored.maxBytes, requested.maxBytes) &&
62
+ sameSize(stored.maxFileBytes, requested.maxFileBytes) && sameSize(stored.maxPathBytes, requested.maxPathBytes) &&
63
+ (requestedIdentity === undefined || requestedIdentity === identity);
@@ -75,6 +75,8 @@ export declare const directoryMetadata: (ino: bigint, uid: number, gid: number,
75
75
  /** @internal */
76
76
  export declare const emptyRoot: (now: bigint) => Directory;
77
77
  /** @internal */
78
+ export declare const emptyState: (now: bigint) => VolumeState;
79
+ /** @internal */
78
80
  export declare const storedMetadata: (metadata: NodeMetadata) => StoredMetadata;
79
81
  /** @internal */
80
82
  export declare const reachableNodes: (state: VolumeState) => Effect.Effect<Node[], never, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"volumeState.d.ts","sourceRoot":"","sources":["../../src/internal/volumeState.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"volumeState.d.ts","sourceRoot":"","sources":["../../src/internal/volumeState.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,15 @@ export const emptyRoot = (now) => ({
63
63
  revision: 1n
64
64
  });
65
65
  /** @internal */
66
+ export const emptyState = (now) => ({
67
+ inodes: InodeTable.set(InodeTable.empty(), ROOT_INO, emptyRoot(now)),
68
+ open: new Map(),
69
+ nextInode: Ino(2),
70
+ revision: 1n,
71
+ entries: 0,
72
+ usedBytes: 0n
73
+ });
74
+ /** @internal */
66
75
  export const storedMetadata = (metadata) => ({
67
76
  uid: metadata.uid,
68
77
  gid: metadata.gid,
@@ -10,15 +10,19 @@ export interface Coordinator {
10
10
  *
11
11
  * @internal
12
12
  */
13
- export interface Selection<A, C> {
13
+ export interface Selection<A, C, E = never> {
14
14
  readonly includes: (event: A, context: C) => boolean;
15
+ readonly prepare?: (context: C) => void;
16
+ readonly project?: (event: A, context: C) => A | undefined;
17
+ readonly failure?: (context: C) => E | undefined;
18
+ readonly boundedTerminal?: boolean;
15
19
  readonly rescan: (context: C) => A;
16
20
  readonly settle?: (context: C) => Iterable<A> | undefined;
17
21
  }
18
22
  /** @internal */
19
23
  export interface WatchHub<A, C, E = never> {
20
24
  readonly publishUnsafe: (events: () => Iterable<A>, context: C) => void;
21
- readonly subscribe: (select: Effect.Effect<Selection<A, C>, E>, afterSubscribe: Effect.Effect<void>) => Effect.Effect<Stream.Stream<A>, E, Scope.Scope>;
25
+ readonly subscribe: <F extends E = never>(select: Effect.Effect<Selection<A, C, F>, E>, afterSubscribe: Effect.Effect<void>) => Effect.Effect<Stream.Stream<A, F>, E, Scope.Scope>;
22
26
  }
23
27
  /** @internal */
24
28
  export declare const make: <A, C, E = never>(coordinate: Coordinator, capacity: number) => Effect.Effect<WatchHub<A, C, E>, never, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"watchHub.d.ts","sourceRoot":"","sources":["../../src/internal/watchHub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAClE;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC;IAE7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO,CAAA;IACpD,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;IAElC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;CAC1D;AAED,gBAAgB;AAChB,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK;IACvC,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;IACvE,QAAQ,CAAC,SAAS,EAAE,CAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACzC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACrD;AAQD,gBAAgB;AAChB,eAAO,MAAM,IAAI,GAA+B,CAAC,EAAE,CAAC,EAAE,CAAC,sGAwFrD,CAAA"}
1
+ {"version":3,"file":"watchHub.d.ts","sourceRoot":"","sources":["../../src/internal/watchHub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAClE;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK;IAExC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO,CAAA;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;IAElC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;CAC1D;AAED,gBAAgB;AAChB,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK;IACvC,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;IACvE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,KAAK,EACtC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACxD;AAQD,gBAAgB;AAChB,eAAO,MAAM,IAAI,GAA+B,CAAC,EAAE,CAAC,EAAE,CAAC,sGAoHrD,CAAA"}
@@ -1,3 +1,4 @@
1
+ import * as Cause from "effect/Cause";
1
2
  import * as Effect from "effect/Effect";
2
3
  import * as Predicate from "effect/Predicate";
3
4
  import * as Queue from "effect/Queue";
@@ -17,20 +18,43 @@ export const make = Effect.fnUntraced(function* (coordinate, capacity) {
17
18
  const publishUnsafe = (events, context) => {
18
19
  if (subscribers.size === 0)
19
20
  return;
21
+ for (const subscriber of subscribers)
22
+ subscriber.selection.prepare?.(context);
20
23
  for (const event of events()) {
21
24
  for (const subscriber of subscribers) {
22
- if (subscriber.selection.includes(event, context))
23
- offer(subscriber, event, context);
25
+ if (subscriber.selection.includes(event, context)) {
26
+ const projected = subscriber.selection.project === undefined
27
+ ? event
28
+ : subscriber.selection.project(event, context);
29
+ if (projected !== undefined)
30
+ offer(subscriber, projected, context);
31
+ }
24
32
  }
25
33
  }
26
34
  for (const subscriber of subscribers) {
27
35
  const last = subscriber.selection.settle?.(context);
28
- if (last === undefined)
36
+ const failure = subscriber.selection.failure?.(context);
37
+ if (last === undefined && failure === undefined)
29
38
  continue;
30
- for (const event of last)
31
- Queue.offerUnsafe(subscriber.queue, event);
39
+ if (last !== undefined) {
40
+ if (subscriber.selection.boundedTerminal) {
41
+ for (const event of last)
42
+ offer(subscriber, event, context);
43
+ if (subscriber.overflowed) {
44
+ while (Queue.takeUnsafe(subscriber.queue) !== undefined) { /* Drain before replacing with Rescan. */ }
45
+ Queue.offerUnsafe(subscriber.queue, subscriber.selection.rescan(context));
46
+ }
47
+ }
48
+ else {
49
+ for (const event of last)
50
+ Queue.offerUnsafe(subscriber.queue, event);
51
+ }
52
+ }
32
53
  subscribers.delete(subscriber);
33
- Queue.endUnsafe(subscriber.queue);
54
+ if (failure === undefined)
55
+ Queue.endUnsafe(subscriber.queue);
56
+ else
57
+ Queue.failCauseUnsafe(subscriber.queue, Cause.fail(failure));
34
58
  }
35
59
  };
36
60
  // Register cleanup before waiting for the volume, including when the scope closes during registration.
@@ -62,6 +86,7 @@ export const make = Effect.fnUntraced(function* (coordinate, capacity) {
62
86
  registered = created;
63
87
  return created;
64
88
  }));
89
+ // SAFETY: A subscription queue only receives failures from its own Selection<F>.
65
90
  return subscriber === undefined ? Stream.empty : Stream.fromEffectRepeat(Queue.take(subscriber.queue));
66
91
  });
67
92
  return { publishUnsafe, subscribe };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-vfs/core",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "A runtime-neutral virtual filesystem core for Effect.",
5
5
  "homepage": "https://github.com/lloydrichards/effect-virtual-fs#readme",
6
6
  "bugs": {
@@ -22,7 +22,8 @@
22
22
  "build": "tsc --project tsconfig.build.json && tsc --project compatibility/node-next/tsconfig.json",
23
23
  "clean": "git clean -xdf .cache .turbo dist docs node_modules tsconfig.tsbuildinfo",
24
24
  "test": "bun --bun run vitest run --config ../../vitest.config.ts --project core",
25
- "type-check": "tsc --noEmit && tsc --project contracts/tsconfig.json"
25
+ "type-check": "tsc --noEmit && tsc --project contracts/tsconfig.json && tsc --project tsconfig.benchmarks.json",
26
+ "benchmark": "bun --bun run vitest bench --run --config ../../vitest.config.ts --project 'core (bench)'"
26
27
  },
27
28
  "peerDependencies": {
28
29
  "effect": "^4.0.0"
@@ -32,7 +33,8 @@
32
33
  "@effect/platform-node-shared": "4.0.0",
33
34
  "@effect/vitest": "4.0.0",
34
35
  "@repo/config-typescript": "workspace:*",
35
- "effect": "4.0.0"
36
+ "effect": "4.0.0",
37
+ "@types/node": "26.6.3"
36
38
  },
37
39
  "exports": {
38
40
  ".": {
@@ -87,6 +89,10 @@
87
89
  "types": "./dist/Snapshot.d.ts",
88
90
  "import": "./dist/Snapshot.js"
89
91
  },
92
+ "./Search": {
93
+ "types": "./dist/Search.d.ts",
94
+ "import": "./dist/Search.js"
95
+ },
90
96
  "./SnapshotDelta": {
91
97
  "types": "./dist/SnapshotDelta.d.ts",
92
98
  "import": "./dist/SnapshotDelta.js"