@procedures/store 0.8.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.
- package/CHANGELOG.md +47 -0
- package/README.md +88 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/indexeddb/sync-state-store.d.ts +40 -0
- package/dist/indexeddb/sync-state-store.d.ts.map +1 -0
- package/dist/indexeddb/sync-state-store.js +94 -0
- package/dist/indexeddb/sync-state-store.js.map +1 -0
- package/dist/indexeddb.d.ts +7 -2
- package/dist/indexeddb.d.ts.map +1 -1
- package/dist/indexeddb.js +6 -2
- package/dist/indexeddb.js.map +1 -1
- package/dist/storage/api.d.ts +84 -11
- package/dist/storage/api.d.ts.map +1 -1
- package/dist/storage/api.js +148 -25
- package/dist/storage/api.js.map +1 -1
- package/dist/storage/feed.d.ts +133 -0
- package/dist/storage/feed.d.ts.map +1 -0
- package/dist/storage/feed.js +159 -0
- package/dist/storage/feed.js.map +1 -0
- package/dist/storage/hybrid.d.ts +367 -20
- package/dist/storage/hybrid.d.ts.map +1 -1
- package/dist/storage/hybrid.js +1295 -206
- package/dist/storage/hybrid.js.map +1 -1
- package/dist/storage/index.d.ts +6 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +6 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/sync-state.d.ts +56 -0
- package/dist/storage/sync-state.d.ts.map +1 -0
- package/dist/storage/sync-state.js +58 -0
- package/dist/storage/sync-state.js.map +1 -0
- package/dist/storage/synced-registry.d.ts +22 -4
- package/dist/storage/synced-registry.d.ts.map +1 -1
- package/dist/storage/synced-registry.js +63 -31
- package/dist/storage/synced-registry.js.map +1 -1
- package/dist/storage/types.d.ts +22 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/indexeddb/sync-state-store.ts +101 -0
- package/src/indexeddb.ts +7 -2
- package/src/storage/api.ts +210 -29
- package/src/storage/feed.ts +251 -0
- package/src/storage/hybrid.ts +1404 -211
- package/src/storage/index.ts +17 -0
- package/src/storage/sync-state.ts +89 -0
- package/src/storage/synced-registry.ts +76 -31
- package/src/storage/types.ts +25 -1
package/dist/storage/api.js
CHANGED
|
@@ -6,13 +6,31 @@
|
|
|
6
6
|
*
|
|
7
7
|
* This is the KEY integration between Collections and Universal Client!
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
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,24 @@ 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
|
+
}
|
|
34
70
|
/** True when the server does not know a procedure: an older server without `ids`. */
|
|
35
71
|
function isNotFound(error) {
|
|
36
72
|
return typeof error === "object" && error !== null && error.code === "NOT_FOUND";
|
|
@@ -45,6 +81,13 @@ function isFoundOutput(value) {
|
|
|
45
81
|
const record = value;
|
|
46
82
|
return typeof record["found"] === "boolean" && Object.keys(record).every((key) => key === "found" || key === "value");
|
|
47
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
|
+
}
|
|
48
91
|
/**
|
|
49
92
|
* API storage backed by universal client.
|
|
50
93
|
*
|
|
@@ -54,11 +97,16 @@ function isFoundOutput(value) {
|
|
|
54
97
|
* - set(id, value) → `collections.<collection>.set` with `{ id, value }`
|
|
55
98
|
* - setBatch(items) → `collections.<collection>.setBatch` with `{ items: [{ id, value }] }`
|
|
56
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 }`
|
|
57
102
|
* - etc.
|
|
58
103
|
*
|
|
59
104
|
* Before, the class expected a `{ data }` envelope and called `<service>.get`: no core
|
|
60
105
|
* procedure matched, and every read was undefined (deep dive CORE-9, DATA-9).
|
|
61
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
|
+
*
|
|
62
110
|
* @example
|
|
63
111
|
* ```typescript
|
|
64
112
|
* // Create API storage
|
|
@@ -71,6 +119,7 @@ function isFoundOutput(value) {
|
|
|
71
119
|
* // Operations are automatically sent to server
|
|
72
120
|
* await storage.set("123", { name: "John" });
|
|
73
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
|
|
74
123
|
* ```
|
|
75
124
|
*/
|
|
76
125
|
export class ApiStorage {
|
|
@@ -79,11 +128,19 @@ export class ApiStorage {
|
|
|
79
128
|
closed = false;
|
|
80
129
|
/** True when the server does not know the procedure `ids`: `getIds()` reads the entries */
|
|
81
130
|
idsUnsupported = false;
|
|
131
|
+
/** True when the server does not know the procedure `find`: `query()` reads the entries */
|
|
132
|
+
findUnsupported = false;
|
|
82
133
|
constructor(client, options) {
|
|
83
134
|
const service = options.service ?? (options.collection !== undefined ? `collections.${options.collection}` : undefined);
|
|
84
135
|
if (!service) {
|
|
85
136
|
throw new Error("ApiStorage requires a collection or a service");
|
|
86
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}`);
|
|
87
144
|
this.client = client;
|
|
88
145
|
this.options = {
|
|
89
146
|
service,
|
|
@@ -95,6 +152,7 @@ export class ApiStorage {
|
|
|
95
152
|
ids: "ids",
|
|
96
153
|
changes: "changes",
|
|
97
154
|
find: "find",
|
|
155
|
+
patch: "patch",
|
|
98
156
|
has: "has",
|
|
99
157
|
size: "size",
|
|
100
158
|
set: "set",
|
|
@@ -107,11 +165,21 @@ export class ApiStorage {
|
|
|
107
165
|
},
|
|
108
166
|
timeout: optionalMs(options.timeout, "timeout") ?? 30000,
|
|
109
167
|
attempts: options.retry === false ? 1 : options.retry === true || options.retry === undefined ? 3 : Math.max(1, options.retry),
|
|
110
|
-
|
|
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,
|
|
111
177
|
...(options.signal !== undefined && { signal: options.signal }),
|
|
112
178
|
closeClient: options.closeClient ?? false,
|
|
113
179
|
// A custom service can refuse an unknown input field: it gets the input { id }
|
|
114
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,
|
|
115
183
|
};
|
|
116
184
|
}
|
|
117
185
|
//
|
|
@@ -141,11 +209,7 @@ export class ApiStorage {
|
|
|
141
209
|
}
|
|
142
210
|
/** Every item with its id, from the `entries` procedure of the collection (roadmap R2). */
|
|
143
211
|
async getEntries() {
|
|
144
|
-
|
|
145
|
-
if (!Array.isArray(entries)) {
|
|
146
|
-
throw new Error(`${this.options.service}.entries did not return an array`);
|
|
147
|
-
}
|
|
148
|
-
return entries.map((entry) => [entry.id, entry.value]);
|
|
212
|
+
return entriesOf(await this.call("entries", {}), `${this.options.service}.entries`);
|
|
149
213
|
}
|
|
150
214
|
/**
|
|
151
215
|
* The ids of the items in the order of the entries, from the `ids` procedure of the collection.
|
|
@@ -187,11 +251,47 @@ export class ApiStorage {
|
|
|
187
251
|
deleted: result.deleted,
|
|
188
252
|
};
|
|
189
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
|
+
*/
|
|
190
258
|
async find(predicate) {
|
|
191
|
-
// A predicate cannot go over the network: read all items, then filter here
|
|
192
259
|
const all = await this.getAll();
|
|
193
260
|
return all.filter(predicate);
|
|
194
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
|
+
}
|
|
195
295
|
async has(id) {
|
|
196
296
|
return (await this.call("has", { id })) === true;
|
|
197
297
|
}
|
|
@@ -201,24 +301,42 @@ export class ApiStorage {
|
|
|
201
301
|
//
|
|
202
302
|
// ═══ Write Operations ═══
|
|
203
303
|
//
|
|
204
|
-
|
|
205
|
-
|
|
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) });
|
|
206
310
|
}
|
|
207
|
-
async delete(id) {
|
|
208
|
-
return (await this.call("delete", { id })) === true;
|
|
311
|
+
async delete(id, options) {
|
|
312
|
+
return (await this.call("delete", { id, ...this.originOf(options) })) === true;
|
|
209
313
|
}
|
|
210
|
-
async clear() {
|
|
211
|
-
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;
|
|
212
330
|
}
|
|
213
331
|
//
|
|
214
332
|
// ═══ Bulk Operations ═══
|
|
215
333
|
//
|
|
216
|
-
async setBatch(items) {
|
|
334
|
+
async setBatch(items, options) {
|
|
217
335
|
// The collection procedure takes objects, not tuples
|
|
218
|
-
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) });
|
|
219
337
|
}
|
|
220
|
-
async deleteBatch(ids) {
|
|
221
|
-
return Number(await this.call("deleteBatch", { ids }));
|
|
338
|
+
async deleteBatch(ids, options) {
|
|
339
|
+
return Number(await this.call("deleteBatch", { ids, ...this.originOf(options) }));
|
|
222
340
|
}
|
|
223
341
|
async getBatch(ids) {
|
|
224
342
|
const values = (await this.call("getBatch", { ids })) ?? {};
|
|
@@ -260,8 +378,14 @@ export class ApiStorage {
|
|
|
260
378
|
//
|
|
261
379
|
// ═══ Internal Helpers ═══
|
|
262
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
|
+
}
|
|
263
385
|
/**
|
|
264
|
-
* 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.
|
|
265
389
|
*/
|
|
266
390
|
async call(operation, payload) {
|
|
267
391
|
if (this.closed)
|
|
@@ -280,8 +404,8 @@ export class ApiStorage {
|
|
|
280
404
|
if (attempt >= this.options.attempts || !isRetryable(error) || this.options.signal?.aborted) {
|
|
281
405
|
throw error;
|
|
282
406
|
}
|
|
283
|
-
const delay = this.options.
|
|
284
|
-
await
|
|
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);
|
|
285
409
|
}
|
|
286
410
|
}
|
|
287
411
|
}
|
|
@@ -291,9 +415,9 @@ export class ApiStorage {
|
|
|
291
415
|
if (this.options.signal)
|
|
292
416
|
signals.push(this.options.signal);
|
|
293
417
|
const timer = this.options.timeout > 0 ? new AbortController() : undefined;
|
|
294
|
-
let
|
|
418
|
+
let cancelTimeout;
|
|
295
419
|
if (timer) {
|
|
296
|
-
|
|
420
|
+
cancelTimeout = this.options.clock.after(this.options.timeout, () => timer.abort());
|
|
297
421
|
signals.push(timer.signal);
|
|
298
422
|
}
|
|
299
423
|
const signal = signals.length === 0 ? undefined : signals.length === 1 ? signals[0] : AbortSignal.any(signals);
|
|
@@ -306,8 +430,7 @@ export class ApiStorage {
|
|
|
306
430
|
callOptions.signal = signal;
|
|
307
431
|
const call = this.client.call(method, payload, callOptions);
|
|
308
432
|
return untilAborted(call, signal, () => timer?.signal.aborted ? new Error(`${label} timed out after ${this.options.timeout} ms`) : new Error(`${label} was aborted`)).finally(() => {
|
|
309
|
-
|
|
310
|
-
clearTimeout(timeoutHandle);
|
|
433
|
+
cancelTimeout?.();
|
|
311
434
|
});
|
|
312
435
|
}
|
|
313
436
|
}
|
package/dist/storage/api.js.map
CHANGED
|
@@ -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":"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"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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 { collectionChangeTopic, subscribeRemote, } from "@procedures/client";
|
|
16
|
+
/** True for a source with `subscribe()`: it subscribes itself. */
|
|
17
|
+
function isSubscriber(source) {
|
|
18
|
+
return typeof source.subscribe === "function";
|
|
19
|
+
}
|
|
20
|
+
/** True for a string, or for no value. */
|
|
21
|
+
const optionalString = (value) => value === undefined || typeof value === "string";
|
|
22
|
+
/** True for a list of ids. */
|
|
23
|
+
const isIds = (value) => Array.isArray(value) && value.every((id) => typeof id === "string");
|
|
24
|
+
/**
|
|
25
|
+
* The delta or the hint of a change event of the collection procedures, or undefined for an
|
|
26
|
+
* event of another form. The event comes over the wire: the function examines each field.
|
|
27
|
+
*
|
|
28
|
+
* - An event with `since`, `version` and a value for each changed id is a delta: `changes`.
|
|
29
|
+
* - Each other event is a hint: an event without values, an event with withheld values (the
|
|
30
|
+
* filter of the host refused them), or a hint of a storage without a change log.
|
|
31
|
+
*/
|
|
32
|
+
function eventOf(data) {
|
|
33
|
+
if (typeof data !== "object" || data === null)
|
|
34
|
+
return undefined;
|
|
35
|
+
const event = data;
|
|
36
|
+
const { since, version, origin } = event;
|
|
37
|
+
if (!optionalString(since) || !optionalString(version) || !optionalString(origin))
|
|
38
|
+
return undefined;
|
|
39
|
+
if (!isIds(event.changed) || !isIds(event.deleted) || (event.withheld !== undefined && !isIds(event.withheld)))
|
|
40
|
+
return undefined;
|
|
41
|
+
let values;
|
|
42
|
+
if (event.values !== undefined) {
|
|
43
|
+
if (!Array.isArray(event.values))
|
|
44
|
+
return undefined;
|
|
45
|
+
values = [];
|
|
46
|
+
for (const value of event.values) {
|
|
47
|
+
const entry = value;
|
|
48
|
+
if (typeof entry !== "object" || entry === null || typeof entry.id !== "string" || !("value" in entry))
|
|
49
|
+
return undefined;
|
|
50
|
+
values.push([entry.id, entry.value]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const withOrigin = origin !== undefined ? { origin } : {};
|
|
54
|
+
const valued = new Set(values?.map(([id]) => id));
|
|
55
|
+
const withheld = event.withheld ?? [];
|
|
56
|
+
const complete = values !== undefined && withheld.length === 0 && event.changed.every((id) => valued.has(id));
|
|
57
|
+
if (since !== undefined && version !== undefined && complete) {
|
|
58
|
+
return { changes: { since, version, full: false, changed: values, deleted: event.deleted, ...withOrigin } };
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
hint: {
|
|
62
|
+
...(since !== undefined && { since }),
|
|
63
|
+
...(version !== undefined && { version }),
|
|
64
|
+
changed: event.changed,
|
|
65
|
+
deleted: event.deleted,
|
|
66
|
+
...withOrigin,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The push feed of the change events of the core collection procedures (roadmap CLI-15). It
|
|
72
|
+
* subscribes to the topic `collections.<name>` with `events.subscribe`. The delivery of the events
|
|
73
|
+
* is at most once, so the feed treats them as hints:
|
|
74
|
+
*
|
|
75
|
+
* - An event without values (the default of the procedures) or with withheld values goes to
|
|
76
|
+
* `onHint()`. The storage reads the values with a pull, so each value passes the checks of a
|
|
77
|
+
* read. A hint with only deletes applies without a pull when `since` is the cursor.
|
|
78
|
+
* - An event with the values of each changed id (the option `values` of the procedures) goes to
|
|
79
|
+
* `onChanges()`. The storage applies it without a read when `since` is its cursor.
|
|
80
|
+
* - A gap of the numbers of the events, a lost event (`dropped`), an event of another form, and
|
|
81
|
+
* each confirmation of the subscription (the first one and each resubscribe) call `onGap()`.
|
|
82
|
+
* - The error that ends the subscription goes to `onError` of the options and of the listener.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const users = new HybridStorage(new ApiStorage(client, { collection: "users" }), {
|
|
87
|
+
* versionOf: (user) => user.rev,
|
|
88
|
+
* feed: new EventsChangeFeed(client, { collection: "users" }),
|
|
89
|
+
* });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export class EventsChangeFeed {
|
|
93
|
+
/** The topic of the change events. */
|
|
94
|
+
topic;
|
|
95
|
+
source;
|
|
96
|
+
subscription;
|
|
97
|
+
onError;
|
|
98
|
+
/**
|
|
99
|
+
* @param source - A `Client` or a `WebSocketTransport`, or another transport of the client
|
|
100
|
+
* @param options - The collection or the topic, and the options of the subscription
|
|
101
|
+
*/
|
|
102
|
+
constructor(source, options) {
|
|
103
|
+
const topic = options.topic ?? (options.collection !== undefined ? collectionChangeTopic(options.collection) : undefined);
|
|
104
|
+
if (topic === undefined || topic === "")
|
|
105
|
+
throw new TypeError("EventsChangeFeed needs a collection or a topic");
|
|
106
|
+
this.topic = topic;
|
|
107
|
+
this.source = source;
|
|
108
|
+
this.subscription = { maxAttempts: Number.POSITIVE_INFINITY, ...options.subscription };
|
|
109
|
+
this.onError = options.onError;
|
|
110
|
+
}
|
|
111
|
+
subscribe(listener) {
|
|
112
|
+
/** The number of the next event: a resubscribe starts again at 1 */
|
|
113
|
+
let next = 1;
|
|
114
|
+
let stopped = false;
|
|
115
|
+
const handler = (data, event) => {
|
|
116
|
+
if (stopped)
|
|
117
|
+
return;
|
|
118
|
+
const lost = event.dropped > 0 || event.seq !== next;
|
|
119
|
+
next = event.seq + 1;
|
|
120
|
+
if (lost)
|
|
121
|
+
listener.onGap();
|
|
122
|
+
const parsed = eventOf(data);
|
|
123
|
+
if (parsed === undefined)
|
|
124
|
+
listener.onGap();
|
|
125
|
+
else if ("changes" in parsed)
|
|
126
|
+
listener.onChanges(parsed.changes);
|
|
127
|
+
// A hint: the listener reads the values with a read of its own
|
|
128
|
+
else if (listener.onHint)
|
|
129
|
+
listener.onHint(parsed.hint);
|
|
130
|
+
else
|
|
131
|
+
listener.onGap();
|
|
132
|
+
};
|
|
133
|
+
const options = {
|
|
134
|
+
...this.subscription,
|
|
135
|
+
onSubscribed: () => {
|
|
136
|
+
if (stopped)
|
|
137
|
+
return;
|
|
138
|
+
next = 1;
|
|
139
|
+
listener.onGap();
|
|
140
|
+
},
|
|
141
|
+
onError: (error) => {
|
|
142
|
+
if (stopped)
|
|
143
|
+
return;
|
|
144
|
+
this.onError?.(error);
|
|
145
|
+
listener.onError?.(error);
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
const unsubscribe = isSubscriber(this.source)
|
|
149
|
+
? this.source.subscribe(this.topic, handler, options)
|
|
150
|
+
: subscribeRemote(this.source, this.topic, handler, options);
|
|
151
|
+
return () => {
|
|
152
|
+
if (stopped)
|
|
153
|
+
return;
|
|
154
|
+
stopped = true;
|
|
155
|
+
unsubscribe();
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=feed.js.map
|