@gonvex/client 0.1.32 → 0.3.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.
Files changed (59) hide show
  1. package/README.md +119 -95
  2. package/dist/control.d.ts +416 -0
  3. package/dist/control.js +210 -0
  4. package/dist/control.js.map +1 -0
  5. package/dist/error-reporter.d.ts +20 -6
  6. package/dist/error-reporter.js +55 -27
  7. package/dist/error-reporter.js.map +1 -1
  8. package/dist/index.d.ts +166 -133
  9. package/dist/index.js +1114 -1139
  10. package/dist/index.js.map +1 -1
  11. package/dist/indexeddb-replica.d.ts +20 -0
  12. package/dist/indexeddb-replica.js +193 -0
  13. package/dist/indexeddb-replica.js.map +1 -0
  14. package/dist/kv-stores.d.ts +2 -48
  15. package/dist/kv-stores.js +24 -411
  16. package/dist/kv-stores.js.map +1 -1
  17. package/dist/local-replica.d.ts +240 -0
  18. package/dist/local-replica.js +590 -0
  19. package/dist/local-replica.js.map +1 -0
  20. package/dist/optimistic.d.ts +34 -55
  21. package/dist/optimistic.js +70 -269
  22. package/dist/optimistic.js.map +1 -1
  23. package/dist/outbox.d.ts +25 -25
  24. package/dist/outbox.js +27 -27
  25. package/dist/outbox.js.map +1 -1
  26. package/dist/query-expression.d.ts +58 -0
  27. package/dist/query-expression.js +164 -0
  28. package/dist/query-expression.js.map +1 -0
  29. package/dist/replica-integrity.d.ts +5 -0
  30. package/dist/replica-integrity.js +58 -0
  31. package/dist/replica-integrity.js.map +1 -0
  32. package/package.json +4 -4
  33. package/dist/browser-cache-client.d.ts +0 -77
  34. package/dist/browser-cache-client.js +0 -156
  35. package/dist/browser-cache-client.js.map +0 -1
  36. package/dist/browser-cache-shared-worker.d.ts +0 -35
  37. package/dist/browser-cache-shared-worker.js +0 -118
  38. package/dist/browser-cache-shared-worker.js.map +0 -1
  39. package/dist/browser-cache.d.ts +0 -43
  40. package/dist/browser-cache.js +0 -67
  41. package/dist/browser-cache.js.map +0 -1
  42. package/dist/browser-capabilities.d.ts +0 -21
  43. package/dist/browser-capabilities.js +0 -31
  44. package/dist/browser-capabilities.js.map +0 -1
  45. package/dist/cache-coordinator.d.ts +0 -37
  46. package/dist/cache-coordinator.js +0 -109
  47. package/dist/cache-coordinator.js.map +0 -1
  48. package/dist/cache.d.ts +0 -74
  49. package/dist/cache.js +0 -120
  50. package/dist/cache.js.map +0 -1
  51. package/dist/persistent-cache.d.ts +0 -41
  52. package/dist/persistent-cache.js +0 -103
  53. package/dist/persistent-cache.js.map +0 -1
  54. package/dist/query-cache.d.ts +0 -88
  55. package/dist/query-cache.js +0 -346
  56. package/dist/query-cache.js.map +0 -1
  57. package/dist/sync-store.d.ts +0 -96
  58. package/dist/sync-store.js +0 -500
  59. package/dist/sync-store.js.map +0 -1
@@ -1,500 +0,0 @@
1
- export const defaultSyncStoreMaxBytes = 100 * 1024 * 1024;
2
- export class DexieSyncStore {
3
- databaseName;
4
- maxBytes;
5
- indexedDB;
6
- keyRange;
7
- database;
8
- databasePromise;
9
- disabled = false;
10
- cleanupScheduled = false;
11
- constructor(options = {}) {
12
- this.databaseName = options.databaseName ?? "gonvex-sync";
13
- this.maxBytes = positive(options.maxBytes, defaultSyncStoreMaxBytes);
14
- this.indexedDB = options.indexedDB;
15
- this.keyRange = options.IDBKeyRange;
16
- this.disabled = options.enabled === false;
17
- }
18
- async load(scope, path, args) {
19
- if (this.disabled || !scope)
20
- return undefined;
21
- try {
22
- const key = await collectionKey(scope, path, args);
23
- const database = await this.open();
24
- let collection;
25
- let storedRows = [];
26
- await database.transaction("r", database.collections, database.rows, async () => {
27
- collection = await database.collections.get(key);
28
- if (collection) {
29
- storedRows = await database.rows.where("collectionKey").equals(key).sortBy("rank");
30
- }
31
- });
32
- if (!collection)
33
- return undefined;
34
- const rows = sortSyncRows(storedRows, collection.orderBy, collection.orderDirection);
35
- void database.collections.update(key, { lastAccessedAt: Date.now() }).catch(() => undefined);
36
- return {
37
- rows: rows.map((row) => row.value),
38
- cursor: collection.cursor,
39
- keyField: collection.keyField,
40
- mode: collection.mode,
41
- truncated: collection.truncated,
42
- orderBy: collection.orderBy,
43
- orderDirection: collection.orderDirection,
44
- maxRows: collection.maxRows,
45
- maxBytes: collection.maxBytes,
46
- hashes: collection.hashes,
47
- };
48
- }
49
- catch {
50
- this.disabled = true;
51
- return undefined;
52
- }
53
- }
54
- async replace(scope, path, args, value) {
55
- if (this.disabled || !scope)
56
- return;
57
- try {
58
- const key = await collectionKey(scope, path, args);
59
- const argsHash = await hashValue(stableStringify(args));
60
- const database = await this.open();
61
- // A quiet reload re-advertises every collection at a new revision with
62
- // byte-identical rows. Rewriting them would delete and re-insert every
63
- // row of every collection on every load; IndexedDB keeps the superseded
64
- // versions until LevelDB compacts, so that churn is what grows the
65
- // origin's store into the gigabytes. Advance the cursor only.
66
- if (value.rowsUnchanged) {
67
- let metadataOnly = false;
68
- await database.transaction("rw", database.collections, async () => {
69
- const existing = await database.collections.get(key);
70
- if (!existing)
71
- return;
72
- if (existing.cursor.epoch === value.cursor.epoch
73
- && existing.cursor.revision > value.cursor.revision) {
74
- metadataOnly = true;
75
- return;
76
- }
77
- await database.collections.put({
78
- ...existing,
79
- cursor: value.cursor,
80
- keyField: value.keyField,
81
- mode: value.mode,
82
- truncated: value.truncated,
83
- orderBy: value.orderBy,
84
- orderDirection: value.orderDirection,
85
- maxRows: value.maxRows,
86
- maxBytes: value.maxBytes,
87
- hashes: value.hashes,
88
- lastAccessedAt: Date.now(),
89
- });
90
- metadataOnly = true;
91
- });
92
- // Only a missing collection record falls through to a full write.
93
- if (metadataOnly)
94
- return;
95
- }
96
- const rows = boundedRows(value.rows, value.keyField, value.maxRows, value.maxBytes, value.orderBy, value.orderDirection)
97
- .map((row, rank) => ({
98
- collectionKey: key,
99
- rowId: rowKey(row, value.keyField),
100
- value: row,
101
- rank,
102
- sizeBytes: jsonSize(row),
103
- }));
104
- const sizeBytes = rows.reduce((sum, row) => sum + row.sizeBytes, 0);
105
- await database.transaction("rw", database.collections, database.rows, async () => {
106
- const existing = await database.collections.get(key);
107
- if (existing?.cursor.epoch === value.cursor.epoch
108
- && existing.cursor.revision > value.cursor.revision)
109
- return;
110
- await database.rows.where("collectionKey").equals(key).delete();
111
- if (rows.length > 0)
112
- await database.rows.bulkPut(rows);
113
- await database.collections.put({
114
- key,
115
- scope,
116
- path,
117
- argsHash,
118
- cursor: value.cursor,
119
- keyField: value.keyField,
120
- mode: value.mode,
121
- truncated: value.truncated,
122
- orderBy: value.orderBy,
123
- orderDirection: value.orderDirection,
124
- maxRows: value.maxRows,
125
- maxBytes: value.maxBytes,
126
- hashes: value.hashes,
127
- rowCount: rows.length,
128
- sizeBytes,
129
- lastAccessedAt: Date.now(),
130
- });
131
- });
132
- this.scheduleCleanup();
133
- }
134
- catch {
135
- this.disabled = true;
136
- }
137
- }
138
- async applyDelta(scope, path, args, value) {
139
- if (this.disabled || !scope)
140
- return;
141
- try {
142
- const key = await collectionKey(scope, path, args);
143
- const database = await this.open();
144
- await database.transaction("rw", database.collections, database.rows, async () => {
145
- const collection = await database.collections.get(key);
146
- if (!collection)
147
- return;
148
- if (collection.cursor.epoch !== value.cursor.epoch
149
- || collection.cursor.revision > value.cursor.revision)
150
- return;
151
- const deleted = new Set(value.deleted);
152
- for (const row of value.upserts)
153
- deleted.delete(rowKey(row, value.keyField));
154
- if (deleted.size > 0) {
155
- await database.rows.bulkDelete([...deleted].map((rowId) => [key, rowId]));
156
- }
157
- const currentRows = await database.rows.where("collectionKey").equals(key).sortBy("rank");
158
- let nextRank = currentRows.length === 0 ? 0 : currentRows[0].rank - 1;
159
- const upsertRecords = [];
160
- for (const row of value.upserts) {
161
- const rowId = rowKey(row, value.keyField);
162
- if (!rowId)
163
- continue;
164
- upsertRecords.push({
165
- collectionKey: key,
166
- rowId,
167
- value: row,
168
- rank: nextRank--,
169
- sizeBytes: jsonSize(row),
170
- });
171
- }
172
- if (upsertRecords.length > 0)
173
- await database.rows.bulkPut(upsertRecords);
174
- const maxRows = value.maxRows ?? collection.maxRows;
175
- const maxBytes = value.maxBytes ?? collection.maxBytes;
176
- const ordered = sortSyncRows(await database.rows.where("collectionKey").equals(key).sortBy("rank"), value.orderBy ?? collection.orderBy, value.orderDirection ?? collection.orderDirection);
177
- const kept = boundedRowRecords(ordered, maxRows, maxBytes);
178
- const keptIds = new Set(kept.map((row) => row.rowId));
179
- const evicted = ordered.filter((row) => !keptIds.has(row.rowId));
180
- if (evicted.length > 0) {
181
- await database.rows.bulkDelete(evicted.map((row) => [key, row.rowId]));
182
- }
183
- const hashes = { ...(collection.hashes ?? {}) };
184
- for (const rowId of deleted)
185
- delete hashes[rowId];
186
- for (const rowId of evicted.map((row) => row.rowId))
187
- delete hashes[rowId];
188
- for (const [rowId, hash] of Object.entries(value.hashes ?? {}))
189
- hashes[rowId] = hash;
190
- await database.collections.put({
191
- ...collection,
192
- cursor: value.cursor,
193
- keyField: value.keyField,
194
- mode: value.mode ?? collection.mode,
195
- truncated: value.truncated ?? collection.truncated,
196
- orderBy: value.orderBy ?? collection.orderBy,
197
- orderDirection: value.orderDirection ?? collection.orderDirection,
198
- maxRows,
199
- maxBytes,
200
- hashes,
201
- rowCount: kept.length,
202
- sizeBytes: kept.reduce((sum, row) => sum + row.sizeBytes, 0),
203
- lastAccessedAt: Date.now(),
204
- });
205
- });
206
- this.scheduleCleanup();
207
- }
208
- catch {
209
- this.disabled = true;
210
- }
211
- }
212
- async clear(scope) {
213
- if (this.disabled && !this.database)
214
- return;
215
- try {
216
- const database = await this.open();
217
- if (!scope) {
218
- await database.transaction("rw", database.collections, database.rows, database.identities, async () => {
219
- await database.rows.clear();
220
- await database.collections.clear();
221
- await database.identities.clear();
222
- });
223
- return;
224
- }
225
- const collections = await database.collections.where("scope").equals(scope).toArray();
226
- const keys = collections.map((collection) => collection.key);
227
- const identities = await database.identities.toArray();
228
- await database.transaction("rw", database.collections, database.rows, database.identities, async () => {
229
- for (const key of keys)
230
- await database.rows.where("collectionKey").equals(key).delete();
231
- await database.collections.bulkDelete(keys);
232
- await database.identities.bulkDelete(identities.filter((entry) => entry.directive.scope === scope).map((entry) => entry.identity));
233
- });
234
- }
235
- catch {
236
- // Disposable local data must never break the application.
237
- }
238
- }
239
- async delete(scope, path, args) {
240
- if (this.disabled || !scope)
241
- return;
242
- try {
243
- const key = await collectionKey(scope, path, args);
244
- const database = await this.open();
245
- await database.transaction("rw", database.collections, database.rows, async () => {
246
- await database.rows.where("collectionKey").equals(key).delete();
247
- await database.collections.delete(key);
248
- });
249
- }
250
- catch {
251
- // Disposable local data must never break the application.
252
- }
253
- }
254
- async loadDirective(identity) {
255
- if (this.disabled || !identity)
256
- return undefined;
257
- try {
258
- const database = await this.open();
259
- const record = await database.identities.get(identity);
260
- if (!record)
261
- return undefined;
262
- void database.identities.update(identity, { lastAccessedAt: Date.now() }).catch(() => undefined);
263
- return record.directive;
264
- }
265
- catch {
266
- return undefined;
267
- }
268
- }
269
- async saveDirective(identity, directive) {
270
- if (this.disabled || !identity)
271
- return;
272
- try {
273
- const database = await this.open();
274
- await database.identities.put({ identity, directive, lastAccessedAt: Date.now() });
275
- }
276
- catch {
277
- // Warm-start metadata is an optimization, never a request prerequisite.
278
- }
279
- }
280
- close() {
281
- this.database?.close();
282
- this.database = undefined;
283
- this.databasePromise = undefined;
284
- }
285
- async open() {
286
- if (!this.databasePromise) {
287
- this.databasePromise = this.createDatabase().catch((error) => {
288
- this.databasePromise = undefined;
289
- throw error;
290
- });
291
- }
292
- return this.databasePromise;
293
- }
294
- async createDatabase() {
295
- const indexedDBValue = this.indexedDB ?? globalThis.indexedDB;
296
- const keyRangeValue = this.keyRange ?? globalThis.IDBKeyRange;
297
- if (!indexedDBValue || !keyRangeValue)
298
- throw new Error("indexeddb-unavailable");
299
- const { Dexie } = await import("dexie");
300
- const database = new Dexie(this.databaseName, {
301
- indexedDB: indexedDBValue,
302
- IDBKeyRange: keyRangeValue,
303
- });
304
- database.version(1).stores({
305
- collections: "&key, scope, [scope+lastAccessedAt], lastAccessedAt",
306
- rows: "[collectionKey+rowId], collectionKey, [collectionKey+rank]",
307
- });
308
- database.version(2).stores({
309
- collections: "&key, scope, [scope+lastAccessedAt], lastAccessedAt",
310
- rows: "[collectionKey+rowId], collectionKey, [collectionKey+rank]",
311
- identities: "&identity, lastAccessedAt",
312
- });
313
- database.on("versionchange", () => database.close());
314
- await database.open();
315
- this.database = database;
316
- return database;
317
- }
318
- scheduleCleanup() {
319
- if (this.cleanupScheduled)
320
- return;
321
- this.cleanupScheduled = true;
322
- const run = () => {
323
- this.cleanupScheduled = false;
324
- void this.cleanup().catch(() => undefined);
325
- };
326
- if (typeof globalThis.requestIdleCallback === "function") {
327
- globalThis.requestIdleCallback(run, { timeout: 2_000 });
328
- }
329
- else {
330
- setTimeout(run, 0);
331
- }
332
- }
333
- async cleanup() {
334
- const database = await this.open();
335
- const collections = await database.collections.orderBy("lastAccessedAt").reverse().toArray();
336
- let bytes = 0;
337
- const evict = [];
338
- for (const collection of collections) {
339
- if (bytes + collection.sizeBytes > this.maxBytes) {
340
- evict.push(collection.key);
341
- }
342
- else {
343
- bytes += collection.sizeBytes;
344
- }
345
- }
346
- if (evict.length === 0)
347
- return;
348
- await database.transaction("rw", database.collections, database.rows, async () => {
349
- for (const key of evict)
350
- await database.rows.where("collectionKey").equals(key).delete();
351
- await database.collections.bulkDelete(evict);
352
- });
353
- }
354
- }
355
- export function createSyncStore(options) {
356
- if (options === false || options?.enabled === false)
357
- return undefined;
358
- if (options?.store)
359
- return options.store;
360
- return new DexieSyncStore(options);
361
- }
362
- function boundedRows(rows, keyField, maxRows, maxBytes, orderBy, orderDirection) {
363
- const seen = new Set();
364
- const kept = [];
365
- let bytes = 0;
366
- for (const row of sortSyncRows(rows, orderBy, orderDirection)) {
367
- const key = rowKey(row, keyField);
368
- if (!key || seen.has(key))
369
- continue;
370
- const size = jsonSize(row);
371
- if (maxRows && kept.length >= maxRows)
372
- break;
373
- if (maxBytes && bytes + size > maxBytes)
374
- break;
375
- seen.add(key);
376
- bytes += size;
377
- kept.push(row);
378
- }
379
- return kept;
380
- }
381
- function sortSyncRows(rows, orderBy, orderDirection) {
382
- if (!orderBy)
383
- return rows;
384
- const direction = orderDirection === "asc" ? 1 : -1;
385
- return [...rows].sort((left, right) => {
386
- const leftValue = syncOrderValue(syncSortableValue(left), orderBy);
387
- const rightValue = syncOrderValue(syncSortableValue(right), orderBy);
388
- if (leftValue === rightValue)
389
- return 0;
390
- if (leftValue === null)
391
- return 1;
392
- if (rightValue === null)
393
- return -1;
394
- return leftValue < rightValue ? -direction : direction;
395
- });
396
- }
397
- function syncSortableValue(value) {
398
- if (value
399
- && typeof value === "object"
400
- && !Array.isArray(value)
401
- && "collectionKey" in value
402
- && "rowId" in value
403
- && "rank" in value
404
- && "value" in value) {
405
- return value.value;
406
- }
407
- return value;
408
- }
409
- function syncOrderValue(value, orderBy) {
410
- if (!value || Array.isArray(value) || typeof value !== "object")
411
- return null;
412
- const candidate = value[orderBy];
413
- return typeof candidate === "string" || typeof candidate === "number" ? candidate : null;
414
- }
415
- function boundedRowRecords(rows, maxRows, maxBytes) {
416
- const kept = [];
417
- let bytes = 0;
418
- for (const row of rows) {
419
- if (maxRows && kept.length >= maxRows)
420
- break;
421
- if (maxBytes && bytes + row.sizeBytes > maxBytes)
422
- break;
423
- kept.push(row);
424
- bytes += row.sizeBytes;
425
- }
426
- return kept;
427
- }
428
- function rowKey(value, keyField) {
429
- if (!value || Array.isArray(value) || typeof value !== "object")
430
- return "";
431
- const key = value[keyField];
432
- return key === null || key === undefined ? "" : String(key);
433
- }
434
- async function collectionKey(scope, path, args) {
435
- return `${scope}:${await hashValue(`${path}\u0000${stableStringify(args)}`)}`;
436
- }
437
- async function hashValue(value) {
438
- const subtle = globalThis.crypto?.subtle;
439
- if (!subtle)
440
- throw new Error("web-crypto-unavailable");
441
- const digest = await subtle.digest("SHA-256", new TextEncoder().encode(value));
442
- return Array.from(new Uint8Array(digest), (part) => part.toString(16).padStart(2, "0")).join("");
443
- }
444
- export async function syncHashesDigest(hashes) {
445
- const pairs = Object.keys(hashes).sort(utf8KeyCompare).map((key) => [key, hashes[key]]);
446
- return hashValue(stableStringify(pairs));
447
- }
448
- /**
449
- * Hash the rows the client actually materialized. Persisted server-provided
450
- * hashes are only a resume optimization; they are not integrity evidence until
451
- * they have been recomputed from the IndexedDB values that the UI will read.
452
- */
453
- export async function syncRowsHashes(rows, keyField) {
454
- const seen = new Set();
455
- const entries = await Promise.all(rows.map(async (row) => {
456
- const key = rowKey(row, keyField);
457
- if (!key)
458
- throw new Error(`sync row is missing key ${JSON.stringify(keyField)}`);
459
- if (seen.has(key))
460
- throw new Error(`sync collection contains duplicate key ${JSON.stringify(key)}`);
461
- seen.add(key);
462
- return [key, await hashValue(stableStringify(row))];
463
- }));
464
- return Object.fromEntries(entries);
465
- }
466
- function stableStringify(value) {
467
- if (typeof value === "string") {
468
- // Go's JSON encoder always escapes the two JavaScript line-separator code
469
- // points. Make the cross-language row hash canonical even after a row has
470
- // made an IndexedDB structured-clone round trip.
471
- return JSON.stringify(value)
472
- .replace(/\u2028/g, "\\u2028")
473
- .replace(/\u2029/g, "\\u2029");
474
- }
475
- if (value === null || typeof value !== "object")
476
- return JSON.stringify(value);
477
- if (Array.isArray(value))
478
- return `[${value.map(stableStringify).join(",")}]`;
479
- return `{${Object.keys(value)
480
- .sort(utf8KeyCompare)
481
- .map((key) => `${stableStringify(key)}:${stableStringify(value[key])}`)
482
- .join(",")}}`;
483
- }
484
- function utf8KeyCompare(left, right) {
485
- const leftBytes = new TextEncoder().encode(left);
486
- const rightBytes = new TextEncoder().encode(right);
487
- const length = Math.min(leftBytes.length, rightBytes.length);
488
- for (let index = 0; index < length; index += 1) {
489
- if (leftBytes[index] !== rightBytes[index])
490
- return leftBytes[index] - rightBytes[index];
491
- }
492
- return leftBytes.length - rightBytes.length;
493
- }
494
- function jsonSize(value) {
495
- return new TextEncoder().encode(stableStringify(value)).byteLength;
496
- }
497
- function positive(value, fallback) {
498
- return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;
499
- }
500
- //# sourceMappingURL=sync-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-store.js","sourceRoot":"","sources":["../src/sync-store.ts"],"names":[],"mappings":"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"}