@estiva-app/platform 0.3.1 → 0.5.0

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.
@@ -0,0 +1,449 @@
1
+ const host = globalThis;
2
+ export const SNAPSHOT_MAX_EVENTS = 10_000;
3
+ export const SNAPSHOT_SAVE_AFTER_MS = 1_000;
4
+ /** The scope of one person's copy on one relay. */
5
+ export function snapshotScope(relayUrl, pubkey) {
6
+ return `${relayUrl.replace(/\/+$/, '')}|${pubkey}`;
7
+ }
8
+ function sortedValue(value) {
9
+ return Array.isArray(value) ? [...value].map(String).sort() : value;
10
+ }
11
+ /** A filter's identity as a question, without its clock (`since`, `until`). */
12
+ export function snapshotFilterKey(filter) {
13
+ const keys = Object.keys(filter)
14
+ .filter((k) => k !== 'since' && k !== 'until')
15
+ .sort();
16
+ return JSON.stringify(keys.map((k) => [k, sortedValue(filter[k])]));
17
+ }
18
+ /** Whether an event matches a filter, `limit` aside — NIP-01's rule. */
19
+ export function matchesSnapshotFilter(filter, event) {
20
+ for (const [key, value] of Object.entries(filter)) {
21
+ if (key === 'limit')
22
+ continue;
23
+ if (key === 'ids') {
24
+ if (!value.includes(event.id))
25
+ return false;
26
+ }
27
+ else if (key === 'kinds') {
28
+ if (!value.includes(event.kind))
29
+ return false;
30
+ }
31
+ else if (key === 'authors') {
32
+ if (!value.includes(event.pubkey))
33
+ return false;
34
+ }
35
+ else if (key === 'since') {
36
+ if (event.created_at < value)
37
+ return false;
38
+ }
39
+ else if (key === 'until') {
40
+ if (event.created_at > value)
41
+ return false;
42
+ }
43
+ else if (key.startsWith('#') && key.length === 2) {
44
+ const name = key.slice(1);
45
+ const wanted = value;
46
+ if (!event.tags.some((tag) => tag[0] === name && tag[1] !== undefined && wanted.includes(tag[1])))
47
+ return false;
48
+ }
49
+ else {
50
+ // `search`, or anything this rule does not know: not something a copy can judge.
51
+ return false;
52
+ }
53
+ }
54
+ return true;
55
+ }
56
+ function answerable(filter) {
57
+ return Object.keys(filter).every((key) => ['ids', 'kinds', 'authors', 'since', 'until', 'limit'].includes(key) || (key.startsWith('#') && key.length === 2));
58
+ }
59
+ /** Newest first, then by id: the order a relay answers in. */
60
+ function byRelayOrder(a, b) {
61
+ return b.created_at - a.created_at || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
62
+ }
63
+ /** The coordinate a replaceable event replaces, or null for a regular one. */
64
+ function replaceableKey(event) {
65
+ const { kind } = event;
66
+ if (kind === 0 || kind === 3 || (kind >= 10_000 && kind < 20_000))
67
+ return `${kind}:${event.pubkey}`;
68
+ if (kind >= 30_000 && kind < 40_000) {
69
+ const d = event.tags.find((tag) => tag[0] === 'd')?.[1] ?? '';
70
+ return `${kind}:${event.pubkey}:${d}`;
71
+ }
72
+ return null;
73
+ }
74
+ export function createEventSnapshot(options) {
75
+ const { storage, scope, version } = options;
76
+ const owner = options.owner ?? scope.slice(scope.lastIndexOf('|') + 1);
77
+ /** The storage's sign-out count when this copy was read; no read, no write. */
78
+ let epoch;
79
+ const maxEvents = options.maxEvents ?? SNAPSHOT_MAX_EVENTS;
80
+ const saveAfterMs = options.saveAfterMs ?? SNAPSHOT_SAVE_AFTER_MS;
81
+ const now = options.now ?? (() => Date.now());
82
+ const timers = () => options.timers ?? host;
83
+ const events = new Map();
84
+ const byCoordinate = new Map();
85
+ const byContent = new Map();
86
+ /** Plaintexts for a ciphertext no held event carries: this page load only. */
87
+ const looseText = new Map();
88
+ const filters = new Set();
89
+ const dirty = new Set();
90
+ const removed = new Set();
91
+ let filtersDirty = false;
92
+ let timer;
93
+ let closed = false;
94
+ function drop(id) {
95
+ const held = events.get(id);
96
+ if (!held)
97
+ return;
98
+ events.delete(id);
99
+ const coordinate = replaceableKey(held.event);
100
+ if (coordinate) {
101
+ if (byCoordinate.get(coordinate) === id)
102
+ byCoordinate.delete(coordinate);
103
+ if (byContent.get(held.event.content) === id)
104
+ byContent.delete(held.event.content);
105
+ }
106
+ dirty.delete(id);
107
+ removed.add(id);
108
+ }
109
+ function hold(stored, mark) {
110
+ const { event } = stored;
111
+ const coordinate = replaceableKey(event);
112
+ if (coordinate) {
113
+ const current = byCoordinate.get(coordinate);
114
+ const currentEvent = current ? events.get(current)?.event : undefined;
115
+ if (currentEvent && currentEvent.id !== event.id) {
116
+ if (byRelayOrder(currentEvent, event) <= 0)
117
+ return;
118
+ drop(currentEvent.id);
119
+ }
120
+ byCoordinate.set(coordinate, event.id);
121
+ }
122
+ const previous = events.get(event.id);
123
+ // A plaintext belongs to the person's own blob — a replaceable event they signed — and
124
+ // never to somebody else's event that happens to carry the same ciphertext.
125
+ const own = coordinate !== null && event.pubkey === owner;
126
+ const plaintext = own ? (stored.plaintext ?? previous?.plaintext ?? looseText.get(event.content)) : undefined;
127
+ events.set(event.id, { event, seenAt: stored.seenAt, ...(plaintext !== undefined ? { plaintext } : {}) });
128
+ if (own && event.content)
129
+ byContent.set(event.content, event.id);
130
+ if (mark) {
131
+ dirty.add(event.id);
132
+ removed.delete(event.id);
133
+ }
134
+ }
135
+ function schedule() {
136
+ if (closed || timer !== undefined)
137
+ return;
138
+ timer = timers().setTimeout(() => {
139
+ timer = undefined;
140
+ void flush();
141
+ }, saveAfterMs);
142
+ }
143
+ async function flush() {
144
+ if (timer !== undefined) {
145
+ timers().clearTimeout(timer);
146
+ timer = undefined;
147
+ }
148
+ if (closed || epoch === undefined || (!dirty.size && !removed.size && !filtersDirty))
149
+ return;
150
+ const change = {
151
+ version,
152
+ epoch,
153
+ put: [...dirty].flatMap((id) => {
154
+ const held = events.get(id);
155
+ return held ? [held] : [];
156
+ }),
157
+ remove: [...removed],
158
+ filters: [...filters],
159
+ };
160
+ dirty.clear();
161
+ removed.clear();
162
+ filtersDirty = false;
163
+ try {
164
+ await storage.save(scope, change);
165
+ }
166
+ catch {
167
+ // A copy that could not be written is a slower next load, not a failure —
168
+ // but what it carried is asked again next time, removals above all: a
169
+ // deletion that never reached storage would be drawn on every reload.
170
+ for (const stored of change.put)
171
+ if (events.has(stored.event.id) && !removed.has(stored.event.id))
172
+ dirty.add(stored.event.id);
173
+ for (const id of change.remove)
174
+ if (!events.has(id))
175
+ removed.add(id);
176
+ filtersDirty = true;
177
+ schedule();
178
+ }
179
+ }
180
+ /** Answers taken in before the stored copy was read: applied over it, never under it. */
181
+ const early = [];
182
+ let loaded = false;
183
+ const ready = (async () => {
184
+ try {
185
+ const read = await storage.load(scope);
186
+ epoch = read.epoch;
187
+ const record = read.record;
188
+ if (record && record.version === version) {
189
+ for (const stored of record.events)
190
+ hold(stored, false);
191
+ for (const key of record.filters)
192
+ filters.add(key);
193
+ }
194
+ }
195
+ catch {
196
+ // Unreadable (a private window, storage refused, a corrupt record): no copy.
197
+ }
198
+ loaded = true;
199
+ for (const [asked, answer] of early.splice(0))
200
+ take(asked, answer);
201
+ })();
202
+ function take(asked, answer) {
203
+ if (closed)
204
+ return;
205
+ const seenAt = now();
206
+ for (const event of answer)
207
+ hold({ event, seenAt }, true);
208
+ const returned = new Set(answer.map((event) => event.id));
209
+ for (const filter of asked) {
210
+ if (!answerable(filter))
211
+ continue;
212
+ const key = snapshotFilterKey(filter);
213
+ if (!filters.has(key)) {
214
+ filters.add(key);
215
+ filtersDirty = true;
216
+ }
217
+ const sent = answer.filter((event) => matchesSnapshotFilter(filter, event));
218
+ // Cut by its limit — counted on the whole answer too when it is the only filter, so an
219
+ // event the relay matched and this rule does not cannot make a cut answer look whole.
220
+ const limit = typeof filter.limit === 'number' ? filter.limit : Infinity;
221
+ const cut = sent.length >= limit || (asked.length === 1 && answer.length >= limit);
222
+ const floor = cut && sent.length ? Math.min(...sent.map((event) => event.created_at)) : cut ? Infinity : -Infinity;
223
+ for (const stored of [...events.values()]) {
224
+ const { event } = stored;
225
+ // At the cut's own second the relay may have held back events it still has: not judged.
226
+ if (returned.has(event.id) || (cut && event.created_at <= floor))
227
+ continue;
228
+ if (matchesSnapshotFilter(filter, event))
229
+ drop(event.id);
230
+ }
231
+ }
232
+ for (const event of answer) {
233
+ if (event.kind !== 5)
234
+ continue;
235
+ for (const tag of event.tags) {
236
+ if (!tag[1])
237
+ continue;
238
+ if (tag[0] === 'e' && events.get(tag[1])?.event.pubkey === event.pubkey)
239
+ drop(tag[1]);
240
+ // An addressable file deleted by its coordinate: what its author wrote up to the deletion.
241
+ if (tag[0] === 'a' && tag[1].split(':')[1] === event.pubkey) {
242
+ const id = byCoordinate.get(tag[1]);
243
+ const target = id ? events.get(id)?.event : undefined;
244
+ if (target && target.created_at <= event.created_at)
245
+ drop(target.id);
246
+ }
247
+ }
248
+ }
249
+ trim();
250
+ schedule();
251
+ }
252
+ function trim() {
253
+ if (events.size <= maxEvents)
254
+ return;
255
+ const oldest = [...events.values()].sort((a, b) => a.seenAt - b.seenAt);
256
+ for (const stored of oldest.slice(0, events.size - maxEvents))
257
+ drop(stored.event.id);
258
+ }
259
+ return {
260
+ ready,
261
+ answer(asked) {
262
+ if (!asked.length)
263
+ return null;
264
+ if (!asked.every((f) => answerable(f) && filters.has(snapshotFilterKey(f))))
265
+ return null;
266
+ const out = new Map();
267
+ for (const filter of asked) {
268
+ const matched = [...events.values()]
269
+ .map((stored) => stored.event)
270
+ .filter((event) => matchesSnapshotFilter(filter, event))
271
+ .sort(byRelayOrder);
272
+ const limit = typeof filter.limit === 'number' ? filter.limit : matched.length;
273
+ for (const event of matched.slice(0, limit))
274
+ out.set(event.id, event);
275
+ }
276
+ return [...out.values()].sort(byRelayOrder);
277
+ },
278
+ absorb(asked, answer) {
279
+ if (closed)
280
+ return;
281
+ if (!loaded)
282
+ early.push([asked, answer]);
283
+ else
284
+ take(asked, answer);
285
+ },
286
+ plaintextOf(content) {
287
+ const id = byContent.get(content);
288
+ return (id ? events.get(id)?.plaintext : undefined) ?? looseText.get(content);
289
+ },
290
+ keepPlaintext(content, plaintext) {
291
+ if (closed)
292
+ return;
293
+ const id = byContent.get(content);
294
+ const held = id ? events.get(id) : undefined;
295
+ if (!held) {
296
+ looseText.set(content, plaintext);
297
+ return;
298
+ }
299
+ if (held.plaintext === plaintext)
300
+ return;
301
+ events.set(held.event.id, { ...held, plaintext });
302
+ dirty.add(held.event.id);
303
+ schedule();
304
+ },
305
+ size: () => events.size,
306
+ flush,
307
+ close() {
308
+ // What changed is written first: a deletion taken in a moment ago must not come back next load.
309
+ void flush();
310
+ closed = true;
311
+ },
312
+ discard() {
313
+ if (timer !== undefined)
314
+ timers().clearTimeout(timer);
315
+ timer = undefined;
316
+ closed = true;
317
+ },
318
+ };
319
+ }
320
+ /**
321
+ * Keeps nothing between page loads: for a test, and for a browser without
322
+ * IndexedDB, where the copy still answers within one load.
323
+ */
324
+ export function memorySnapshotStorage() {
325
+ const records = new Map();
326
+ let epoch = 0;
327
+ return {
328
+ records,
329
+ async load(scope) {
330
+ const record = records.get(scope);
331
+ return { epoch, record: record ? { ...record, events: [...record.events], filters: [...record.filters] } : null };
332
+ },
333
+ async save(scope, change) {
334
+ if (change.epoch !== epoch)
335
+ return;
336
+ const record = records.get(scope);
337
+ const held = new Map(record && record.version === change.version ? record.events.map((s) => [s.event.id, s]) : []);
338
+ for (const id of change.remove)
339
+ held.delete(id);
340
+ for (const stored of change.put)
341
+ held.set(stored.event.id, stored);
342
+ records.set(scope, { version: change.version, events: [...held.values()], filters: [...change.filters] });
343
+ },
344
+ async clear() {
345
+ records.clear();
346
+ epoch += 1;
347
+ },
348
+ };
349
+ }
350
+ const EVENTS = 'events';
351
+ const META = 'meta';
352
+ /** The `meta` row counting sign-outs: no scope can be named this (`snapshotScope` has a `|`). */
353
+ const SIGN_OUTS = '\u0000sign-outs';
354
+ function request(req) {
355
+ return new Promise((resolve, reject) => {
356
+ req.onsuccess = () => resolve(req.result);
357
+ req.onerror = () => reject(req.error);
358
+ });
359
+ }
360
+ function done(tx) {
361
+ return new Promise((resolve, reject) => {
362
+ tx.oncomplete = () => resolve();
363
+ tx.onerror = () => reject(tx.error);
364
+ tx.onabort = () => reject(tx.error);
365
+ });
366
+ }
367
+ /**
368
+ * The browser's storage for a copy: one database, `events` keyed by scope and
369
+ * id, and a `meta` row per scope with its version and answered filters.
370
+ */
371
+ export function indexedDbSnapshotStorage(indexedDB, name = 'estiva-snapshot') {
372
+ let opened;
373
+ const db = () => {
374
+ opened ??= new Promise((resolve, reject) => {
375
+ const req = indexedDB.open(name, 1);
376
+ req.onupgradeneeded = () => {
377
+ const database = req.result;
378
+ if (!database.objectStoreNames.contains(EVENTS)) {
379
+ database.createObjectStore(EVENTS, { keyPath: ['scope', 'id'] }).createIndex('scope', 'scope');
380
+ }
381
+ if (!database.objectStoreNames.contains(META))
382
+ database.createObjectStore(META, { keyPath: 'scope' });
383
+ };
384
+ req.onsuccess = () => resolve(req.result);
385
+ req.onerror = () => reject(req.error);
386
+ });
387
+ // A failed open is asked again next time rather than held for the page.
388
+ opened.catch(() => (opened = undefined));
389
+ return opened;
390
+ };
391
+ const epochOf = async (meta) => (await request(meta.get(SIGN_OUTS)))?.epoch ?? 0;
392
+ return {
393
+ async load(scope) {
394
+ const database = await db();
395
+ const tx = database.transaction([EVENTS, META], 'readonly');
396
+ const [epoch, meta, rows] = await Promise.all([
397
+ epochOf(tx.objectStore(META)),
398
+ request(tx.objectStore(META).get(scope)),
399
+ request(tx.objectStore(EVENTS).index('scope').getAll(scope)),
400
+ ]);
401
+ if (!meta)
402
+ return { epoch, record: null };
403
+ return {
404
+ epoch,
405
+ record: {
406
+ version: meta.version,
407
+ filters: meta.filters,
408
+ events: rows.map(({ event, plaintext, seenAt }) => ({ event, seenAt, ...(plaintext !== undefined ? { plaintext } : {}) })),
409
+ },
410
+ };
411
+ },
412
+ async save(scope, change) {
413
+ const database = await db();
414
+ // One transaction from the check to the last write: a sign-out in this tab or another
415
+ // is either wholly before it (and refuses it) or wholly after it (and clears it).
416
+ const tx = database.transaction([EVENTS, META], 'readwrite');
417
+ const metaStore = tx.objectStore(META);
418
+ const events = tx.objectStore(EVENTS);
419
+ const [epoch, meta] = await Promise.all([
420
+ epochOf(metaStore),
421
+ request(metaStore.get(scope)),
422
+ ]);
423
+ if (epoch === change.epoch) {
424
+ if (meta && meta.version !== change.version) {
425
+ const keys = await request(events.index('scope').getAllKeys(scope));
426
+ for (const key of keys)
427
+ events.delete(key);
428
+ }
429
+ for (const id of change.remove)
430
+ events.delete([scope, id]);
431
+ for (const stored of change.put)
432
+ events.put({ scope, id: stored.event.id, ...stored });
433
+ metaStore.put({ scope, version: change.version, filters: change.filters });
434
+ }
435
+ await done(tx);
436
+ },
437
+ async clear() {
438
+ const database = await db();
439
+ const tx = database.transaction([EVENTS, META], 'readwrite');
440
+ const epoch = await epochOf(tx.objectStore(META));
441
+ tx.objectStore(EVENTS).clear();
442
+ tx.objectStore(META).clear();
443
+ // Counted, so every copy opened before now — in any tab — writes nothing again.
444
+ tx.objectStore(META).put({ scope: SIGN_OUTS, epoch: epoch + 1 });
445
+ await done(tx);
446
+ },
447
+ };
448
+ }
449
+ //# sourceMappingURL=event-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-snapshot.js","sourceRoot":"","sources":["../src/event-snapshot.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -22,5 +22,7 @@
22
22
  export { MAX_FOLDERS_PER_SUBSCRIPTION, createLiveClient, createLiveClientHolder, type FolderWatch, type LiveClient, type LiveClientHolder, type LiveClientObservers, type LiveClientOptions, } from './live-client.js';
23
23
  export { createFolderActivity, type FolderActivity, type FolderListener, } from './folder-activity.js';
24
24
  export { assumeOnline, browserOnlineSource, type OnlineSource, type OnlineTarget } from './online.js';
25
+ export { RETRY_FIRST_MS, RETRY_MAX_MS, createRetryingRead, retryDelayMs, type RetryTimers, type RetryingRead, type RetryingReadOptions, type RetryingReadSnapshot, } from './retrying-read.js';
25
26
  export { DEFAULT_BACKOFF_MS, DEFAULT_MERGE_MS, MIN_BACKOFF_MS, createRefreshScheduler, createRelayBudget, isRateLimited, retryHintMs, type BudgetChannel, type FocusTarget, type RefreshScheduler, type RefreshSchedulerOptions, type RefreshSubscription, type RelayBudget, type RelayBudgetOptions, type SchedulerClock, type VisibilityTarget, } from './refresh.js';
27
+ export { SNAPSHOT_MAX_EVENTS, SNAPSHOT_SAVE_AFTER_MS, createEventSnapshot, indexedDbSnapshotStorage, matchesSnapshotFilter, memorySnapshotStorage, snapshotFilterKey, snapshotScope, type EventSnapshot, type EventSnapshotOptions, type IdbFactoryLike, type SnapshotChange, type SnapshotFilter, type SnapshotRecord, type SnapshotStorage, type SnapshotTimers, type StoredSnapshotEvent, } from './event-snapshot.js';
26
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACrG,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACrG,OAAO,EACL,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAA"}
package/dist/index.js CHANGED
@@ -22,5 +22,7 @@
22
22
  export { MAX_FOLDERS_PER_SUBSCRIPTION, createLiveClient, createLiveClientHolder, } from './live-client.js';
23
23
  export { createFolderActivity, } from './folder-activity.js';
24
24
  export { assumeOnline, browserOnlineSource } from './online.js';
25
+ export { RETRY_FIRST_MS, RETRY_MAX_MS, createRetryingRead, retryDelayMs, } from './retrying-read.js';
25
26
  export { DEFAULT_BACKOFF_MS, DEFAULT_MERGE_MS, MIN_BACKOFF_MS, createRefreshScheduler, createRelayBudget, isRateLimited, retryHintMs, } from './refresh.js';
27
+ export { SNAPSHOT_MAX_EVENTS, SNAPSHOT_SAVE_AFTER_MS, createEventSnapshot, indexedDbSnapshotStorage, matchesSnapshotFilter, memorySnapshotStorage, snapshotFilterKey, snapshotScope, } from './event-snapshot.js';
26
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,GAMvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,oBAAoB,GAGrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAwC,MAAM,aAAa,CAAA;AACrG,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,WAAW,GAUZ,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,GAMvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,oBAAoB,GAGrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAwC,MAAM,aAAa,CAAA;AACrG,OAAO,EACL,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,YAAY,GAKb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,WAAW,GAUZ,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GAUd,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,62 @@
1
+ /** The first wait before reading a failed read again. Peek's `FOLDERS_RETRY_FIRST_MS`. */
2
+ export declare const RETRY_FIRST_MS = 5000;
3
+ /** The longest wait between re-reads while a read keeps failing. */
4
+ export declare const RETRY_MAX_MS = 60000;
5
+ /** Declared here because this package compiles with neither the DOM nor the Node lib. */
6
+ export interface RetryTimers {
7
+ setTimeout(run: () => void, ms: number): unknown;
8
+ clearTimeout(handle: unknown): void;
9
+ }
10
+ export interface RetryingReadOptions {
11
+ /**
12
+ * Whether this failure could answer differently next time. Default: every
13
+ * failure is. A caller that can tell a refusal (`not_a_member`, `refused`)
14
+ * from an outage says so, and the refusal is not asked again.
15
+ */
16
+ retryable?: (error: unknown) => boolean;
17
+ firstRetryMs?: number;
18
+ maxRetryMs?: number;
19
+ /**
20
+ * How long an answer is fresh enough that {@link RetryingRead.ensure} does
21
+ * not ask again. Default: for ever — read once per tab, which is what a
22
+ * navigation listing wants; {@link RetryingRead.reload} always asks.
23
+ */
24
+ freshMs?: number;
25
+ now?: () => number;
26
+ /** Looked up on every call when absent, so a test's fake timers apply. */
27
+ timers?: RetryTimers;
28
+ }
29
+ /** Replaced, never mutated: a stable snapshot for `useSyncExternalStore` between changes. */
30
+ export interface RetryingReadSnapshot<T> {
31
+ /** The last answer, once any read has succeeded. */
32
+ value?: T;
33
+ /** Why the last read failed — only while there is no value to keep. */
34
+ error?: unknown;
35
+ /** A re-read is scheduled: a failure shown now is not the final word. */
36
+ retrying: boolean;
37
+ }
38
+ export interface RetryingRead<T> {
39
+ snapshot(): RetryingReadSnapshot<T>;
40
+ subscribe(listener: () => void): () => void;
41
+ /**
42
+ * Read, unless an answer fresher than `freshMs` is held, a read is in
43
+ * flight, or a retry is already scheduled. What a mount calls.
44
+ *
45
+ * Retries run only while something is subscribed: the last unsubscribe
46
+ * cancels a scheduled one, and the next `ensure` reads in its place.
47
+ */
48
+ ensure(load: () => Promise<T>): Promise<void>;
49
+ /** Read now, whatever is held; a scheduled retry is replaced by this read. */
50
+ reload(load: () => Promise<T>): Promise<void>;
51
+ /** Cancel a scheduled retry. The held answer stays. */
52
+ dispose(): void;
53
+ /**
54
+ * Forget everything held — for a new viewer, or between test cases. A read
55
+ * in flight across it neither writes its answer nor schedules a retry.
56
+ */
57
+ clear(): void;
58
+ }
59
+ /** The wait before the next attempt, after `failures` consecutive retryable failures. */
60
+ export declare function retryDelayMs(failures: number, error: unknown, first?: number, max?: number): number;
61
+ export declare function createRetryingRead<T>(options?: RetryingReadOptions): RetryingRead<T>;
62
+ //# sourceMappingURL=retrying-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrying-read.d.ts","sourceRoot":"","sources":["../src/retrying-read.ts"],"names":[],"mappings":"AA2BA,0FAA0F;AAC1F,eAAO,MAAM,cAAc,OAAQ,CAAA;AACnC,oEAAoE;AACpE,eAAO,MAAM,YAAY,QAAS,CAAA;AAElC,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;IAChD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;CACpC;AAID,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,6FAA6F;AAC7F,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,oDAAoD;IACpD,KAAK,CAAC,EAAE,CAAC,CAAA;IACT,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAA;IACnC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC3C;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,8EAA8E;IAC9E,MAAM,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,uDAAuD;IACvD,OAAO,IAAI,IAAI,CAAA;IACf;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAA;CACd;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,SAAiB,EAAE,GAAG,SAAe,GAAG,MAAM,CAOjH;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAAC,CAAC,CAAC,CA2FxF"}