@rindle/client 0.4.3 → 0.5.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 +31 -161
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/query.d.ts +34 -3
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +31 -8
- package/dist/query.js.map +1 -1
- package/dist/schema.d.ts +30 -6
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +35 -5
- package/dist/schema.js.map +1 -1
- package/dist/store.d.ts +46 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +151 -20
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +71 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/view.d.ts +63 -8
- package/dist/view.d.ts.map +1 -1
- package/dist/view.js +328 -18
- package/dist/view.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/query.ts +91 -10
- package/src/schema.ts +50 -9
- package/src/store.ts +146 -18
- package/src/types.ts +77 -3
- package/src/view.ts +325 -18
package/dist/types.d.ts
CHANGED
|
@@ -79,6 +79,7 @@ export type ChangeEvent = {
|
|
|
79
79
|
} | {
|
|
80
80
|
type: "batch";
|
|
81
81
|
events: FlatChange[];
|
|
82
|
+
catchUp?: boolean;
|
|
82
83
|
};
|
|
83
84
|
export type Mutation = {
|
|
84
85
|
op: "add";
|
|
@@ -201,8 +202,13 @@ export interface Backend {
|
|
|
201
202
|
/** Optional DIRECT-COMMIT path for LOCAL-only tables (`201-LOCAL-ONLY-TABLES-DESIGN.md` §6):
|
|
202
203
|
* applies the writes straight to the engine, OUTSIDE the optimistic pending stack (a local
|
|
203
204
|
* table is untracked, so it never rebases). The backend rejects any synced/tracked table (M2).
|
|
204
|
-
* Backends with no local-table support (a plain remote sync backend) omit it.
|
|
205
|
-
|
|
205
|
+
* Backends with no local-table support (a plain remote sync backend) omit it.
|
|
206
|
+
*
|
|
207
|
+
* `onCommitted` (207 §5.1) runs after the engine commit is applied but BEFORE subscriber
|
|
208
|
+
* delivery: a subscriber throwing during delivery re-raises out of this call, and a caller
|
|
209
|
+
* that must stay coherent with the engine (the persistence tap) cannot tell that throw from
|
|
210
|
+
* a pre-commit rejection — the callback can, because it fires exactly when the commit is in. */
|
|
211
|
+
writeLocal?(mutations: Mutation[], onCommitted?: () => void): void;
|
|
206
212
|
onEvent(handler: (queryId: QueryId, event: ChangeEvent) => void): void;
|
|
207
213
|
/** Optional: the backend pushes per-query {@link ResultType} changes here and the core routes
|
|
208
214
|
* each to the matching view (so `view.resultType` tracks it). Backends with no lifecycle (the
|
|
@@ -251,6 +257,32 @@ export interface MutationEnvelope {
|
|
|
251
257
|
name: string;
|
|
252
258
|
args: unknown;
|
|
253
259
|
}
|
|
260
|
+
/** A room authority's verdict for a NON-applied mutation (RINDLE-REALTIME-QUERY-ENABLEMENT
|
|
261
|
+
* §3.3, the deopt handshake; Slice H-iv-b server half / H-v client half). Sent on the author's
|
|
262
|
+
* own socket for every mutation the room did NOT apply, always BEFORE the lmid ack that burns
|
|
263
|
+
* the `mid` (same-socket ordering only — the ack may reach the client through another path
|
|
264
|
+
* first, e.g. a replayed lmid snapshot). Applied mutations send NOTHING: silence + lmid
|
|
265
|
+
* coverage ⇒ applied.
|
|
266
|
+
*
|
|
267
|
+
* - `kind: "deopt"` — the room's §3.3 commit gate refused the routed mutation (or its
|
|
268
|
+
* environment fell short, e.g. `tx.query`); the mid is burnt in the ROOM ledger with zero
|
|
269
|
+
* effects and the client re-enqueues the same logical mutation onto the daemon stream.
|
|
270
|
+
* `name`/`args` are echoed so the frame is SELF-CONTAINED: a client that already retired the
|
|
271
|
+
* entry (the burnt-mid confirm won the race, or the frame is a replay re-answer) re-invokes
|
|
272
|
+
* from the frame alone.
|
|
273
|
+
* - `kind: "rejected"` — FINAL (authz/validation): the mid is burnt the same way and the
|
|
274
|
+
* prediction snaps back on the ordinary lmid release; no re-route.
|
|
275
|
+
*
|
|
276
|
+
* `reason` may be absent on a re-answered frame whose record was seeded from journal replay
|
|
277
|
+
* (the verdict is journaled; the reason is not). */
|
|
278
|
+
export interface MutationOutcomeFrame {
|
|
279
|
+
mid: number;
|
|
280
|
+
kind: "deopt" | "rejected";
|
|
281
|
+
reason?: string;
|
|
282
|
+
/** Echoed on DEOPT frames only (self-contained re-invoke — see above). */
|
|
283
|
+
name?: string;
|
|
284
|
+
args?: unknown;
|
|
285
|
+
}
|
|
254
286
|
/** The connection-level progress frame (§8.6): advances the coherent-apply release point
|
|
255
287
|
* (`cvMin`). A pure release signal — mutation confirmation does NOT ride it: `lmid` is a
|
|
256
288
|
* row in {@link CLIENT_MUTATIONS_TABLE}, delivered through the client's own per-client
|
|
@@ -258,6 +290,13 @@ export interface MutationEnvelope {
|
|
|
258
290
|
* `cvMin` as the commit's effects (transactionally coherent by construction). */
|
|
259
291
|
export interface ProgressFrame {
|
|
260
292
|
cvMin: number;
|
|
293
|
+
/** A ROOM shell's upstream-absorption advert (`301-ECHO-FENCE-DESIGN.md` §1.2, optional —
|
|
294
|
+
* old shells omit both): "I have absorbed upstream daemon commits through cv `upstreamCv`
|
|
295
|
+
* of daemon boot `upstreamBoot`." The client's §301 direction-B pin fence: a pin stamped
|
|
296
|
+
* `(boot, cv)` at its parking daemon release drops once the room advertises coverage under
|
|
297
|
+
* the §2.4 boot rule. The daemon's own progress frames never carry these. */
|
|
298
|
+
upstreamCv?: number;
|
|
299
|
+
upstreamBoot?: string;
|
|
261
300
|
}
|
|
262
301
|
/** The replicated bookkeeping table carrying each client's high-water mutation id
|
|
263
302
|
* (`lmid`). Engine-hosted and served like any base table; reserved (never part of a
|
|
@@ -290,5 +329,35 @@ export interface OptimisticSource {
|
|
|
290
329
|
* boot id). The backend resets its `cv` watermark so the server's reset `cv` sequence is
|
|
291
330
|
* accepted rather than dropped as stale. In-process sources never restart and omit it. */
|
|
292
331
|
onRestart?(handler: () => void): void;
|
|
332
|
+
/** Optional (§301 §2.4): the transport's observed authority BOOT-ID stream — fired on the
|
|
333
|
+
* FIRST observation and on every change (the same signal that drives {@link onRestart}, plus
|
|
334
|
+
* the initial one). The backend keeps client-local ordinals over these opaque ids; the
|
|
335
|
+
* direction-B pin fence's boot rule compares a room's advertised
|
|
336
|
+
* {@link ProgressFrame.upstreamBoot} against them. Sources that cannot observe one omit it —
|
|
337
|
+
* direction-B pins then hold to the state-match fallback across restarts (conservative). */
|
|
338
|
+
onBootId?(handler: (bootId: string) => void): void;
|
|
339
|
+
/** Optional (Slice H-v): the channel's {@link MutationOutcomeFrame} stream — the room deopt
|
|
340
|
+
* handshake's client half. **OUT-OF-BAND BY DESIGN**: the frame carries no `cv` and the source
|
|
341
|
+
* MUST dispatch it immediately on arrival, never behind the cv buffer — a deopt has to migrate
|
|
342
|
+
* its pending entry BEFORE the buffered lmid release that would otherwise retire it as a
|
|
343
|
+
* success (and the §7.3 hold-back trigger, keyed on the entry's confirming domain, would then
|
|
344
|
+
* park its staged writes the wrong way). Sources whose authority never deopts (the in-process
|
|
345
|
+
* native source, a plain daemon) omit it. */
|
|
346
|
+
onMutationOutcome?(handler: (frame: MutationOutcomeFrame) => void): void;
|
|
347
|
+
/** Optional (Slice H-v, the §7.5 rule-3 crash-window closer): fired when the transport
|
|
348
|
+
* RE-establishes its session (reconnect → re-`init`), BEFORE any post-reconnect frame is
|
|
349
|
+
* processed — the ordering is load-bearing: the re-subscribed lmid stream's fresh snapshot may
|
|
350
|
+
* cover a mid whose `mutationOutcome` frame died with the old socket, and once that release
|
|
351
|
+
* retires the entry as an apparent success there is nothing left to re-send. The backend
|
|
352
|
+
* re-sends this domain's unconfirmed pending envelopes with their ORIGINAL mids, in mid order;
|
|
353
|
+
* the source may DEFER their delivery until the session is re-authorized (a room's
|
|
354
|
+
* `pushMutation` requires the lease-token subscribe's subject). Idempotent under the domain's
|
|
355
|
+
* own ledger — a processed mid dedups silently (silence + lmid coverage ⇒ applied), a
|
|
356
|
+
* non-applied mid is re-answered from the authority's recorded-outcome map (resolving even an
|
|
357
|
+
* already-retired entry through the handshake's not-found arm). Distinct from
|
|
358
|
+
* {@link onRestart} (a NEW server incarnation): a same-incarnation socket drop re-syncs
|
|
359
|
+
* without restarting, and envelopes sent into the dead socket are exactly what this recovers.
|
|
360
|
+
* In-process sources never drop a session and omit it. */
|
|
361
|
+
onResync?(handler: () => void): void;
|
|
293
362
|
}
|
|
294
363
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEzD,2FAA2F;AAC3F,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/D;;;4FAG4F;AAC5F,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ;kEAC8D;IAC9D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB;kGAC8F;IAC9F,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,4FAA4F;IAC5F,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,SAAS,EAAE,CAAC;IACjB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB;AAED;;;;wFAIwF;AACxF,MAAM,MAAM,MAAM,GACd;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,SAAS,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,GACpD;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,EAAE,CAAC;IAAC,GAAG,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,sFAAsF;AACtF,0EAA0E;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,EAAE;AACF,sFAAsF;AACtF,0EAA0E;AAsR1E;;8EAE8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAEjE;;mEAEmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD;qDACqD;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,CAAC;CAChB,CAAC"}
|
package/dist/view.d.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import type { ColType, FlatChange, QueryId, ResultType, WireSchema } from "./types.ts";
|
|
1
|
+
import type { ColType, FlatChange, QueryId, ResultType, WireSchema, WireValue } from "./types.ts";
|
|
2
2
|
/** Per-level column types (parallel to the WireSchema), used to JSON.parse json columns on
|
|
3
3
|
* projection. Built by the Store from the typed schema; absent ⇒ no parsing (bare values). */
|
|
4
4
|
export interface ViewTypes {
|
|
5
5
|
columnTypes: ColType[];
|
|
6
6
|
rels: Record<number, ViewTypes>;
|
|
7
7
|
}
|
|
8
|
+
/** The phase of an {@link ArrayView.onChanges} delivery: the initial hydrate `snapshot` vs a later
|
|
9
|
+
* incremental `batch` — the same distinction a narrator draws (`ChangeEvent` `snapshot`/`batch`). */
|
|
10
|
+
export type ChangePhase = "snapshot" | "batch";
|
|
11
|
+
/** A per-view change listener ({@link ArrayView.onChanges}): the net `FlatChange[]` this view folded,
|
|
12
|
+
* the {@link ChangePhase} it arrived on, and the view's `WireSchema` (the position→name source for
|
|
13
|
+
* `resolveChange`). This is the DIFF the data channel ({@link ArrayView.subscribe}) discards — the
|
|
14
|
+
* seam a narrator drives off. The `schema` is passed (not closed over) because the first `snapshot`
|
|
15
|
+
* fires synchronously inside `materialize`, before the caller holds the view handle. */
|
|
16
|
+
export type ViewChangeListener = (changes: FlatChange[], phase: ChangePhase, schema: WireSchema) => void;
|
|
8
17
|
/** The public ArrayView contract `materialize()` returns. */
|
|
9
18
|
export interface ArrayView<R> {
|
|
10
19
|
/** The current materialized result (reference-stable where data is unchanged). */
|
|
@@ -26,6 +35,14 @@ export interface ArrayView<R> {
|
|
|
26
35
|
/** Subscribe; fires immediately with the current data, then after each applied batch (and after
|
|
27
36
|
* a {@link resultType} change — re-read `resultType` in the listener). */
|
|
28
37
|
subscribe(listener: (data: readonly R[]) => void): () => void;
|
|
38
|
+
/** Subscribe to this view's folded CHANGE stream — the `FlatChange[]` it applies, NET of no-op
|
|
39
|
+
* cycles (a rebase's balanced `remove`+`add` / edit round-trip cancels, so a correctly predicted
|
|
40
|
+
* optimistic write delivers nothing here). Carries the diff {@link subscribe} throws away; the
|
|
41
|
+
* per-view seam a narrator rides. Does NOT replay on subscribe — attach via
|
|
42
|
+
* `store.materialize(query, { onChanges })` to catch a synchronous backend's first snapshot.
|
|
43
|
+
* A view with any change listener also enriches its own `remove` ops with the evicted subtree
|
|
44
|
+
* (per-view, no global opt-in). Returns a detach function. */
|
|
45
|
+
onChanges(listener: ViewChangeListener): () => void;
|
|
29
46
|
/** Tear down + stop receiving updates. */
|
|
30
47
|
destroy(): void;
|
|
31
48
|
}
|
|
@@ -44,6 +61,10 @@ export interface SingularArrayView<R> {
|
|
|
44
61
|
/** Subscribe; fires immediately with the current row, then after each applied batch (and after
|
|
45
62
|
* a {@link resultType} change). */
|
|
46
63
|
subscribe(listener: (data: R | null) => void): () => void;
|
|
64
|
+
/** Subscribe to the view's folded CHANGE stream — see {@link ArrayView.onChanges}. The changes
|
|
65
|
+
* are the same positional `FlatChange`s as the plural view (a `.one()` is just the list capped to
|
|
66
|
+
* one), so a narrator resolves them identically. */
|
|
67
|
+
onChanges(listener: ViewChangeListener): () => void;
|
|
47
68
|
/** Tear down + stop receiving updates. */
|
|
48
69
|
destroy(): void;
|
|
49
70
|
}
|
|
@@ -57,8 +78,15 @@ export declare class SingularView<R> implements SingularArrayView<R> {
|
|
|
57
78
|
get schema(): WireSchema | null;
|
|
58
79
|
get resultType(): ResultType;
|
|
59
80
|
subscribe(listener: (data: R | null) => void): () => void;
|
|
81
|
+
onChanges(listener: ViewChangeListener): () => void;
|
|
60
82
|
destroy(): void;
|
|
61
83
|
}
|
|
84
|
+
/** Elementwise equality over positional bare-cell rows — THE row comparator for every JS-side
|
|
85
|
+
* diff (views, aggregate heads, the persistence mirror), exported so no caller grows a drifted
|
|
86
|
+
* private copy. Per cell: `===` keeps `-0 === 0` (the engine's key semantics treat them equal);
|
|
87
|
+
* the `Object.is` arm makes a NaN cell equal itself (under `!==` alone, a NaN-bearing row never
|
|
88
|
+
* matches any copy of itself, so every diff re-emits it as a spurious edit forever). */
|
|
89
|
+
export declare function rowsEqual(a: WireValue[], b: WireValue[]): boolean;
|
|
62
90
|
export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
63
91
|
private readonly _qid;
|
|
64
92
|
private _schema;
|
|
@@ -69,6 +97,8 @@ export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
|
69
97
|
private cached;
|
|
70
98
|
private rt;
|
|
71
99
|
private readonly listeners;
|
|
100
|
+
private readonly changeListeners;
|
|
101
|
+
private pendingSegments;
|
|
72
102
|
constructor(schema?: WireSchema, types?: ViewTypes, qid?: QueryId);
|
|
73
103
|
get qid(): QueryId;
|
|
74
104
|
get schema(): WireSchema | null;
|
|
@@ -80,14 +110,25 @@ export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
|
80
110
|
/** (Re)bind to a schema and clear the tree IN PLACE. The first `hello` (pending → ready)
|
|
81
111
|
* and a re-hydrate (gap → new epoch — FLAT-CHANGES-DESIGN.md §2.3) both go through here, so
|
|
82
112
|
* the caller's view reference and its subscribers survive a re-subscribe. Does NOT notify —
|
|
83
|
-
* the snapshot that follows (`applyChanges`) does, avoiding an empty-then-filled flicker.
|
|
113
|
+
* the snapshot that follows (`applyChanges`) does, avoiding an empty-then-filled flicker.
|
|
114
|
+
* KEEPS any SSR `seeded` rows: they are retired only when the first live snapshot lands
|
|
115
|
+
* ({@link retireSeed}, driven by the Store), so `data` shows the seed — not an empty tree —
|
|
116
|
+
* across the whole `hello`→first-`snapshot` gap. */
|
|
84
117
|
reset(schema: WireSchema, types?: ViewTypes): void;
|
|
85
118
|
/** Install a pre-projected SSR first-paint snapshot (SSR-DESIGN.md §6). The rows are already
|
|
86
119
|
* in result shape (json columns parsed, relationships nested), so a view with no live backend
|
|
87
120
|
* (the server one-shot Store) reads them directly, and a browser view shows them until its
|
|
88
|
-
* first live
|
|
89
|
-
*
|
|
121
|
+
* first live snapshot lands ({@link retireSeed}). Does NOT notify — it is set at materialize
|
|
122
|
+
* time, before any subscriber, and the live snapshot that follows notifies. */
|
|
90
123
|
seed(rows: readonly R[]): void;
|
|
124
|
+
/** Retire the SSR first-paint seed — the Store calls this as it folds the maintained tree's first
|
|
125
|
+
* live snapshot, so `data` switches from the seed to the live tree with no empty gap between them
|
|
126
|
+
* (the seed deliberately survived the earlier `reset`/`hello`). Idempotent. Does NOT notify — the
|
|
127
|
+
* snapshot fold it accompanies does; BUT when that fold is empty (a 0-row result, or rows already
|
|
128
|
+
* in `top`) it notifies nothing, so the Store forces a {@link notify} on the strength of the `true`
|
|
129
|
+
* return here — else the view reads the live tree yet never re-renders (a frozen seed). Returns
|
|
130
|
+
* whether a live seed was actually cleared (so the Store knows a forced notify is owed). */
|
|
131
|
+
retireSeed(): boolean;
|
|
91
132
|
/** Apply a batch (the hydrate snapshot or one transaction's events) in order, then
|
|
92
133
|
* notify subscribers once. Order is significant (FLAT-CHANGES-DESIGN.md §5.4). A no-op
|
|
93
134
|
* while pending (changes never precede the `hello` that resets the schema).
|
|
@@ -95,15 +136,19 @@ export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
|
95
136
|
* `enrichRemoves` ⇒ before a removed node is dropped, reconstruct its full subtree and attach it
|
|
96
137
|
* to the `remove` op's `node` (in place, so the same event object the Store fans out to its
|
|
97
138
|
* change subscribers carries it). Off by default — paid only when a consumer asked for it, and
|
|
98
|
-
* only on a real eviction (an rc-decrement that keeps the row leaves `node` absent).
|
|
139
|
+
* only on a real eviction (an rc-decrement that keeps the row leaves `node` absent). A view with
|
|
140
|
+
* an attached {@link onChanges} listener ALSO enriches (per-view, no global opt-in), so a
|
|
141
|
+
* narrator can resolve a removed row's subs whether or not the store-global counter is set.
|
|
99
142
|
*
|
|
100
143
|
* `deferNotify` ⇒ fold but do NOT notify; the caller is responsible for calling {@link flush}
|
|
101
144
|
* later. The Store uses this to fold every view in one commit before notifying any subscriber
|
|
102
145
|
* (cross-view-atomic notification — `Store.onCommitBoundary`); standalone use leaves it off, so
|
|
103
146
|
* a bare view still fires its subscribers after each applied batch.
|
|
104
147
|
*
|
|
105
|
-
*
|
|
106
|
-
|
|
148
|
+
* `phase` tags the {@link onChanges} delivery (`snapshot` for the hydrate, `batch` otherwise); it
|
|
149
|
+
* does not affect the fold. Returns whether the batch changed the view (so a deferring caller
|
|
150
|
+
* knows it must be flushed). */
|
|
151
|
+
applyChanges(events: FlatChange[], enrichRemoves?: boolean, deferNotify?: boolean, phase?: ChangePhase): boolean;
|
|
107
152
|
/** Notify subscribers with the current data. The deferred half of {@link applyChanges} (when
|
|
108
153
|
* `deferNotify` was set): the Store calls this at the commit-notify barrier — after every view
|
|
109
154
|
* touched by the same commit has folded — so a subscriber that re-reads a sibling view inside
|
|
@@ -111,6 +156,13 @@ export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
|
111
156
|
flush(): void;
|
|
112
157
|
get data(): readonly R[];
|
|
113
158
|
subscribe(listener: (data: readonly R[]) => void): () => void;
|
|
159
|
+
onChanges(listener: ViewChangeListener): () => void;
|
|
160
|
+
/** Net the folded batch and hand the survivors to the change listeners, AFTER the data `notify`
|
|
161
|
+
* (the order `Store.subscribeChanges` consumers already observe). A batch that nets to nothing —
|
|
162
|
+
* a correctly predicted rebase — makes no call, so a narrator sees only real change. Each listener
|
|
163
|
+
* is isolated: a throwing one reports to `note` (the caller re-raises the first) and the rest still
|
|
164
|
+
* run, so one bad narration template never starves a sibling listener nor corrupts the view. */
|
|
165
|
+
private deliverChanges;
|
|
114
166
|
destroy(): void;
|
|
115
167
|
private applyAt;
|
|
116
168
|
private applyOp;
|
|
@@ -121,6 +173,9 @@ export declare class FlatArrayView<R = unknown> implements ArrayView<R> {
|
|
|
121
173
|
private applyRemove;
|
|
122
174
|
private applyEdit;
|
|
123
175
|
private project;
|
|
124
|
-
|
|
176
|
+
/** Notify data subscribers with the current {@link data}. Normally driven by a fold ({@link
|
|
177
|
+
* applyChanges}/{@link flush}); the Store also calls it directly to land a seed retirement whose
|
|
178
|
+
* accompanying fold was empty (see {@link retireSeed}). */
|
|
179
|
+
notify(): void;
|
|
125
180
|
}
|
|
126
181
|
//# sourceMappingURL=view.d.ts.map
|
package/dist/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAU,OAAO,EAAE,UAAU,EAAY,UAAU,
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
|