@rindle/normalized 0.1.6 → 0.3.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/dist/backend.d.ts +23 -2
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +128 -11
- package/dist/backend.js.map +1 -1
- package/package.json +3 -3
- package/src/backend.ts +127 -10
package/dist/backend.d.ts
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { Store } from "@rindle/client";
|
|
2
|
-
import type { Ast, Backend, ChangeEvent, ColsMap, Mutation, NormalizedSource, QueryId, RemoteQuery, Schema } from "@rindle/client";
|
|
2
|
+
import type { Ast, Backend, BackendDevObserver, ChangeEvent, ColsMap, Mutation, NormalizedSource, QueryId, RemoteQuery, ResultType, Schema } from "@rindle/client";
|
|
3
3
|
export type { NormalizedEvent, NormalizedSource, NormalizedTableSchema } from "@rindle/client";
|
|
4
4
|
export declare class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
5
5
|
private readonly local;
|
|
6
6
|
private readonly sync;
|
|
7
7
|
private readonly source;
|
|
8
8
|
private handler;
|
|
9
|
+
/** The Store's commit-boundary handler ({@link Backend.onCommitBoundary}), forwarded from the
|
|
10
|
+
* local engine's `dispatch` brackets so the Store folds every affected view before notifying any
|
|
11
|
+
* subscriber (cross-view-atomic notification). A normalized batch becomes net base mutations
|
|
12
|
+
* applied to the local engine in one commit, which fans to every view reading those rows — this
|
|
13
|
+
* carries that commit's boundary up so all those views notify together. */
|
|
14
|
+
private boundaryHandler;
|
|
15
|
+
private readonly devObservers;
|
|
9
16
|
private readonly remoteSubs;
|
|
10
17
|
private readonly localToRemote;
|
|
18
|
+
private readonly remoteRetainToLocal;
|
|
19
|
+
private readonly sourceToRemote;
|
|
20
|
+
private readonly resultTypes;
|
|
21
|
+
private readonly hydrated;
|
|
22
|
+
private resultTypeHandler;
|
|
11
23
|
/** The client's OWN typed per-table schemas (for CRIT#4 validation), fixed at construction. */
|
|
12
24
|
private readonly clientTables;
|
|
13
25
|
/** Synthetic aggregate tables (`__agg_*`) registered so far, by name (§3.3). Per aggregate
|
|
@@ -36,15 +48,24 @@ export declare class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
36
48
|
* `unregisterTable` frees it. */
|
|
37
49
|
private releaseSyntheticTables;
|
|
38
50
|
unregisterQuery(qid: QueryId): void;
|
|
39
|
-
retainRemoteQuery(qid: QueryId, remote: RemoteQuery): void;
|
|
51
|
+
retainRemoteQuery(qid: QueryId, remote: RemoteQuery, localQueryId?: QueryId, ast?: Ast): void;
|
|
40
52
|
releaseRemoteQuery(qid: QueryId): void;
|
|
41
53
|
/** Writes are authoritative-only here: send to the server, the stream reconciles locally.
|
|
42
54
|
* (Optimistic local apply + rebase is Slice 6.) */
|
|
43
55
|
mutate(mutations: Mutation[]): Promise<void>;
|
|
44
56
|
onEvent(handler: (qid: QueryId, ev: ChangeEvent) => void): void;
|
|
57
|
+
onCommitBoundary(handler: (phase: "begin" | "end") => void): void;
|
|
58
|
+
onResultType(handler: (qid: QueryId, rt: ResultType) => void): void;
|
|
59
|
+
__attachDevtoolsServerDeltas(observer: BackendDevObserver): () => void;
|
|
45
60
|
private onNormalized;
|
|
61
|
+
private emitServerDelta;
|
|
62
|
+
private localQidsForSource;
|
|
46
63
|
private retainRemote;
|
|
47
64
|
private releaseRemote;
|
|
65
|
+
private markSubHydrated;
|
|
66
|
+
private hasRemoteDependency;
|
|
67
|
+
private setResultType;
|
|
68
|
+
private recomputeResultType;
|
|
48
69
|
}
|
|
49
70
|
/** A local-first {@link Store} whose base tables are fed by a server's normalized stream.
|
|
50
71
|
* The returned Store is the ordinary `@rindle/client` Store — `store.query…materialize()` and
|
package/dist/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAoBA,OAAO,EAA0B,KAAK,EAAa,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EACV,GAAG,EACH,OAAO,EACP,WAAW,EACX,OAAO,EACP,QAAQ,EAER,gBAAgB,EAEhB,OAAO,EACP,WAAW,EACX,MAAM,EACP,MAAM,gBAAgB,CAAC;AASxB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AA2B/F,qBAAa,iBAAiB,CAAC,CAAC,SAAS,OAAO,CAAE,YAAW,OAAO;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,OAAO,CAAqD;IACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD;0FACsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IACtE,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC;0GACsG;IACtG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;gBAEnD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/backend.js
CHANGED
|
@@ -50,8 +50,20 @@ export class NormalizedBackend {
|
|
|
50
50
|
sync;
|
|
51
51
|
source;
|
|
52
52
|
handler = () => { };
|
|
53
|
+
/** The Store's commit-boundary handler ({@link Backend.onCommitBoundary}), forwarded from the
|
|
54
|
+
* local engine's `dispatch` brackets so the Store folds every affected view before notifying any
|
|
55
|
+
* subscriber (cross-view-atomic notification). A normalized batch becomes net base mutations
|
|
56
|
+
* applied to the local engine in one commit, which fans to every view reading those rows — this
|
|
57
|
+
* carries that commit's boundary up so all those views notify together. */
|
|
58
|
+
boundaryHandler = () => { };
|
|
59
|
+
devObservers = new Set();
|
|
53
60
|
remoteSubs = new Map();
|
|
54
61
|
localToRemote = new Map();
|
|
62
|
+
remoteRetainToLocal = new Map();
|
|
63
|
+
sourceToRemote = new Map();
|
|
64
|
+
resultTypes = new Map();
|
|
65
|
+
hydrated = new Set();
|
|
66
|
+
resultTypeHandler = () => { };
|
|
55
67
|
/** The client's OWN typed per-table schemas (for CRIT#4 validation), fixed at construction. */
|
|
56
68
|
clientTables;
|
|
57
69
|
/** Synthetic aggregate tables (`__agg_*`) registered so far, by name (§3.3). Per aggregate
|
|
@@ -70,6 +82,10 @@ export class NormalizedBackend {
|
|
|
70
82
|
this.local = new WasmBackend(schema);
|
|
71
83
|
// The local engine's flat stream IS this backend's stream upward (→ the Store's views).
|
|
72
84
|
this.local.onEvent((qid, ev) => this.handler(qid, ev));
|
|
85
|
+
// Forward the local engine's commit brackets up to the Store (cross-view-atomic notification):
|
|
86
|
+
// a normalized batch's net base mutations commit to `this.local` in one transaction, so its
|
|
87
|
+
// commit boundary is ours — every view those rows touch then notifies together.
|
|
88
|
+
this.local.onCommitBoundary((phase) => this.boundaryHandler(phase));
|
|
73
89
|
this.colIndex = colIndexFromSchema(schema);
|
|
74
90
|
this.colCounts = colCountsFromSchema(schema);
|
|
75
91
|
this.sync = new NormalizedSync(pkColsFromSchema(schema), this.colCounts);
|
|
@@ -88,8 +104,13 @@ export class NormalizedBackend {
|
|
|
88
104
|
this.ensureSyntheticTables(qid, ast);
|
|
89
105
|
// Local first: builds the (empty) view synchronously. Then the server stream hydrates it.
|
|
90
106
|
this.local.registerQuery(qid, rewriteAggregates(ast));
|
|
91
|
-
if (remote)
|
|
92
|
-
this.retainRemote(qid, remote);
|
|
107
|
+
if (remote) {
|
|
108
|
+
this.retainRemote(qid, remote, qid);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.hydrated.add(qid);
|
|
112
|
+
this.setResultType(qid, "complete");
|
|
113
|
+
}
|
|
93
114
|
}
|
|
94
115
|
/** Register every synthetic aggregate table `ast` needs that we haven't seen yet: on the
|
|
95
116
|
* local engine (so it can join to it), on `NormalizedSync` (so its rows refcount/GC by
|
|
@@ -154,12 +175,19 @@ export class NormalizedBackend {
|
|
|
154
175
|
this.local.unregisterQuery(qid);
|
|
155
176
|
// Pipeline gone (no live conn) + `__agg` rows GC'd above → free any now-unread synthetic table.
|
|
156
177
|
this.releaseSyntheticTables(qid);
|
|
178
|
+
this.resultTypes.delete(qid);
|
|
179
|
+
this.hydrated.delete(qid);
|
|
157
180
|
}
|
|
158
|
-
retainRemoteQuery(qid, remote) {
|
|
159
|
-
|
|
181
|
+
retainRemoteQuery(qid, remote, localQueryId, ast) {
|
|
182
|
+
if (ast)
|
|
183
|
+
this.ensureSyntheticTables(qid, ast);
|
|
184
|
+
this.retainRemote(qid, remote, localQueryId);
|
|
160
185
|
}
|
|
161
186
|
releaseRemoteQuery(qid) {
|
|
162
187
|
const remoteQid = this.releaseRemote(qid);
|
|
188
|
+
this.resultTypes.delete(qid);
|
|
189
|
+
this.hydrated.delete(qid);
|
|
190
|
+
this.releaseSyntheticTables(qid);
|
|
163
191
|
if (remoteQid === undefined)
|
|
164
192
|
return;
|
|
165
193
|
const muts = this.sync.dropQuery(remoteQid);
|
|
@@ -174,7 +202,20 @@ export class NormalizedBackend {
|
|
|
174
202
|
onEvent(handler) {
|
|
175
203
|
this.handler = handler;
|
|
176
204
|
}
|
|
205
|
+
onCommitBoundary(handler) {
|
|
206
|
+
this.boundaryHandler = handler;
|
|
207
|
+
}
|
|
208
|
+
onResultType(handler) {
|
|
209
|
+
this.resultTypeHandler = handler;
|
|
210
|
+
}
|
|
211
|
+
__attachDevtoolsServerDeltas(observer) {
|
|
212
|
+
this.devObservers.add(observer);
|
|
213
|
+
return () => {
|
|
214
|
+
this.devObservers.delete(observer);
|
|
215
|
+
};
|
|
216
|
+
}
|
|
177
217
|
onNormalized(qid, ev) {
|
|
218
|
+
this.emitServerDelta(qid, ev);
|
|
178
219
|
// The slim hello carries table schemas + fingerprint; envelope validation (epoch/seq/gap)
|
|
179
220
|
// is the source's job (the ws Subscriber, §5.3) — it precedes every (re)hydrate snapshot.
|
|
180
221
|
if (ev.type === "hello") {
|
|
@@ -208,33 +249,109 @@ export class NormalizedBackend {
|
|
|
208
249
|
const muts = ev.type === "snapshot" ? this.sync.rehydrate(qid, ev.ops) : this.sync.applyBatch(qid, ev.ops);
|
|
209
250
|
if (muts.length)
|
|
210
251
|
void this.local.mutate(muts); // → local engine → flat stream → views
|
|
252
|
+
if (ev.type === "snapshot")
|
|
253
|
+
this.markSubHydrated(qid);
|
|
254
|
+
}
|
|
255
|
+
emitServerDelta(sourceQid, ev) {
|
|
256
|
+
if (!this.devObservers.size)
|
|
257
|
+
return;
|
|
258
|
+
for (const qid of this.localQidsForSource(sourceQid)) {
|
|
259
|
+
for (const o of this.devObservers)
|
|
260
|
+
o.onServerDelta?.(qid, { format: "normalized", event: ev });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
localQidsForSource(sourceQid) {
|
|
264
|
+
const key = this.sourceToRemote.get(sourceQid);
|
|
265
|
+
const sub = key ? this.remoteSubs.get(key) : undefined;
|
|
266
|
+
if (!sub)
|
|
267
|
+
return [sourceQid];
|
|
268
|
+
const localQids = [...sub.localQids.keys()];
|
|
269
|
+
return localQids.length ? localQids : [sourceQid];
|
|
211
270
|
}
|
|
212
|
-
retainRemote(
|
|
271
|
+
retainRemote(retainQid, remote, localQueryId = retainQid) {
|
|
213
272
|
const key = remoteKey(remote);
|
|
214
273
|
let sub = this.remoteSubs.get(key);
|
|
274
|
+
let isNew = false;
|
|
215
275
|
if (!sub) {
|
|
216
|
-
sub = { sourceQid:
|
|
276
|
+
sub = { sourceQid: retainQid, remote, refCount: 0, localQids: new Map(), hydrated: false };
|
|
217
277
|
this.remoteSubs.set(key, sub);
|
|
218
|
-
this.
|
|
278
|
+
this.sourceToRemote.set(sub.sourceQid, key);
|
|
279
|
+
isNew = true;
|
|
219
280
|
}
|
|
220
281
|
sub.refCount++;
|
|
221
|
-
|
|
282
|
+
if (localQueryId !== undefined) {
|
|
283
|
+
sub.localQids.set(localQueryId, (sub.localQids.get(localQueryId) ?? 0) + 1);
|
|
284
|
+
if (sub.hydrated)
|
|
285
|
+
this.hydrated.add(localQueryId);
|
|
286
|
+
else
|
|
287
|
+
this.hydrated.delete(localQueryId);
|
|
288
|
+
this.recomputeResultType(localQueryId);
|
|
289
|
+
}
|
|
290
|
+
this.localToRemote.set(retainQid, key);
|
|
291
|
+
this.remoteRetainToLocal.set(retainQid, localQueryId);
|
|
292
|
+
if (isNew)
|
|
293
|
+
this.source.registerQuery(sub.sourceQid, remote);
|
|
222
294
|
}
|
|
223
|
-
releaseRemote(
|
|
224
|
-
const key = this.localToRemote.get(
|
|
295
|
+
releaseRemote(retainQid) {
|
|
296
|
+
const key = this.localToRemote.get(retainQid);
|
|
225
297
|
if (!key)
|
|
226
298
|
return undefined;
|
|
227
|
-
this.localToRemote.delete(
|
|
299
|
+
this.localToRemote.delete(retainQid);
|
|
300
|
+
const localQueryId = this.remoteRetainToLocal.get(retainQid);
|
|
301
|
+
this.remoteRetainToLocal.delete(retainQid);
|
|
228
302
|
const sub = this.remoteSubs.get(key);
|
|
229
303
|
if (!sub)
|
|
230
304
|
return undefined;
|
|
231
305
|
sub.refCount--;
|
|
306
|
+
if (localQueryId !== undefined) {
|
|
307
|
+
const refs = (sub.localQids.get(localQueryId) ?? 0) - 1;
|
|
308
|
+
if (refs > 0) {
|
|
309
|
+
sub.localQids.set(localQueryId, refs);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
sub.localQids.delete(localQueryId);
|
|
313
|
+
if (!this.hasRemoteDependency(localQueryId)) {
|
|
314
|
+
this.hydrated.add(localQueryId);
|
|
315
|
+
this.recomputeResultType(localQueryId);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
232
319
|
if (sub.refCount > 0)
|
|
233
320
|
return undefined;
|
|
234
321
|
this.source.unregisterQuery(sub.sourceQid);
|
|
322
|
+
this.sourceToRemote.delete(sub.sourceQid);
|
|
235
323
|
this.remoteSubs.delete(key);
|
|
236
324
|
return sub.sourceQid;
|
|
237
325
|
}
|
|
326
|
+
markSubHydrated(sourceQid) {
|
|
327
|
+
const key = this.sourceToRemote.get(sourceQid);
|
|
328
|
+
if (!key)
|
|
329
|
+
return;
|
|
330
|
+
const sub = this.remoteSubs.get(key);
|
|
331
|
+
if (!sub || sub.hydrated)
|
|
332
|
+
return;
|
|
333
|
+
sub.hydrated = true;
|
|
334
|
+
for (const localQid of sub.localQids.keys()) {
|
|
335
|
+
this.hydrated.add(localQid);
|
|
336
|
+
this.recomputeResultType(localQid);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
hasRemoteDependency(localQid) {
|
|
340
|
+
for (const sub of this.remoteSubs.values()) {
|
|
341
|
+
if (sub.localQids.has(localQid))
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
setResultType(qid, rt) {
|
|
347
|
+
if (this.resultTypes.get(qid) === rt)
|
|
348
|
+
return;
|
|
349
|
+
this.resultTypes.set(qid, rt);
|
|
350
|
+
this.resultTypeHandler(qid, rt);
|
|
351
|
+
}
|
|
352
|
+
recomputeResultType(qid) {
|
|
353
|
+
this.setResultType(qid, this.hydrated.has(qid) ? "complete" : "unknown");
|
|
354
|
+
}
|
|
238
355
|
}
|
|
239
356
|
function remoteKey(remote) {
|
|
240
357
|
return stableJson([remote.name, remote.args]);
|
package/dist/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rindle/normalized",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"README.md"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@rindle/client": "0.1
|
|
29
|
-
"@rindle/wasm": "0.1
|
|
28
|
+
"@rindle/client": "0.3.1",
|
|
29
|
+
"@rindle/wasm": "0.3.1"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^22.10.0",
|
package/src/backend.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { normalizedTableSchemas, Store, tableSpec } from "@rindle/client";
|
|
|
22
22
|
import type {
|
|
23
23
|
Ast,
|
|
24
24
|
Backend,
|
|
25
|
+
BackendDevObserver,
|
|
25
26
|
ChangeEvent,
|
|
26
27
|
ColsMap,
|
|
27
28
|
Mutation,
|
|
@@ -30,6 +31,7 @@ import type {
|
|
|
30
31
|
NormalizedTableSchema,
|
|
31
32
|
QueryId,
|
|
32
33
|
RemoteQuery,
|
|
34
|
+
ResultType,
|
|
33
35
|
Schema,
|
|
34
36
|
} from "@rindle/client";
|
|
35
37
|
import { WasmBackend } from "@rindle/wasm";
|
|
@@ -72,8 +74,20 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
72
74
|
private readonly sync: NormalizedSync;
|
|
73
75
|
private readonly source: NormalizedSource;
|
|
74
76
|
private handler: (qid: QueryId, ev: ChangeEvent) => void = () => {};
|
|
77
|
+
/** The Store's commit-boundary handler ({@link Backend.onCommitBoundary}), forwarded from the
|
|
78
|
+
* local engine's `dispatch` brackets so the Store folds every affected view before notifying any
|
|
79
|
+
* subscriber (cross-view-atomic notification). A normalized batch becomes net base mutations
|
|
80
|
+
* applied to the local engine in one commit, which fans to every view reading those rows — this
|
|
81
|
+
* carries that commit's boundary up so all those views notify together. */
|
|
82
|
+
private boundaryHandler: (phase: "begin" | "end") => void = () => {};
|
|
83
|
+
private readonly devObservers = new Set<BackendDevObserver>();
|
|
75
84
|
private readonly remoteSubs = new Map<string, RemoteSub>();
|
|
76
85
|
private readonly localToRemote = new Map<QueryId, string>();
|
|
86
|
+
private readonly remoteRetainToLocal = new Map<QueryId, QueryId | undefined>();
|
|
87
|
+
private readonly sourceToRemote = new Map<QueryId, string>();
|
|
88
|
+
private readonly resultTypes = new Map<QueryId, ResultType>();
|
|
89
|
+
private readonly hydrated = new Set<QueryId>();
|
|
90
|
+
private resultTypeHandler: (qid: QueryId, rt: ResultType) => void = () => {};
|
|
77
91
|
/** The client's OWN typed per-table schemas (for CRIT#4 validation), fixed at construction. */
|
|
78
92
|
private readonly clientTables: NormalizedTableSchema[];
|
|
79
93
|
/** Synthetic aggregate tables (`__agg_*`) registered so far, by name (§3.3). Per aggregate
|
|
@@ -93,6 +107,10 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
93
107
|
this.local = new WasmBackend(schema);
|
|
94
108
|
// The local engine's flat stream IS this backend's stream upward (→ the Store's views).
|
|
95
109
|
this.local.onEvent((qid, ev) => this.handler(qid, ev));
|
|
110
|
+
// Forward the local engine's commit brackets up to the Store (cross-view-atomic notification):
|
|
111
|
+
// a normalized batch's net base mutations commit to `this.local` in one transaction, so its
|
|
112
|
+
// commit boundary is ours — every view those rows touch then notifies together.
|
|
113
|
+
this.local.onCommitBoundary((phase) => this.boundaryHandler(phase));
|
|
96
114
|
this.colIndex = colIndexFromSchema(schema);
|
|
97
115
|
this.colCounts = colCountsFromSchema(schema);
|
|
98
116
|
this.sync = new NormalizedSync(pkColsFromSchema(schema), this.colCounts);
|
|
@@ -112,7 +130,12 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
112
130
|
this.ensureSyntheticTables(qid, ast);
|
|
113
131
|
// Local first: builds the (empty) view synchronously. Then the server stream hydrates it.
|
|
114
132
|
this.local.registerQuery(qid, rewriteAggregates(ast));
|
|
115
|
-
if (remote)
|
|
133
|
+
if (remote) {
|
|
134
|
+
this.retainRemote(qid, remote, qid);
|
|
135
|
+
} else {
|
|
136
|
+
this.hydrated.add(qid);
|
|
137
|
+
this.setResultType(qid, "complete");
|
|
138
|
+
}
|
|
116
139
|
}
|
|
117
140
|
|
|
118
141
|
/** Register every synthetic aggregate table `ast` needs that we haven't seen yet: on the
|
|
@@ -173,14 +196,20 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
173
196
|
this.local.unregisterQuery(qid);
|
|
174
197
|
// Pipeline gone (no live conn) + `__agg` rows GC'd above → free any now-unread synthetic table.
|
|
175
198
|
this.releaseSyntheticTables(qid);
|
|
199
|
+
this.resultTypes.delete(qid);
|
|
200
|
+
this.hydrated.delete(qid);
|
|
176
201
|
}
|
|
177
202
|
|
|
178
|
-
retainRemoteQuery(qid: QueryId, remote: RemoteQuery): void {
|
|
179
|
-
this.
|
|
203
|
+
retainRemoteQuery(qid: QueryId, remote: RemoteQuery, localQueryId?: QueryId, ast?: Ast): void {
|
|
204
|
+
if (ast) this.ensureSyntheticTables(qid, ast);
|
|
205
|
+
this.retainRemote(qid, remote, localQueryId);
|
|
180
206
|
}
|
|
181
207
|
|
|
182
208
|
releaseRemoteQuery(qid: QueryId): void {
|
|
183
209
|
const remoteQid = this.releaseRemote(qid);
|
|
210
|
+
this.resultTypes.delete(qid);
|
|
211
|
+
this.hydrated.delete(qid);
|
|
212
|
+
this.releaseSyntheticTables(qid);
|
|
184
213
|
if (remoteQid === undefined) return;
|
|
185
214
|
const muts = this.sync.dropQuery(remoteQid);
|
|
186
215
|
if (muts.length) void this.local.mutate(muts);
|
|
@@ -196,7 +225,23 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
196
225
|
this.handler = handler;
|
|
197
226
|
}
|
|
198
227
|
|
|
228
|
+
onCommitBoundary(handler: (phase: "begin" | "end") => void): void {
|
|
229
|
+
this.boundaryHandler = handler;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
onResultType(handler: (qid: QueryId, rt: ResultType) => void): void {
|
|
233
|
+
this.resultTypeHandler = handler;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
__attachDevtoolsServerDeltas(observer: BackendDevObserver): () => void {
|
|
237
|
+
this.devObservers.add(observer);
|
|
238
|
+
return () => {
|
|
239
|
+
this.devObservers.delete(observer);
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
199
243
|
private onNormalized(qid: QueryId, ev: NormalizedEvent): void {
|
|
244
|
+
this.emitServerDelta(qid, ev);
|
|
200
245
|
// The slim hello carries table schemas + fingerprint; envelope validation (epoch/seq/gap)
|
|
201
246
|
// is the source's job (the ws Subscriber, §5.3) — it precedes every (re)hydrate snapshot.
|
|
202
247
|
if (ev.type === "hello") {
|
|
@@ -226,38 +271,110 @@ export class NormalizedBackend<S extends ColsMap> implements Backend {
|
|
|
226
271
|
// `batch` is an incremental delta → `applyBatch`.
|
|
227
272
|
const muts = ev.type === "snapshot" ? this.sync.rehydrate(qid, ev.ops) : this.sync.applyBatch(qid, ev.ops);
|
|
228
273
|
if (muts.length) void this.local.mutate(muts); // → local engine → flat stream → views
|
|
274
|
+
if (ev.type === "snapshot") this.markSubHydrated(qid);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private emitServerDelta(sourceQid: QueryId, ev: NormalizedEvent): void {
|
|
278
|
+
if (!this.devObservers.size) return;
|
|
279
|
+
for (const qid of this.localQidsForSource(sourceQid)) {
|
|
280
|
+
for (const o of this.devObservers) o.onServerDelta?.(qid, { format: "normalized", event: ev });
|
|
281
|
+
}
|
|
229
282
|
}
|
|
230
283
|
|
|
231
|
-
private
|
|
284
|
+
private localQidsForSource(sourceQid: QueryId): QueryId[] {
|
|
285
|
+
const key = this.sourceToRemote.get(sourceQid);
|
|
286
|
+
const sub = key ? this.remoteSubs.get(key) : undefined;
|
|
287
|
+
if (!sub) return [sourceQid];
|
|
288
|
+
const localQids = [...sub.localQids.keys()];
|
|
289
|
+
return localQids.length ? localQids : [sourceQid];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private retainRemote(retainQid: QueryId, remote: RemoteQuery, localQueryId: QueryId | undefined = retainQid): void {
|
|
232
293
|
const key = remoteKey(remote);
|
|
233
294
|
let sub = this.remoteSubs.get(key);
|
|
295
|
+
let isNew = false;
|
|
234
296
|
if (!sub) {
|
|
235
|
-
sub = { sourceQid:
|
|
297
|
+
sub = { sourceQid: retainQid, remote, refCount: 0, localQids: new Map(), hydrated: false };
|
|
236
298
|
this.remoteSubs.set(key, sub);
|
|
237
|
-
this.
|
|
299
|
+
this.sourceToRemote.set(sub.sourceQid, key);
|
|
300
|
+
isNew = true;
|
|
238
301
|
}
|
|
239
302
|
sub.refCount++;
|
|
240
|
-
|
|
303
|
+
if (localQueryId !== undefined) {
|
|
304
|
+
sub.localQids.set(localQueryId, (sub.localQids.get(localQueryId) ?? 0) + 1);
|
|
305
|
+
if (sub.hydrated) this.hydrated.add(localQueryId);
|
|
306
|
+
else this.hydrated.delete(localQueryId);
|
|
307
|
+
this.recomputeResultType(localQueryId);
|
|
308
|
+
}
|
|
309
|
+
this.localToRemote.set(retainQid, key);
|
|
310
|
+
this.remoteRetainToLocal.set(retainQid, localQueryId);
|
|
311
|
+
if (isNew) this.source.registerQuery(sub.sourceQid, remote);
|
|
241
312
|
}
|
|
242
313
|
|
|
243
|
-
private releaseRemote(
|
|
244
|
-
const key = this.localToRemote.get(
|
|
314
|
+
private releaseRemote(retainQid: QueryId): QueryId | undefined {
|
|
315
|
+
const key = this.localToRemote.get(retainQid);
|
|
245
316
|
if (!key) return undefined;
|
|
246
|
-
this.localToRemote.delete(
|
|
317
|
+
this.localToRemote.delete(retainQid);
|
|
318
|
+
const localQueryId = this.remoteRetainToLocal.get(retainQid);
|
|
319
|
+
this.remoteRetainToLocal.delete(retainQid);
|
|
247
320
|
const sub = this.remoteSubs.get(key);
|
|
248
321
|
if (!sub) return undefined;
|
|
249
322
|
sub.refCount--;
|
|
323
|
+
if (localQueryId !== undefined) {
|
|
324
|
+
const refs = (sub.localQids.get(localQueryId) ?? 0) - 1;
|
|
325
|
+
if (refs > 0) {
|
|
326
|
+
sub.localQids.set(localQueryId, refs);
|
|
327
|
+
} else {
|
|
328
|
+
sub.localQids.delete(localQueryId);
|
|
329
|
+
if (!this.hasRemoteDependency(localQueryId)) {
|
|
330
|
+
this.hydrated.add(localQueryId);
|
|
331
|
+
this.recomputeResultType(localQueryId);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
250
335
|
if (sub.refCount > 0) return undefined;
|
|
251
336
|
this.source.unregisterQuery(sub.sourceQid);
|
|
337
|
+
this.sourceToRemote.delete(sub.sourceQid);
|
|
252
338
|
this.remoteSubs.delete(key);
|
|
253
339
|
return sub.sourceQid;
|
|
254
340
|
}
|
|
341
|
+
|
|
342
|
+
private markSubHydrated(sourceQid: QueryId): void {
|
|
343
|
+
const key = this.sourceToRemote.get(sourceQid);
|
|
344
|
+
if (!key) return;
|
|
345
|
+
const sub = this.remoteSubs.get(key);
|
|
346
|
+
if (!sub || sub.hydrated) return;
|
|
347
|
+
sub.hydrated = true;
|
|
348
|
+
for (const localQid of sub.localQids.keys()) {
|
|
349
|
+
this.hydrated.add(localQid);
|
|
350
|
+
this.recomputeResultType(localQid);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
private hasRemoteDependency(localQid: QueryId): boolean {
|
|
355
|
+
for (const sub of this.remoteSubs.values()) {
|
|
356
|
+
if (sub.localQids.has(localQid)) return true;
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
private setResultType(qid: QueryId, rt: ResultType): void {
|
|
362
|
+
if (this.resultTypes.get(qid) === rt) return;
|
|
363
|
+
this.resultTypes.set(qid, rt);
|
|
364
|
+
this.resultTypeHandler(qid, rt);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private recomputeResultType(qid: QueryId): void {
|
|
368
|
+
this.setResultType(qid, this.hydrated.has(qid) ? "complete" : "unknown");
|
|
369
|
+
}
|
|
255
370
|
}
|
|
256
371
|
|
|
257
372
|
interface RemoteSub {
|
|
258
373
|
sourceQid: QueryId;
|
|
259
374
|
remote: RemoteQuery;
|
|
260
375
|
refCount: number;
|
|
376
|
+
localQids: Map<QueryId, number>;
|
|
377
|
+
hydrated: boolean;
|
|
261
378
|
}
|
|
262
379
|
|
|
263
380
|
function remoteKey(remote: RemoteQuery): string {
|