@sunfall/arc-db 0.1.0-alpha.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/LICENSE +21 -0
- package/dist/change-feed-dispatcher.d.ts +21 -0
- package/dist/change-feed-dispatcher.d.ts.map +1 -0
- package/dist/change-feed-dispatcher.js +53 -0
- package/dist/change-feed-dispatcher.js.map +1 -0
- package/dist/collection-change-feed-runtime.d.ts +32 -0
- package/dist/collection-change-feed-runtime.d.ts.map +1 -0
- package/dist/collection-change-feed-runtime.js +50 -0
- package/dist/collection-change-feed-runtime.js.map +1 -0
- package/dist/collection-contract.d.ts +525 -0
- package/dist/collection-contract.d.ts.map +1 -0
- package/dist/collection-contract.js +4 -0
- package/dist/collection-contract.js.map +1 -0
- package/dist/collection-definition-snapshot.d.ts +64 -0
- package/dist/collection-definition-snapshot.d.ts.map +1 -0
- package/dist/collection-definition-snapshot.js +122 -0
- package/dist/collection-definition-snapshot.js.map +1 -0
- package/dist/collection-errors.d.ts +38 -0
- package/dist/collection-errors.d.ts.map +1 -0
- package/dist/collection-errors.js +17 -0
- package/dist/collection-errors.js.map +1 -0
- package/dist/collection-ids.d.ts +6 -0
- package/dist/collection-ids.d.ts.map +1 -0
- package/dist/collection-ids.js +6 -0
- package/dist/collection-ids.js.map +1 -0
- package/dist/collection-index-materialization.d.ts +29 -0
- package/dist/collection-index-materialization.d.ts.map +1 -0
- package/dist/collection-index-materialization.js +118 -0
- package/dist/collection-index-materialization.js.map +1 -0
- package/dist/collection-mutation-queue.d.ts +10 -0
- package/dist/collection-mutation-queue.d.ts.map +1 -0
- package/dist/collection-mutation-queue.js +46 -0
- package/dist/collection-mutation-queue.js.map +1 -0
- package/dist/collection-mutation-workflow.d.ts +18 -0
- package/dist/collection-mutation-workflow.d.ts.map +1 -0
- package/dist/collection-mutation-workflow.js +252 -0
- package/dist/collection-mutation-workflow.js.map +1 -0
- package/dist/collection-persistence.d.ts +48 -0
- package/dist/collection-persistence.d.ts.map +1 -0
- package/dist/collection-persistence.js +323 -0
- package/dist/collection-persistence.js.map +1 -0
- package/dist/collection-policy.d.ts +5 -0
- package/dist/collection-policy.d.ts.map +1 -0
- package/dist/collection-policy.js +7 -0
- package/dist/collection-policy.js.map +1 -0
- package/dist/collection-preload.d.ts +21 -0
- package/dist/collection-preload.d.ts.map +1 -0
- package/dist/collection-preload.js +4 -0
- package/dist/collection-preload.js.map +1 -0
- package/dist/collection-projection-callback-policy.d.ts +14 -0
- package/dist/collection-projection-callback-policy.d.ts.map +1 -0
- package/dist/collection-projection-callback-policy.js +25 -0
- package/dist/collection-projection-callback-policy.js.map +1 -0
- package/dist/collection-reactive-binding.d.ts +72 -0
- package/dist/collection-reactive-binding.d.ts.map +1 -0
- package/dist/collection-reactive-binding.js +95 -0
- package/dist/collection-reactive-binding.js.map +1 -0
- package/dist/collection-registry.d.ts +56 -0
- package/dist/collection-registry.d.ts.map +1 -0
- package/dist/collection-registry.js +123 -0
- package/dist/collection-registry.js.map +1 -0
- package/dist/collection-row-ingress.d.ts +16 -0
- package/dist/collection-row-ingress.d.ts.map +1 -0
- package/dist/collection-row-ingress.js +110 -0
- package/dist/collection-row-ingress.js.map +1 -0
- package/dist/collection-runtime.d.ts +20 -0
- package/dist/collection-runtime.d.ts.map +1 -0
- package/dist/collection-runtime.js +256 -0
- package/dist/collection-runtime.js.map +1 -0
- package/dist/collection-snapshot-codec.d.ts +62 -0
- package/dist/collection-snapshot-codec.d.ts.map +1 -0
- package/dist/collection-snapshot-codec.js +563 -0
- package/dist/collection-snapshot-codec.js.map +1 -0
- package/dist/collection-state.d.ts +72 -0
- package/dist/collection-state.d.ts.map +1 -0
- package/dist/collection-state.js +276 -0
- package/dist/collection-state.js.map +1 -0
- package/dist/collection-sync-load-policy.d.ts +17 -0
- package/dist/collection-sync-load-policy.d.ts.map +1 -0
- package/dist/collection-sync-load-policy.js +245 -0
- package/dist/collection-sync-load-policy.js.map +1 -0
- package/dist/collection-value-detachment.d.ts +34 -0
- package/dist/collection-value-detachment.d.ts.map +1 -0
- package/dist/collection-value-detachment.js +248 -0
- package/dist/collection-value-detachment.js.map +1 -0
- package/dist/collection-write-commit.d.ts +32 -0
- package/dist/collection-write-commit.d.ts.map +1 -0
- package/dist/collection-write-commit.js +51 -0
- package/dist/collection-write-commit.js.map +1 -0
- package/dist/flush-policy.d.ts +130 -0
- package/dist/flush-policy.d.ts.map +1 -0
- package/dist/flush-policy.js +96 -0
- package/dist/flush-policy.js.map +1 -0
- package/dist/index.d.ts +481 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/live-query-collection-materialization.d.ts +47 -0
- package/dist/live-query-collection-materialization.d.ts.map +1 -0
- package/dist/live-query-collection-materialization.js +231 -0
- package/dist/live-query-collection-materialization.js.map +1 -0
- package/dist/live-query-collection.d.ts +23 -0
- package/dist/live-query-collection.d.ts.map +1 -0
- package/dist/live-query-collection.js +94 -0
- package/dist/live-query-collection.js.map +1 -0
- package/dist/live-query-runtime.d.ts +8 -0
- package/dist/live-query-runtime.d.ts.map +1 -0
- package/dist/live-query-runtime.js +228 -0
- package/dist/live-query-runtime.js.map +1 -0
- package/dist/live-query-state.d.ts +11 -0
- package/dist/live-query-state.d.ts.map +1 -0
- package/dist/live-query-state.js +130 -0
- package/dist/live-query-state.js.map +1 -0
- package/dist/query-builder.d.ts +294 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +373 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/query-context-identity.d.ts +19 -0
- package/dist/query-context-identity.d.ts.map +1 -0
- package/dist/query-context-identity.js +41 -0
- package/dist/query-context-identity.js.map +1 -0
- package/dist/query-execution-plan.d.ts +27 -0
- package/dist/query-execution-plan.d.ts.map +1 -0
- package/dist/query-execution-plan.js +69 -0
- package/dist/query-execution-plan.js.map +1 -0
- package/dist/query-plan.d.ts +200 -0
- package/dist/query-plan.d.ts.map +1 -0
- package/dist/query-plan.js +524 -0
- package/dist/query-plan.js.map +1 -0
- package/dist/query-source-adapter.d.ts +25 -0
- package/dist/query-source-adapter.d.ts.map +1 -0
- package/dist/query-source-adapter.js +14 -0
- package/dist/query-source-adapter.js.map +1 -0
- package/dist/runtime-collection-store.d.ts +38 -0
- package/dist/runtime-collection-store.d.ts.map +1 -0
- package/dist/runtime-collection-store.js +149 -0
- package/dist/runtime-collection-store.js.map +1 -0
- package/dist/server-collection.d.ts +84 -0
- package/dist/server-collection.d.ts.map +1 -0
- package/dist/server-collection.js +84 -0
- package/dist/server-collection.js.map +1 -0
- package/dist/sqlite-persistence.d.ts +239 -0
- package/dist/sqlite-persistence.d.ts.map +1 -0
- package/dist/sqlite-persistence.js +345 -0
- package/dist/sqlite-persistence.js.map +1 -0
- package/dist/sync-adapter.d.ts +233 -0
- package/dist/sync-adapter.d.ts.map +1 -0
- package/dist/sync-adapter.js +226 -0
- package/dist/sync-adapter.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { EffectInputCallbackError, invokeEffectInput } from "@sunfall/arc-core";
|
|
2
|
+
import { Clock, Data, Effect } from "effect";
|
|
3
|
+
import {} from "./collection-state.js";
|
|
4
|
+
import { hasStoreExplicitCollectionSnapshotMarker, hydrateStoreExplicitCollectionSnapshotEffect, hydrateStoreExplicitCollectionSnapshotPreflightEffect, snapshotStoreExplicitCollection, snapshotStoreExplicitCollectionEffect, withCollectionDurableSnapshotPermits, } from "./collection-definition-snapshot.js";
|
|
5
|
+
import { advanceCollectionTransactionIdentity } from "./collection-mutation-queue.js";
|
|
6
|
+
import { collectionSnapshotFromState, CollectionSnapshotCodecError, decodeCollectionSnapshotEffect, encodeCollectionSnapshotEffect, hydrateCollectionSnapshotStateEffect, validateCollectionHydrationPayload, validateCollectionSnapshotStateHydrationEffect, validateCollectionSnapshotDefinitionEffect, validateCollectionHydrationPayloadEffect, } from "./collection-snapshot-codec.js";
|
|
7
|
+
import { withCollectionDurableCommitPermit } from "./collection-write-commit.js";
|
|
8
|
+
/** Error raised by the sync Web Storage Adapter when a host method throws. */
|
|
9
|
+
export class CollectionStorageError extends Data.TaggedError("CollectionStorageError") {
|
|
10
|
+
}
|
|
11
|
+
const storageInputCallbackEffect = (callback) => invokeEffectInput("collection persistence storage callback", callback);
|
|
12
|
+
const duplicateCollectionDefinitionError = (name, operation = "hydrate") => new CollectionSnapshotCodecError({
|
|
13
|
+
operation,
|
|
14
|
+
path: "$.collections",
|
|
15
|
+
reason: `Multiple collection definitions were provided for '${name}'. Collection names must identify one hydration definition.`,
|
|
16
|
+
});
|
|
17
|
+
const uniqueCollectionDefinitionsUnsafe = (collections, operation) => {
|
|
18
|
+
const definitions = new Map();
|
|
19
|
+
const unique = [];
|
|
20
|
+
for (const collection of collections) {
|
|
21
|
+
const existing = definitions.get(collection.name);
|
|
22
|
+
if (existing === collection) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (existing !== undefined) {
|
|
26
|
+
throw duplicateCollectionDefinitionError(collection.name, operation);
|
|
27
|
+
}
|
|
28
|
+
definitions.set(collection.name, collection);
|
|
29
|
+
unique.push(collection);
|
|
30
|
+
}
|
|
31
|
+
return unique;
|
|
32
|
+
};
|
|
33
|
+
const uniqueCollectionDefinitionsEffect = (collections, operation) => Effect.try({
|
|
34
|
+
try: () => uniqueCollectionDefinitionsUnsafe(collections, operation),
|
|
35
|
+
catch: (cause) => cause instanceof CollectionSnapshotCodecError
|
|
36
|
+
? cause
|
|
37
|
+
: duplicateCollectionDefinitionError("unknown", operation),
|
|
38
|
+
});
|
|
39
|
+
const collectionDefinitionMapEffect = (collections) => Effect.gen(function* () {
|
|
40
|
+
const definitions = new Map();
|
|
41
|
+
for (const collection of collections) {
|
|
42
|
+
const existing = definitions.get(collection.name);
|
|
43
|
+
if (existing === collection) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (existing !== undefined) {
|
|
47
|
+
return yield* Effect.fail(duplicateCollectionDefinitionError(collection.name));
|
|
48
|
+
}
|
|
49
|
+
definitions.set(collection.name, collection);
|
|
50
|
+
}
|
|
51
|
+
return definitions;
|
|
52
|
+
});
|
|
53
|
+
const snapshotCallbackError = (definition, cause) => new EffectInputCallbackError({
|
|
54
|
+
operation: `Collection.snapshot(${definition.name})`,
|
|
55
|
+
cause,
|
|
56
|
+
guidance: "Collection snapshot callbacks and initialData key projection must be synchronous, pure, and total.",
|
|
57
|
+
});
|
|
58
|
+
const snapshotCollectionForEffectUnsafe = (definition, store, updatedAt) => hasStoreExplicitCollectionSnapshotMarker(definition)
|
|
59
|
+
? snapshotStoreExplicitCollectionEffect(definition, store, updatedAt)
|
|
60
|
+
: Effect.try({
|
|
61
|
+
try: () => snapshotCollection(definition, store, updatedAt),
|
|
62
|
+
catch: (cause) => snapshotCallbackError(definition, cause),
|
|
63
|
+
});
|
|
64
|
+
const snapshotCollectionForEffect = (definition, store, updatedAt) => withCollectionDurableSnapshotPermits(store, [definition], snapshotCollectionForEffectUnsafe(definition, store, updatedAt));
|
|
65
|
+
export function snapshotCollection(definition, store, updatedAt = Date.now()) {
|
|
66
|
+
if (hasStoreExplicitCollectionSnapshotMarker(definition)) {
|
|
67
|
+
return snapshotStoreExplicitCollection(definition, store, updatedAt);
|
|
68
|
+
}
|
|
69
|
+
const state = store.state(definition);
|
|
70
|
+
return collectionSnapshotFromState(definition, state, updatedAt);
|
|
71
|
+
}
|
|
72
|
+
export const snapshotCollectionEffect = (definition, storeEffect) => Effect.gen(function* () {
|
|
73
|
+
const store = yield* storeEffect;
|
|
74
|
+
const updatedAt = yield* Clock.currentTimeMillis;
|
|
75
|
+
return yield* snapshotCollectionForEffect(definition, store, updatedAt);
|
|
76
|
+
});
|
|
77
|
+
const hydrateCollectionEffectUnsafe = (definition, snapshot, options = {}, storeEffect, store) => Effect.gen(function* () {
|
|
78
|
+
if (hasStoreExplicitCollectionSnapshotMarker(definition)) {
|
|
79
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
80
|
+
const validatedSnapshot = yield* validateCollectionSnapshotDefinitionEffect(definition, snapshot);
|
|
81
|
+
yield* hydrateStoreExplicitCollectionSnapshotEffect(definition, dbStore, validatedSnapshot, options);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
85
|
+
const state = dbStore.state(definition);
|
|
86
|
+
const validatedSnapshot = yield* validateCollectionSnapshotDefinitionEffect(definition, snapshot);
|
|
87
|
+
yield* validateCollectionSnapshotStateHydrationEffect(state, validatedSnapshot, options);
|
|
88
|
+
const hydrated = yield* hydrateCollectionSnapshotStateEffect(state, validatedSnapshot, options, (id) => advanceCollectionTransactionIdentity(state, id));
|
|
89
|
+
yield* dbStore.publish({
|
|
90
|
+
_tag: "CollectionHydrated",
|
|
91
|
+
collection: definition.name,
|
|
92
|
+
count: hydrated.rows.length,
|
|
93
|
+
updatedAt: hydrated.updatedAt,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
export function hydrateCollectionEffect(definition, snapshot, options = {}, storeEffect, store) {
|
|
97
|
+
return Effect.gen(function* () {
|
|
98
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
99
|
+
if (hasStoreExplicitCollectionSnapshotMarker(definition)) {
|
|
100
|
+
yield* hydrateCollectionEffectUnsafe(definition, snapshot, options, storeEffect, dbStore);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
yield* withCollectionDurableCommitPermit(dbStore.state(definition), hydrateCollectionEffectUnsafe(definition, snapshot, options, storeEffect, dbStore));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
export const collectionPersistenceKey = (definition, options = {}) => options.key ?? `sunfall-arc:collection:${definition.name}`;
|
|
107
|
+
const persistCollectionEffectUnsafe = (definition, storage, options = {}, storeEffect, store) => Effect.gen(function* () {
|
|
108
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
109
|
+
const updatedAt = yield* Clock.currentTimeMillis;
|
|
110
|
+
yield* persistCollectionSnapshotEffect(definition, snapshotCollectionForEffectUnsafe(definition, dbStore, updatedAt), storage, options, dbStore);
|
|
111
|
+
});
|
|
112
|
+
export const persistCollectionEffect = (definition, storage, options = {}, storeEffect, store) => Effect.gen(function* () {
|
|
113
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
114
|
+
yield* withCollectionDurableSnapshotPermits(dbStore, [definition], persistCollectionEffectUnsafe(definition, storage, options, storeEffect, dbStore));
|
|
115
|
+
});
|
|
116
|
+
export const persistCollectionSnapshotEffect = (definition, snapshotEffect, storage, options = {}, store) => Effect.gen(function* () {
|
|
117
|
+
const key = collectionPersistenceKey(definition, options);
|
|
118
|
+
const snapshot = yield* snapshotEffect;
|
|
119
|
+
const encoded = yield* encodeCollectionSnapshotEffect(snapshot);
|
|
120
|
+
yield* storageInputCallbackEffect(() => storage.setItem(key, encoded));
|
|
121
|
+
if (store) {
|
|
122
|
+
yield* store.publish({
|
|
123
|
+
_tag: "CollectionPersisted",
|
|
124
|
+
collection: definition.name,
|
|
125
|
+
key,
|
|
126
|
+
count: snapshot.rows.length,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return snapshot;
|
|
130
|
+
});
|
|
131
|
+
const restoreCollectionSnapshotEffectUnsafe = (definition, storage, options = {}, storeEffect, store) => Effect.gen(function* () {
|
|
132
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
133
|
+
const key = collectionPersistenceKey(definition, options);
|
|
134
|
+
const encoded = yield* storageInputCallbackEffect(() => storage.getItem(key));
|
|
135
|
+
if (encoded === null) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const snapshot = yield* decodeCollectionSnapshotEffect(encoded);
|
|
139
|
+
yield* hydrateCollectionEffectUnsafe(definition, snapshot, options, storeEffect, dbStore);
|
|
140
|
+
yield* dbStore.publish({
|
|
141
|
+
_tag: "CollectionRestored",
|
|
142
|
+
collection: definition.name,
|
|
143
|
+
key,
|
|
144
|
+
count: snapshot.rows.length,
|
|
145
|
+
});
|
|
146
|
+
return true;
|
|
147
|
+
});
|
|
148
|
+
const restoreCollectionSnapshotEffect = (definition, storage, options = {}, storeEffect, store) => Effect.gen(function* () {
|
|
149
|
+
const dbStore = store ?? (yield* storeEffect);
|
|
150
|
+
if (hasStoreExplicitCollectionSnapshotMarker(definition)) {
|
|
151
|
+
return yield* restoreCollectionSnapshotEffectUnsafe(definition, storage, options, storeEffect, dbStore);
|
|
152
|
+
}
|
|
153
|
+
return yield* withCollectionDurableCommitPermit(dbStore.state(definition), restoreCollectionSnapshotEffectUnsafe(definition, storage, options, storeEffect, dbStore));
|
|
154
|
+
});
|
|
155
|
+
export const restoreCollectionEffect = (definition, storage, options = {}, storeEffect, store) => Effect.asVoid(restoreCollectionSnapshotEffect(definition, storage, options, storeEffect, store));
|
|
156
|
+
export function collectionPersistenceConfig(definition) {
|
|
157
|
+
return definition.options.persistence;
|
|
158
|
+
}
|
|
159
|
+
export const collectionPersistencePersistOptions = (config) => (config.key === undefined ? {} : { key: config.key });
|
|
160
|
+
export const collectionPersistenceRestoreOptions = (config) => ({
|
|
161
|
+
...collectionPersistencePersistOptions(config),
|
|
162
|
+
...(config.hydrate === false ? {} : (config.hydrate ?? {})),
|
|
163
|
+
});
|
|
164
|
+
/**
|
|
165
|
+
* Merge collection and persistence error/requirement channels.
|
|
166
|
+
*
|
|
167
|
+
* Use before `Collection.define` when the persistence backend has a different
|
|
168
|
+
* Effect error or requirement type from the collection load/mutation handlers.
|
|
169
|
+
*/
|
|
170
|
+
export const persistedCollectionOptions = (options) => {
|
|
171
|
+
const { policy, persistence, ...rest } = options;
|
|
172
|
+
return {
|
|
173
|
+
...rest,
|
|
174
|
+
...(policy === undefined ? {} : { policy: policy }),
|
|
175
|
+
persistence,
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
export const persistCollectionForReasonEffect = (definition, store, storeEffect, reason) => {
|
|
179
|
+
const config = collectionPersistenceConfig(definition);
|
|
180
|
+
if (!config) {
|
|
181
|
+
return Effect.succeed(undefined);
|
|
182
|
+
}
|
|
183
|
+
const shouldPersist = reason === "load"
|
|
184
|
+
? config.persistOnLoad !== false
|
|
185
|
+
: reason === "mutation"
|
|
186
|
+
? config.persistOnMutation !== false
|
|
187
|
+
: config.persistOnWrite !== false;
|
|
188
|
+
if (!shouldPersist) {
|
|
189
|
+
return Effect.succeed(undefined);
|
|
190
|
+
}
|
|
191
|
+
return persistCollectionEffectUnsafe(definition, config.storage, collectionPersistencePersistOptions(config), storeEffect, store);
|
|
192
|
+
};
|
|
193
|
+
export const restoreCollectionBeforePreloadEffect = (definition, state, store, storeEffect, shouldRestore = () => true) => Effect.gen(function* () {
|
|
194
|
+
const config = collectionPersistenceConfig(definition);
|
|
195
|
+
if (!config ||
|
|
196
|
+
config.hydrate === false ||
|
|
197
|
+
config.restoreOnPreload === false ||
|
|
198
|
+
state.persistenceRestored ||
|
|
199
|
+
!shouldRestore()) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
const restoreOptions = collectionPersistenceRestoreOptions(config);
|
|
203
|
+
const dbStore = store;
|
|
204
|
+
const key = collectionPersistenceKey(definition, restoreOptions);
|
|
205
|
+
const encoded = yield* storageInputCallbackEffect(() => config.storage.getItem(key));
|
|
206
|
+
if (encoded === null || !shouldRestore()) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
const snapshot = yield* decodeCollectionSnapshotEffect(encoded);
|
|
210
|
+
const restored = yield* withCollectionDurableCommitPermit(state, Effect.gen(function* () {
|
|
211
|
+
if (!shouldRestore()) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
yield* hydrateCollectionEffectUnsafe(definition, snapshot, restoreOptions, storeEffect, dbStore);
|
|
215
|
+
yield* dbStore.publish({
|
|
216
|
+
_tag: "CollectionRestored",
|
|
217
|
+
collection: definition.name,
|
|
218
|
+
key,
|
|
219
|
+
count: snapshot.rows.length,
|
|
220
|
+
});
|
|
221
|
+
return true;
|
|
222
|
+
}));
|
|
223
|
+
if (restored) {
|
|
224
|
+
state.persistenceRestored = true;
|
|
225
|
+
}
|
|
226
|
+
return restored;
|
|
227
|
+
});
|
|
228
|
+
export const dehydrateCollections = (collections, store) => {
|
|
229
|
+
const definitions = uniqueCollectionDefinitionsUnsafe(collections, "snapshot");
|
|
230
|
+
const payload = {
|
|
231
|
+
collections: definitions.map((collection) => snapshotCollection(collection, store)),
|
|
232
|
+
};
|
|
233
|
+
return validateCollectionHydrationPayload(payload, "snapshot");
|
|
234
|
+
};
|
|
235
|
+
export const dehydrateCollectionsEffect = (collections, storeEffect) => Effect.gen(function* () {
|
|
236
|
+
const store = yield* storeEffect;
|
|
237
|
+
const updatedAt = yield* Clock.currentTimeMillis;
|
|
238
|
+
const definitions = yield* uniqueCollectionDefinitionsEffect(collections, "snapshot");
|
|
239
|
+
return yield* withCollectionDurableSnapshotPermits(store, definitions, Effect.gen(function* () {
|
|
240
|
+
const snapshots = [];
|
|
241
|
+
let index = 0;
|
|
242
|
+
for (const collection of definitions) {
|
|
243
|
+
const snapshot = yield* snapshotCollectionForEffectUnsafe(collection, store, updatedAt);
|
|
244
|
+
snapshots.push(yield* validateCollectionSnapshotDefinitionEffect(collection, snapshot, "snapshot", `$.collections[${index}]`));
|
|
245
|
+
index++;
|
|
246
|
+
}
|
|
247
|
+
const payload = {
|
|
248
|
+
collections: snapshots,
|
|
249
|
+
};
|
|
250
|
+
return yield* validateCollectionHydrationPayloadEffect(payload, "snapshot");
|
|
251
|
+
}));
|
|
252
|
+
});
|
|
253
|
+
export const hydrateCollectionsEffect = (collections, payload, options = {}, storeEffect) => Effect.gen(function* () {
|
|
254
|
+
const plan = yield* planCollectionsHydrationEffect(collections, payload, options, storeEffect);
|
|
255
|
+
yield* withCollectionDurableSnapshotPermits(plan.store, plan.entries.map((entry) => entry.collection), Effect.forEach(plan.entries, ({ collection, snapshot }) => hydrateCollectionEffectUnsafe(collection, snapshot, options, storeEffect, plan.store), { discard: true }));
|
|
256
|
+
});
|
|
257
|
+
export const validateCollectionsHydrationEffect = (collections, payload, options = {}, storeEffect) => Effect.asVoid(planCollectionsHydrationEffect(collections, payload, options, storeEffect));
|
|
258
|
+
const planCollectionsHydrationEffect = (collections, payload, options, storeEffect) => Effect.gen(function* () {
|
|
259
|
+
const definitions = yield* collectionDefinitionMapEffect(collections);
|
|
260
|
+
const hydrationPayload = yield* validateCollectionHydrationPayloadEffect(payload);
|
|
261
|
+
const entries = [];
|
|
262
|
+
for (const [index, snapshot] of hydrationPayload.collections.entries()) {
|
|
263
|
+
const collection = definitions.get(snapshot.name);
|
|
264
|
+
if (!collection) {
|
|
265
|
+
return yield* Effect.fail(new CollectionSnapshotCodecError({
|
|
266
|
+
operation: "hydrate",
|
|
267
|
+
path: `$.collections[${index}].name`,
|
|
268
|
+
reason: `No collection definition was provided for '${snapshot.name}'.`,
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
const validatedSnapshot = yield* validateCollectionSnapshotDefinitionEffect(collection, snapshot);
|
|
272
|
+
if (hasStoreExplicitCollectionSnapshotMarker(collection)) {
|
|
273
|
+
yield* hydrateStoreExplicitCollectionSnapshotPreflightEffect(collection, validatedSnapshot, options);
|
|
274
|
+
}
|
|
275
|
+
entries.push({ collection, snapshot: validatedSnapshot });
|
|
276
|
+
}
|
|
277
|
+
const store = yield* storeEffect;
|
|
278
|
+
for (const { collection, snapshot } of entries) {
|
|
279
|
+
if (!hasStoreExplicitCollectionSnapshotMarker(collection)) {
|
|
280
|
+
yield* validateCollectionSnapshotStateHydrationEffect(store.state(collection), snapshot, options);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return { store, entries };
|
|
284
|
+
});
|
|
285
|
+
/** Creates in-memory key/value storage for collection persistence tests and demos. */
|
|
286
|
+
export const makeCollectionMemoryStorage = (initial) => {
|
|
287
|
+
const values = new Map(initial);
|
|
288
|
+
return {
|
|
289
|
+
values,
|
|
290
|
+
getItem: (key) => values.get(key) ?? null,
|
|
291
|
+
setItem: (key, value) => {
|
|
292
|
+
values.set(key, value);
|
|
293
|
+
},
|
|
294
|
+
removeItem: (key) => {
|
|
295
|
+
values.delete(key);
|
|
296
|
+
},
|
|
297
|
+
clear: () => {
|
|
298
|
+
values.clear();
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
};
|
|
302
|
+
/** Adapts synchronous Web Storage-like hosts into Effect-aware collection persistence storage. */
|
|
303
|
+
export const collectionStorageFromSync = (storage) => {
|
|
304
|
+
return {
|
|
305
|
+
getItem: (key) => Effect.try({
|
|
306
|
+
try: () => storage.getItem(key),
|
|
307
|
+
catch: (cause) => new CollectionStorageError({ operation: "getItem", key, cause }),
|
|
308
|
+
}),
|
|
309
|
+
setItem: (key, value) => Effect.try({
|
|
310
|
+
try: () => storage.setItem(key, value),
|
|
311
|
+
catch: (cause) => new CollectionStorageError({ operation: "setItem", key, cause }),
|
|
312
|
+
}),
|
|
313
|
+
...(storage.removeItem
|
|
314
|
+
? {
|
|
315
|
+
removeItem: (key) => Effect.try({
|
|
316
|
+
try: () => storage.removeItem(key),
|
|
317
|
+
catch: (cause) => new CollectionStorageError({ operation: "removeItem", key, cause }),
|
|
318
|
+
}),
|
|
319
|
+
}
|
|
320
|
+
: {}),
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
//# sourceMappingURL=collection-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-persistence.js","sourceRoot":"","sources":["../src/collection-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { AnyCollection } from "./collection-contract.js";
|
|
3
|
+
/** Applies the shared collection retry policy to load and mutation Effects. */
|
|
4
|
+
export declare const withCollectionPolicyRetry: <A, E, R>(definition: AnyCollection, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
5
|
+
//# sourceMappingURL=collection-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-policy.d.ts","sourceRoot":"","sources":["../src/collection-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cACnC,aAAa,UACjB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAGvB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
/** Applies the shared collection retry policy to load and mutation Effects. */
|
|
3
|
+
export const withCollectionPolicyRetry = (definition, effect) => {
|
|
4
|
+
const retry = definition.options.policy?.retry;
|
|
5
|
+
return retry ? Effect.retry(effect, retry) : effect;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=collection-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-policy.js","sourceRoot":"","sources":["../src/collection-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAC;AAG/C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,UAAyB,EACzB,MAA8B,EACN,EAAE;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAsC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACvF,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context } from "effect";
|
|
2
|
+
import type { AnyCollection } from "./collection-contract.js";
|
|
3
|
+
/** Effect service that records collections preloaded during route work. */
|
|
4
|
+
export interface CollectionPreloadCollector {
|
|
5
|
+
/**
|
|
6
|
+
* Ordered collection preload facts observed in the current collector.
|
|
7
|
+
*
|
|
8
|
+
* The list may contain duplicate definition identities. Nested
|
|
9
|
+
* `Collection.collectEffect(...)` calls append their facts to the parent
|
|
10
|
+
* collector; dehydration later dedupes identical definitions and rejects
|
|
11
|
+
* distinct definitions that share a collection name.
|
|
12
|
+
*/
|
|
13
|
+
readonly definitions: AnyCollection[];
|
|
14
|
+
}
|
|
15
|
+
/** Context tag for the active Collection preload collector. */
|
|
16
|
+
export declare const CollectionPreloadCollector: Context.Service<CollectionPreloadCollector, CollectionPreloadCollector>;
|
|
17
|
+
export interface CollectionPreloadCollected<A> {
|
|
18
|
+
readonly value: A;
|
|
19
|
+
readonly definitions: ReadonlyArray<AnyCollection>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=collection-preload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-preload.d.ts","sourceRoot":"","sources":["../src/collection-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,2EAA2E;AAC3E,MAAM,WAAW,0BAA0B;IACzC;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;CACvC;AAED,+DAA+D;AAC/D,eAAO,MAAM,0BAA0B,yEAEtC,CAAC;AAEF,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-preload.js","sourceRoot":"","sources":["../src/collection-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAgBjC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC,OAAO,CACvD,4CAA4C,CAC7C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EffectInputCallbackError, type EffectInput } from "@sunfall/arc-core";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { CollectionRowKeyChanged } from "./collection-errors.js";
|
|
4
|
+
import type { AnyCollection, CollectionDefinition, CollectionKey, CollectionUpdate } from "./collection-contract.js";
|
|
5
|
+
import type { CollectionState } from "./collection-state.js";
|
|
6
|
+
import { applyCollectionUpdate } from "./collection-value-detachment.js";
|
|
7
|
+
import type { RuntimeCollectionStore } from "./runtime-collection-store.js";
|
|
8
|
+
export declare const collectionCallbackEffect: <A, E, R>(callback: () => EffectInput<A, E, R>) => Effect.Effect<A, E | EffectInputCallbackError, R>;
|
|
9
|
+
export declare const collectionProjectionCallbackError: (definition: AnyCollection, operation: string, cause: unknown) => EffectInputCallbackError;
|
|
10
|
+
export declare const collectionProjectionEffect: <A>(definition: AnyCollection, operation: string, evaluate: () => A) => Effect.Effect<A, EffectInputCallbackError>;
|
|
11
|
+
export declare const collectionStateEffect: <A extends object, K extends CollectionKey, E, R>(definition: CollectionDefinition<A, K, E, R>, store: RuntimeCollectionStore) => Effect.Effect<CollectionState<A, K, E>, EffectInputCallbackError>;
|
|
12
|
+
export declare const ensureCollectionRowKey: <A extends object, K extends CollectionKey, E, R>(definition: CollectionDefinition<A, K, E, R>, key: K, nextKey: K) => Effect.Effect<void, CollectionRowKeyChanged>;
|
|
13
|
+
export declare const applyCollectionUpdateEffect: <A extends object, K extends CollectionKey, E, R>(definition: CollectionDefinition<A, K, E, R>, previous: A, update: CollectionUpdate<A>) => Effect.Effect<ReturnType<typeof applyCollectionUpdate<A>>, EffectInputCallbackError>;
|
|
14
|
+
//# sourceMappingURL=collection-projection-callback-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-projection-callback-policy.d.ts","sourceRoot":"","sources":["../src/collection-projection-callback-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAqB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,eAAO,MAAM,wBAAwB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YACpC,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACnC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,wBAAwB,EAAE,CAAC,CACC,CAAC;AAErD,eAAO,MAAM,iCAAiC,eAChC,aAAa,aACd,MAAM,SACV,OAAO,KACb,wBAMC,CAAC;AAEL,eAAO,MAAM,0BAA0B,GAAI,CAAC,cAC9B,aAAa,aACd,MAAM,YACP,MAAM,CAAC,KAChB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,wBAAwB,CAIxC,CAAC;AAEL,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,cACvE,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SACrC,sBAAsB,KAC5B,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,wBAAwB,CACa,CAAC;AAEjF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,cACxE,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OACvC,CAAC,WACG,CAAC,KACT,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,uBAAuB,CAWvC,CAAC;AAER,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,cAC7E,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YAClC,CAAC,UACH,gBAAgB,CAAC,CAAC,CAAC,KAC1B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,wBAAwB,CACW,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EffectInputCallbackError, invokeEffectInput } from "@sunfall/arc-core";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { CollectionRowKeyChanged } from "./collection-errors.js";
|
|
4
|
+
import { applyCollectionUpdate } from "./collection-value-detachment.js";
|
|
5
|
+
export const collectionCallbackEffect = (callback) => invokeEffectInput("collection callback", callback);
|
|
6
|
+
export const collectionProjectionCallbackError = (definition, operation, cause) => new EffectInputCallbackError({
|
|
7
|
+
operation: `Collection.${operation}(${definition.name})`,
|
|
8
|
+
cause,
|
|
9
|
+
guidance: "Collection projection callbacks such as getKey, indexes, update functions, and state lookup must be synchronous, pure, and total. Move Effectful work into collection loaders or mutation handlers.",
|
|
10
|
+
});
|
|
11
|
+
export const collectionProjectionEffect = (definition, operation, evaluate) => Effect.try({
|
|
12
|
+
try: evaluate,
|
|
13
|
+
catch: (cause) => collectionProjectionCallbackError(definition, operation, cause),
|
|
14
|
+
});
|
|
15
|
+
export const collectionStateEffect = (definition, store) => collectionProjectionEffect(definition, "state", () => store.state(definition));
|
|
16
|
+
export const ensureCollectionRowKey = (definition, key, nextKey) => Object.is(nextKey, key)
|
|
17
|
+
? Effect.void
|
|
18
|
+
: Effect.fail(new CollectionRowKeyChanged({
|
|
19
|
+
collection: definition.name,
|
|
20
|
+
key,
|
|
21
|
+
nextKey,
|
|
22
|
+
guidance: "Collection updates must preserve the row key. Delete and insert when a domain workflow intentionally changes identity.",
|
|
23
|
+
}));
|
|
24
|
+
export const applyCollectionUpdateEffect = (definition, previous, update) => collectionProjectionEffect(definition, "update", () => applyCollectionUpdate(previous, update));
|
|
25
|
+
//# sourceMappingURL=collection-projection-callback-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-projection-callback-policy.js","sourceRoot":"","sources":["../src/collection-projection-callback-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAQjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,QAAoC,EACe,EAAE,CACrD,iBAAiB,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,UAAyB,EACzB,SAAiB,EACjB,KAAc,EACY,EAAE,CAC5B,IAAI,wBAAwB,CAAC;IAC3B,SAAS,EAAE,cAAc,SAAS,IAAI,UAAU,CAAC,IAAI,GAAG;IACxD,KAAK;IACL,QAAQ,EACN,qMAAqM;CACxM,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,UAAyB,EACzB,SAAiB,EACjB,QAAiB,EAC2B,EAAE,CAC9C,MAAM,CAAC,GAAG,CAAC;IACT,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iCAAiC,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;CAClF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAA4C,EAC5C,KAA6B,EACsC,EAAE,CACrE,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AAEjF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,UAA4C,EAC5C,GAAM,EACN,OAAU,EACoC,EAAE,CAChD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;IACrB,CAAC,CAAC,MAAM,CAAC,IAAI;IACb,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,IAAI,uBAAuB,CAAC;QAC1B,UAAU,EAAE,UAAU,CAAC,IAAI;QAC3B,GAAG;QACH,OAAO;QACP,QAAQ,EACN,wHAAwH;KAC3H,CAAC,CACH,CAAC;AAER,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,UAA4C,EAC5C,QAAW,EACX,MAA2B,EAC2D,EAAE,CACxF,0BAA0B,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type AnySunfallArcRuntime, type EffectInput } from "@sunfall/arc-core";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { AnyCollection, CollectionLoadState } from "./collection-contract.js";
|
|
4
|
+
import { type LiveQuery, type LiveQueryState, type QueryFactory } from "./query-builder.js";
|
|
5
|
+
/**
|
|
6
|
+
* Subscribes to the collection signals that framework adapters use to refresh
|
|
7
|
+
* collection-backed UI reads.
|
|
8
|
+
*/
|
|
9
|
+
export declare const subscribeCollectionReactiveSource: (runtime: AnySunfallArcRuntime<unknown>, collection: AnyCollection, notify: () => void) => (() => void);
|
|
10
|
+
/** Provides the runtime and scopes a collection/live-query Effect. */
|
|
11
|
+
export declare const bindCollectionRuntimeEffect: <A, E, R, ER = never>(runtime: AnySunfallArcRuntime<ER>, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ER>;
|
|
12
|
+
/** Returns true when two collection source lists have the same identity order. */
|
|
13
|
+
export declare const sameCollectionReactiveSources: (left: ReadonlyArray<AnyCollection>, right: ReadonlyArray<AnyCollection>) => boolean;
|
|
14
|
+
/** Extracts the current failure value from a collection load state. */
|
|
15
|
+
export declare const collectionStateError: <E>(state: CollectionLoadState<E>) => E | undefined;
|
|
16
|
+
/** Extracts the current failure value from a live-query state. */
|
|
17
|
+
export declare const liveQueryStateError: <T, E>(state: LiveQueryState<T, E>) => E | undefined;
|
|
18
|
+
/** Query factory or prebuilt LiveQuery accepted by framework live-query adapters. */
|
|
19
|
+
export type CollectionReactiveLiveQueryInput<T, E, R> = QueryFactory<T, E, R> | LiveQuery<T, E, R>;
|
|
20
|
+
/** Memoized live-query selection state shared by framework adapters. */
|
|
21
|
+
export interface CollectionReactiveLiveQuerySelection<T, E, R, Runtime> {
|
|
22
|
+
readonly runtime: Runtime;
|
|
23
|
+
readonly stableLiveQueryInput: LiveQuery<T, E, R> | undefined;
|
|
24
|
+
readonly deps: unknown;
|
|
25
|
+
readonly live: LiveQuery<T, E, R>;
|
|
26
|
+
}
|
|
27
|
+
/** Resolves live-query dependency options to the value used for equality. */
|
|
28
|
+
export declare const collectionReactiveDepsValue: (deps: unknown) => unknown;
|
|
29
|
+
/** Returns true when two framework live-query dependency values are equal. */
|
|
30
|
+
export declare const sameCollectionReactiveDeps: (left: unknown, right: unknown) => boolean;
|
|
31
|
+
/** Copies array dependency values so later caller mutation cannot change memo identity. */
|
|
32
|
+
export declare const snapshotCollectionReactiveDeps: (value: unknown) => unknown;
|
|
33
|
+
/** Selects or recreates a runtime-bound LiveQuery for framework adapters. */
|
|
34
|
+
export declare const selectCollectionReactiveLiveQuery: <T, E, R, Runtime extends AnySunfallArcRuntime<unknown>>(runtime: Runtime, input: CollectionReactiveLiveQueryInput<T, E, R>, deps: unknown, previous: CollectionReactiveLiveQuerySelection<T, E, R, Runtime> | undefined) => CollectionReactiveLiveQuerySelection<T, E, R, Runtime>;
|
|
35
|
+
/** Controls mount-time preload fibers for framework collection adapters. */
|
|
36
|
+
export interface CollectionReactivePreloadController<E, _ER = never> {
|
|
37
|
+
/** Starts a new preload when enabled, interrupting any previous one first. */
|
|
38
|
+
start(preloadEffect: Effect.Effect<void, E, unknown> | undefined, enabled: boolean): void;
|
|
39
|
+
/** Interrupts the current preload fiber and retires its generation as an Effect. */
|
|
40
|
+
interruptEffect(): Effect.Effect<void>;
|
|
41
|
+
/** Runtime-owned synchronous convenience for framework cleanup hooks. */
|
|
42
|
+
interrupt(): void;
|
|
43
|
+
}
|
|
44
|
+
/** Options for the shared collection/live-query preload controller. */
|
|
45
|
+
export interface CollectionReactivePreloadControllerOptions<E, ER = never> {
|
|
46
|
+
/** Runtime that owns preload execution and interruption. */
|
|
47
|
+
readonly runtime: AnySunfallArcRuntime<ER>;
|
|
48
|
+
/**
|
|
49
|
+
* Called when the latest preload succeeds.
|
|
50
|
+
*
|
|
51
|
+
* Return a plain value or an Effect. Promise-shaped observers are rejected at
|
|
52
|
+
* the EffectInput seam; adapt host Promise work explicitly with
|
|
53
|
+
* `Effect.tryPromise(...)` before returning it.
|
|
54
|
+
*/
|
|
55
|
+
readonly onSuccess: () => EffectInput<void, unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* Called when the latest preload fails.
|
|
58
|
+
*
|
|
59
|
+
* Return a plain value or an Effect. Promise-shaped observers are rejected at
|
|
60
|
+
* the EffectInput seam; adapt host Promise work explicitly with
|
|
61
|
+
* `Effect.tryPromise(...)` before returning it.
|
|
62
|
+
*/
|
|
63
|
+
readonly onFailure: (error: E | ER) => EffectInput<void, unknown>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates the shared mount-time preload lifecycle used by React DB and Solid DB.
|
|
67
|
+
*
|
|
68
|
+
* The controller keeps generation checks in one place so stale preload failures
|
|
69
|
+
* cannot overwrite newer UI state after a source refresh or unmount.
|
|
70
|
+
*/
|
|
71
|
+
export declare const makeCollectionReactivePreloadController: <E, ER = never>(options: CollectionReactivePreloadControllerOptions<E, ER>) => CollectionReactivePreloadController<E, ER>;
|
|
72
|
+
//# sourceMappingURL=collection-reactive-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection-reactive-binding.d.ts","sourceRoot":"","sources":["../src/collection-reactive-binding.ts"],"names":[],"mappings":"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"}
|