meridian-sdk 1.3.0 → 1.4.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/CHANGELOG.md +14 -0
- package/README.md +99 -0
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +0 -6
- package/dist/agents.js.map +1 -1
- package/dist/auth/permissions.d.ts +45 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +101 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/client.d.ts +80 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +147 -2
- package/dist/client.js.map +1 -1
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +4 -4
- package/dist/codec.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/rpc.d.ts +77 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +85 -0
- package/dist/rpc.js.map +1 -0
- package/dist/schema.d.ts +46 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +41 -0
- package/dist/schema.js.map +1 -1
- package/dist/transport/http.d.ts +21 -4
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +20 -1
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/websocket.d.ts +7 -0
- package/dist/transport/websocket.d.ts.map +1 -1
- package/dist/transport/websocket.js +14 -6
- package/dist/transport/websocket.js.map +1 -1
- package/dist/undo/UndoManager.d.ts.map +1 -1
- package/dist/undo/UndoManager.js +8 -6
- package/dist/undo/UndoManager.js.map +1 -1
- package/dist/utils/fractional.js +3 -3
- package/dist/utils/fractional.js.map +1 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agents.ts +1 -17
- package/src/auth/permissions.ts +130 -0
- package/src/client.ts +174 -2
- package/src/codec.ts +6 -6
- package/src/index.ts +10 -0
- package/src/rpc.ts +156 -0
- package/src/schema.ts +57 -0
- package/src/transport/http.ts +32 -2
- package/src/transport/websocket.ts +15 -7
- package/src/undo/UndoManager.ts +7 -6
- package/src/utils/fractional.ts +3 -3
- package/src/validation/index.ts +1 -1
- package/test/integration.test.ts +0 -4
- package/test/permissions.test.ts +229 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# meridian-sdk
|
|
2
2
|
|
|
3
|
+
## 1.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 886cbf7: feat: type-safe RPC layer (createMeridianRpc), live queries, devtools panel, edge query engine
|
|
8
|
+
|
|
9
|
+
## 1.4.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- f234dcc: **meridian-sdk**: Add Query Engine (`client.query()`, `QuerySpec`, `QueryResult`) for cross-CRDT scan/filter/aggregate over HTTP. Add Live Queries (`client.liveQuery()`, `LiveQueryHandle`, `LiveQueryResult`) for reactive WebSocket subscriptions that push updated results on every matching CRDT delta, with automatic re-subscription on reconnect.
|
|
14
|
+
|
|
15
|
+
**meridian-react**: Add `useQuery` hook for one-shot HTTP queries and `useLiveQuery` hook for reactive WebSocket-pushed query results.
|
|
16
|
+
|
|
3
17
|
## 1.3.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -214,6 +214,74 @@ const stats = client.getLatencyStats();
|
|
|
214
214
|
|
|
215
215
|
Latency is measured from the moment an op is sent over the WebSocket to the moment the server `Ack` is received. The `meridian-devtools` panel displays this automatically.
|
|
216
216
|
|
|
217
|
+
### Query Engine — `client.query()`
|
|
218
|
+
|
|
219
|
+
Aggregate data across multiple CRDTs in a single HTTP request:
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
// Sum all page view counters matching a glob
|
|
223
|
+
const result = await client.query({ from: "gc:views-*", aggregate: "sum" });
|
|
224
|
+
console.log(result.value); // total
|
|
225
|
+
console.log(result.matched); // number of CRDTs matched
|
|
226
|
+
console.log(result.execution_ms); // server latency
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Supported aggregations: `sum`, `max`, `min`, `count`, `union`, `intersection`, `latest`, `collect`, `merge`.
|
|
230
|
+
|
|
231
|
+
### Live Queries — `client.liveQuery()`
|
|
232
|
+
|
|
233
|
+
Subscribe once — get a push every time matching CRDTs change. Uses the existing WebSocket connection, no extra socket opened.
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
const handle = client.liveQuery({
|
|
237
|
+
from: "gc:views-*",
|
|
238
|
+
aggregate: "sum",
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
handle.onResult(result => {
|
|
242
|
+
console.log("live total:", result.value); // pushed on every matching delta
|
|
243
|
+
console.log("matched:", result.matched);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// Cancel
|
|
247
|
+
handle.close();
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Set `type` to avoid re-execution for unrelated CRDT deltas:
|
|
251
|
+
|
|
252
|
+
```ts
|
|
253
|
+
client.liveQuery({ from: "gc:views-*", type: "gcounter", aggregate: "sum" });
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The SDK automatically re-sends active subscriptions after a WebSocket reconnect.
|
|
257
|
+
|
|
258
|
+
### Permission checks — `client.canRead()` / `client.canWrite()`
|
|
259
|
+
|
|
260
|
+
Check token permissions locally — no network round-trip. Useful for gating UI actions before attempting an op that would fail with 403.
|
|
261
|
+
|
|
262
|
+
```ts
|
|
263
|
+
import { OpMasks } from "meridian-sdk";
|
|
264
|
+
|
|
265
|
+
// Key-level check (V1 and V2)
|
|
266
|
+
if (!client.canRead("or:cart-42")) showLockedBadge();
|
|
267
|
+
if (!client.canWrite("or:cart-42")) disableCartButton();
|
|
268
|
+
|
|
269
|
+
// Op-level check (V2 tokens only)
|
|
270
|
+
if (!client.canWrite("or:cart-42", OpMasks.OR_ADD)) disableAddButton();
|
|
271
|
+
if (!client.canWrite("pn:balance", OpMasks.PN_DECREMENT)) disableWithdrawButton();
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
`canRead` and `canWrite` are also exported as standalone functions for use outside a client instance:
|
|
275
|
+
|
|
276
|
+
```ts
|
|
277
|
+
import { canRead, canWrite, OpMasks } from "meridian-sdk";
|
|
278
|
+
|
|
279
|
+
canRead(claims.permissions, "lw:dashboard", claims.client_id); // boolean
|
|
280
|
+
canWrite(claims.permissions, "or:cart-42", claims.client_id, OpMasks.OR_ADD); // boolean
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
The check mirrors the server's logic exactly — V1 glob lists, V2 first-match-wins rules, per-rule TTLs, and `{clientId}` expansion are all handled. The server still enforces permissions independently; client checks are for UX only.
|
|
284
|
+
|
|
217
285
|
### HTTP client (`client.http`)
|
|
218
286
|
|
|
219
287
|
All methods return `Effect<T, HttpError | NetworkError>`:
|
|
@@ -223,6 +291,37 @@ client.http.getCrdt(ns, id) // → Effect<CrdtGetResponse, ...>
|
|
|
223
291
|
client.http.postOp(ns, id, op) // → Effect<CrdtOpResponse, ...>
|
|
224
292
|
client.http.syncCrdt(ns, id, sinceVc?) // → Effect<CrdtGetResponse, ...>
|
|
225
293
|
client.http.issueToken(ns, opts) // → Effect<TokenIssueResponse, ...>
|
|
294
|
+
client.http.tokenMe(ns) // → Effect<TokenClaims, ...>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
`issueToken` accepts both V1 (glob lists) and V2 (fine-grained rules):
|
|
298
|
+
|
|
299
|
+
```ts
|
|
300
|
+
// V1
|
|
301
|
+
await Effect.runPromise(
|
|
302
|
+
client.http.issueToken("shop", {
|
|
303
|
+
client_id: 42,
|
|
304
|
+
ttl_ms: 3_600_000,
|
|
305
|
+
permissions: { read: ["*"], write: ["or:cart-42"], admin: false },
|
|
306
|
+
})
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
// V2 — op masks, per-rule TTLs, {clientId} template, rate limit
|
|
310
|
+
await Effect.runPromise(
|
|
311
|
+
client.http.issueToken("shop", {
|
|
312
|
+
client_id: 42,
|
|
313
|
+
ttl_ms: 3_600_000,
|
|
314
|
+
rules: {
|
|
315
|
+
r: [{ p: "*" }],
|
|
316
|
+
w: [{ p: "or:cart-{clientId}", o: 0x01 | 0x02 }],
|
|
317
|
+
rl: 200,
|
|
318
|
+
},
|
|
319
|
+
})
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
// Inspect current token claims (useful for debugging)
|
|
323
|
+
const claims = await Effect.runPromise(client.http.tokenMe("shop"));
|
|
324
|
+
console.log(claims.client_id, claims.expires_at, claims.permissions);
|
|
226
325
|
```
|
|
227
326
|
|
|
228
327
|
## Wire protocol
|
package/dist/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/agents.js
CHANGED
|
@@ -142,9 +142,6 @@ export function getMeridianTools(config, crdtIds) {
|
|
|
142
142
|
}
|
|
143
143
|
return tools;
|
|
144
144
|
}
|
|
145
|
-
// ---------------------------------------------------------------------------
|
|
146
|
-
// Shared dispatcher (private)
|
|
147
|
-
// ---------------------------------------------------------------------------
|
|
148
145
|
/**
|
|
149
146
|
* Core dispatch logic — routes a (name, input) pair to the right HTTP operation.
|
|
150
147
|
* All provider-specific executors delegate here.
|
|
@@ -189,9 +186,6 @@ async function dispatchTool(config, name, input) {
|
|
|
189
186
|
}
|
|
190
187
|
return JSON.stringify({ error: `Unknown tool: ${name}` });
|
|
191
188
|
}
|
|
192
|
-
// ---------------------------------------------------------------------------
|
|
193
|
-
// Provider executors
|
|
194
|
-
// ---------------------------------------------------------------------------
|
|
195
189
|
/**
|
|
196
190
|
* Execute a Meridian tool call returned by **Anthropic Claude**.
|
|
197
191
|
*
|
package/dist/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side permission evaluation — mirrors the Rust `claims.rs` logic exactly.
|
|
3
|
+
*
|
|
4
|
+
* Lets callers check `canRead` / `canWrite` locally without a round-trip to the
|
|
5
|
+
* server. Useful for disabling UI elements before attempting an op that would
|
|
6
|
+
* fail with 403.
|
|
7
|
+
*/
|
|
8
|
+
import type { Permissions } from "../schema.js";
|
|
9
|
+
export declare const OpMasks: {
|
|
10
|
+
/** Allow all ops (sentinel — 0 means no restriction). */
|
|
11
|
+
readonly ALL: 0;
|
|
12
|
+
readonly GC_INCREMENT: 1;
|
|
13
|
+
readonly PN_INCREMENT: 1;
|
|
14
|
+
readonly PN_DECREMENT: 2;
|
|
15
|
+
readonly OR_ADD: 1;
|
|
16
|
+
readonly OR_REMOVE: 2;
|
|
17
|
+
readonly LWW_SET: 1;
|
|
18
|
+
readonly PRESENCE_UPDATE: 1;
|
|
19
|
+
readonly RGA_INSERT: 1;
|
|
20
|
+
readonly RGA_DELETE: 2;
|
|
21
|
+
readonly TREE_ADD: 1;
|
|
22
|
+
readonly TREE_MOVE: 2;
|
|
23
|
+
readonly TREE_UPDATE: 4;
|
|
24
|
+
readonly TREE_DELETE: 8;
|
|
25
|
+
readonly MAP_WRITE: 1;
|
|
26
|
+
};
|
|
27
|
+
export type OpMask = number;
|
|
28
|
+
/**
|
|
29
|
+
* Check whether the token's permissions allow reading `crdtId`.
|
|
30
|
+
*
|
|
31
|
+
* @param permissions - parsed from `TokenClaims.permissions`
|
|
32
|
+
* @param crdtId - e.g. `"gc:views"`, `"or:cart-42"`
|
|
33
|
+
* @param clientId - `TokenClaims.client_id` (needed for `{clientId}` expansion)
|
|
34
|
+
* @param nowMs - current time in ms (default: `Date.now()`)
|
|
35
|
+
*/
|
|
36
|
+
export declare function canRead(permissions: Permissions, crdtId: string, clientId: number, nowMs?: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Check whether the token's permissions allow writing `crdtId`.
|
|
39
|
+
*
|
|
40
|
+
* @param opMask - op-level bitmask (e.g. `OpMasks.OR_ADD`). Omit or pass `0` to
|
|
41
|
+
* check key-level access without op granularity (V2 rule with a
|
|
42
|
+
* mask will still be matched if the caller passes `ALL=0`).
|
|
43
|
+
*/
|
|
44
|
+
export declare function canWrite(permissions: Permissions, crdtId: string, clientId: number, opMask?: OpMask, nowMs?: number): boolean;
|
|
45
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,OAAO;IAClB,yDAAyD;;;;;;;;;;;;;;;;CA8BjD,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AA4C5B;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAa,GACjB,OAAO,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAoB,EAC5B,KAAK,SAAa,GACjB,OAAO,CAOT"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side permission evaluation — mirrors the Rust `claims.rs` logic exactly.
|
|
3
|
+
*
|
|
4
|
+
* Lets callers check `canRead` / `canWrite` locally without a round-trip to the
|
|
5
|
+
* server. Useful for disabling UI elements before attempting an op that would
|
|
6
|
+
* fail with 403.
|
|
7
|
+
*/
|
|
8
|
+
export const OpMasks = {
|
|
9
|
+
/** Allow all ops (sentinel — 0 means no restriction). */
|
|
10
|
+
ALL: 0,
|
|
11
|
+
// GCounter / PNCounter
|
|
12
|
+
GC_INCREMENT: 0b0000_0001,
|
|
13
|
+
PN_INCREMENT: 0b0000_0001,
|
|
14
|
+
PN_DECREMENT: 0b0000_0010,
|
|
15
|
+
// ORSet
|
|
16
|
+
OR_ADD: 0b0000_0001,
|
|
17
|
+
OR_REMOVE: 0b0000_0010,
|
|
18
|
+
// LWW Register
|
|
19
|
+
LWW_SET: 0b0000_0001,
|
|
20
|
+
// Presence
|
|
21
|
+
PRESENCE_UPDATE: 0b0000_0001,
|
|
22
|
+
// RGA
|
|
23
|
+
RGA_INSERT: 0b0000_0001,
|
|
24
|
+
RGA_DELETE: 0b0000_0010,
|
|
25
|
+
// Tree
|
|
26
|
+
TREE_ADD: 0b0000_0001,
|
|
27
|
+
TREE_MOVE: 0b0000_0010,
|
|
28
|
+
TREE_UPDATE: 0b0000_0100,
|
|
29
|
+
TREE_DELETE: 0b0000_1000,
|
|
30
|
+
// CRDTMap
|
|
31
|
+
MAP_WRITE: 0b0000_0001,
|
|
32
|
+
};
|
|
33
|
+
function globMatch(pattern, value) {
|
|
34
|
+
if (pattern === "*")
|
|
35
|
+
return true;
|
|
36
|
+
const starPos = pattern.indexOf("*");
|
|
37
|
+
if (starPos === -1)
|
|
38
|
+
return pattern === value;
|
|
39
|
+
const prefix = pattern.slice(0, starPos);
|
|
40
|
+
const suffix = pattern.slice(starPos + 1);
|
|
41
|
+
if (!value.startsWith(prefix))
|
|
42
|
+
return false;
|
|
43
|
+
const rest = value.slice(prefix.length);
|
|
44
|
+
if (suffix === "")
|
|
45
|
+
return true;
|
|
46
|
+
for (let i = 0; i <= rest.length; i++) {
|
|
47
|
+
if (globMatch(suffix, rest.slice(i)))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function isAllMask(mask) {
|
|
53
|
+
return mask === 0 || mask === 0xffff;
|
|
54
|
+
}
|
|
55
|
+
function entryMatches(entry, crdtId, opMask, nowMs, clientId) {
|
|
56
|
+
// TTL gate
|
|
57
|
+
if (entry.e !== undefined && nowMs >= entry.e)
|
|
58
|
+
return false;
|
|
59
|
+
// Expand {clientId} placeholder
|
|
60
|
+
const pattern = entry.p.includes("{clientId}")
|
|
61
|
+
? entry.p.replaceAll("{clientId}", String(clientId))
|
|
62
|
+
: entry.p;
|
|
63
|
+
if (!globMatch(pattern, crdtId))
|
|
64
|
+
return false;
|
|
65
|
+
const ruleOp = entry.o ?? OpMasks.ALL;
|
|
66
|
+
if (isAllMask(ruleOp) || isAllMask(opMask))
|
|
67
|
+
return true;
|
|
68
|
+
return (opMask & ruleOp) !== 0;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check whether the token's permissions allow reading `crdtId`.
|
|
72
|
+
*
|
|
73
|
+
* @param permissions - parsed from `TokenClaims.permissions`
|
|
74
|
+
* @param crdtId - e.g. `"gc:views"`, `"or:cart-42"`
|
|
75
|
+
* @param clientId - `TokenClaims.client_id` (needed for `{clientId}` expansion)
|
|
76
|
+
* @param nowMs - current time in ms (default: `Date.now()`)
|
|
77
|
+
*/
|
|
78
|
+
export function canRead(permissions, crdtId, clientId, nowMs = Date.now()) {
|
|
79
|
+
if ("v" in permissions) {
|
|
80
|
+
// V2
|
|
81
|
+
return permissions.r.some((e) => entryMatches(e, crdtId, OpMasks.ALL, nowMs, clientId));
|
|
82
|
+
}
|
|
83
|
+
// V1
|
|
84
|
+
return permissions.read.some((p) => globMatch(p, crdtId));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check whether the token's permissions allow writing `crdtId`.
|
|
88
|
+
*
|
|
89
|
+
* @param opMask - op-level bitmask (e.g. `OpMasks.OR_ADD`). Omit or pass `0` to
|
|
90
|
+
* check key-level access without op granularity (V2 rule with a
|
|
91
|
+
* mask will still be matched if the caller passes `ALL=0`).
|
|
92
|
+
*/
|
|
93
|
+
export function canWrite(permissions, crdtId, clientId, opMask = OpMasks.ALL, nowMs = Date.now()) {
|
|
94
|
+
if ("v" in permissions) {
|
|
95
|
+
// V2
|
|
96
|
+
return permissions.w.some((e) => entryMatches(e, crdtId, opMask, nowMs, clientId));
|
|
97
|
+
}
|
|
98
|
+
// V1
|
|
99
|
+
return permissions.write.some((p) => globMatch(p, crdtId));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yDAAyD;IACzD,GAAG,EAAE,CAAC;IAEN,uBAAuB;IACvB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IAEzB,QAAQ;IACR,MAAM,EAAK,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,eAAe;IACf,OAAO,EAAE,WAAW;IAEpB,WAAW;IACX,eAAe,EAAE,WAAW;IAE5B,MAAM;IACN,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,WAAW;IAEvB,OAAO;IACP,QAAQ,EAAK,WAAW;IACxB,SAAS,EAAI,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IAExB,UAAU;IACV,SAAS,EAAE,WAAW;CACd,CAAC;AAIX,SAAS,SAAS,CAAC,OAAe,EAAE,KAAa;IAC/C,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,KAAK,KAAK,CAAC;IAE7C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CACnB,KAAgB,EAChB,MAAc,EACd,MAAc,EACd,KAAa,EACb,QAAgB;IAEhB,WAAW;IACX,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5D,gCAAgC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC;IACtC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CACrB,WAAwB,EACxB,MAAc,EACd,QAAgB,EAChB,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAElB,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QACvB,KAAK;QACL,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK;IACL,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,WAAwB,EACxB,MAAc,EACd,QAAgB,EAChB,SAAiB,OAAO,CAAC,GAAG,EAC5B,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAElB,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QACvB,KAAK;QACL,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,KAAK;IACL,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Effect, type Schema } from "effect";
|
|
2
|
+
import type { QuerySpec, QueryResult, LiveQueryResult } from "./schema.js";
|
|
2
3
|
import type { WsState } from "./transport/websocket.js";
|
|
3
4
|
import type { CrdtMapValue } from "./crdt/crdtmap.js";
|
|
4
5
|
import { HttpClient } from "./transport/http.js";
|
|
@@ -13,6 +14,7 @@ import { RGAHandle } from "./crdt/rga.js";
|
|
|
13
14
|
import { TreeHandle } from "./crdt/tree.js";
|
|
14
15
|
import type { CrdtValidator } from "./validation/index.js";
|
|
15
16
|
import type { TreeNodeValue } from "./sync/delta.js";
|
|
17
|
+
import type { OpMask } from "./auth/permissions.js";
|
|
16
18
|
import type { TokenClaims } from "./schema.js";
|
|
17
19
|
import type { TokenParseError, TokenExpiredError } from "./errors.js";
|
|
18
20
|
export interface GCounterSnapshotEntry {
|
|
@@ -65,6 +67,16 @@ export interface TreeSnapshotEntry {
|
|
|
65
67
|
roots: TreeNodeValue[];
|
|
66
68
|
}
|
|
67
69
|
export type CRDTSnapshotEntry = GCounterSnapshotEntry | PNCounterSnapshotEntry | ORSetSnapshotEntry | LwwRegisterSnapshotEntry | PresenceSnapshotEntry | CRDTMapSnapshotEntry | RGASnapshotEntry | TreeSnapshotEntry;
|
|
70
|
+
/**
|
|
71
|
+
* A handle returned by `client.liveQuery()`. Receives pushed `LiveQueryResult`
|
|
72
|
+
* frames whenever matching CRDTs change.
|
|
73
|
+
*/
|
|
74
|
+
export interface LiveQueryHandle {
|
|
75
|
+
/** Register a listener for live query result pushes. Returns an unsubscribe fn. */
|
|
76
|
+
onResult(listener: (result: LiveQueryResult) => void): () => void;
|
|
77
|
+
/** Cancel the subscription and clean up. */
|
|
78
|
+
close(): void;
|
|
79
|
+
}
|
|
68
80
|
export interface DeltaEvent {
|
|
69
81
|
crdtId: string;
|
|
70
82
|
type: CRDTSnapshotEntry["type"];
|
|
@@ -127,6 +139,9 @@ export declare class MeridianClient {
|
|
|
127
139
|
private readonly anyListeners;
|
|
128
140
|
private readonly deltaListeners;
|
|
129
141
|
private readonly handleUnsubs;
|
|
142
|
+
private readonly liveQueries;
|
|
143
|
+
private liveQueryCounter;
|
|
144
|
+
private readonly rpcListeners;
|
|
130
145
|
private constructor();
|
|
131
146
|
/**
|
|
132
147
|
* Creates and validates a new `MeridianClient` from the supplied configuration.
|
|
@@ -336,6 +351,19 @@ export declare class MeridianClient {
|
|
|
336
351
|
* Useful for building "syncing" indicators in the UI.
|
|
337
352
|
*/
|
|
338
353
|
onStateChange(listener: (state: WsState) => void): () => void;
|
|
354
|
+
/**
|
|
355
|
+
* Register a listener for incoming RPC frames (used by `createMeridianRpc`).
|
|
356
|
+
* Frames arrive as `AwarenessBroadcast` messages with key `"__rpc__"`.
|
|
357
|
+
* Returns an unsubscribe function.
|
|
358
|
+
* @internal
|
|
359
|
+
*/
|
|
360
|
+
onRpcFrame(listener: (frame: unknown) => void): () => void;
|
|
361
|
+
/**
|
|
362
|
+
* Send a raw msgpack-encoded `ClientMsg` over the WebSocket transport.
|
|
363
|
+
* Used by `createMeridianRpc` to send typed RPC frames.
|
|
364
|
+
* @internal
|
|
365
|
+
*/
|
|
366
|
+
sendRpcFrame(data: Uint8Array): void;
|
|
339
367
|
/**
|
|
340
368
|
* Subscribe to any state change (CRDT value or connection state).
|
|
341
369
|
* Fires whenever any handle emits or the WebSocket transitions.
|
|
@@ -360,9 +388,61 @@ export declare class MeridianClient {
|
|
|
360
388
|
* using `<MeridianProvider>` in React, the provider calls this automatically
|
|
361
389
|
* on unmount.
|
|
362
390
|
*/
|
|
391
|
+
/**
|
|
392
|
+
* Returns `true` if the token's permissions allow reading `crdtId`.
|
|
393
|
+
*
|
|
394
|
+
* Evaluated locally against the parsed claims — no network round-trip.
|
|
395
|
+
* Useful for disabling UI elements before attempting an op that would fail.
|
|
396
|
+
*
|
|
397
|
+
* @example
|
|
398
|
+
* ```ts
|
|
399
|
+
* if (!client.canRead("or:cart-42")) showLockIcon();
|
|
400
|
+
* ```
|
|
401
|
+
*/
|
|
402
|
+
canRead(crdtId: string): boolean;
|
|
403
|
+
/**
|
|
404
|
+
* Returns `true` if the token's permissions allow writing `crdtId`.
|
|
405
|
+
*
|
|
406
|
+
* Pass an optional `opMask` to check op-level access (V2 tokens only).
|
|
407
|
+
* Without `opMask`, checks key-level write access.
|
|
408
|
+
*
|
|
409
|
+
* @example
|
|
410
|
+
* ```ts
|
|
411
|
+
* import { OpMasks } from "meridian-sdk";
|
|
412
|
+
*
|
|
413
|
+
* if (!client.canWrite("or:cart-42", OpMasks.OR_ADD)) disableAddButton();
|
|
414
|
+
* if (!client.canWrite("gc:views")) disableIncrementButton();
|
|
415
|
+
* ```
|
|
416
|
+
*/
|
|
417
|
+
canWrite(crdtId: string, opMask?: OpMask): boolean;
|
|
363
418
|
close(): void;
|
|
364
419
|
/** Re-opens the WebSocket after a `close()`. Used by MeridianProvider to survive React StrictMode double-mount. */
|
|
365
420
|
reopen(): void;
|
|
421
|
+
/**
|
|
422
|
+
* Execute a cross-CRDT query against the namespace.
|
|
423
|
+
*
|
|
424
|
+
* @example
|
|
425
|
+
* ```ts
|
|
426
|
+
* const result = await client.query({ from: "gc:views-*", aggregate: "sum" });
|
|
427
|
+
* console.log(result.value); // total view count
|
|
428
|
+
* ```
|
|
429
|
+
*/
|
|
430
|
+
query(spec: QuerySpec): Promise<QueryResult>;
|
|
431
|
+
/**
|
|
432
|
+
* Subscribe to a live cross-CRDT query over WebSocket.
|
|
433
|
+
* The server re-executes the query and pushes a result whenever a matching CRDT changes.
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* ```ts
|
|
437
|
+
* const handle = client.liveQuery({ from: "gc:views-*", aggregate: "sum" });
|
|
438
|
+
* handle.onResult(result => console.log("live total:", result.value));
|
|
439
|
+
* // later:
|
|
440
|
+
* handle.close();
|
|
441
|
+
* ```
|
|
442
|
+
*/
|
|
443
|
+
liveQuery(spec: QuerySpec): LiveQueryHandle;
|
|
444
|
+
private sendSubscribeQuery;
|
|
445
|
+
private resubscribeLiveQueries;
|
|
366
446
|
private notifyAnyChange;
|
|
367
447
|
private handleServerMsg;
|
|
368
448
|
private notifyDelta;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAW3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAW3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAItE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1C;AACD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AACD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtD;AACD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE;AACD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAC/B;AACD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AACD,MAAM,MAAM,iBAAiB,GACzB,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,GAClB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,4CAA4C;IAC5C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAG1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiD;IAC3E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0C;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IAGtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGvB;IACL,OAAO,CAAC,gBAAgB,CAAK;IAG7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAEpE,OAAO;IA8BP;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,MAAM,CACX,MAAM,EAAE,oBAAoB,GAC3B,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,GAAG,iBAAiB,CAAC;IAMrE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAWxC;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAW1C;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAYnE;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAY/E;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAYzE;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAWtC;;;;;;;;;;;;;;OAcG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,aAAa,CAAA;KAAE,GAAG,SAAS;IAWpE;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,aAAa,CAAA;KAAE,GAAG,UAAU;IAWtE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IASlF,gBAAgB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,uEAAuE;IACvE,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,mFAAmF;IACnF,eAAe,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIrE;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAI7D;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIpC;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK7C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D;;;OAGG;IACH,QAAQ,IAAI,cAAc;IA2B1B;;;;;;OAMG;IAEH;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAIlD,KAAK,IAAI,IAAI;IAYb,mHAAmH;IACnH,MAAM,IAAI,IAAI;IAId;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAI5C;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,eAAe;IAkB3C,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IA4EvB,OAAO,CAAC,WAAW;CAKpB"}
|