@procedures/store 0.48.2 → 0.49.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.
@@ -110,9 +110,13 @@ export interface HybridStorageOptions {
110
110
  *
111
111
  * @param local - Local version
112
112
  * @param remote - Remote version
113
+ * @param base - The remote value that the queued writes of the id changed (roadmap CLI-109). A
114
+ * three-way merge uses it. `null`: the remote had no item. The value is undefined when the
115
+ * storage does not know it. Examples are a storage with no `versionOf`, an operation of an
116
+ * older version, and a write after a restart, before a sync.
113
117
  * @returns Merged value
114
118
  */
115
- mergeFn?: <T>(local: T, remote: T) => T;
119
+ mergeFn?: <T>(local: T, remote: T, base: T | null | undefined) => T;
116
120
  /**
117
121
  * The key of a remote item, for the local cache. The default reads a string `id` field. Give
118
122
  * a function for items with another key, for example `getSerializedKey` for procedure records.
@@ -197,6 +201,13 @@ export interface HybridStorageOptions {
197
201
  * `UNAUTHORIZED` is not a refusal by default, because a new token can let the write through.
198
202
  */
199
203
  isRefusal?: (error: unknown) => boolean;
204
+ /**
205
+ * True when an error of the remote tells that a write is larger than its limit (roadmap CLI-108). A batch with this
206
+ * error, or with a refusal, goes again as one write for each id. So only the bad write leaves the queue. A write of one
207
+ * id with this error leaves the queue with the reason `too-large`, and the writes behind it go on. The default: the
208
+ * code `PAYLOAD_TOO_LARGE`.
209
+ */
210
+ isTooLarge?: (error: unknown) => boolean;
200
211
  /**
201
212
  * This hook gets each queued write that the remote refused (roadmap O67). The local copy of its
202
213
  * ids gets the remote values again, except for an id that a later queued write changes. An
@@ -410,13 +421,16 @@ export interface DroppedWrite {
410
421
  * The last queued write gives the value when an id has more than one.
411
422
  */
412
423
  value: unknown;
413
- /** The cause: the policy took the remote value, the remote deleted the item, or the remote refused the write. */
414
- reason: "conflict" | "remote-delete" | "refused";
424
+ /**
425
+ * The cause: the policy took the remote value, the remote deleted the item, or the remote refused the write. The
426
+ * cause `too-large` tells that the write was larger than the limit of the remote (roadmap CLI-108).
427
+ */
428
+ reason: "conflict" | "remote-delete" | "refused" | "too-large";
415
429
  /** The sync that dropped the write. */
416
430
  during: "pull" | "push";
417
431
  /** The remote value that replaced the write, for the reason `conflict`. */
418
432
  remote?: unknown;
419
- /** The error of the remote, for the reason `refused`. */
433
+ /** The error of the remote, for the reasons `refused` and `too-large`. */
420
434
  error?: unknown;
421
435
  }
422
436
  /**
@@ -597,6 +611,13 @@ export declare class HybridStorage<T> implements CollectionStorage<T> {
597
611
  private changesUnsupported;
598
612
  /** With `versionOf`: the last known remote version of each id. `null`: the remote has no item. */
599
613
  private readonly bases;
614
+ /**
615
+ * With `versionOf`, the policy `merge` and `capture: "observe"`, this map holds the remote value at the known remote
616
+ * version of each id (roadmap CLI-109). A captured change has no value before it, so its base value comes from here.
617
+ * A write of the storage reads its base value from the local copy, and needs no map. A new version of an id drops
618
+ * its value. A sync or a send gives the value of the new version.
619
+ */
620
+ private readonly baseValues;
600
621
  /**
601
622
  * With `versionOf`: the version of each local item that the storage wrote or read. A pull does
602
623
  * not read an item whose version it knows. The version of an id that is not here is unknown.
@@ -628,6 +649,10 @@ export declare class HybridStorage<T> implements CollectionStorage<T> {
628
649
  private resetPull;
629
650
  /** The stop of the capture of the local copy */
630
651
  private readonly stopCapture;
652
+ /** True with `capture: "observe"`. */
653
+ private readonly capturing;
654
+ /** True when a queued write keeps its base value: with `versionOf` and the policy `merge` (roadmap CLI-109). */
655
+ private readonly keepsBaseValues;
631
656
  /** The captured changes that came before the end of the load. Undefined after the load. */
632
657
  private captured;
633
658
  /** With `versionOf`: the versions of the own writes that wait for their echo */
@@ -1106,6 +1131,21 @@ export declare class HybridStorage<T> implements CollectionStorage<T> {
1106
1131
  private versionOfItem;
1107
1132
  /** This method records the remote version of an id that the storage read. */
1108
1133
  private noteBase;
1134
+ /** This method keeps the remote value of the remote version of an id, for a captured change (roadmap CLI-109). */
1135
+ private noteBaseValue;
1136
+ /**
1137
+ * This method gives a write of the storage the base value of each id that has no queued write (roadmap CLI-109).
1138
+ * The value is the local item before the write, when that item has the base version. The local copy then holds the
1139
+ * remote value of a sync or a send.
1140
+ */
1141
+ private fillBaseValues;
1142
+ /** The remote value at a remote version of an id: `null` for no item, and undefined when the storage does not know it. */
1143
+ private baseValueAt;
1144
+ /**
1145
+ * The remote value that the queued writes of an id changed: the base value of the first queued operation of the id.
1146
+ * The value is undefined when that operation has none, or when it is a clear.
1147
+ */
1148
+ private queuedBaseValue;
1109
1149
  /** This method records the remote versions after a write reached the remote. */
1110
1150
  private noteRemoteWrite;
1111
1151
  /**
@@ -1114,6 +1154,11 @@ export declare class HybridStorage<T> implements CollectionStorage<T> {
1114
1154
  * loads the queue after a restart takes the version of the first operation of each id.
1115
1155
  */
1116
1156
  private attachBase;
1157
+ /**
1158
+ * This method gives the remote value at the version of `expectedBase`, for the policy `merge` (roadmap CLI-109). It
1159
+ * is the value of an older queued operation of the id. Without one, it is the kept value of the known remote version.
1160
+ */
1161
+ private expectedBaseValue;
1117
1162
  /** The remote version of an id after the queued operations, or undefined when it is not known. */
1118
1163
  private expectedBase;
1119
1164
  private hasPendingOp;
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/storage/hybrid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/storage/hybrid.ts"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ import { InMemoryStorage, StorageListeners } from "@procedures/collections";
49
49
  import { queryEntries, queryOptionsProblems, selectorProblems, versionConflictsOf, } from "@procedures/client/query";
50
50
  import { optionalMs, realClock } from "@procedures/client/browser";
51
51
  import { backoffDelay } from "@mark1russell7/service/backoff";
52
- import { MemoryQueueStore, idsOf, withoutId } from "./queue.js";
52
+ import { MemoryQueueStore, idsOf, singlesOf, withoutId } from "./queue.js";
53
53
  import { isSyncState } from "./sync-state.js";
54
54
  const MODES = new Set(["local-only", "write-through", "write-back", "remote-only", "read-only"]);
55
55
  /** True for the modes that keep a local copy and read the remote changes into it. */
@@ -283,6 +283,8 @@ const defaultIsRefusal = (error) => {
283
283
  const code = error?.code;
284
284
  return typeof code === "string" && REFUSAL_CODES.has(code);
285
285
  };
286
+ /** The default of `isTooLarge`: an error with the code `PAYLOAD_TOO_LARGE` (roadmap CLI-108). */
287
+ const defaultIsTooLarge = (error) => error?.code === "PAYLOAD_TOO_LARGE";
286
288
  /** True when a remote does not know a procedure: an older server without `changes`. */
287
289
  const isNotFound = (error) => typeof error === "object" && error !== null && error.code === "NOT_FOUND";
288
290
  const defaultKeyOf = (item) => {
@@ -469,16 +471,20 @@ class BaseVersions extends Map {
469
471
  changed = new Set();
470
472
  /** True when the storage has a sync state store */
471
473
  tracked = false;
474
+ /** This function gets each change of a version, after the change. */
475
+ onChange;
472
476
  set(id, version) {
473
477
  super.set(id, version);
474
478
  if (this.tracked)
475
479
  this.changed.add(id);
480
+ this.onChange?.(id, version);
476
481
  return this;
477
482
  }
478
483
  delete(id) {
479
484
  const had = super.delete(id);
480
485
  if (had && this.tracked)
481
486
  this.changed.add(id);
487
+ this.onChange?.(id, undefined);
482
488
  return had;
483
489
  }
484
490
  }
@@ -569,6 +575,13 @@ export class HybridStorage {
569
575
  changesUnsupported = false;
570
576
  /** With `versionOf`: the last known remote version of each id. `null`: the remote has no item. */
571
577
  bases = new BaseVersions();
578
+ /**
579
+ * With `versionOf`, the policy `merge` and `capture: "observe"`, this map holds the remote value at the known remote
580
+ * version of each id (roadmap CLI-109). A captured change has no value before it, so its base value comes from here.
581
+ * A write of the storage reads its base value from the local copy, and needs no map. A new version of an id drops
582
+ * its value. A sync or a send gives the value of the new version.
583
+ */
584
+ baseValues = new Map();
572
585
  /**
573
586
  * With `versionOf`: the version of each local item that the storage wrote or read. A pull does
574
587
  * not read an item whose version it knows. The version of an id that is not here is unknown.
@@ -600,6 +613,10 @@ export class HybridStorage {
600
613
  resetPull = false;
601
614
  /** The stop of the capture of the local copy */
602
615
  stopCapture;
616
+ /** True with `capture: "observe"`. */
617
+ capturing;
618
+ /** True when a queued write keeps its base value: with `versionOf` and the policy `merge` (roadmap CLI-109). */
619
+ keepsBaseValues;
603
620
  /** The captured changes that came before the end of the load. Undefined after the load. */
604
621
  captured = [];
605
622
  /** With `versionOf`: the versions of the own writes that wait for their echo */
@@ -653,6 +670,7 @@ export class HybridStorage {
653
670
  offlineQueue: options.offlineQueue ?? true,
654
671
  isUnavailable: options.isUnavailable ?? defaultIsUnavailable,
655
672
  isRefusal: options.isRefusal ?? defaultIsRefusal,
673
+ isTooLarge: options.isTooLarge ?? defaultIsTooLarge,
656
674
  ...(options.onRefused !== undefined && { onRefused: options.onRefused }),
657
675
  ...(options.onDropped !== undefined && { onDropped: options.onDropped }),
658
676
  };
@@ -669,6 +687,10 @@ export class HybridStorage {
669
687
  this.aroundRemoteApply = options.aroundRemoteApply;
670
688
  this.stateStore = options.syncState;
671
689
  this.bases.tracked = this.stateStore !== undefined;
690
+ this.bases.onChange = (id, version) => {
691
+ if (this.baseValues.get(id)?.version !== version)
692
+ this.baseValues.delete(id);
693
+ };
672
694
  this.localGiven = options.local !== undefined;
673
695
  // The timers on the clock, with the backoff after a failure (roadmap CLI-13)
674
696
  const factor = options.backoff?.factor ?? 2;
@@ -705,6 +727,8 @@ export class HybridStorage {
705
727
  const capture = options.capture ?? "none";
706
728
  if (capture !== "none" && capture !== "observe")
707
729
  throw new TypeError(`Unknown capture ${JSON.stringify(capture)}: use none or observe`);
730
+ this.capturing = capture === "observe";
731
+ this.keepsBaseValues = this.options.conflictResolution === "merge" && this.options.versionOf !== undefined;
708
732
  if (capture === "observe") {
709
733
  if (!this.local.observe)
710
734
  throw new TypeError('capture: "observe" needs a local copy with observe()');
@@ -857,6 +881,10 @@ export class HybridStorage {
857
881
  op.base = previous.base;
858
882
  else
859
883
  delete op.base;
884
+ if (previous.baseValues)
885
+ op.baseValues = previous.baseValues;
886
+ else
887
+ delete op.baseValues;
860
888
  this.offlineOps[index] = op;
861
889
  }
862
890
  else {
@@ -1581,6 +1609,7 @@ export class HybridStorage {
1581
1609
  this.ensureQueueRoom(op);
1582
1610
  this.attachBase(op);
1583
1611
  const undo = await this.snapshot(ids, origin);
1612
+ this.fillBaseValues(op, undo.before);
1584
1613
  const result = await applyLocal();
1585
1614
  this.noteOwnWrite(op);
1586
1615
  await this.enqueue(op, undo);
@@ -1620,6 +1649,7 @@ export class HybridStorage {
1620
1649
  // The status shows the queue and the connection. The caller gets PendingWriteError.
1621
1650
  this.isOnline = false;
1622
1651
  this.attachBase(op);
1652
+ this.fillBaseValues(op, undo.before);
1623
1653
  await this.enqueue(op, undo);
1624
1654
  this.scheduleDrain();
1625
1655
  throw new PendingWriteError(type, error);
@@ -1767,7 +1797,7 @@ export class HybridStorage {
1767
1797
  // The versions after the write: this write adds one to each id (clear adds to clearVersion)
1768
1798
  const versions = new Map(touched.map((id) => [id, (this.writeVersions.get(id) ?? 0) + (ids === "*" ? 0 : 1)]));
1769
1799
  const clearVersion = this.clearVersion + (ids === "*" ? 1 : 0);
1770
- return async () => {
1800
+ const undo = async () => {
1771
1801
  if (this.clearVersion !== clearVersion)
1772
1802
  return;
1773
1803
  for (const id of touched) {
@@ -1780,6 +1810,7 @@ export class HybridStorage {
1780
1810
  await this.localSet(id, value, origin);
1781
1811
  }
1782
1812
  };
1813
+ return Object.assign(undo, { before });
1783
1814
  }
1784
1815
  //
1785
1816
  // ═══ Sync Operations ═══
@@ -2297,6 +2328,7 @@ export class HybridStorage {
2297
2328
  return false;
2298
2329
  if (knownVersion === remoteVersion) {
2299
2330
  this.bases.set(id, remoteVersion);
2331
+ this.noteBaseValue(id, remoteVersion, item);
2300
2332
  return false;
2301
2333
  }
2302
2334
  const localItem = await this.readLocal(id);
@@ -2304,6 +2336,7 @@ export class HybridStorage {
2304
2336
  return false;
2305
2337
  if (localItem !== undefined && this.versionOfItem(localItem) === remoteVersion) {
2306
2338
  this.bases.set(id, remoteVersion);
2339
+ this.noteBaseValue(id, remoteVersion, item);
2307
2340
  return false;
2308
2341
  }
2309
2342
  return this.resolvePending(id, localItem, item, remoteVersion, conflicts, "pull");
@@ -2313,6 +2346,7 @@ export class HybridStorage {
2313
2346
  if (knownVersion !== remoteVersion)
2314
2347
  await this.localSet(id, item, this.syncOrigin);
2315
2348
  this.bases.set(id, remoteVersion);
2349
+ this.noteBaseValue(id, remoteVersion, item);
2316
2350
  return false;
2317
2351
  }
2318
2352
  const localItem = await this.readLocal(id);
@@ -2338,8 +2372,10 @@ export class HybridStorage {
2338
2372
  await this.localSet(id, resolved, this.syncOrigin);
2339
2373
  this.stats.conflicts++;
2340
2374
  }
2341
- if (remoteVersion !== undefined)
2375
+ if (remoteVersion !== undefined) {
2342
2376
  this.bases.set(id, remoteVersion);
2377
+ this.noteBaseValue(id, remoteVersion, item);
2378
+ }
2343
2379
  return false;
2344
2380
  }
2345
2381
  /** This method applies one remote delete. It gives true when the queue changed. */
@@ -2403,17 +2439,20 @@ export class HybridStorage {
2403
2439
  break;
2404
2440
  await this.localSet(id, remoteItem, this.syncOrigin);
2405
2441
  this.bases.set(id, remoteVersion);
2442
+ this.noteBaseValue(id, remoteVersion, remoteItem);
2406
2443
  await this.reportDropped({ id, value: localItem, reason: "conflict", during, remote: remoteItem });
2407
2444
  return true;
2408
2445
  case "merge": {
2409
2446
  if (localItem === undefined)
2410
2447
  break;
2411
- const merged = this.resolveConflict(localItem, remoteItem);
2448
+ const merged = this.resolveConflict(localItem, remoteItem, this.queuedBaseValue(id));
2412
2449
  if (!this.dropQueued(id))
2413
2450
  break;
2414
2451
  await this.localSet(id, merged, this.syncOrigin);
2415
2452
  this.bases.set(id, remoteVersion);
2416
- this.offlineOps.push({ type: "set", data: { id, value: merged }, timestamp: Date.now(), base: [[id, remoteVersion]] });
2453
+ this.noteBaseValue(id, remoteVersion, remoteItem);
2454
+ // The merged write changes the remote item of this conflict: that item is its base
2455
+ this.offlineOps.push({ type: "set", data: { id, value: merged }, timestamp: Date.now(), base: [[id, remoteVersion]], baseValues: [[id, remoteItem]] });
2417
2456
  return true;
2418
2457
  }
2419
2458
  case "error":
@@ -2494,6 +2533,8 @@ export class HybridStorage {
2494
2533
  async pushQueue() {
2495
2534
  this.pushing = true;
2496
2535
  let sent = 0;
2536
+ // True when a batch went again as one write for each id: the queue store gets the new operations
2537
+ let split = false;
2497
2538
  // The operations whose conflicts this push resolved once (roadmap CLI-16)
2498
2539
  const resolved = new Set();
2499
2540
  try {
@@ -2524,18 +2565,25 @@ export class HybridStorage {
2524
2565
  }
2525
2566
  continue;
2526
2567
  }
2527
- if (conflicts === undefined &&
2528
- !(error instanceof QueueStoreError) &&
2529
- !this.options.isUnavailable(error) &&
2530
- this.options.isRefusal(error)) {
2531
- // The remote refused the write: it leaves the queue, and the push goes on (roadmap O67)
2568
+ const tooLarge = conflicts === undefined && !(error instanceof QueueStoreError) && this.options.isTooLarge(error);
2569
+ const refused = tooLarge || (conflicts === undefined && !(error instanceof QueueStoreError) && !this.options.isUnavailable(error) && this.options.isRefusal(error));
2570
+ if (refused) {
2532
2571
  this.isOnline = true;
2572
+ const singles = singlesOf(op);
2573
+ if (singles.length > 1 && this.offlineOps[0] === op) {
2574
+ // A batch goes again as one write for each id, so only the bad write leaves the queue (roadmap CLI-108)
2575
+ this.offlineOps.splice(0, 1, ...singles);
2576
+ split = true;
2577
+ this.storeDirty = true;
2578
+ continue;
2579
+ }
2580
+ // The remote refused the write: it leaves the queue, and the push goes on (roadmap O67)
2533
2581
  if (this.offlineOps[0] === op) {
2534
2582
  this.offlineOps.shift();
2535
2583
  sent++;
2536
2584
  this.storeDirty = true;
2537
2585
  }
2538
- await this.refuseQueued(op, error);
2586
+ await this.refuseQueued(op, error, tooLarge ? "too-large" : "refused");
2539
2587
  continue;
2540
2588
  }
2541
2589
  // This operation and the later ones stay queued
@@ -2555,7 +2603,7 @@ export class HybridStorage {
2555
2603
  }
2556
2604
  finally {
2557
2605
  this.pushing = false;
2558
- if (sent > 0) {
2606
+ if (sent > 0 || split) {
2559
2607
  // The store keeps sent operations, and the status gets the failure. A later direct write
2560
2608
  // repairs the store first.
2561
2609
  await this.persistAll().catch(() => undefined);
@@ -2567,7 +2615,7 @@ export class HybridStorage {
2567
2615
  * gets the remote values, and the hook `onRefused` gets the refusal. A refused clear asks for a
2568
2616
  * full pull.
2569
2617
  */
2570
- async refuseQueued(op, error) {
2618
+ async refuseQueued(op, error, reason) {
2571
2619
  const ids = idsOf(op);
2572
2620
  const all = ids.includes("*");
2573
2621
  let restored = false;
@@ -2585,7 +2633,7 @@ export class HybridStorage {
2585
2633
  }
2586
2634
  for (const id of all ? ["*"] : ids) {
2587
2635
  const written = this.writtenValue(op, id);
2588
- await this.reportDropped({ id, value: written ? written.value : undefined, reason: "refused", during: "push", error });
2636
+ await this.reportDropped({ id, value: written ? written.value : undefined, reason, during: "push", error });
2589
2637
  }
2590
2638
  }
2591
2639
  /**
@@ -2649,10 +2697,57 @@ export class HybridStorage {
2649
2697
  return;
2650
2698
  }
2651
2699
  const version = this.versionOfItem(item);
2652
- if (version === undefined)
2700
+ if (version === undefined) {
2653
2701
  this.bases.delete(id);
2654
- else
2655
- this.bases.set(id, version);
2702
+ return;
2703
+ }
2704
+ this.bases.set(id, version);
2705
+ this.noteBaseValue(id, version, item);
2706
+ }
2707
+ /** This method keeps the remote value of the remote version of an id, for a captured change (roadmap CLI-109). */
2708
+ noteBaseValue(id, version, value) {
2709
+ if (!this.keepsBaseValues || !this.capturing)
2710
+ return;
2711
+ if (this.bases.get(id) === version)
2712
+ this.baseValues.set(id, { version, value });
2713
+ }
2714
+ /**
2715
+ * This method gives a write of the storage the base value of each id that has no queued write (roadmap CLI-109).
2716
+ * The value is the local item before the write, when that item has the base version. The local copy then holds the
2717
+ * remote value of a sync or a send.
2718
+ */
2719
+ fillBaseValues(op, before) {
2720
+ if (!this.keepsBaseValues || !op.base)
2721
+ return;
2722
+ const values = op.baseValues ? [...op.baseValues] : [];
2723
+ const known = new Set(values.map(([id]) => id));
2724
+ for (const [id, version] of op.base) {
2725
+ if (known.has(id) || version === null)
2726
+ continue;
2727
+ const value = before.get(id);
2728
+ if (value !== undefined && this.versionOfItem(value) === version)
2729
+ values.push([id, value]);
2730
+ }
2731
+ if (values.length > 0)
2732
+ op.baseValues = values;
2733
+ }
2734
+ /** The remote value at a remote version of an id: `null` for no item, and undefined when the storage does not know it. */
2735
+ baseValueAt(id, version) {
2736
+ if (version === null)
2737
+ return null;
2738
+ const known = this.baseValues.get(id);
2739
+ return known !== undefined && known.version === version ? known.value : undefined;
2740
+ }
2741
+ /**
2742
+ * The remote value that the queued writes of an id changed: the base value of the first queued operation of the id.
2743
+ * The value is undefined when that operation has none, or when it is a clear.
2744
+ */
2745
+ queuedBaseValue(id) {
2746
+ const op = this.offlineOps.find((queued) => {
2747
+ const ids = idsOf(queued);
2748
+ return ids.includes(id) || ids.includes("*");
2749
+ });
2750
+ return op?.baseValues?.find(([valueId]) => valueId === id)?.[1];
2656
2751
  }
2657
2752
  /** This method records the remote versions after a write reached the remote. */
2658
2753
  noteRemoteWrite(op) {
@@ -2689,15 +2784,56 @@ export class HybridStorage {
2689
2784
  if (!this.options.versionOf)
2690
2785
  return;
2691
2786
  const base = [];
2787
+ const values = [];
2692
2788
  for (const id of idsOf(op)) {
2693
2789
  if (id === "*")
2694
2790
  continue;
2695
2791
  const version = this.expectedBase(id);
2696
2792
  if (version !== undefined)
2697
2793
  base.push([id, version]);
2794
+ const value = this.expectedBaseValue(id, version);
2795
+ if (value !== undefined)
2796
+ values.push([id, value]);
2698
2797
  }
2699
2798
  if (base.length > 0)
2700
2799
  op.base = base;
2800
+ if (values.length > 0)
2801
+ op.baseValues = values;
2802
+ }
2803
+ /**
2804
+ * This method gives the remote value at the version of `expectedBase`, for the policy `merge` (roadmap CLI-109). It
2805
+ * is the value of an older queued operation of the id. Without one, it is the kept value of the known remote version.
2806
+ */
2807
+ expectedBaseValue(id, version) {
2808
+ if (!this.keepsBaseValues || version === undefined)
2809
+ return undefined;
2810
+ for (let index = this.offlineOps.length - 1; index >= 0; index--) {
2811
+ const op = this.offlineOps[index];
2812
+ const data = op.data;
2813
+ switch (op.type) {
2814
+ case "set":
2815
+ if (data.id === id)
2816
+ return data.value;
2817
+ break;
2818
+ case "delete":
2819
+ if (data.id === id)
2820
+ return null;
2821
+ break;
2822
+ case "setBatch": {
2823
+ const item = (data.items ?? []).findLast(([itemId]) => itemId === id);
2824
+ if (item)
2825
+ return item[1];
2826
+ break;
2827
+ }
2828
+ case "deleteBatch":
2829
+ if ((data.ids ?? []).includes(id))
2830
+ return null;
2831
+ break;
2832
+ case "clear":
2833
+ return null;
2834
+ }
2835
+ }
2836
+ return this.baseValueAt(id, version);
2701
2837
  }
2702
2838
  /** The remote version of an id after the queued operations, or undefined when it is not known. */
2703
2839
  expectedBase(id) {
@@ -2738,7 +2874,7 @@ export class HybridStorage {
2738
2874
  /**
2739
2875
  * Resolve conflict between local and remote versions.
2740
2876
  */
2741
- resolveConflict(local, remote) {
2877
+ resolveConflict(local, remote, base) {
2742
2878
  switch (this.options.conflictResolution) {
2743
2879
  case "local":
2744
2880
  return local;
@@ -2748,7 +2884,7 @@ export class HybridStorage {
2748
2884
  if (!this.options.mergeFn) {
2749
2885
  throw new Error("Merge function required for conflict resolution strategy 'merge'");
2750
2886
  }
2751
- return this.options.mergeFn(local, remote);
2887
+ return this.options.mergeFn(local, remote, base);
2752
2888
  case "error":
2753
2889
  throw new Error(`Conflict detected between local and remote versions`);
2754
2890
  default:
@@ -2776,6 +2912,10 @@ export class HybridStorage {
2776
2912
  op.base = previous.base;
2777
2913
  else
2778
2914
  delete op.base;
2915
+ if (previous.baseValues)
2916
+ op.baseValues = previous.baseValues;
2917
+ else
2918
+ delete op.baseValues;
2779
2919
  this.offlineOps[index] = op;
2780
2920
  rollback = () => {
2781
2921
  const at = this.offlineOps.indexOf(op);
@@ -3021,8 +3161,10 @@ export class HybridStorage {
3021
3161
  if (remoteVersion === undefined || echo) {
3022
3162
  if (remoteVersion === undefined)
3023
3163
  this.bases.delete(id);
3024
- else
3164
+ else {
3025
3165
  this.bases.set(id, remoteVersion);
3166
+ this.noteBaseValue(id, remoteVersion, remoteItem);
3167
+ }
3026
3168
  if (echo)
3027
3169
  echoes.add(id);
3028
3170
  continue;