@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.
- package/README.md +21 -235
- package/dist/Caller.d.ts +2 -0
- package/dist/Caller.d.ts.map +1 -1
- package/dist/Caller.js +3 -1
- package/dist/LiveVolume.d.ts +69 -1
- package/dist/LiveVolume.d.ts.map +1 -1
- package/dist/LiveVolume.js +89 -12
- package/dist/Search.d.ts +730 -0
- package/dist/Search.d.ts.map +1 -0
- package/dist/Search.js +576 -0
- package/dist/SnapshotDelta.d.ts +234 -0
- package/dist/SnapshotDelta.d.ts.map +1 -1
- package/dist/SnapshotDelta.js +107 -0
- package/dist/VfsError.d.ts +3 -1
- package/dist/VfsError.d.ts.map +1 -1
- package/dist/VfsError.js +3 -1
- package/dist/VirtualFileSystem.d.ts +78 -2
- package/dist/VirtualFileSystem.d.ts.map +1 -1
- package/dist/VirtualFileSystem.js +68 -4
- package/dist/Watch.d.ts +18 -0
- package/dist/Watch.d.ts.map +1 -1
- package/dist/Watch.js +12 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/internal/callerWatch.d.ts +32 -0
- package/dist/internal/callerWatch.d.ts.map +1 -0
- package/dist/internal/callerWatch.js +184 -0
- package/dist/internal/confinement.d.ts +16 -0
- package/dist/internal/confinement.d.ts.map +1 -0
- package/dist/internal/confinement.js +79 -0
- package/dist/internal/directoryEntries.d.ts +6 -0
- package/dist/internal/directoryEntries.d.ts.map +1 -0
- package/dist/internal/directoryEntries.js +79 -0
- package/dist/internal/fixture.js +4 -4
- package/dist/internal/glob.d.ts +66 -0
- package/dist/internal/glob.d.ts.map +1 -0
- package/dist/internal/glob.js +248 -0
- package/dist/internal/image.d.ts +7 -1
- package/dist/internal/image.d.ts.map +1 -1
- package/dist/internal/image.js +9 -7
- package/dist/internal/liveImage.d.ts +1 -1
- package/dist/internal/liveImage.d.ts.map +1 -1
- package/dist/internal/liveImage.js +2 -10
- package/dist/internal/path.js +2 -2
- package/dist/internal/resolution.d.ts +139 -0
- package/dist/internal/resolution.d.ts.map +1 -0
- package/dist/internal/resolution.js +332 -0
- package/dist/internal/search.d.ts +24 -0
- package/dist/internal/search.d.ts.map +1 -0
- package/dist/internal/search.js +78 -0
- package/dist/internal/searchContent.d.ts +77 -0
- package/dist/internal/searchContent.d.ts.map +1 -0
- package/dist/internal/searchContent.js +223 -0
- package/dist/internal/searchModel.d.ts +83 -0
- package/dist/internal/searchModel.d.ts.map +1 -0
- package/dist/internal/searchModel.js +23 -0
- package/dist/internal/snapshotDelta.d.ts +470 -1
- package/dist/internal/snapshotDelta.d.ts.map +1 -1
- package/dist/internal/snapshotDelta.js +59 -25
- package/dist/internal/snapshotMerge.d.ts +54 -0
- package/dist/internal/snapshotMerge.d.ts.map +1 -0
- package/dist/internal/snapshotMerge.js +959 -0
- package/dist/internal/tokenRegistry.d.ts +83 -0
- package/dist/internal/tokenRegistry.d.ts.map +1 -0
- package/dist/internal/tokenRegistry.js +146 -0
- package/dist/internal/virtualFileSystem.d.ts +32 -17
- package/dist/internal/virtualFileSystem.d.ts.map +1 -1
- package/dist/internal/virtualFileSystem.js +503 -736
- package/dist/internal/volumeLimits.d.ts +53 -0
- package/dist/internal/volumeLimits.d.ts.map +1 -0
- package/dist/internal/volumeLimits.js +63 -0
- package/dist/internal/volumeState.d.ts +2 -0
- package/dist/internal/volumeState.d.ts.map +1 -1
- package/dist/internal/volumeState.js +9 -0
- package/dist/internal/watchHub.d.ts +6 -2
- package/dist/internal/watchHub.d.ts.map +1 -1
- package/dist/internal/watchHub.js +31 -6
- 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;
|
|
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
|
-
|
|
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
|
-
|
|
36
|
+
const failure = subscriber.selection.failure?.(context);
|
|
37
|
+
if (last === undefined && failure === undefined)
|
|
29
38
|
continue;
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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.
|
|
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"
|