@rindle/remote 0.1.0-rc.5
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 +201 -0
- package/README.md +119 -0
- package/dist/backend.d.ts +31 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +136 -0
- package/dist/backend.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/mutation-queue.d.ts +26 -0
- package/dist/mutation-queue.d.ts.map +1 -0
- package/dist/mutation-queue.js +62 -0
- package/dist/mutation-queue.js.map +1 -0
- package/dist/normalized.d.ts +50 -0
- package/dist/normalized.d.ts.map +1 -0
- package/dist/normalized.js +146 -0
- package/dist/normalized.js.map +1 -0
- package/dist/optimistic-source.d.ts +108 -0
- package/dist/optimistic-source.d.ts.map +1 -0
- package/dist/optimistic-source.js +317 -0
- package/dist/optimistic-source.js.map +1 -0
- package/dist/protocol.d.ts +134 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +178 -0
- package/dist/protocol.js.map +1 -0
- package/dist/remote-source.d.ts +31 -0
- package/dist/remote-source.d.ts.map +1 -0
- package/dist/remote-source.js +133 -0
- package/dist/remote-source.js.map +1 -0
- package/dist/subscribe.d.ts +26 -0
- package/dist/subscribe.d.ts.map +1 -0
- package/dist/subscribe.js +14 -0
- package/dist/subscribe.js.map +1 -0
- package/dist/transport.d.ts +53 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +105 -0
- package/dist/transport.js.map +1 -0
- package/package.json +39 -0
- package/src/backend.ts +163 -0
- package/src/index.ts +40 -0
- package/src/mutation-queue.ts +96 -0
- package/src/normalized.ts +188 -0
- package/src/optimistic-source.ts +374 -0
- package/src/protocol.ts +252 -0
- package/src/remote-source.ts +171 -0
- package/src/subscribe.ts +40 -0
- package/src/transport.ts +127 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimistic-source.js","sourceRoot":"","sources":["../src/optimistic-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { COMPARATOR_VERSION } from "@rindle/client";
|
|
2
|
+
import type { ChangeEvent, FlatChange, Mutation, MutationEnvelope, ProgressFrame, WireSchema } from "@rindle/client";
|
|
3
|
+
import type { NormalizedBatch, NormalizedHello } from "./normalized.ts";
|
|
4
|
+
export { COMPARATOR_VERSION };
|
|
5
|
+
export declare class Fnv {
|
|
6
|
+
h: bigint;
|
|
7
|
+
private byte;
|
|
8
|
+
u8(v: number): void;
|
|
9
|
+
/** A `u32` little-endian (matching Rust `v.to_le_bytes()`). */
|
|
10
|
+
u32(v: number): void;
|
|
11
|
+
/** A length-prefixed string: `u32(byteLen)` then the UTF-8 bytes (disambiguates joins). */
|
|
12
|
+
s(str: string): void;
|
|
13
|
+
}
|
|
14
|
+
/** A `WireSchema`'s content fingerprint — FNV-1a 64 over the canonical, length-prefixed byte
|
|
15
|
+
* stream of `src/wire_schema.rs`, rendered as 16-char lowercase hex (=== Rust `SchemaFp`
|
|
16
|
+
* `Display`). A string (not a JS number) so the full 64 bits survive JSON without precision loss. */
|
|
17
|
+
export declare function schemaFp(ws: WireSchema): string;
|
|
18
|
+
/** The subscription handshake, sent once before any {@link Batch}. */
|
|
19
|
+
export interface Hello {
|
|
20
|
+
epoch: number;
|
|
21
|
+
comparatorVersion: number;
|
|
22
|
+
schema: WireSchema;
|
|
23
|
+
schemaFp: string;
|
|
24
|
+
}
|
|
25
|
+
/** One transaction's flat changes (or the seq-0 hydrate snapshot). `events` apply in order. */
|
|
26
|
+
export interface Batch {
|
|
27
|
+
epoch: number;
|
|
28
|
+
seq: number;
|
|
29
|
+
schemaFp: string;
|
|
30
|
+
events: FlatChange[];
|
|
31
|
+
}
|
|
32
|
+
/** The multiplexed wire messages (many queries over one connection, tagged by `queryId`).
|
|
33
|
+
* `subscribe.mode` selects the serializer (default flat); a normalized subscription gets
|
|
34
|
+
* `nhello`/`nbatch` back instead of `hello`/`batch` (NORMALIZED-CHANGES-DESIGN.md §6).
|
|
35
|
+
* Embedded servers receive `{name,args}`. Daemon/serverless deployments can instead receive an
|
|
36
|
+
* opaque `leaseToken` that the app API server minted after auth + named-query resolution.
|
|
37
|
+
*
|
|
38
|
+
* The OPTIMISTIC path (OPTIMISTIC-WRITES-DESIGN.md §8) adds `init` (the connection
|
|
39
|
+
* identifies its stable clientID, so progress frames can carry that client's `lmid`) and
|
|
40
|
+
* `pushMutation` (one named-mutator envelope up); the server answers with the normalized
|
|
41
|
+
* frames (`cv`-stamped) plus connection-level `progress` frames. */
|
|
42
|
+
export type SubscribeClientMsg = {
|
|
43
|
+
t: "subscribe";
|
|
44
|
+
queryId: number;
|
|
45
|
+
name: string;
|
|
46
|
+
args: unknown;
|
|
47
|
+
mode?: "flat" | "normalized";
|
|
48
|
+
} | {
|
|
49
|
+
t: "subscribe";
|
|
50
|
+
queryId: number;
|
|
51
|
+
leaseToken: string;
|
|
52
|
+
mode?: "flat" | "normalized";
|
|
53
|
+
};
|
|
54
|
+
export type ClientMsg = {
|
|
55
|
+
t: "init";
|
|
56
|
+
clientID: string;
|
|
57
|
+
} | SubscribeClientMsg | {
|
|
58
|
+
t: "unsubscribe";
|
|
59
|
+
queryId: number;
|
|
60
|
+
} | {
|
|
61
|
+
t: "mutate";
|
|
62
|
+
mutations: Mutation[];
|
|
63
|
+
} | {
|
|
64
|
+
t: "pushMutation";
|
|
65
|
+
envelope: MutationEnvelope;
|
|
66
|
+
};
|
|
67
|
+
export type ServerMsg = {
|
|
68
|
+
t: "hello";
|
|
69
|
+
queryId: number;
|
|
70
|
+
hello: Hello;
|
|
71
|
+
} | {
|
|
72
|
+
t: "batch";
|
|
73
|
+
queryId: number;
|
|
74
|
+
batch: Batch;
|
|
75
|
+
} | {
|
|
76
|
+
t: "nhello";
|
|
77
|
+
queryId: number;
|
|
78
|
+
hello: NormalizedHello;
|
|
79
|
+
bootId?: string;
|
|
80
|
+
} | {
|
|
81
|
+
t: "nbatch";
|
|
82
|
+
queryId: number;
|
|
83
|
+
batch: NormalizedBatch;
|
|
84
|
+
} | {
|
|
85
|
+
t: "queryError";
|
|
86
|
+
queryId: number;
|
|
87
|
+
message: string;
|
|
88
|
+
} | {
|
|
89
|
+
t: "progress";
|
|
90
|
+
frame: ProgressFrame;
|
|
91
|
+
} | {
|
|
92
|
+
t: "error";
|
|
93
|
+
queryId?: number;
|
|
94
|
+
message: string;
|
|
95
|
+
};
|
|
96
|
+
/** Sender side: stamps batches with the subscription `epoch` + `schemaFp` and drives the
|
|
97
|
+
* gap-free seq. The hydrate snapshot is seq 0; increments are seq 1, 2, …. An empty
|
|
98
|
+
* transaction emits no batch and consumes no seq (so a gap always means a lost batch). */
|
|
99
|
+
export declare class Publisher {
|
|
100
|
+
readonly epoch: number;
|
|
101
|
+
readonly schema: WireSchema;
|
|
102
|
+
readonly schemaFp: string;
|
|
103
|
+
private nextSeq;
|
|
104
|
+
constructor(epoch: number, schema: WireSchema);
|
|
105
|
+
hello(): Hello;
|
|
106
|
+
/** The hydrate snapshot (seq 0). Always emitted, even when empty, so the receiver learns it. */
|
|
107
|
+
snapshot(events: FlatChange[]): Batch;
|
|
108
|
+
/** One transaction's events — `null` for an empty transaction (no batch, no seq consumed). */
|
|
109
|
+
commit(events: FlatChange[]): Batch | null;
|
|
110
|
+
private emit;
|
|
111
|
+
}
|
|
112
|
+
export type ProtocolErrorKind = "comparator-mismatch" | "epoch-mismatch" | "schema-mismatch" | "gap";
|
|
113
|
+
/** A protocol violation. All but a duplicate (handled silently) are unrecoverable for the
|
|
114
|
+
* current subscription — the RemoteBackend re-hydrates under a new epoch. */
|
|
115
|
+
export declare class ProtocolError extends Error {
|
|
116
|
+
readonly kind: ProtocolErrorKind;
|
|
117
|
+
constructor(kind: ProtocolErrorKind, message: string);
|
|
118
|
+
}
|
|
119
|
+
/** Receiver side: validates a frame stream (comparator at `hello`; per batch — epoch match,
|
|
120
|
+
* schema-fp match, strict in-order seq) and emits the clean `hello`/`snapshot`/`batch`
|
|
121
|
+
* `ChangeEvent`s. It does NOT fold (the core `ArrayView` does) — the §2.2 split. */
|
|
122
|
+
export declare class Subscriber {
|
|
123
|
+
readonly epoch: number;
|
|
124
|
+
readonly schemaFp: string;
|
|
125
|
+
private readonly emit;
|
|
126
|
+
private phase;
|
|
127
|
+
private lastSeq;
|
|
128
|
+
constructor(hello: Hello, emit: (ev: ChangeEvent) => void);
|
|
129
|
+
/** Apply one incremental batch (or the seq-0 snapshot). Returns `"duplicate"` for an
|
|
130
|
+
* already-applied seq (discarded — rc ops are not idempotent); throws {@link ProtocolError}
|
|
131
|
+
* on a gap / epoch / schema mismatch (the caller re-hydrates). */
|
|
132
|
+
apply(batch: Batch): "applied" | "duplicate";
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// The flat-change subscription protocol, ported from `src/flat_protocol.rs` + the
|
|
2
|
+
// `schema_fp` fingerprint from `src/wire_schema.rs`. This is the wire contract shared by the
|
|
3
|
+
// server (`@rindle/server`, which frames via {@link Publisher}) and the client RemoteBackend
|
|
4
|
+
// (which validates via {@link Subscriber}).
|
|
5
|
+
//
|
|
6
|
+
// The §2.2 split (WASM-CLIENT-DESIGN.md): the Rust `Subscriber` owns a `Receiver` and does
|
|
7
|
+
// validation *and* folding. Here we keep ONLY validation/sequencing in {@link Subscriber} and
|
|
8
|
+
// hand the clean `hello`/`snapshot`/`batch` `ChangeEvent`s up to the core `ArrayView` to fold —
|
|
9
|
+
// so one `ArrayView` serves both the local and remote backends.
|
|
10
|
+
import { COMPARATOR_VERSION } from "@rindle/client";
|
|
11
|
+
export { COMPARATOR_VERSION };
|
|
12
|
+
// ----------------------------- schema fingerprint (FNV-1a 64) -----------------------------
|
|
13
|
+
const enc = new TextEncoder();
|
|
14
|
+
const FNV_OFFSET = 0xcbf29ce484222325n;
|
|
15
|
+
const FNV_PRIME = 0x00000100000001b3n;
|
|
16
|
+
const MASK = 0xffffffffffffffffn;
|
|
17
|
+
export class Fnv {
|
|
18
|
+
h = FNV_OFFSET;
|
|
19
|
+
byte(b) {
|
|
20
|
+
this.h = ((this.h ^ BigInt(b & 0xff)) * FNV_PRIME) & MASK;
|
|
21
|
+
}
|
|
22
|
+
u8(v) {
|
|
23
|
+
this.byte(v);
|
|
24
|
+
}
|
|
25
|
+
/** A `u32` little-endian (matching Rust `v.to_le_bytes()`). */
|
|
26
|
+
u32(v) {
|
|
27
|
+
this.byte(v & 0xff);
|
|
28
|
+
this.byte((v >>> 8) & 0xff);
|
|
29
|
+
this.byte((v >>> 16) & 0xff);
|
|
30
|
+
this.byte((v >>> 24) & 0xff);
|
|
31
|
+
}
|
|
32
|
+
/** A length-prefixed string: `u32(byteLen)` then the UTF-8 bytes (disambiguates joins). */
|
|
33
|
+
s(str) {
|
|
34
|
+
const bytes = enc.encode(str);
|
|
35
|
+
this.u32(bytes.length);
|
|
36
|
+
for (const b of bytes)
|
|
37
|
+
this.byte(b);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function hashLevel(f, ws) {
|
|
41
|
+
f.u8(0x53); // 'S'
|
|
42
|
+
f.u32(ws.columns.length);
|
|
43
|
+
for (const c of ws.columns)
|
|
44
|
+
f.s(c);
|
|
45
|
+
// PK + sort resolved to column NAMES (semantic identity, independent of indices).
|
|
46
|
+
f.u32(ws.primaryKey.length);
|
|
47
|
+
for (const pk of ws.primaryKey)
|
|
48
|
+
f.s(ws.columns[pk]);
|
|
49
|
+
f.u32(ws.sort.length);
|
|
50
|
+
for (const [c, asc] of ws.sort) {
|
|
51
|
+
f.s(ws.columns[c]);
|
|
52
|
+
f.u8(asc ? 1 : 0);
|
|
53
|
+
}
|
|
54
|
+
f.u8(ws.singular ? 1 : 0);
|
|
55
|
+
f.u32(ws.relationships.length);
|
|
56
|
+
for (const r of ws.relationships) {
|
|
57
|
+
f.s(r.name);
|
|
58
|
+
if (r.child) {
|
|
59
|
+
f.u8(1);
|
|
60
|
+
hashLevel(f, r.child);
|
|
61
|
+
// Scalar-projection marker (REDUCE-DESIGN.md §9): a presence byte, then — when present
|
|
62
|
+
// — the projected column's NAME in the child schema (index-independent, matching
|
|
63
|
+
// PK/sort). The empty-identity value is NOT hashed (a bare cell can't reproduce its
|
|
64
|
+
// type variant). Must match `hash_level` in `src/wire_schema.rs`.
|
|
65
|
+
if (r.project) {
|
|
66
|
+
f.u8(1);
|
|
67
|
+
f.s(r.child.columns[r.project.col]);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
f.u8(0);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
f.u8(0);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** A `WireSchema`'s content fingerprint — FNV-1a 64 over the canonical, length-prefixed byte
|
|
79
|
+
* stream of `src/wire_schema.rs`, rendered as 16-char lowercase hex (=== Rust `SchemaFp`
|
|
80
|
+
* `Display`). A string (not a JS number) so the full 64 bits survive JSON without precision loss. */
|
|
81
|
+
export function schemaFp(ws) {
|
|
82
|
+
const f = new Fnv();
|
|
83
|
+
hashLevel(f, ws);
|
|
84
|
+
return f.h.toString(16).padStart(16, "0");
|
|
85
|
+
}
|
|
86
|
+
// ----------------------------- Publisher (server side) -----------------------------
|
|
87
|
+
/** Sender side: stamps batches with the subscription `epoch` + `schemaFp` and drives the
|
|
88
|
+
* gap-free seq. The hydrate snapshot is seq 0; increments are seq 1, 2, …. An empty
|
|
89
|
+
* transaction emits no batch and consumes no seq (so a gap always means a lost batch). */
|
|
90
|
+
export class Publisher {
|
|
91
|
+
epoch;
|
|
92
|
+
schema;
|
|
93
|
+
schemaFp;
|
|
94
|
+
nextSeq = 0;
|
|
95
|
+
constructor(epoch, schema) {
|
|
96
|
+
this.epoch = epoch;
|
|
97
|
+
this.schema = schema;
|
|
98
|
+
this.schemaFp = schemaFp(schema);
|
|
99
|
+
}
|
|
100
|
+
hello() {
|
|
101
|
+
return { epoch: this.epoch, comparatorVersion: COMPARATOR_VERSION, schema: this.schema, schemaFp: this.schemaFp };
|
|
102
|
+
}
|
|
103
|
+
/** The hydrate snapshot (seq 0). Always emitted, even when empty, so the receiver learns it. */
|
|
104
|
+
snapshot(events) {
|
|
105
|
+
return this.emit(events);
|
|
106
|
+
}
|
|
107
|
+
/** One transaction's events — `null` for an empty transaction (no batch, no seq consumed). */
|
|
108
|
+
commit(events) {
|
|
109
|
+
return events.length ? this.emit(events) : null;
|
|
110
|
+
}
|
|
111
|
+
emit(events) {
|
|
112
|
+
const seq = this.nextSeq++;
|
|
113
|
+
return { epoch: this.epoch, seq, schemaFp: this.schemaFp, events };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** A protocol violation. All but a duplicate (handled silently) are unrecoverable for the
|
|
117
|
+
* current subscription — the RemoteBackend re-hydrates under a new epoch. */
|
|
118
|
+
export class ProtocolError extends Error {
|
|
119
|
+
kind;
|
|
120
|
+
constructor(kind, message) {
|
|
121
|
+
super(message);
|
|
122
|
+
this.kind = kind;
|
|
123
|
+
this.name = "ProtocolError";
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Receiver side: validates a frame stream (comparator at `hello`; per batch — epoch match,
|
|
127
|
+
* schema-fp match, strict in-order seq) and emits the clean `hello`/`snapshot`/`batch`
|
|
128
|
+
* `ChangeEvent`s. It does NOT fold (the core `ArrayView` does) — the §2.2 split. */
|
|
129
|
+
export class Subscriber {
|
|
130
|
+
epoch;
|
|
131
|
+
schemaFp;
|
|
132
|
+
emit;
|
|
133
|
+
phase = "snapshot";
|
|
134
|
+
lastSeq = 0;
|
|
135
|
+
constructor(hello, emit) {
|
|
136
|
+
this.emit = emit;
|
|
137
|
+
if (hello.comparatorVersion !== COMPARATOR_VERSION) {
|
|
138
|
+
throw new ProtocolError("comparator-mismatch", `comparator version ${hello.comparatorVersion} != ${COMPARATOR_VERSION}`);
|
|
139
|
+
}
|
|
140
|
+
const computed = schemaFp(hello.schema);
|
|
141
|
+
if (computed !== hello.schemaFp) {
|
|
142
|
+
throw new ProtocolError("schema-mismatch", `advertised fp ${hello.schemaFp} != computed ${computed}`);
|
|
143
|
+
}
|
|
144
|
+
this.epoch = hello.epoch;
|
|
145
|
+
this.schemaFp = hello.schemaFp;
|
|
146
|
+
emit({ type: "hello", schema: hello.schema, comparatorVersion: hello.comparatorVersion });
|
|
147
|
+
}
|
|
148
|
+
/** Apply one incremental batch (or the seq-0 snapshot). Returns `"duplicate"` for an
|
|
149
|
+
* already-applied seq (discarded — rc ops are not idempotent); throws {@link ProtocolError}
|
|
150
|
+
* on a gap / epoch / schema mismatch (the caller re-hydrates). */
|
|
151
|
+
apply(batch) {
|
|
152
|
+
if (batch.epoch !== this.epoch) {
|
|
153
|
+
throw new ProtocolError("epoch-mismatch", `expected epoch ${this.epoch}, got ${batch.epoch}`);
|
|
154
|
+
}
|
|
155
|
+
if (batch.schemaFp !== this.schemaFp) {
|
|
156
|
+
throw new ProtocolError("schema-mismatch", `expected fp ${this.schemaFp}, got ${batch.schemaFp}`);
|
|
157
|
+
}
|
|
158
|
+
if (this.phase === "snapshot") {
|
|
159
|
+
if (batch.seq === 0) {
|
|
160
|
+
this.phase = "live";
|
|
161
|
+
this.lastSeq = 0;
|
|
162
|
+
this.emit({ type: "snapshot", adds: batch.events, last: true });
|
|
163
|
+
return "applied";
|
|
164
|
+
}
|
|
165
|
+
throw new ProtocolError("gap", `expected the seq-0 snapshot, got seq ${batch.seq}`);
|
|
166
|
+
}
|
|
167
|
+
const expected = this.lastSeq + 1;
|
|
168
|
+
if (batch.seq < expected)
|
|
169
|
+
return "duplicate";
|
|
170
|
+
if (batch.seq > expected) {
|
|
171
|
+
throw new ProtocolError("gap", `expected seq ${expected}, got ${batch.seq}`);
|
|
172
|
+
}
|
|
173
|
+
this.lastSeq = batch.seq;
|
|
174
|
+
this.emit({ type: "batch", events: batch.events });
|
|
175
|
+
return "applied";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Mutation, NormalizedEvent, NormalizedSource, NormalizedTableSchema, QueryId, RemoteQuery } from "@rindle/client";
|
|
2
|
+
import { type RawMutationSender, type SubscribeResolver } from "./subscribe.ts";
|
|
3
|
+
import type { Transport } from "./transport.ts";
|
|
4
|
+
export interface RemoteNormalizedSourceOptions {
|
|
5
|
+
/** Resolve the upstream subscribe target. Defaults to embedded-server `{name,args}`. */
|
|
6
|
+
resolveSubscribe?: SubscribeResolver;
|
|
7
|
+
/** Override raw authoritative writes, e.g. POST them to an app API server. */
|
|
8
|
+
sendMutation?: RawMutationSender;
|
|
9
|
+
}
|
|
10
|
+
export declare class RemoteNormalizedSource implements NormalizedSource {
|
|
11
|
+
private readonly transport;
|
|
12
|
+
private readonly resolveSubscribe;
|
|
13
|
+
private readonly sendMutation?;
|
|
14
|
+
private handler;
|
|
15
|
+
private readonly subs;
|
|
16
|
+
/** The client's own typed per-table schemas, for hello validation (CRIT#4); set by the backend. */
|
|
17
|
+
private clientTables;
|
|
18
|
+
constructor(transport: Transport, opts?: RemoteNormalizedSourceOptions);
|
|
19
|
+
expectClientSchema(tables: NormalizedTableSchema[]): void;
|
|
20
|
+
registerQuery(qid: QueryId, remote: RemoteQuery): void;
|
|
21
|
+
unregisterQuery(qid: QueryId): void;
|
|
22
|
+
mutate(mutations: Mutation[]): Promise<void>;
|
|
23
|
+
onNormalized(handler: (qid: QueryId, ev: NormalizedEvent) => void): void;
|
|
24
|
+
private subscribe;
|
|
25
|
+
private onServerMsg;
|
|
26
|
+
private openSubscriber;
|
|
27
|
+
private applyBatch;
|
|
28
|
+
}
|
|
29
|
+
/** Convenience: a `RemoteNormalizedSource` over a ws URL or a custom transport. */
|
|
30
|
+
export declare function createRemoteNormalizedSource(urlOrTransport: string | Transport, opts?: RemoteNormalizedSourceOptions): RemoteNormalizedSource;
|
|
31
|
+
//# sourceMappingURL=remote-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-source.d.ts","sourceRoot":"","sources":["../src/remote-source.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,OAAO,EACP,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAahD,MAAM,WAAW,6BAA6B;IAC5C,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAoB;IAClD,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAsC;gBAE9C,SAAS,EAAE,SAAS,EAAE,IAAI,GAAE,6BAAkC;IAO1E,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,IAAI;IAIzD,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAKtD,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAKnC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAMxE,OAAO,CAAC,SAAS;IA2BjB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;CAcnB;AAED,mFAAmF;AACnF,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,GAAE,6BAAkC,GACvC,sBAAsB,CAGxB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// RemoteNormalizedSource: a `NormalizedSource` over a network transport — the ws sibling of
|
|
2
|
+
// the in-process native source (NORMALIZED-CHANGES-DESIGN.md §7). It subscribes in normalized
|
|
3
|
+
// mode, owns the epoch/seq/gap protocol (via {@link NormalizedSubscriber}), and emits clean
|
|
4
|
+
// `NormalizedEvent`s upward — so `@rindle/normalized`'s `NormalizedBackend` drives the local
|
|
5
|
+
// engine identically whether the footprint stream comes from in-process or over the wire.
|
|
6
|
+
//
|
|
7
|
+
// On a gap (or epoch/fp drift) it re-subscribes; the server re-registers the query under a NEW
|
|
8
|
+
// epoch and replies with a fresh hello + snapshot, and `NormalizedSync` diffs the new footprint
|
|
9
|
+
// against the old (the set-analogue re-hydrate, §5.3).
|
|
10
|
+
import { NormalizedSubscriber } from "./normalized.js";
|
|
11
|
+
import { ProtocolError } from "./protocol.js";
|
|
12
|
+
import { defaultSubscribeTarget, isThenable, subscribeMessage, } from "./subscribe.js";
|
|
13
|
+
import { WsTransport } from "./transport.js";
|
|
14
|
+
export class RemoteNormalizedSource {
|
|
15
|
+
transport;
|
|
16
|
+
resolveSubscribe;
|
|
17
|
+
sendMutation;
|
|
18
|
+
handler = () => { };
|
|
19
|
+
subs = new Map();
|
|
20
|
+
/** The client's own typed per-table schemas, for hello validation (CRIT#4); set by the backend. */
|
|
21
|
+
clientTables;
|
|
22
|
+
constructor(transport, opts = {}) {
|
|
23
|
+
this.transport = transport;
|
|
24
|
+
this.resolveSubscribe = opts.resolveSubscribe ?? defaultSubscribeTarget;
|
|
25
|
+
this.sendMutation = opts.sendMutation;
|
|
26
|
+
this.transport.onMessage((msg) => this.onServerMsg(msg));
|
|
27
|
+
}
|
|
28
|
+
expectClientSchema(tables) {
|
|
29
|
+
this.clientTables = tables;
|
|
30
|
+
}
|
|
31
|
+
registerQuery(qid, remote) {
|
|
32
|
+
this.subs.set(qid, { remote, subscriber: null, epoch: 0, resubscribing: false, subscribeTicket: 0 });
|
|
33
|
+
this.subscribe(qid, remote);
|
|
34
|
+
}
|
|
35
|
+
unregisterQuery(qid) {
|
|
36
|
+
this.subs.delete(qid);
|
|
37
|
+
this.transport.send({ t: "unsubscribe", queryId: qid });
|
|
38
|
+
}
|
|
39
|
+
mutate(mutations) {
|
|
40
|
+
if (this.sendMutation)
|
|
41
|
+
return Promise.resolve(this.sendMutation(mutations));
|
|
42
|
+
this.transport.send({ t: "mutate", mutations });
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
}
|
|
45
|
+
onNormalized(handler) {
|
|
46
|
+
this.handler = handler;
|
|
47
|
+
}
|
|
48
|
+
// --- internals ---------------------------------------------------------------
|
|
49
|
+
subscribe(qid, remote) {
|
|
50
|
+
const s = this.subs.get(qid);
|
|
51
|
+
if (!s)
|
|
52
|
+
return;
|
|
53
|
+
const request = { queryId: qid, remote, mode: "normalized" };
|
|
54
|
+
const ticket = ++s.subscribeTicket;
|
|
55
|
+
const send = (target) => {
|
|
56
|
+
const cur = this.subs.get(qid);
|
|
57
|
+
if (cur !== s || cur.subscribeTicket !== ticket)
|
|
58
|
+
return;
|
|
59
|
+
this.transport.send(subscribeMessage(request, target));
|
|
60
|
+
};
|
|
61
|
+
const fail = (err) => {
|
|
62
|
+
const cur = this.subs.get(qid);
|
|
63
|
+
if (cur !== s || cur.subscribeTicket !== ticket)
|
|
64
|
+
return;
|
|
65
|
+
s.resubscribing = false;
|
|
66
|
+
console.error(`[rindle-remote] normalized query ${qid} subscribe resolution failed: ${String(err?.message ?? err)}`);
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
const target = this.resolveSubscribe(request);
|
|
70
|
+
if (isThenable(target))
|
|
71
|
+
void target.then(send, fail);
|
|
72
|
+
else
|
|
73
|
+
send(target);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
fail(err);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
onServerMsg(msg) {
|
|
80
|
+
if (msg.t === "queryError") {
|
|
81
|
+
this.subs.delete(msg.queryId);
|
|
82
|
+
console.error(`[rindle-remote] normalized query ${msg.queryId} subscription rejected: ${msg.message}`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// This source is normalized-only; it sees `nhello`/`nbatch` (flat frames are ignored).
|
|
86
|
+
if (msg.t !== "nhello" && msg.t !== "nbatch")
|
|
87
|
+
return;
|
|
88
|
+
const s = this.subs.get(msg.queryId);
|
|
89
|
+
if (!s)
|
|
90
|
+
return; // unsubscribed / unknown query
|
|
91
|
+
if (msg.t === "nhello")
|
|
92
|
+
this.openSubscriber(msg.queryId, s, msg.hello);
|
|
93
|
+
else
|
|
94
|
+
this.applyBatch(msg.queryId, s, msg.batch);
|
|
95
|
+
}
|
|
96
|
+
openSubscriber(qid, s, hello) {
|
|
97
|
+
try {
|
|
98
|
+
s.subscriber = new NormalizedSubscriber(hello, (ev) => this.handler(qid, ev), this.clientTables);
|
|
99
|
+
s.epoch = hello.epoch;
|
|
100
|
+
s.resubscribing = false;
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
// A comparator/fp mismatch at hello is unrecoverable (a code-contract divergence).
|
|
104
|
+
s.subscriber = null;
|
|
105
|
+
console.error(`[rindle-remote] normalized query ${qid} subscription rejected: ${e.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
applyBatch(qid, s, batch) {
|
|
109
|
+
if (!s.subscriber)
|
|
110
|
+
return; // no hello yet (or mid re-hydrate)
|
|
111
|
+
if (batch.epoch < s.epoch)
|
|
112
|
+
return; // a stale batch from a superseded epoch — drop
|
|
113
|
+
try {
|
|
114
|
+
s.subscriber.apply(batch);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
if (!(e instanceof ProtocolError))
|
|
118
|
+
throw e;
|
|
119
|
+
if (s.resubscribing)
|
|
120
|
+
return; // already recovering
|
|
121
|
+
// Gap / drift → re-hydrate under a new epoch (the server bumps it on re-subscribe).
|
|
122
|
+
s.resubscribing = true;
|
|
123
|
+
s.subscriber = null;
|
|
124
|
+
this.subscribe(qid, s.remote);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Convenience: a `RemoteNormalizedSource` over a ws URL or a custom transport. */
|
|
129
|
+
export function createRemoteNormalizedSource(urlOrTransport, opts = {}) {
|
|
130
|
+
const transport = typeof urlOrTransport === "string" ? new WsTransport(urlOrTransport) : urlOrTransport;
|
|
131
|
+
return new RemoteNormalizedSource(transport, opts);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=remote-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-source.js","sourceRoot":"","sources":["../src/remote-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Mutation, MutationEnvelope, QueryId, RemoteQuery } from "@rindle/client";
|
|
2
|
+
import type { SubscribeClientMsg } from "./protocol.ts";
|
|
3
|
+
export type SubscribeMode = "flat" | "normalized";
|
|
4
|
+
export interface SubscribeRequest {
|
|
5
|
+
queryId: QueryId;
|
|
6
|
+
remote: RemoteQuery;
|
|
7
|
+
mode: SubscribeMode;
|
|
8
|
+
}
|
|
9
|
+
export type SubscribeTarget = {
|
|
10
|
+
name: string;
|
|
11
|
+
args: unknown;
|
|
12
|
+
leaseToken?: never;
|
|
13
|
+
wsEndpoint?: never;
|
|
14
|
+
} | {
|
|
15
|
+
leaseToken: string;
|
|
16
|
+
wsEndpoint?: string;
|
|
17
|
+
name?: never;
|
|
18
|
+
args?: never;
|
|
19
|
+
};
|
|
20
|
+
export type SubscribeResolver = (request: SubscribeRequest) => SubscribeTarget | PromiseLike<SubscribeTarget>;
|
|
21
|
+
export type RawMutationSender = (mutations: Mutation[]) => void | PromiseLike<void>;
|
|
22
|
+
export type MutationEnvelopeSender = (envelope: MutationEnvelope) => void | PromiseLike<void>;
|
|
23
|
+
export declare function defaultSubscribeTarget(request: SubscribeRequest): SubscribeTarget;
|
|
24
|
+
export declare function subscribeMessage(request: SubscribeRequest, target: SubscribeTarget): SubscribeClientMsg;
|
|
25
|
+
export declare function isThenable<T>(value: T | PromiseLike<T>): value is PromiseLike<T>;
|
|
26
|
+
//# sourceMappingURL=subscribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,GAIvE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;AAE9G,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAEpF,MAAM,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;AAE9F,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAEjF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAMvG;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function defaultSubscribeTarget(request) {
|
|
2
|
+
return { name: request.remote.name, args: request.remote.args };
|
|
3
|
+
}
|
|
4
|
+
export function subscribeMessage(request, target) {
|
|
5
|
+
const mode = request.mode === "normalized" ? { mode: request.mode } : {};
|
|
6
|
+
if (target.leaseToken !== undefined) {
|
|
7
|
+
return { t: "subscribe", queryId: request.queryId, leaseToken: target.leaseToken, ...mode };
|
|
8
|
+
}
|
|
9
|
+
return { t: "subscribe", queryId: request.queryId, name: target.name, args: target.args, ...mode };
|
|
10
|
+
}
|
|
11
|
+
export function isThenable(value) {
|
|
12
|
+
return value != null && typeof value.then === "function";
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=subscribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../src/subscribe.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,sBAAsB,CAAC,OAAyB;IAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAyB,EAAE,MAAuB;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,UAAU,CAAI,KAAyB;IACrD,OAAO,KAAK,IAAI,IAAI,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,UAAU,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ClientMsg, ServerMsg } from "./protocol.ts";
|
|
2
|
+
export interface Transport {
|
|
3
|
+
/** Send a message up to the server. */
|
|
4
|
+
send(msg: ClientMsg): void;
|
|
5
|
+
/** Register the single handler for incoming server messages. */
|
|
6
|
+
onMessage(handler: (msg: ServerMsg) => void): void;
|
|
7
|
+
/** Register a handler fired after the connection is RE-established (not the first open) — the
|
|
8
|
+
* source uses it to re-`init` + re-subscribe so a dropped/restarted daemon heals. Optional:
|
|
9
|
+
* transports without reconnect (mocks, in-process) may omit it. */
|
|
10
|
+
onReconnect?(handler: () => void): void;
|
|
11
|
+
/** Register a handler fired when the connection is SUSTAINEDLY down — repeated reconnects to the
|
|
12
|
+
* same endpoint have failed (a dead/removed follower, READ-ROUTER-DESIGN.md §3). The source uses
|
|
13
|
+
* it to re-lease: the router returns a (possibly new) `wsEndpoint`, and a changed one migrates the
|
|
14
|
+
* whole session off the dead node. Optional: transports without failover (mocks, in-process,
|
|
15
|
+
* fixed endpoints) may omit it. */
|
|
16
|
+
onDown?(handler: () => void): void;
|
|
17
|
+
/** Tear down the connection. */
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|
|
20
|
+
/** A `Transport` over a `WebSocket` (text JSON frames). Messages sent before the socket
|
|
21
|
+
* opens are buffered and flushed on open (so `registerQuery`/`mutate` can be called eagerly).
|
|
22
|
+
* Reconnects with capped exponential backoff: if the socket drops (e.g. the daemon restarted)
|
|
23
|
+
* it reopens and fires `onReconnect` so the source rebuilds its subscriptions. */
|
|
24
|
+
export declare class WsTransport implements Transport {
|
|
25
|
+
private readonly url;
|
|
26
|
+
private ws;
|
|
27
|
+
private handler;
|
|
28
|
+
private reconnectHandler;
|
|
29
|
+
private downHandler;
|
|
30
|
+
private readonly pending;
|
|
31
|
+
private open;
|
|
32
|
+
private everOpened;
|
|
33
|
+
private closedByUser;
|
|
34
|
+
private attempt;
|
|
35
|
+
private reconnectTimer;
|
|
36
|
+
/** Failed reconnect attempts after which the connection is declared "down" (fires `onDown`). */
|
|
37
|
+
private readonly downThreshold;
|
|
38
|
+
/** True once `onDown` has fired for the CURRENT down episode; reset on the next successful open
|
|
39
|
+
* so a later outage fires again (but a single episode fires `onDown` exactly once — no re-lease
|
|
40
|
+
* storm while a follower is gone). */
|
|
41
|
+
private downFired;
|
|
42
|
+
constructor(url: string, opts?: {
|
|
43
|
+
downThreshold?: number;
|
|
44
|
+
});
|
|
45
|
+
private connect;
|
|
46
|
+
private scheduleReconnect;
|
|
47
|
+
send(msg: ClientMsg): void;
|
|
48
|
+
onMessage(handler: (msg: ServerMsg) => void): void;
|
|
49
|
+
onReconnect(handler: () => void): void;
|
|
50
|
+
onDown(handler: () => void): void;
|
|
51
|
+
close(): void;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD;;wEAEoE;IACpE,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACxC;;;;wCAIoC;IACpC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnC,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;mFAGmF;AACnF,qBAAa,WAAY,YAAW,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,cAAc,CAA4C;IAClE,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC;;2CAEuC;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO;IAM9D,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,iBAAiB;IAiBzB,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAK1B,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAIlD,WAAW,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjC,KAAK,IAAI,IAAI;CAQd"}
|