@procedures/store 0.7.0 → 0.8.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.
Files changed (51) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +98 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/indexeddb/sync-state-store.d.ts +40 -0
  5. package/dist/indexeddb/sync-state-store.d.ts.map +1 -0
  6. package/dist/indexeddb/sync-state-store.js +94 -0
  7. package/dist/indexeddb/sync-state-store.js.map +1 -0
  8. package/dist/indexeddb.d.ts +7 -2
  9. package/dist/indexeddb.d.ts.map +1 -1
  10. package/dist/indexeddb.js +6 -2
  11. package/dist/indexeddb.js.map +1 -1
  12. package/dist/storage/api.d.ts +94 -11
  13. package/dist/storage/api.d.ts.map +1 -1
  14. package/dist/storage/api.js +177 -24
  15. package/dist/storage/api.js.map +1 -1
  16. package/dist/storage/feed.d.ts +133 -0
  17. package/dist/storage/feed.d.ts.map +1 -0
  18. package/dist/storage/feed.js +159 -0
  19. package/dist/storage/feed.js.map +1 -0
  20. package/dist/storage/file-queue.d.ts.map +1 -1
  21. package/dist/storage/file-queue.js +2 -1
  22. package/dist/storage/file-queue.js.map +1 -1
  23. package/dist/storage/hybrid.d.ts +415 -20
  24. package/dist/storage/hybrid.d.ts.map +1 -1
  25. package/dist/storage/hybrid.js +1405 -196
  26. package/dist/storage/hybrid.js.map +1 -1
  27. package/dist/storage/index.d.ts +6 -2
  28. package/dist/storage/index.d.ts.map +1 -1
  29. package/dist/storage/index.js +6 -1
  30. package/dist/storage/index.js.map +1 -1
  31. package/dist/storage/sync-state.d.ts +56 -0
  32. package/dist/storage/sync-state.d.ts.map +1 -0
  33. package/dist/storage/sync-state.js +58 -0
  34. package/dist/storage/sync-state.js.map +1 -0
  35. package/dist/storage/synced-registry.d.ts +22 -4
  36. package/dist/storage/synced-registry.d.ts.map +1 -1
  37. package/dist/storage/synced-registry.js +63 -31
  38. package/dist/storage/synced-registry.js.map +1 -1
  39. package/dist/storage/types.d.ts +22 -1
  40. package/dist/storage/types.d.ts.map +1 -1
  41. package/package.json +4 -3
  42. package/src/indexeddb/sync-state-store.ts +101 -0
  43. package/src/indexeddb.ts +7 -2
  44. package/src/storage/api.ts +240 -28
  45. package/src/storage/feed.ts +251 -0
  46. package/src/storage/file-queue.ts +2 -1
  47. package/src/storage/hybrid.ts +1526 -203
  48. package/src/storage/index.ts +17 -0
  49. package/src/storage/sync-state.ts +89 -0
  50. package/src/storage/synced-registry.ts +76 -31
  51. package/src/storage/types.ts +25 -1
@@ -6,13 +6,31 @@
6
6
  *
7
7
  * This is the KEY integration between Collections and Universal Client!
8
8
  */
9
- import { optionalMs } from "@procedures/client";
9
+ import { QUERY_OPERATORS, patchProblems, queryEntries, queryOptionsProblems, selectorProblems, } from "@procedures/client/query";
10
+ import { optionalMs, realClock } from "@procedures/client";
11
+ import { backoffDelay } from "@mark1russell7/service/backoff";
12
+ /**
13
+ * The policy of a query that only the server limits: each operator, and no limit of size. The form
14
+ * of the selector must still be correct.
15
+ */
16
+ const FORM_ONLY = Object.freeze({
17
+ operators: QUERY_OPERATORS,
18
+ maxRegexLength: Number.POSITIVE_INFINITY,
19
+ maxClauses: Number.POSITIVE_INFINITY,
20
+ maxDepth: Number.POSITIVE_INFINITY,
21
+ maxListLength: Number.POSITIVE_INFINITY,
22
+ });
10
23
  /** An error that says whether another attempt can succeed (a ClientError does). */
11
24
  function isRetryable(error) {
12
25
  return (typeof error === "object" &&
13
26
  error !== null &&
14
27
  error.retryable === true);
15
28
  }
29
+ /** The wait that an error asks for before a retry, in milliseconds, or 0. */
30
+ function retryAfterOf(error) {
31
+ const value = error?.retryAfterMs;
32
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
33
+ }
16
34
  /** A promise that rejects when the signal aborts first. */
17
35
  function untilAborted(promise, signal, describe) {
18
36
  if (!signal)
@@ -31,6 +49,28 @@ function untilAborted(promise, signal, describe) {
31
49
  });
32
50
  });
33
51
  }
52
+ /** A wait on the clock. The signal stops the wait and its timer. */
53
+ function wait(clock, ms, signal, describe) {
54
+ return new Promise((resolve, reject) => {
55
+ if (signal?.aborted) {
56
+ reject(describe());
57
+ return;
58
+ }
59
+ const onAbort = () => {
60
+ cancel();
61
+ reject(describe());
62
+ };
63
+ const cancel = clock.after(ms, () => {
64
+ signal?.removeEventListener("abort", onAbort);
65
+ resolve();
66
+ });
67
+ signal?.addEventListener("abort", onAbort, { once: true });
68
+ });
69
+ }
70
+ /** True when the server does not know a procedure: an older server without `ids`. */
71
+ function isNotFound(error) {
72
+ return typeof error === "object" && error !== null && error.code === "NOT_FOUND";
73
+ }
34
74
  /**
35
75
  * True for the output `{ found, value }` of the core procedure `get` with `found: true`: an
36
76
  * object with a boolean `found`, and no key other than `found` and `value`.
@@ -41,6 +81,13 @@ function isFoundOutput(value) {
41
81
  const record = value;
42
82
  return typeof record["found"] === "boolean" && Object.keys(record).every((key) => key === "found" || key === "value");
43
83
  }
84
+ /** The entries of the output `[{ id, value }]` of `entries` or `find`. */
85
+ function entriesOf(output, label) {
86
+ if (!Array.isArray(output) || !output.every((entry) => typeof entry === "object" && entry !== null && typeof entry.id === "string")) {
87
+ throw new Error(`${label} did not return an array of { id, value }`);
88
+ }
89
+ return output.map((entry) => [entry.id, entry.value]);
90
+ }
44
91
  /**
45
92
  * API storage backed by universal client.
46
93
  *
@@ -49,11 +96,17 @@ function isFoundOutput(value) {
49
96
  * - get(id) → `collections.<collection>.get` with `{ id }`
50
97
  * - set(id, value) → `collections.<collection>.set` with `{ id, value }`
51
98
  * - setBatch(items) → `collections.<collection>.setBatch` with `{ items: [{ id, value }] }`
99
+ * - getIds() → `collections.<collection>.ids` with `{}`, or the entries of an older server
100
+ * - query(selector, options) → `collections.<collection>.find` with `{ selector, sort, skip, limit }`
101
+ * - patch(id, fields) → `collections.<collection>.patch` with `{ id, fields }`
52
102
  * - etc.
53
103
  *
54
104
  * Before, the class expected a `{ data }` envelope and called `<service>.get`: no core
55
105
  * procedure matched, and every read was undefined (deep dive CORE-9, DATA-9).
56
106
  *
107
+ * The retries wait with `backoffDelay` of `@mark1russell7/service/backoff` on the clock of the
108
+ * options, with full jitter by default. Before, the waits had no jitter, and they used the timers of the platform directly.
109
+ *
57
110
  * @example
58
111
  * ```typescript
59
112
  * // Create API storage
@@ -66,17 +119,28 @@ function isFoundOutput(value) {
66
119
  * // Operations are automatically sent to server
67
120
  * await storage.set("123", { name: "John" });
68
121
  * const user = await storage.get("123"); // Fetched from server
122
+ * const admins = await storage.query({ role: "admin" }, { sort: { name: 1 }, limit: 50 }); // Runs on the server
69
123
  * ```
70
124
  */
71
125
  export class ApiStorage {
72
126
  client;
73
127
  options;
74
128
  closed = false;
129
+ /** True when the server does not know the procedure `ids`: `getIds()` reads the entries */
130
+ idsUnsupported = false;
131
+ /** True when the server does not know the procedure `find`: `query()` reads the entries */
132
+ findUnsupported = false;
75
133
  constructor(client, options) {
76
134
  const service = options.service ?? (options.collection !== undefined ? `collections.${options.collection}` : undefined);
77
135
  if (!service) {
78
136
  throw new Error("ApiStorage requires a collection or a service");
79
137
  }
138
+ const jitter = options.retryJitter ?? 1;
139
+ if (!(jitter >= 0 && jitter <= 1))
140
+ throw new RangeError(`retryJitter must be from 0 to 1, not ${jitter}`);
141
+ const factor = options.retryFactor ?? 2;
142
+ if (!(Number.isFinite(factor) && factor >= 1))
143
+ throw new RangeError(`retryFactor must be a number of 1 or more, not ${factor}`);
80
144
  this.client = client;
81
145
  this.options = {
82
146
  service,
@@ -85,8 +149,10 @@ export class ApiStorage {
85
149
  get: "get",
86
150
  getAll: "getAll",
87
151
  entries: "entries",
152
+ ids: "ids",
88
153
  changes: "changes",
89
154
  find: "find",
155
+ patch: "patch",
90
156
  has: "has",
91
157
  size: "size",
92
158
  set: "set",
@@ -99,11 +165,21 @@ export class ApiStorage {
99
165
  },
100
166
  timeout: optionalMs(options.timeout, "timeout") ?? 30000,
101
167
  attempts: options.retry === false ? 1 : options.retry === true || options.retry === undefined ? 3 : Math.max(1, options.retry),
102
- retryDelay: optionalMs(options.retryDelay, "retryDelay") ?? 100,
168
+ backoff: {
169
+ base: optionalMs(options.retryDelay, "retryDelay") ?? 100,
170
+ factor,
171
+ cap: optionalMs(options.maxRetryDelay, "maxRetryDelay") ?? 30000,
172
+ jitter: jitter === 0 ? { kind: "none" } : { kind: "subtract", fraction: jitter },
173
+ },
174
+ clock: options.clock ?? realClock,
175
+ random: options.random ?? Math.random,
176
+ queryPolicy: options.queryPolicy ?? FORM_ONLY,
103
177
  ...(options.signal !== undefined && { signal: options.signal }),
104
178
  closeClient: options.closeClient ?? false,
105
179
  // A custom service can refuse an unknown input field: it gets the input { id }
106
180
  askFound: options.service === undefined && (options.operations?.get ?? "get") === "get",
181
+ // A custom service can refuse an unknown input field: it gets no origin
182
+ sendOrigin: options.service === undefined,
107
183
  };
108
184
  }
109
185
  //
@@ -133,11 +209,29 @@ export class ApiStorage {
133
209
  }
134
210
  /** Every item with its id, from the `entries` procedure of the collection (roadmap R2). */
135
211
  async getEntries() {
136
- const entries = await this.call("entries", {});
137
- if (!Array.isArray(entries)) {
138
- throw new Error(`${this.options.service}.entries did not return an array`);
212
+ return entriesOf(await this.call("entries", {}), `${this.options.service}.entries`);
213
+ }
214
+ /**
215
+ * The ids of the items in the order of the entries, from the `ids` procedure of the collection.
216
+ * The values stay on the server. An older server without the procedure answers `NOT_FOUND`.
217
+ * Then this call and each later call read the ids from `getEntries()`.
218
+ */
219
+ async getIds() {
220
+ if (!this.idsUnsupported) {
221
+ try {
222
+ const ids = await this.call("ids", {});
223
+ if (!Array.isArray(ids) || !ids.every((id) => typeof id === "string")) {
224
+ throw new Error(`${this.options.service}.ids did not return an array of ids`);
225
+ }
226
+ return ids;
227
+ }
228
+ catch (error) {
229
+ if (!isNotFound(error))
230
+ throw error;
231
+ this.idsUnsupported = true;
232
+ }
139
233
  }
140
- return entries.map((entry) => [entry.id, entry.value]);
234
+ return (await this.getEntries()).map(([id]) => id);
141
235
  }
142
236
  /**
143
237
  * The changes after a version, from the `changes` procedure of the collection (roadmap R28).
@@ -157,11 +251,47 @@ export class ApiStorage {
157
251
  deleted: result.deleted,
158
252
  };
159
253
  }
254
+ /**
255
+ * The items for which the predicate gives true. A function cannot go over the network, so this
256
+ * method reads all items and filters here. `query()` sends a JSON selector to the server.
257
+ */
160
258
  async find(predicate) {
161
- // A predicate cannot go over the network: read all items, then filter here
162
259
  const all = await this.getAll();
163
260
  return all.filter(predicate);
164
261
  }
262
+ /**
263
+ * The entries whose items match the selector, from the `find` procedure of the collection: the
264
+ * server runs the selector, the order, the skip and the limit (roadmap CLI-14), under its own
265
+ * query policy. An older server without the procedure answers `NOT_FOUND`. Then this call and
266
+ * each later call read the entries and run the query here, with the same result.
267
+ *
268
+ * @param policy - The policy that the storage applies before it sends the query. The default is
269
+ * the option `queryPolicy`. The server applies its own policy too.
270
+ */
271
+ async query(selector, options = {}, policy) {
272
+ // A selector with a problem does not go to the server: the server would refuse it
273
+ const limits = policy ?? this.options.queryPolicy;
274
+ const problems = [...selectorProblems(selector, limits), ...queryOptionsProblems(options, limits)];
275
+ if (problems.length > 0)
276
+ throw new TypeError(`The query is not correct: ${problems.join(". ")}`);
277
+ if (!this.findUnsupported) {
278
+ const input = {
279
+ selector,
280
+ ...(options.sort !== undefined && { sort: options.sort }),
281
+ ...(options.skip !== undefined && { skip: options.skip }),
282
+ ...(options.limit !== undefined && { limit: options.limit }),
283
+ };
284
+ try {
285
+ return entriesOf(await this.call("find", input), `${this.options.service}.find`);
286
+ }
287
+ catch (error) {
288
+ if (!isNotFound(error))
289
+ throw error;
290
+ this.findUnsupported = true;
291
+ }
292
+ }
293
+ return queryEntries(await this.getEntries(), selector, options, limits);
294
+ }
165
295
  async has(id) {
166
296
  return (await this.call("has", { id })) === true;
167
297
  }
@@ -171,24 +301,42 @@ export class ApiStorage {
171
301
  //
172
302
  // ═══ Write Operations ═══
173
303
  //
174
- async set(id, value) {
175
- await this.call("set", { id, value });
304
+ /**
305
+ * This method sets an item on the server. The origin of the options goes to the procedure `set`,
306
+ * so the storage of the server and the change event of the write have it (roadmap CLI-15).
307
+ */
308
+ async set(id, value, options) {
309
+ await this.call("set", { id, value, ...this.originOf(options) });
176
310
  }
177
- async delete(id) {
178
- return (await this.call("delete", { id })) === true;
311
+ async delete(id, options) {
312
+ return (await this.call("delete", { id, ...this.originOf(options) })) === true;
179
313
  }
180
- async clear() {
181
- await this.call("clear", {});
314
+ async clear(options) {
315
+ await this.call("clear", { ...this.originOf(options) });
316
+ }
317
+ /**
318
+ * This method changes an item on the server in one step: the `patch` procedure of the collection
319
+ * (roadmap CLI-14). The fields are a JSON Merge Patch, or the operations `$set` and `$unset`.
320
+ * It gives the new item, or undefined for a missing id.
321
+ */
322
+ async patch(id, fields, options) {
323
+ const [problem] = patchProblems(fields);
324
+ if (problem !== undefined)
325
+ throw new TypeError(`The patch of ${id} is not correct: ${problem}`);
326
+ const result = await this.call("patch", { id, fields, ...this.originOf(options) });
327
+ if (!isFoundOutput(result))
328
+ throw new Error(`${this.options.service}.patch did not return { found, value }`);
329
+ return result.found ? result.value : undefined;
182
330
  }
183
331
  //
184
332
  // ═══ Bulk Operations ═══
185
333
  //
186
- async setBatch(items) {
334
+ async setBatch(items, options) {
187
335
  // The collection procedure takes objects, not tuples
188
- await this.call("setBatch", { items: items.map(([id, value]) => ({ id, value })) });
336
+ await this.call("setBatch", { items: items.map(([id, value]) => ({ id, value })), ...this.originOf(options) });
189
337
  }
190
- async deleteBatch(ids) {
191
- return Number(await this.call("deleteBatch", { ids }));
338
+ async deleteBatch(ids, options) {
339
+ return Number(await this.call("deleteBatch", { ids, ...this.originOf(options) }));
192
340
  }
193
341
  async getBatch(ids) {
194
342
  const values = (await this.call("getBatch", { ids })) ?? {};
@@ -230,8 +378,14 @@ export class ApiStorage {
230
378
  //
231
379
  // ═══ Internal Helpers ═══
232
380
  //
381
+ /** The field `origin` of a write input, or no field: a custom service gets no origin. */
382
+ originOf(options) {
383
+ return this.options.sendOrigin && options?.origin !== undefined ? { origin: options.origin } : {};
384
+ }
233
385
  /**
234
- * Make an RPC call via the universal client, with the timeout, the signal and the retries.
386
+ * Make an RPC call via the universal client, with the timeout, the signal and the retries. The
387
+ * wait before retry `n` is `backoffDelay(backoff, n)`, or the wait that the error asks for when
388
+ * it is longer.
235
389
  */
236
390
  async call(operation, payload) {
237
391
  if (this.closed)
@@ -250,8 +404,8 @@ export class ApiStorage {
250
404
  if (attempt >= this.options.attempts || !isRetryable(error) || this.options.signal?.aborted) {
251
405
  throw error;
252
406
  }
253
- const delay = this.options.retryDelay * 2 ** (attempt - 1);
254
- await untilAborted(new Promise((resolve) => setTimeout(resolve, delay)), this.options.signal, () => error);
407
+ const delay = Math.max(backoffDelay(this.options.backoff, attempt, this.options.random), retryAfterOf(error));
408
+ await wait(this.options.clock, delay, this.options.signal, () => error);
255
409
  }
256
410
  }
257
411
  }
@@ -261,9 +415,9 @@ export class ApiStorage {
261
415
  if (this.options.signal)
262
416
  signals.push(this.options.signal);
263
417
  const timer = this.options.timeout > 0 ? new AbortController() : undefined;
264
- let timeoutHandle;
418
+ let cancelTimeout;
265
419
  if (timer) {
266
- timeoutHandle = setTimeout(() => timer.abort(), this.options.timeout);
420
+ cancelTimeout = this.options.clock.after(this.options.timeout, () => timer.abort());
267
421
  signals.push(timer.signal);
268
422
  }
269
423
  const signal = signals.length === 0 ? undefined : signals.length === 1 ? signals[0] : AbortSignal.any(signals);
@@ -276,8 +430,7 @@ export class ApiStorage {
276
430
  callOptions.signal = signal;
277
431
  const call = this.client.call(method, payload, callOptions);
278
432
  return untilAborted(call, signal, () => timer?.signal.aborted ? new Error(`${label} timed out after ${this.options.timeout} ms`) : new Error(`${label} was aborted`)).finally(() => {
279
- if (timeoutHandle !== undefined)
280
- clearTimeout(timeoutHandle);
433
+ cancelTimeout?.();
281
434
  });
282
435
  }
283
436
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/storage/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/storage/api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,eAAe,EACf,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GAKjB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAE,UAAU,EAAE,SAAS,EAA6B,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAgB,MAAM,gCAAgC,CAAC;AAuH5E;;;GAGG;AACH,MAAM,SAAS,GAAuB,MAAM,CAAC,MAAM,CAAC;IAClD,SAAS,EAAE,eAAe;IAC1B,cAAc,EAAE,MAAM,CAAC,iBAAiB;IACxC,UAAU,EAAE,MAAM,CAAC,iBAAiB;IACpC,QAAQ,EAAE,MAAM,CAAC,iBAAiB;IAClC,aAAa,EAAE,MAAM,CAAC,iBAAiB;CACxC,CAAC,CAAC;AAEH,mFAAmF;AACnF,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,SAAS,KAAK,IAAI,CACtD,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,KAAK,GAAI,KAA2C,EAAE,YAAY,CAAC;IACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,2DAA2D;AAC3D,SAAS,YAAY,CAAI,OAAmB,EAAE,MAA+B,EAAE,QAAqB;IAClG,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AACpE,SAAS,IAAI,CAAC,KAAY,EAAE,EAAU,EAAE,MAA+B,EAAE,QAAqB;IAC5F,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE;YAClC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,IAAI,KAAK,WAAW,CAAC;AAC3G,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC;AACxH,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAI,MAAe,EAAE,KAAa;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA0B,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC1J,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,2CAA2C,CAAC,CAAC;IACvE,CAAC;IACD,OAAQ,MAA0C,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAS;IACf,OAAO,CAgBb;IACM,MAAM,GAAG,KAAK,CAAC;IACvB,2FAA2F;IACnF,cAAc,GAAG,KAAK,CAAC;IAC/B,2FAA2F;IACnF,eAAe,GAAG,KAAK,CAAC;IAEhC,YAAY,MAAc,EAAE,OAA0B;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;QAC1G,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kDAAkD,MAAM,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG;YACb,OAAO;YACP,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,UAAU,EAAE;gBACV,GAAG,EAAE,KAAK;gBACV,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,SAAS;gBAClB,GAAG,EAAE,KAAK;gBACV,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,KAAK;gBACV,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,aAAa;gBAC1B,QAAQ,EAAE,UAAU;gBACpB,GAAG,OAAO,CAAC,UAAU;aACtB;YACD,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,KAAK;YACxD,QAAQ,EACN,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;YACtH,OAAO,EAAE;gBACP,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,GAAG;gBACzD,MAAM;gBACN,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,IAAI,KAAK;gBAChE,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE;aACjF;YACD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;YACrC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;YAC7C,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/D,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;YACzC,+EAA+E;YAC/E,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK;YACvF,wEAAwE;YACxE,UAAU,EAAE,OAAO,CAAC,OAAO,KAAK,SAAS;SAC1C,CAAC;IACJ,CAAC;IAED,EAAE;IACF,0BAA0B;IAC1B,EAAE;IAEF;;;;OAIG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAuB,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,MAAM,CAAC,KAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,kFAAkF;QAClF,OAAO,CAAC,MAAM,IAAI,SAAS,CAAkB,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAM,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,iCAAiC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,UAAU;QACd,OAAO,SAAS,CAAI,MAAM,IAAI,CAAC,IAAI,CAAU,SAAS,EAAE,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,UAAU,CAAC,CAAC;IAClG,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAW,KAAK,EAAE,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;oBACtE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,qCAAqC,CAAC,CAAC;gBAChF,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,KAAc;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,SAAS,EACT,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CACrC,CAAC;QACF,IACE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YACnF,OAAO,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EACpG,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,6DAA6D,CAAC,CAAC;QACxG,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,SAA+B;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,KAAK,CAAC,QAAyB,EAAE,OAAO,GAAwB,EAAE,EAAE,MAA2B;QACnG,kFAAkF;QAClF,MAAM,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAClD,MAAM,QAAQ,GAAG,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACnG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG;gBACZ,QAAQ;gBACR,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBACzD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBACzD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;aAC7D,CAAC;YACF,IAAI,CAAC;gBACH,OAAO,SAAS,CAAI,MAAM,IAAI,CAAC,IAAI,CAAU,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,OAAO,CAAC,CAAC;YAC/F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;gBACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAU,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAS,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,EAAE;IACF,2BAA2B;IAC3B,EAAE;IAEF;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,KAAQ,EAAE,OAA6B;QAC3D,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAA6B;QACpD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAU,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA6B;QACvC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAU,EAAE,MAAoB,EAAE,OAA6B;QACzE,MAAM,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAChG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAU,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,wCAAwC,CAAC,CAAC;QAC7G,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,MAAM,CAAC,KAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAED,EAAE;IACF,0BAA0B;IAC1B,EAAE;IAEF,KAAK,CAAC,QAAQ,CAAC,KAAyB,EAAE,OAA6B;QACrE,qDAAqD;QACrD,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAa,EAAE,OAA6B;QAC5D,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAS,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAa;QAC1B,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAA2B,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEtF,wBAAwB;QACxB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;QACpC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,EAAE;IACF,+BAA+B;IAC/B,EAAE;IAEF;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEtC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;aAC9B;SACF,CAAC;IACJ,CAAC;IAED,EAAE;IACF,2BAA2B;IAC3B,EAAE;IAEF,yFAAyF;IACjF,QAAQ,CAAC,OAAwC;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,IAAI,CAAO,SAA0D,EAAE,OAAgB;QACnG,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,OAAO,YAAY,CAAC,CAAC;QACxF,MAAM,MAAM,GAAW;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS;YAC1D,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC7E,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAEtD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBAC5F,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9G,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAc,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,2FAA2F;IACnF,OAAO,CAAO,MAAc,EAAE,OAAgB,EAAE,KAAa;QACnE,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,IAAI,aAAuC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/G,2FAA2F;QAC3F,6EAA6E;QAC7E,8FAA8F;QAC9F,sDAAsD;QACtD,MAAM,WAAW,GAAyB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACrF,IAAI,MAAM;YAAE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAgB,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CACrC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,cAAc,CAAC,CAC7H,CAAC,OAAO,CAAC,GAAG,EAAE;YACb,aAAa,EAAE,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * The push feed of the remote changes of a `HybridStorage` (roadmap CLI-21, CLI-15).
3
+ *
4
+ * A `RemoteChangeFeed` pushes the deltas of the remote. When the `since` of a delta is the cursor
5
+ * of the storage, the storage applies the delta without a read. A gap, a lost event or a new
6
+ * subscription makes the storage read the changes since its cursor. Thus the feed replaces most
7
+ * of the periodic pulls, and the pulls stay correct when the feed loses an event.
8
+ *
9
+ * `EventsChangeFeed` is the feed of the change events of the core collection procedures: the topic
10
+ * `collections.<name>` of `events.subscribe` (`documentation/EVENTS.md`). By default, an event has
11
+ * only the ids and the versions: the feed gives it as a hint, and the storage reads the values
12
+ * with a pull, through the checks of a read. The file imports no module of Node, so it runs in a
13
+ * browser.
14
+ */
15
+ import type { StorageChanges } from "@procedures/collections";
16
+ import { type RemoteEvent, type SubscribeOptions, type Subscription, type SubscriptionError } from "@procedures/client";
17
+ import type { EventTransport } from "@procedures/client/events";
18
+ /**
19
+ * A delta of the remote that a feed pushes: the changes between two versions of the remote. The
20
+ * changes have the form of `getChangesSince()`.
21
+ */
22
+ export interface RemoteChanges<T> extends StorageChanges<T> {
23
+ /**
24
+ * The version of the remote before the changes. A storage applies the delta without a read only
25
+ * when this version is its cursor. Without it, the storage reads the changes.
26
+ */
27
+ readonly since?: string | undefined;
28
+ /** The origin of the writes of the delta, when one origin made all of them. */
29
+ readonly origin?: string | undefined;
30
+ }
31
+ /**
32
+ * A hint of the remote (roadmap CLI-15): the ids that changed between two versions, without their
33
+ * values. A value reaches a subscriber only through a read, with the checks of a read.
34
+ */
35
+ export interface RemoteChangeHint {
36
+ /** The version of the remote before the changes, or undefined when the chain of versions starts. */
37
+ readonly since?: string | undefined;
38
+ /** The version of the remote after the changes, or undefined for a remote without a change log. */
39
+ readonly version?: string | undefined;
40
+ /** The ids of the items that changed: the listener reads their values. */
41
+ readonly changed: readonly string[];
42
+ /** The ids that were deleted. A delete needs no value. */
43
+ readonly deleted: readonly string[];
44
+ /** The origin of the writes, when one origin made all of them. */
45
+ readonly origin?: string | undefined;
46
+ }
47
+ /** The functions that get the pushes of a feed. */
48
+ export interface RemoteChangeListener<T> {
49
+ /** This function gets a delta of the remote with its values. The listener applies it, or reads the changes. */
50
+ onChanges(changes: RemoteChanges<T>): void;
51
+ /**
52
+ * This function gets a hint without values. The listener reads the changes, or applies the
53
+ * deletes when no value changed. Without it, a hint goes to `onGap()`.
54
+ */
55
+ onHint?(hint: RemoteChangeHint): void;
56
+ /**
57
+ * This function tells that the feed can have lost changes: a gap of the events, a lost event, or
58
+ * a new subscription. The listener reads the changes since its cursor.
59
+ */
60
+ onGap(): void;
61
+ /** This function gets the error that stops the feed. The listener then reads the changes only with its pulls. */
62
+ onError?(error: unknown): void;
63
+ }
64
+ /** A push feed of the changes of a remote storage (roadmap CLI-21). */
65
+ export interface RemoteChangeFeed<T> {
66
+ /**
67
+ * This method starts to push the changes to a listener. Each new subscription calls `onGap()`
68
+ * when it starts, so the listener reads the changes that came before it.
69
+ *
70
+ * @returns The function that stops the pushes. A second use of it does nothing.
71
+ */
72
+ subscribe(listener: RemoteChangeListener<T>): () => void;
73
+ }
74
+ /**
75
+ * An object that subscribes to the topics of the event bus of a server: a `Client`, or a
76
+ * `WebSocketTransport` of `@procedures/client`.
77
+ */
78
+ export interface EventSubscriber {
79
+ subscribe<E = unknown>(topics: string | readonly string[], handler: (data: E, event: RemoteEvent<E>) => void | Promise<void>, options?: SubscribeOptions): Subscription;
80
+ }
81
+ /** The source of the events of an `EventsChangeFeed`: an `EventSubscriber`, or a transport. */
82
+ export type ChangeEventSource = EventSubscriber | EventTransport;
83
+ /** The options of an `EventsChangeFeed`. */
84
+ export interface EventsChangeFeedOptions {
85
+ /** The collection of the core collection procedures. The topic is `collections.<collection>`. */
86
+ collection?: string | undefined;
87
+ /** The topic of the change events, for example with a partition. It comes before `collection`. */
88
+ topic?: string | undefined;
89
+ /**
90
+ * The options of the subscription: the resubscribe rules, the backoff, the clock and the
91
+ * metadata of the call. The feed gives `onSubscribed` and `onError` itself.
92
+ * @default `{ maxAttempts: Infinity }`: the feed resubscribes until it stops
93
+ */
94
+ subscription?: Omit<SubscribeOptions, "onSubscribed" | "onError"> | undefined;
95
+ /** This function gets the error that ends the subscription, for example `TOPIC_NOT_FOUND`. */
96
+ onError?: ((error: SubscriptionError) => void) | undefined;
97
+ }
98
+ /**
99
+ * The push feed of the change events of the core collection procedures (roadmap CLI-15). It
100
+ * subscribes to the topic `collections.<name>` with `events.subscribe`. The delivery of the events
101
+ * is at most once, so the feed treats them as hints:
102
+ *
103
+ * - An event without values (the default of the procedures) or with withheld values goes to
104
+ * `onHint()`. The storage reads the values with a pull, so each value passes the checks of a
105
+ * read. A hint with only deletes applies without a pull when `since` is the cursor.
106
+ * - An event with the values of each changed id (the option `values` of the procedures) goes to
107
+ * `onChanges()`. The storage applies it without a read when `since` is its cursor.
108
+ * - A gap of the numbers of the events, a lost event (`dropped`), an event of another form, and
109
+ * each confirmation of the subscription (the first one and each resubscribe) call `onGap()`.
110
+ * - The error that ends the subscription goes to `onError` of the options and of the listener.
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const users = new HybridStorage(new ApiStorage(client, { collection: "users" }), {
115
+ * versionOf: (user) => user.rev,
116
+ * feed: new EventsChangeFeed(client, { collection: "users" }),
117
+ * });
118
+ * ```
119
+ */
120
+ export declare class EventsChangeFeed<T> implements RemoteChangeFeed<T> {
121
+ /** The topic of the change events. */
122
+ readonly topic: string;
123
+ private readonly source;
124
+ private readonly subscription;
125
+ private readonly onError;
126
+ /**
127
+ * @param source - A `Client` or a `WebSocketTransport`, or another transport of the client
128
+ * @param options - The collection or the topic, and the options of the subscription
129
+ */
130
+ constructor(source: ChangeEventSource, options: EventsChangeFeedOptions);
131
+ subscribe(listener: RemoteChangeListener<T>): () => void;
132
+ }
133
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/storage/feed.ts"],"names":[],"mappings":"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"}