@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.
- package/CHANGELOG.md +77 -0
- package/README.md +98 -1
- 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 +94 -11
- package/dist/storage/api.d.ts.map +1 -1
- package/dist/storage/api.js +177 -24
- 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/file-queue.d.ts.map +1 -1
- package/dist/storage/file-queue.js +2 -1
- package/dist/storage/file-queue.js.map +1 -1
- package/dist/storage/hybrid.d.ts +415 -20
- package/dist/storage/hybrid.d.ts.map +1 -1
- package/dist/storage/hybrid.js +1405 -196
- 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 +240 -28
- package/src/storage/feed.ts +251 -0
- package/src/storage/file-queue.ts +2 -1
- package/src/storage/hybrid.ts +1526 -203
- 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
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/storage/feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-queue.d.ts","sourceRoot":"","sources":["../../src/storage/file-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,0CAA0C;AAC1C,qBAAa,cAAe,YAAW,UAAU;IAKnC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAJjC,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAuC;IAEpD,sFAAsF;IACtF,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"file-queue.d.ts","sourceRoot":"","sources":["../../src/storage/file-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,0CAA0C;AAC1C,qBAAa,cAAe,YAAW,UAAU;IAKnC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAJjC,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAuC;IAEpD,sFAAsF;IACtF,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA0BjC;IAED,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhD;IAED,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAED,OAAO,CAAC,KAAK;IAab,4DAA4D;YAC9C,KAAK;IAYnB,OAAO,CAAC,MAAM;CAKf"}
|
|
@@ -38,7 +38,8 @@ export class FileQueueStore {
|
|
|
38
38
|
const lines = text.split("\n");
|
|
39
39
|
// The text after the last newline is a part of a line, or empty
|
|
40
40
|
const tail = lines.pop() ?? "";
|
|
41
|
-
|
|
41
|
+
// Each line keeps its number in the file, so an error names the right line after blank lines
|
|
42
|
+
const operations = lines.flatMap((line, index) => (line.trim() === "" ? [] : [this.parse(line, index + 1)]));
|
|
42
43
|
if (tail.trim() !== "") {
|
|
43
44
|
let last;
|
|
44
45
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-queue.js","sourceRoot":"","sources":["../../src/storage/file-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAyC,MAAM,YAAY,CAAC;AAItF,0CAA0C;AAC1C,MAAM,OAAO,cAAc;IAKJ,IAAI;IAJzB,gDAAgD;IACxC,KAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEpD,sFAAsF;IACtF,YAAqB,IAAY;oBAAZ,IAAI;IAAW,CAAC;IAErC,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC5B,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,EAAE,CAAC;gBAClE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,gEAAgE;YAChE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"file-queue.js","sourceRoot":"","sources":["../../src/storage/file-queue.ts"],"names":[],"mappings":"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"}
|