dexie-cloud-addon 4.4.6 → 4.4.8

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 (50) hide show
  1. package/dist/modern/DXCWebSocketStatus.d.ts +1 -1
  2. package/dist/modern/DexieCloudAPI.d.ts +1 -1
  3. package/dist/modern/authentication/AuthPersistedContext.d.ts +2 -2
  4. package/dist/modern/currentUserEmitter.d.ts +3 -3
  5. package/dist/modern/db/entities/Member.d.ts +3 -3
  6. package/dist/modern/db/entities/PersistedSyncState.d.ts +1 -1
  7. package/dist/modern/db/entities/Role.d.ts +3 -3
  8. package/dist/modern/default-ui/Dialog.d.ts +1 -1
  9. package/dist/modern/default-ui/index.d.ts +5 -5
  10. package/dist/modern/dexie-cloud-addon.js +653 -531
  11. package/dist/modern/dexie-cloud-addon.js.map +1 -1
  12. package/dist/modern/dexie-cloud-addon.min.js +1 -1
  13. package/dist/modern/dexie-cloud-addon.min.js.map +1 -1
  14. package/dist/modern/dexie-cloud-client.d.ts +1 -1
  15. package/dist/modern/helpers/BroadcastedAndLocalEvent.d.ts +2 -2
  16. package/dist/modern/helpers/getSyncableTables.d.ts +3 -3
  17. package/dist/modern/helpers/resolveText.d.ts +1 -1
  18. package/dist/modern/middleware-helpers/guardedTable.d.ts +1 -1
  19. package/dist/modern/service-worker.js +655 -533
  20. package/dist/modern/service-worker.js.map +1 -1
  21. package/dist/modern/service-worker.min.js +1 -1
  22. package/dist/modern/service-worker.min.js.map +1 -1
  23. package/dist/modern/sync/BlobDownloadTracker.d.ts +7 -4
  24. package/dist/modern/sync/extractRealm.d.ts +1 -1
  25. package/dist/modern/sync/getTablesToSyncify.d.ts +2 -2
  26. package/dist/modern/sync/isSyncNeeded.d.ts +1 -1
  27. package/dist/modern/sync/messageConsumerIsReady.d.ts +1 -1
  28. package/dist/modern/sync/modifyLocalObjectsWithNewUserId.d.ts +3 -3
  29. package/dist/modern/sync/numUnsyncedMutations.d.ts +1 -1
  30. package/dist/modern/sync/performGuardedJob.d.ts +1 -1
  31. package/dist/modern/sync/registerSyncEvent.d.ts +1 -1
  32. package/dist/modern/sync/triggerSync.d.ts +2 -2
  33. package/dist/modern/types/DXCUserInteraction.d.ts +2 -2
  34. package/dist/modern/types/SyncState.d.ts +2 -2
  35. package/dist/modern/types/TXExpandos.d.ts +1 -1
  36. package/dist/modern/updateSchemaFromOptions.d.ts +2 -2
  37. package/dist/modern/verifyConfig.d.ts +1 -1
  38. package/dist/modern/verifySchema.d.ts +1 -1
  39. package/dist/modern/yjs/YTable.d.ts +3 -3
  40. package/dist/modern/yjs/getUpdatesTable.d.ts +2 -2
  41. package/dist/modern/yjs/reopenDocSignal.d.ts +2 -2
  42. package/dist/umd/dexie-cloud-addon.js +661 -539
  43. package/dist/umd/dexie-cloud-addon.js.map +1 -1
  44. package/dist/umd/dexie-cloud-addon.min.js +1 -1
  45. package/dist/umd/dexie-cloud-addon.min.js.map +1 -1
  46. package/dist/umd/service-worker.js +663 -541
  47. package/dist/umd/service-worker.js.map +1 -1
  48. package/dist/umd/service-worker.min.js +1 -1
  49. package/dist/umd/service-worker.min.js.map +1 -1
  50. package/package.json +2 -2
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * ==========================================================================
10
10
  *
11
- * Version 4.4.6, Thu Mar 26 2026
11
+ * Version 4.4.8, Tue Mar 31 2026
12
12
  *
13
13
  * https://dexie.org
14
14
  *
@@ -114,7 +114,7 @@ function escapeDollarProps(value) {
114
114
  const keys = Object.keys(value);
115
115
  let dollarKeys = null;
116
116
  for (let i = 0, l = keys.length; i < l; ++i) {
117
- if (keys[i][0] === "$") {
117
+ if (keys[i][0] === '$') {
118
118
  dollarKeys = dollarKeys || [];
119
119
  dollarKeys.push(keys[i]);
120
120
  }
@@ -126,7 +126,7 @@ function escapeDollarProps(value) {
126
126
  delete clone[k];
127
127
  }
128
128
  for (const k of dollarKeys) {
129
- clone["$" + k] = value[k];
129
+ clone['$' + k] = value[k];
130
130
  }
131
131
  return clone;
132
132
  }
@@ -177,7 +177,7 @@ function TypesonSimplified(...typeDefsInputs) {
177
177
  //
178
178
  // Child part
179
179
  //
180
- if (value === undefined || (key[0] === "$" && key !== "$t")) {
180
+ if (value === undefined || (key[0] === '$' && key !== '$t')) {
181
181
  top = stack[stack.length - 1];
182
182
  let deletes;
183
183
  let mods;
@@ -188,7 +188,7 @@ function TypesonSimplified(...typeDefsInputs) {
188
188
  else {
189
189
  stack.push([this, (deletes = []), (mods = {})]);
190
190
  }
191
- if (key[0] === "$" && key !== "$t") {
191
+ if (key[0] === '$' && key !== '$t') {
192
192
  // Unescape props (also preserves undefined if this is a combo)
193
193
  deletes.push(key);
194
194
  mods[key.substr(1)] = value;
@@ -205,8 +205,8 @@ function TypesonSimplified(...typeDefsInputs) {
205
205
  function getTypeDef(realVal) {
206
206
  const type = typeof realVal;
207
207
  switch (typeof realVal) {
208
- case "object":
209
- case "function": {
208
+ case 'object':
209
+ case 'function': {
210
210
  // "object", "function", null
211
211
  if (realVal === null)
212
212
  return null;
@@ -222,7 +222,7 @@ function TypesonSimplified(...typeDefsInputs) {
222
222
  if (!typeDef) {
223
223
  typeDef = Array.isArray(realVal)
224
224
  ? null
225
- : typeof realVal === "function"
225
+ : typeof realVal === 'function'
226
226
  ? typeDefs.function || null
227
227
  : ObjectDef;
228
228
  }
@@ -398,13 +398,13 @@ TSONRef.resolver = null;
398
398
 
399
399
  function readBlobSync(b) {
400
400
  const req = new XMLHttpRequest();
401
- req.overrideMimeType("text/plain; charset=x-user-defined");
401
+ req.overrideMimeType('text/plain; charset=x-user-defined');
402
402
  const url = URL.createObjectURL(b);
403
403
  try {
404
- req.open("GET", url, false); // Sync
404
+ req.open('GET', url, false); // Sync
405
405
  req.send();
406
406
  if (req.status !== 200 && req.status !== 0) {
407
- throw new Error("Bad Blob access: " + req.status);
407
+ throw new Error('Bad Blob access: ' + req.status);
408
408
  }
409
409
  return req.responseText;
410
410
  }
@@ -418,11 +418,11 @@ const numberTypeDef = {
418
418
  replace: (num) => {
419
419
  switch (true) {
420
420
  case isNaN(num):
421
- return { $t: "number", v: "NaN" };
421
+ return { $t: 'number', v: 'NaN' };
422
422
  case num === Infinity:
423
- return { $t: "number", v: "Infinity" };
423
+ return { $t: 'number', v: 'Infinity' };
424
424
  case num === -Infinity:
425
- return { $t: "number", v: "-Infinity" };
425
+ return { $t: 'number', v: '-Infinity' };
426
426
  default:
427
427
  return num;
428
428
  }
@@ -434,17 +434,17 @@ const numberTypeDef = {
434
434
  const dateTypeDef = {
435
435
  Date: {
436
436
  replace: (date) => ({
437
- $t: "Date",
438
- v: isNaN(date.getTime()) ? "NaN" : date.toISOString(),
437
+ $t: 'Date',
438
+ v: isNaN(date.getTime()) ? 'NaN' : date.toISOString(),
439
439
  }),
440
- revive: ({ v }) => new Date(v === "NaN" ? NaN : Date.parse(v)),
440
+ revive: ({ v }) => new Date(v === 'NaN' ? NaN : Date.parse(v)),
441
441
  },
442
442
  };
443
443
 
444
444
  const setTypeDef = {
445
445
  Set: {
446
446
  replace: (set) => ({
447
- $t: "Set",
447
+ $t: 'Set',
448
448
  v: Array.from(set),
449
449
  }),
450
450
  revive: ({ v }) => new Set(v),
@@ -454,34 +454,34 @@ const setTypeDef = {
454
454
  const mapTypeDef = {
455
455
  Map: {
456
456
  replace: (map) => ({
457
- $t: "Map",
457
+ $t: 'Map',
458
458
  v: Array.from(map.entries()),
459
459
  }),
460
460
  revive: ({ v }) => new Map(v),
461
461
  },
462
462
  };
463
463
 
464
- const _global = typeof globalThis !== "undefined" // All modern environments (node, bun, deno, browser, workers, webview etc)
464
+ const _global = typeof globalThis !== 'undefined' // All modern environments (node, bun, deno, browser, workers, webview etc)
465
465
  ? globalThis
466
- : typeof self !== "undefined" // Older browsers, workers, webview, window etc
466
+ : typeof self !== 'undefined' // Older browsers, workers, webview, window etc
467
467
  ? self
468
- : typeof global !== "undefined" // Older versions of node
468
+ : typeof global !== 'undefined' // Older versions of node
469
469
  ? global
470
470
  : undefined; // Unsupported environment. No idea to return 'this' since we are in a module or a function scope anyway.
471
471
 
472
472
  const typedArrayTypeDefs = [
473
- "Int8Array",
474
- "Uint8Array",
475
- "Uint8ClampedArray",
476
- "Int16Array",
477
- "Uint16Array",
478
- "Int32Array",
479
- "Uint32Array",
480
- "Float32Array",
481
- "Float64Array",
482
- "DataView",
483
- "BigInt64Array",
484
- "BigUint64Array",
473
+ 'Int8Array',
474
+ 'Uint8Array',
475
+ 'Uint8ClampedArray',
476
+ 'Int16Array',
477
+ 'Uint16Array',
478
+ 'Int32Array',
479
+ 'Uint32Array',
480
+ 'Float32Array',
481
+ 'Float64Array',
482
+ 'DataView',
483
+ 'BigInt64Array',
484
+ 'BigUint64Array',
485
485
  ].reduce((specs, typeName) => ({
486
486
  ...specs,
487
487
  [typeName]: {
@@ -509,10 +509,10 @@ const typedArrayTypeDefs = [
509
509
  },
510
510
  }), {});
511
511
 
512
- const hasArrayBufferFromBase64 = "fromBase64" in Uint8Array; // https://github.com/tc39/proposal-arraybuffer-base64;
513
- const hasArrayBufferToBase64 = "toBase64" in Uint8Array.prototype; // https://github.com/tc39/proposal-arraybuffer-base64;
514
- const b64decode = typeof Buffer !== "undefined"
515
- ? (base64) => Buffer.from(base64, "base64") // Node
512
+ const hasArrayBufferFromBase64 = 'fromBase64' in Uint8Array; // https://github.com/tc39/proposal-arraybuffer-base64;
513
+ const hasArrayBufferToBase64 = 'toBase64' in Uint8Array.prototype; // https://github.com/tc39/proposal-arraybuffer-base64;
514
+ const b64decode = typeof Buffer !== 'undefined'
515
+ ? (base64) => Buffer.from(base64, 'base64') // Node
516
516
  : hasArrayBufferFromBase64
517
517
  ? // @ts-ignore: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64
518
518
  (base64) => Uint8Array.fromBase64(base64) // Modern javascript standard
@@ -526,14 +526,14 @@ const b64decode = typeof Buffer !== "undefined"
526
526
  }
527
527
  return bytes;
528
528
  };
529
- const b64encode = typeof Buffer !== "undefined"
529
+ const b64encode = typeof Buffer !== 'undefined'
530
530
  ? (b) => {
531
531
  // Node
532
532
  if (ArrayBuffer.isView(b)) {
533
- return Buffer.from(b.buffer, b.byteOffset, b.byteLength).toString("base64");
533
+ return Buffer.from(b.buffer, b.byteOffset, b.byteLength).toString('base64');
534
534
  }
535
535
  else {
536
- return Buffer.from(b).toString("base64");
536
+ return Buffer.from(b).toString('base64');
537
537
  }
538
538
  }
539
539
  : hasArrayBufferToBase64
@@ -552,7 +552,7 @@ const b64encode = typeof Buffer !== "undefined"
552
552
  const chunk = u8a.subarray(i, i + CHUNK_SIZE);
553
553
  strs.push(String.fromCharCode.apply(null, Array.from(chunk)));
554
554
  }
555
- return btoa(strs.join(""));
555
+ return btoa(strs.join(''));
556
556
  };
557
557
 
558
558
  function b64LexEncode(b) {
@@ -562,7 +562,7 @@ function b64LexDecode(b64Lex) {
562
562
  return b64decode(lexToB64(b64Lex));
563
563
  }
564
564
  function b64ToLex(base64) {
565
- var encoded = "";
565
+ var encoded = '';
566
566
  for (var i = 0, length = base64.length; i < length; i++) {
567
567
  encoded += ENCODE_TABLE[base64[i]];
568
568
  }
@@ -570,81 +570,81 @@ function b64ToLex(base64) {
570
570
  }
571
571
  function lexToB64(base64lex) {
572
572
  // only accept string input
573
- if (typeof base64lex !== "string") {
574
- throw new Error("invalid decoder input: " + base64lex);
573
+ if (typeof base64lex !== 'string') {
574
+ throw new Error('invalid decoder input: ' + base64lex);
575
575
  }
576
- var base64 = "";
576
+ var base64 = '';
577
577
  for (var i = 0, length = base64lex.length; i < length; i++) {
578
578
  base64 += DECODE_TABLE[base64lex[i]];
579
579
  }
580
580
  return base64;
581
581
  }
582
582
  const DECODE_TABLE = {
583
- "-": "=",
584
- "0": "A",
585
- "1": "B",
586
- "2": "C",
587
- "3": "D",
588
- "4": "E",
589
- "5": "F",
590
- "6": "G",
591
- "7": "H",
592
- "8": "I",
593
- "9": "J",
594
- A: "K",
595
- B: "L",
596
- C: "M",
597
- D: "N",
598
- E: "O",
599
- F: "P",
600
- G: "Q",
601
- H: "R",
602
- I: "S",
603
- J: "T",
604
- K: "U",
605
- L: "V",
606
- M: "W",
607
- N: "X",
608
- O: "Y",
609
- P: "Z",
610
- Q: "a",
611
- R: "b",
612
- S: "c",
613
- T: "d",
614
- U: "e",
615
- V: "f",
616
- W: "g",
617
- X: "h",
618
- Y: "i",
619
- Z: "j",
620
- _: "k",
621
- a: "l",
622
- b: "m",
623
- c: "n",
624
- d: "o",
625
- e: "p",
626
- f: "q",
627
- g: "r",
628
- h: "s",
629
- i: "t",
630
- j: "u",
631
- k: "v",
632
- l: "w",
633
- m: "x",
634
- n: "y",
635
- o: "z",
636
- p: "0",
637
- q: "1",
638
- r: "2",
639
- s: "3",
640
- t: "4",
641
- u: "5",
642
- v: "6",
643
- w: "7",
644
- x: "8",
645
- y: "9",
646
- z: "+",
647
- "|": "/",
583
+ '-': '=',
584
+ '0': 'A',
585
+ '1': 'B',
586
+ '2': 'C',
587
+ '3': 'D',
588
+ '4': 'E',
589
+ '5': 'F',
590
+ '6': 'G',
591
+ '7': 'H',
592
+ '8': 'I',
593
+ '9': 'J',
594
+ A: 'K',
595
+ B: 'L',
596
+ C: 'M',
597
+ D: 'N',
598
+ E: 'O',
599
+ F: 'P',
600
+ G: 'Q',
601
+ H: 'R',
602
+ I: 'S',
603
+ J: 'T',
604
+ K: 'U',
605
+ L: 'V',
606
+ M: 'W',
607
+ N: 'X',
608
+ O: 'Y',
609
+ P: 'Z',
610
+ Q: 'a',
611
+ R: 'b',
612
+ S: 'c',
613
+ T: 'd',
614
+ U: 'e',
615
+ V: 'f',
616
+ W: 'g',
617
+ X: 'h',
618
+ Y: 'i',
619
+ Z: 'j',
620
+ _: 'k',
621
+ a: 'l',
622
+ b: 'm',
623
+ c: 'n',
624
+ d: 'o',
625
+ e: 'p',
626
+ f: 'q',
627
+ g: 'r',
628
+ h: 's',
629
+ i: 't',
630
+ j: 'u',
631
+ k: 'v',
632
+ l: 'w',
633
+ m: 'x',
634
+ n: 'y',
635
+ o: 'z',
636
+ p: '0',
637
+ q: '1',
638
+ r: '2',
639
+ s: '3',
640
+ t: '4',
641
+ u: '5',
642
+ v: '6',
643
+ w: '7',
644
+ x: '8',
645
+ y: '9',
646
+ z: '+',
647
+ '|': '/',
648
648
  };
649
649
  const ENCODE_TABLE = {};
650
650
  for (const c of Object.keys(DECODE_TABLE)) {
@@ -654,7 +654,7 @@ for (const c of Object.keys(DECODE_TABLE)) {
654
654
  const arrayBufferTypeDef = {
655
655
  ArrayBuffer: {
656
656
  replace: (ab) => ({
657
- $t: "ArrayBuffer",
657
+ $t: 'ArrayBuffer',
658
658
  v: b64LexEncode(ab),
659
659
  }),
660
660
  revive: ({ v }) => {
@@ -677,9 +677,9 @@ function string2ArrayBuffer(str) {
677
677
 
678
678
  const blobTypeDef = {
679
679
  Blob: {
680
- test: (blob, toStringTag) => toStringTag === "Blob" || blob instanceof FakeBlob,
680
+ test: (blob, toStringTag) => toStringTag === 'Blob' || blob instanceof FakeBlob,
681
681
  replace: (blob) => ({
682
- $t: "Blob",
682
+ $t: 'Blob',
683
683
  v: blob instanceof FakeBlob
684
684
  ? b64encode(blob.buf)
685
685
  : b64encode(string2ArrayBuffer(readBlobSync(blob))),
@@ -690,7 +690,7 @@ const blobTypeDef = {
690
690
  const buf = ab.buffer.byteLength === ab.byteLength
691
691
  ? ab.buffer
692
692
  : ab.buffer.slice(ab.byteOffset, ab.byteOffset + ab.byteLength);
693
- return typeof Blob !== "undefined"
693
+ return typeof Blob !== 'undefined'
694
694
  ? new Blob([new Uint8Array(buf)], { type })
695
695
  : new FakeBlob(buf, type);
696
696
  },
@@ -709,15 +709,15 @@ const blobTypeDef = {
709
709
 
710
710
  const fileTypeDef = {
711
711
  File: {
712
- test: (file, toStringTag) => toStringTag === "File",
712
+ test: (file, toStringTag) => toStringTag === 'File',
713
713
  replace: (file) => ({
714
- $t: "File",
714
+ $t: 'File',
715
715
  v: b64encode(string2ArrayBuffer(readBlobSync(file))),
716
716
  type: file.type,
717
717
  name: file.name,
718
718
  lastModified: new Date(file.lastModified).toISOString(),
719
719
  }),
720
- revive: ({ type, v, name, lastModified }) => {
720
+ revive: ({ type, v, name, lastModified, }) => {
721
721
  const ab = b64decode(v);
722
722
  const buf = ab.buffer.byteLength === ab.byteLength
723
723
  ? ab.buffer
@@ -741,13 +741,13 @@ const fileTypeDef = {
741
741
  const undefinedTypeDef = {
742
742
  undefined: {
743
743
  replace: () => ({
744
- $t: "undefined",
744
+ $t: 'undefined',
745
745
  }),
746
746
  revive: () => undefined,
747
747
  },
748
748
  };
749
749
 
750
- const getRandomValues = typeof crypto !== "undefined"
750
+ const getRandomValues = typeof crypto !== 'undefined'
751
751
  ? crypto.getRandomValues.bind(crypto)
752
752
  : (buf) => {
753
753
  for (let i = 0; i < buf.length; ++i) {
@@ -848,7 +848,7 @@ function setByKeyPath(obj, keyPath, value) {
848
848
  var innerObj = obj[currentKeyPath];
849
849
  //@ts-ignore: even if currentKeyPath would be numeric string and obj would be array - it works.
850
850
  if (!innerObj || !hasOwn(obj, currentKeyPath))
851
- innerObj = (obj[currentKeyPath] = {});
851
+ innerObj = obj[currentKeyPath] = {};
852
852
  setByKeyPath(innerObj, remainingKeyPath, value);
853
853
  }
854
854
  }
@@ -867,17 +867,23 @@ function setByKeyPath(obj, keyPath, value) {
867
867
  }
868
868
  }
869
869
  }
870
- const randomString$1 = typeof self !== 'undefined' && typeof crypto !== 'undefined' ? (bytes, randomFill = crypto.getRandomValues.bind(crypto)) => {
871
- // Web
872
- const buf = new Uint8Array(bytes);
873
- randomFill(buf);
874
- return self.btoa(String.fromCharCode.apply(null, buf));
875
- } : typeof Buffer !== 'undefined' ? (bytes, randomFill = simpleRandomFill) => {
876
- // Node
877
- const buf = Buffer.alloc(bytes);
878
- randomFill(buf);
879
- return buf.toString("base64");
880
- } : () => { throw new Error("No implementation of randomString was found"); };
870
+ const randomString$1 = typeof self !== 'undefined' && typeof crypto !== 'undefined'
871
+ ? (bytes, randomFill = crypto.getRandomValues.bind(crypto)) => {
872
+ // Web
873
+ const buf = new Uint8Array(bytes);
874
+ randomFill(buf);
875
+ return self.btoa(String.fromCharCode.apply(null, buf));
876
+ }
877
+ : typeof Buffer !== 'undefined'
878
+ ? (bytes, randomFill = simpleRandomFill) => {
879
+ // Node
880
+ const buf = Buffer.alloc(bytes);
881
+ randomFill(buf);
882
+ return buf.toString('base64');
883
+ }
884
+ : () => {
885
+ throw new Error('No implementation of randomString was found');
886
+ };
881
887
  function simpleRandomFill(buf) {
882
888
  for (let i = 0; i < buf.length; ++i) {
883
889
  buf[i] = Math.floor(Math.random() * 256);
@@ -896,11 +902,13 @@ function simpleRandomFill(buf) {
896
902
  * @returns
897
903
  */
898
904
  function isValidSyncableID(id) {
899
- if (typeof id === "string")
905
+ if (typeof id === 'string')
900
906
  return true;
901
907
  //if (validIDTypes[toStringTag(id)]) return true;
902
908
  //if (Array.isArray(id)) return id.every((part) => isValidSyncableID(part));
903
- if (Array.isArray(id) && id.some(key => isValidSyncableID(key)) && id.every(isValidSyncableIDPart))
909
+ if (Array.isArray(id) &&
910
+ id.some((key) => isValidSyncableID(key)) &&
911
+ id.every(isValidSyncableIDPart))
904
912
  return true;
905
913
  return false;
906
914
  }
@@ -909,53 +917,53 @@ function isValidSyncableID(id) {
909
917
  * For example, ArrayBuffer cannot be used (gives "object ArrayBuffer") but Uint8Array can be
910
918
  * used (gives comma-delimited list of included bytes).
911
919
  * 2: Since we store the key as a VARCHAR server side in current version, try not promote types that stringifies to become very long server side.
912
- */
920
+ */
913
921
  function isValidSyncableIDPart(part) {
914
- return typeof part === "string" || typeof part === "number" || Array.isArray(part) && part.every(isValidSyncableIDPart);
922
+ return (typeof part === 'string' ||
923
+ typeof part === 'number' ||
924
+ (Array.isArray(part) && part.every(isValidSyncableIDPart)));
915
925
  }
916
926
  function isValidAtID(id, idPrefix) {
917
- return !idPrefix || (typeof id === "string" && id.startsWith(idPrefix));
927
+ return !idPrefix || (typeof id === 'string' && id.startsWith(idPrefix));
918
928
  }
919
929
 
920
930
  function applyOperation(target, table, op) {
921
931
  const tbl = target[table] || (target[table] = {});
922
- const keys = op.keys.map(key => typeof key === 'string' ? key : JSON.stringify(key));
932
+ const keys = op.keys.map((key) => typeof key === 'string' ? key : JSON.stringify(key));
923
933
  switch (op.type) {
924
- case "insert":
934
+ case 'insert':
925
935
  // TODO: Don't treat insert and upsert the same?
926
- case "upsert":
936
+ case 'upsert':
927
937
  keys.forEach((key, idx) => {
928
938
  tbl[key] = {
929
- type: "ups",
939
+ type: 'ups',
930
940
  val: op.values[idx],
931
941
  };
932
942
  });
933
943
  break;
934
- case "update":
935
- case "modify": {
944
+ case 'update':
945
+ case 'modify': {
936
946
  keys.forEach((key, idx) => {
937
- const changeSpec = op.type === "update"
938
- ? op.changeSpecs[idx]
939
- : op.changeSpec;
947
+ const changeSpec = op.type === 'update' ? op.changeSpecs[idx] : op.changeSpec;
940
948
  const entry = tbl[key];
941
949
  if (!entry) {
942
950
  tbl[key] = {
943
- type: "upd",
951
+ type: 'upd',
944
952
  mod: changeSpec,
945
953
  };
946
954
  }
947
955
  else {
948
956
  switch (entry.type) {
949
- case "ups":
957
+ case 'ups':
950
958
  // Adjust the existing upsert with additional updates
951
959
  for (const [propPath, value] of Object.entries(changeSpec)) {
952
960
  setByKeyPath(entry.val, propPath, value);
953
961
  }
954
962
  break;
955
- case "del":
963
+ case 'del':
956
964
  // No action.
957
965
  break;
958
- case "upd":
966
+ case 'upd':
959
967
  // Adjust existing update with additional updates
960
968
  Object.assign(entry.mod, changeSpec); // May work for deep props as well - new keys is added later, right? Does the prop order persist along TSON and all? But it will not be 100% when combined with some server code (seach for "address.city": "Stockholm" comment)
961
969
  break;
@@ -964,10 +972,10 @@ function applyOperation(target, table, op) {
964
972
  });
965
973
  break;
966
974
  }
967
- case "delete":
975
+ case 'delete':
968
976
  keys.forEach((key) => {
969
977
  tbl[key] = {
970
- type: "del",
978
+ type: 'del',
971
979
  };
972
980
  });
973
981
  break;
@@ -1064,30 +1072,30 @@ function toDBOperationSet(inSet, txid) {
1064
1072
  };
1065
1073
  for (const [optype, muts] of Object.entries(ops)) {
1066
1074
  switch (optype) {
1067
- case "ups": {
1075
+ case 'ups': {
1068
1076
  const op = {
1069
- type: "upsert",
1070
- keys: muts.map(mut => mut.key),
1071
- values: muts.map(mut => mut.val),
1072
- txid
1077
+ type: 'upsert',
1078
+ keys: muts.map((mut) => mut.key),
1079
+ values: muts.map((mut) => mut.val),
1080
+ txid,
1073
1081
  };
1074
1082
  resultEntry.muts.push(op);
1075
1083
  break;
1076
1084
  }
1077
- case "upd": {
1085
+ case 'upd': {
1078
1086
  const op = {
1079
- type: "update",
1080
- keys: muts.map(mut => mut.key),
1081
- changeSpecs: muts.map(mut => mut.mod),
1082
- txid
1087
+ type: 'update',
1088
+ keys: muts.map((mut) => mut.key),
1089
+ changeSpecs: muts.map((mut) => mut.mod),
1090
+ txid,
1083
1091
  };
1084
1092
  resultEntry.muts.push(op);
1085
1093
  break;
1086
1094
  }
1087
- case "del": {
1095
+ case 'del': {
1088
1096
  const op = {
1089
- type: "delete",
1090
- keys: muts.map(mut => mut.key),
1097
+ type: 'delete',
1098
+ keys: muts.map((mut) => mut.key),
1091
1099
  txid,
1092
1100
  };
1093
1101
  resultEntry.muts.push(op);
@@ -1102,7 +1110,7 @@ function toDBOperationSet(inSet, txid) {
1102
1110
 
1103
1111
  function getDbNameFromDbUrl(dbUrl) {
1104
1112
  const url = new URL(dbUrl);
1105
- return url.pathname === "/"
1113
+ return url.pathname === '/'
1106
1114
  ? url.hostname.split('.')[0]
1107
1115
  : url.pathname.split('/')[1];
1108
1116
  }
@@ -1220,7 +1228,8 @@ function decodeYMessage(a) {
1220
1228
  prop,
1221
1229
  k,
1222
1230
  u: readVarUint8Array(decoder),
1223
- r: (decoder.pos < decoder.arr.length && readVarString(decoder)) || undefined,
1231
+ r: (decoder.pos < decoder.arr.length && readVarString(decoder)) ||
1232
+ undefined,
1224
1233
  };
1225
1234
  default:
1226
1235
  throw new TypeError(`Unknown message type: ${type}`);
@@ -1237,7 +1246,8 @@ async function asyncIterablePipeline(source, ...stages) {
1237
1246
  }
1238
1247
  // Start running the machine. If the last stage is a sink, it will consume the data and never emit anything
1239
1248
  // to us here...
1240
- for await (const chunk of result) { }
1249
+ for await (const chunk of result) {
1250
+ }
1241
1251
  }
1242
1252
 
1243
1253
  async function* consumeChunkedBinaryStream(source) {
@@ -1291,7 +1301,7 @@ async function* consumeChunkedBinaryStream(source) {
1291
1301
  }
1292
1302
  if (pos + len > chunk.byteLength) {
1293
1303
  bufs.push(chunk.slice(pos));
1294
- len -= (chunk.byteLength - pos);
1304
+ len -= chunk.byteLength - pos;
1295
1305
  state = 2;
1296
1306
  pos = chunk.byteLength; // will break while loop.
1297
1307
  }
@@ -1322,7 +1332,7 @@ async function* consumeChunkedBinaryStream(source) {
1322
1332
  function getFetchResponseBodyGenerator(res) {
1323
1333
  return async function* () {
1324
1334
  if (!res.body)
1325
- throw new Error("Response body is not readable");
1335
+ throw new Error('Response body is not readable');
1326
1336
  const reader = res.body.getReader();
1327
1337
  try {
1328
1338
  while (true) {
@@ -1391,11 +1401,11 @@ function hasBlobRefs(obj, visited = new WeakSet()) {
1391
1401
  return false;
1392
1402
  }
1393
1403
  if (Array.isArray(obj)) {
1394
- return obj.some(item => hasBlobRefs(item, visited));
1404
+ return obj.some((item) => hasBlobRefs(item, visited));
1395
1405
  }
1396
1406
  // Only traverse POJOs
1397
1407
  if (obj.constructor === Object) {
1398
- return Object.values(obj).some(value => hasBlobRefs(value, visited));
1408
+ return Object.values(obj).some((value) => hasBlobRefs(value, visited));
1399
1409
  }
1400
1410
  return false;
1401
1411
  }
@@ -1459,7 +1469,8 @@ function convertToOriginalType(data, ref) {
1459
1469
  */
1460
1470
  function resolveAllBlobRefs(obj_1, dbUrl_1) {
1461
1471
  return __awaiter(this, arguments, void 0, function* (obj, dbUrl, resolvedBlobs = [], currentPath = '', visited = new WeakMap(), tracker) {
1462
- if (obj == null) { // null or undefined
1472
+ if (obj == null) {
1473
+ // null or undefined
1463
1474
  return obj;
1464
1475
  }
1465
1476
  // Check if this is a BlobRef - resolve it and track it
@@ -1508,9 +1519,7 @@ function resolveAllBlobRefs(obj_1, dbUrl_1) {
1508
1519
  * Check if an object has unresolved BlobRefs
1509
1520
  */
1510
1521
  function hasUnresolvedBlobRefs(obj) {
1511
- return (typeof obj === 'object' &&
1512
- obj !== null &&
1513
- obj._hasBlobRefs === 1);
1522
+ return (typeof obj === 'object' && obj !== null && obj._hasBlobRefs === 1);
1514
1523
  }
1515
1524
 
1516
1525
  function getSyncableTables(db) {
@@ -1575,7 +1584,7 @@ function observeBlobProgress(db, downloading$) {
1575
1584
  isDownloading: isDownloading && stats.blobsRemaining > 0,
1576
1585
  blobsRemaining: stats.blobsRemaining,
1577
1586
  bytesRemaining: stats.bytesRemaining,
1578
- })), share({ resetOnRefCountZero: () => timer(2000) }) // Keep alive for 2s after last unsubscription to avoid rapid re-subscriptions during UI updates
1587
+ })), share({ resetOnRefCountZero: () => timer(2000) }) // Keep alive for 2s after last unsubscription to avoid rapid re-subscriptions during UI updates
1579
1588
  );
1580
1589
  }
1581
1590
  /**
@@ -1659,13 +1668,13 @@ function downloadUnresolvedBlobs(db, downloading$, signal) {
1659
1668
  }
1660
1669
  setDownloadingState(downloading$, true);
1661
1670
  try {
1662
- debugLog(`Eager download: Found ${syncedTables.length} syncable tables: ${syncedTables.map(t => t.name).join(', ')}`);
1671
+ debugLog(`Eager download: Found ${syncedTables.length} syncable tables: ${syncedTables.map((t) => t.name).join(', ')}`);
1663
1672
  for (const table of syncedTables) {
1664
1673
  if (signal === null || signal === void 0 ? void 0 : signal.aborted)
1665
1674
  ;
1666
1675
  try {
1667
1676
  // Check if table has _hasBlobRefs index
1668
- const hasIndex = table.schema.indexes.some(idx => idx.name === '_hasBlobRefs');
1677
+ const hasIndex = table.schema.indexes.some((idx) => idx.name === '_hasBlobRefs');
1669
1678
  if (!hasIndex)
1670
1679
  continue;
1671
1680
  // Query objects with _hasBlobRefs marker
@@ -1681,7 +1690,7 @@ function downloadUnresolvedBlobs(db, downloading$, signal) {
1681
1690
  const MAX_CONCURRENT = 6;
1682
1691
  const primaryKey = table.schema.primKey;
1683
1692
  // Filter to actionable objects first
1684
- const pending = unresolvedObjects.filter(obj => {
1693
+ const pending = unresolvedObjects.filter((obj) => {
1685
1694
  if (!hasUnresolvedBlobRefs(obj))
1686
1695
  return false;
1687
1696
  const key = primaryKey.keyPath
@@ -1742,7 +1751,7 @@ function registerSyncEvent(db, purpose) {
1742
1751
  try {
1743
1752
  // Send sync event to SW:
1744
1753
  const sw = yield navigator.serviceWorker.ready;
1745
- if (purpose === "push" && sw.sync) {
1754
+ if (purpose === 'push' && sw.sync) {
1746
1755
  yield sw.sync.register(`dexie-cloud:${db.name}`);
1747
1756
  }
1748
1757
  if (sw.active) {
@@ -1751,7 +1760,7 @@ function registerSyncEvent(db, purpose) {
1751
1760
  sw.active.postMessage({
1752
1761
  type: 'dexie-cloud-sync',
1753
1762
  dbName: db.name,
1754
- purpose
1763
+ purpose,
1755
1764
  });
1756
1765
  }
1757
1766
  else {
@@ -1876,14 +1885,15 @@ function promptForEmail(userInteraction, title, emailHint, initialAlert) {
1876
1885
  // the domain extension like .com, .net, etc.
1877
1886
  // (\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$ : This part is optional (due to the ? at the end).
1878
1887
  // If present, it matches " as " followed by another valid email address. This allows for the
1879
- // input to be either a single email address or two email addresses separated by " as ".
1888
+ // input to be either a single email address or two email addresses separated by " as ".
1880
1889
  //
1881
1890
  // The use case for "<email1> as <email2>"" is for when a database owner with full access to the
1882
1891
  // database needs to impersonate another user in the database in order to troubleshoot. This
1883
1892
  // format will only be possible to use when email1 is the owner of an API client with GLOBAL_READ
1884
1893
  // and GLOBAL_WRITE permissions on the database. The email will be checked on the server before
1885
1894
  // allowing it and giving out a token for email2, using the OTP sent to email1.
1886
- while (!email || !/^[\w-+.]+@([\w-]+\.)+[\w-]{2,10}(\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$/.test(email)) {
1895
+ while (!email ||
1896
+ !/^[\w-+.]+@([\w-]+\.)+[\w-]{2,10}(\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$/.test(email)) {
1887
1897
  const alerts = [];
1888
1898
  if (firstPrompt && initialAlert)
1889
1899
  alerts.push(initialAlert);
@@ -1949,7 +1959,7 @@ function confirmLogout(userInteraction, currentUserId, numUnsyncedChanges) {
1949
1959
  messageParams: {
1950
1960
  currentUserId,
1951
1961
  numUnsyncedChanges: numUnsyncedChanges.toString(),
1952
- }
1962
+ },
1953
1963
  },
1954
1964
  ];
1955
1965
  return yield interactWithUser(userInteraction, {
@@ -1958,7 +1968,7 @@ function confirmLogout(userInteraction, currentUserId, numUnsyncedChanges) {
1958
1968
  alerts,
1959
1969
  fields: {},
1960
1970
  submitLabel: 'Confirm logout',
1961
- cancelLabel: 'Cancel'
1971
+ cancelLabel: 'Cancel',
1962
1972
  })
1963
1973
  .then(() => true)
1964
1974
  .catch(() => false);
@@ -2075,7 +2085,8 @@ function loadAccessToken(db) {
2075
2085
  if (!accessToken)
2076
2086
  return null;
2077
2087
  const expTime = (_a = accessTokenExpiration === null || accessTokenExpiration === void 0 ? void 0 : accessTokenExpiration.getTime()) !== null && _a !== void 0 ? _a : Infinity;
2078
- if (expTime > (Date.now() + 5 * MINUTES) && (((_b = currentUser.license) === null || _b === void 0 ? void 0 : _b.status) || 'ok') === 'ok') {
2088
+ if (expTime > Date.now() + 5 * MINUTES &&
2089
+ (((_b = currentUser.license) === null || _b === void 0 ? void 0 : _b.status) || 'ok') === 'ok') {
2079
2090
  return currentUser;
2080
2091
  }
2081
2092
  if (!refreshToken) {
@@ -2235,11 +2246,13 @@ function userAuthenticate(context, fetchToken, userInteraction, hints) {
2235
2246
  }
2236
2247
  catch (error) {
2237
2248
  // OAuth redirect is not an error - page is navigating away
2238
- if (error instanceof OAuthRedirectError || (error === null || error === void 0 ? void 0 : error.name) === 'OAuthRedirectError') {
2249
+ if (error instanceof OAuthRedirectError ||
2250
+ (error === null || error === void 0 ? void 0 : error.name) === 'OAuthRedirectError') {
2239
2251
  throw error; // Re-throw without logging
2240
2252
  }
2241
2253
  // Policy rejections have already been shown to the user as a challenge
2242
- if (error instanceof PolicyRejectionError || (error === null || error === void 0 ? void 0 : error.name) === 'PolicyRejectionError') {
2254
+ if (error instanceof PolicyRejectionError ||
2255
+ (error === null || error === void 0 ? void 0 : error.name) === 'PolicyRejectionError') {
2243
2256
  throw error;
2244
2257
  }
2245
2258
  if (error instanceof TokenErrorResponseError) {
@@ -2258,7 +2271,10 @@ function userAuthenticate(context, fetchToken, userInteraction, hints) {
2258
2271
  if (isOffline) {
2259
2272
  message = `You seem to be offline. Please connect to the internet and try again.`;
2260
2273
  }
2261
- else if (typeof location !== 'undefined' && (Dexie.debug || location.hostname === 'localhost' || location.hostname === '127.0.0.1')) {
2274
+ else if (typeof location !== 'undefined' &&
2275
+ (Dexie.debug ||
2276
+ location.hostname === 'localhost' ||
2277
+ location.hostname === '127.0.0.1')) {
2262
2278
  // The audience is most likely the developer. Suggest to whitelist the localhost origin:
2263
2279
  const whitelistCommand = `npx dexie-cloud whitelist ${location.origin}`;
2264
2280
  message = `Could not connect to server. Please verify that your origin '${location.origin}' is whitelisted using \`npx dexie-cloud whitelist\``;
@@ -2308,31 +2324,31 @@ class AuthPersistedContext {
2308
2324
  }
2309
2325
  static load(db, userId) {
2310
2326
  return db
2311
- .table("$logins")
2327
+ .table('$logins')
2312
2328
  .get(userId)
2313
2329
  .then((userLogin) => new AuthPersistedContext(db, userLogin || {
2314
2330
  userId,
2315
2331
  claims: {
2316
- sub: userId
2332
+ sub: userId,
2317
2333
  },
2318
- lastLogin: new Date(0)
2334
+ lastLogin: new Date(0),
2319
2335
  }));
2320
2336
  }
2321
2337
  save() {
2322
2338
  return __awaiter(this, void 0, void 0, function* () {
2323
2339
  const db = wm$3.get(this);
2324
- db.table("$logins").put(this);
2340
+ db.table('$logins').put(this);
2325
2341
  });
2326
2342
  }
2327
2343
  }
2328
2344
 
2329
2345
  const UNAUTHORIZED_USER = {
2330
- userId: "unauthorized",
2331
- name: "Unauthorized",
2346
+ userId: 'unauthorized',
2347
+ name: 'Unauthorized',
2332
2348
  claims: {
2333
- sub: "unauthorized",
2349
+ sub: 'unauthorized',
2334
2350
  },
2335
- lastLogin: new Date(0)
2351
+ lastLogin: new Date(0),
2336
2352
  };
2337
2353
  try {
2338
2354
  Object.freeze(UNAUTHORIZED_USER);
@@ -2401,7 +2417,7 @@ class HttpError extends Error {
2401
2417
  this.httpStatus = res.status;
2402
2418
  }
2403
2419
  get name() {
2404
- return "HttpError";
2420
+ return 'HttpError';
2405
2421
  }
2406
2422
  }
2407
2423
 
@@ -2440,7 +2456,7 @@ class OAuthError extends Error {
2440
2456
  */
2441
2457
  function exchangeOAuthCode(options) {
2442
2458
  return __awaiter(this, void 0, void 0, function* () {
2443
- const { databaseUrl, code, publicKey, scopes = ['ACCESS_DB'], intent } = options;
2459
+ const { databaseUrl, code, publicKey, scopes = ['ACCESS_DB'], intent, } = options;
2444
2460
  const tokenRequest = Object.assign({ grant_type: 'authorization_code', code, public_key: publicKey, scopes }, (intent !== undefined ? { intent } : {}));
2445
2461
  try {
2446
2462
  const res = yield fetch(`${databaseUrl}/token`, {
@@ -2498,7 +2514,8 @@ function exchangeOAuthCode(options) {
2498
2514
  return response;
2499
2515
  }
2500
2516
  catch (error) {
2501
- if (error instanceof OAuthError || error instanceof TokenErrorResponseError) {
2517
+ if (error instanceof OAuthError ||
2518
+ error instanceof TokenErrorResponseError) {
2502
2519
  throw error;
2503
2520
  }
2504
2521
  if (error instanceof TypeError) {
@@ -2536,7 +2553,7 @@ function fetchAuthProviders(databaseUrl_1) {
2536
2553
  try {
2537
2554
  const res = yield fetch(`${databaseUrl}/auth-providers`, {
2538
2555
  method: 'GET',
2539
- headers: { 'Accept': 'application/json' },
2556
+ headers: { Accept: 'application/json' },
2540
2557
  mode: 'cors',
2541
2558
  });
2542
2559
  if (res.status === 404) {
@@ -2866,7 +2883,7 @@ function tryParsePolicyAlert(res) {
2866
2883
  * @param args
2867
2884
  */
2868
2885
  function prodLog(level, ...args) {
2869
- globalThis["con" + "sole"][level](...args);
2886
+ globalThis['con' + 'sole'][level](...args);
2870
2887
  }
2871
2888
 
2872
2889
  /** This function changes or sets the current user as requested.
@@ -2978,8 +2995,10 @@ function login(db, hints) {
2978
2995
  }
2979
2996
 
2980
2997
  const swHolder = {};
2981
- const swContainer = typeof self !== 'undefined' && self.document && // self.document is to verify we're not the SW ourself
2982
- typeof navigator !== 'undefined' && navigator.serviceWorker;
2998
+ const swContainer = typeof self !== 'undefined' &&
2999
+ self.document && // self.document is to verify we're not the SW ourself
3000
+ typeof navigator !== 'undefined' &&
3001
+ navigator.serviceWorker;
2983
3002
  if (swContainer)
2984
3003
  swContainer.ready.then((registration) => (swHolder.registration = registration));
2985
3004
  if (typeof self !== 'undefined' && 'clients' in self && !self.document) {
@@ -3033,7 +3052,8 @@ class SWBroadcastChannel {
3033
3052
  }
3034
3053
  }
3035
3054
 
3036
- const events = globalThis['lbc-events'] || (globalThis['lbc-events'] = new Map());
3055
+ const events = globalThis['lbc-events'] ||
3056
+ (globalThis['lbc-events'] = new Map());
3037
3057
  function addListener(name, listener) {
3038
3058
  if (events.has(name)) {
3039
3059
  events.get(name).push(listener);
@@ -3054,25 +3074,25 @@ function removeListener(name, listener) {
3054
3074
  function dispatch(ev) {
3055
3075
  const listeners = events.get(ev.type);
3056
3076
  if (listeners) {
3057
- listeners.forEach(listener => {
3077
+ listeners.forEach((listener) => {
3058
3078
  try {
3059
3079
  listener(ev);
3060
3080
  }
3061
- catch (_a) {
3062
- }
3081
+ catch (_a) { }
3063
3082
  });
3064
3083
  }
3065
3084
  }
3066
3085
  class BroadcastedAndLocalEvent extends Observable {
3067
3086
  constructor(name) {
3068
- const bc = typeof BroadcastChannel === "undefined"
3069
- ? new SWBroadcastChannel(name) : new BroadcastChannel(name);
3070
- super(subscriber => {
3087
+ const bc = typeof BroadcastChannel === 'undefined'
3088
+ ? new SWBroadcastChannel(name)
3089
+ : new BroadcastChannel(name);
3090
+ super((subscriber) => {
3071
3091
  function onCustomEvent(ev) {
3072
3092
  subscriber.next(ev.detail);
3073
3093
  }
3074
3094
  function onMessageEvent(ev) {
3075
- console.debug("BroadcastedAndLocalEvent: onMessageEvent", ev);
3095
+ console.debug('BroadcastedAndLocalEvent: onMessageEvent', ev);
3076
3096
  subscriber.next(ev.data);
3077
3097
  }
3078
3098
  let unsubscribe;
@@ -3080,11 +3100,11 @@ class BroadcastedAndLocalEvent extends Observable {
3080
3100
  addListener(`lbc-${name}`, onCustomEvent); // Works better in service worker
3081
3101
  try {
3082
3102
  if (bc instanceof SWBroadcastChannel) {
3083
- unsubscribe = bc.subscribe(message => subscriber.next(message));
3103
+ unsubscribe = bc.subscribe((message) => subscriber.next(message));
3084
3104
  }
3085
3105
  else {
3086
- console.debug("BroadcastedAndLocalEvent: bc.addEventListener()", name, "bc is a", bc);
3087
- bc.addEventListener("message", onMessageEvent);
3106
+ console.debug('BroadcastedAndLocalEvent: bc.addEventListener()', name, 'bc is a', bc);
3107
+ bc.addEventListener('message', onMessageEvent);
3088
3108
  }
3089
3109
  }
3090
3110
  catch (err) {
@@ -3098,7 +3118,7 @@ class BroadcastedAndLocalEvent extends Observable {
3098
3118
  unsubscribe();
3099
3119
  }
3100
3120
  else {
3101
- bc.removeEventListener("message", onMessageEvent);
3121
+ bc.removeEventListener('message', onMessageEvent);
3102
3122
  }
3103
3123
  };
3104
3124
  });
@@ -3106,7 +3126,7 @@ class BroadcastedAndLocalEvent extends Observable {
3106
3126
  this.bc = bc;
3107
3127
  }
3108
3128
  next(message) {
3109
- console.debug("BroadcastedAndLocalEvent: bc.postMessage()", Object.assign({}, message), "bc is a", this.bc);
3129
+ console.debug('BroadcastedAndLocalEvent: bc.postMessage()', Object.assign({}, message), 'bc is a', this.bc);
3110
3130
  this.bc.postMessage(message);
3111
3131
  const ev = new CustomEvent(`lbc-${this.name}`, { detail: message });
3112
3132
  //self.dispatchEvent(ev);
@@ -3199,7 +3219,7 @@ function removeRedundantUpdateOps(muts) {
3199
3219
  }
3200
3220
  const strKey = '' + mut.keys[0];
3201
3221
  const changeSpecs = mut.changeSpecs[0];
3202
- if (Object.values(changeSpecs).some(v => typeof v === "object" && v && "@@propmod" in v)) {
3222
+ if (Object.values(changeSpecs).some((v) => typeof v === 'object' && v && '@@propmod' in v)) {
3203
3223
  continue; // Cannot optimize if any PropModification is present
3204
3224
  }
3205
3225
  let keyCoverage = updateCoverage.get(strKey);
@@ -3207,11 +3227,13 @@ function removeRedundantUpdateOps(muts) {
3207
3227
  keyCoverage.push({ txid: mut.txid, updateSpec: changeSpecs });
3208
3228
  }
3209
3229
  else {
3210
- updateCoverage.set(strKey, [{ txid: mut.txid, updateSpec: changeSpecs }]);
3230
+ updateCoverage.set(strKey, [
3231
+ { txid: mut.txid, updateSpec: changeSpecs },
3232
+ ]);
3211
3233
  }
3212
3234
  }
3213
3235
  }
3214
- muts = muts.filter(mut => {
3236
+ muts = muts.filter((mut) => {
3215
3237
  // Only apply optimization to update mutations that are single-key
3216
3238
  if (mut.type !== 'update')
3217
3239
  return true;
@@ -3219,7 +3241,7 @@ function removeRedundantUpdateOps(muts) {
3219
3241
  return true;
3220
3242
  // Check if this has PropModifications - if so, skip optimization
3221
3243
  const changeSpecs = mut.changeSpecs[0];
3222
- if (Object.values(changeSpecs).some(v => typeof v === "object" && v && "@@propmod" in v)) {
3244
+ if (Object.values(changeSpecs).some((v) => typeof v === 'object' && v && '@@propmod' in v)) {
3223
3245
  return true; // Cannot optimize if any PropModification is present
3224
3246
  }
3225
3247
  // Keep track of properties that aren't overlapped by later transactions
@@ -3247,7 +3269,7 @@ function removeRedundantUpdateOps(muts) {
3247
3269
  return muts;
3248
3270
  }
3249
3271
  function canonicalizeToUpdateOps(muts) {
3250
- muts = muts.map(mut => {
3272
+ muts = muts.map((mut) => {
3251
3273
  if (mut.type === 'modify' && mut.criteria.index === null) {
3252
3274
  // The criteria is on primary key. Convert to an update operation instead.
3253
3275
  // It is simpler for the server to handle and also more efficient.
@@ -3469,7 +3491,7 @@ function checkSyncRateLimitDelay(db) {
3469
3491
  const delatMilliseconds = ((_b = (_a = syncRatelimitDelays.get(db)) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : 0) - Date.now();
3470
3492
  if (delatMilliseconds > 0) {
3471
3493
  console.debug(`Stalling sync request ${delatMilliseconds} ms to spare ratelimits`);
3472
- yield new Promise(resolve => setTimeout(resolve, delatMilliseconds));
3494
+ yield new Promise((resolve) => setTimeout(resolve, delatMilliseconds));
3473
3495
  }
3474
3496
  });
3475
3497
  }
@@ -3534,7 +3556,7 @@ function syncWithServer(changes, y, syncState, baseRevs, db, databaseUrl, schema
3534
3556
  baseRevs,
3535
3557
  changes: encodeIdsForServer(db.dx.core.schema, currentUser, changes),
3536
3558
  y,
3537
- dxcv: db.cloud.version
3559
+ dxcv: db.cloud.version,
3538
3560
  };
3539
3561
  console.debug('Sync request', syncRequest);
3540
3562
  db.syncStateChangedEvent.next({
@@ -3574,19 +3596,22 @@ function modifyLocalObjectsWithNewUserId(syncifiedTables, currentUser, alreadySy
3574
3596
  return __awaiter(this, void 0, void 0, function* () {
3575
3597
  const ignoredRealms = new Set(alreadySyncedRealms || []);
3576
3598
  for (const table of syncifiedTables) {
3577
- if (table.name === "members") {
3599
+ if (table.name === 'members') {
3578
3600
  // members
3579
3601
  yield table.toCollection().modify((member) => {
3580
- if (!ignoredRealms.has(member.realmId) && (!member.userId || member.userId === UNAUTHORIZED_USER.userId)) {
3602
+ if (!ignoredRealms.has(member.realmId) &&
3603
+ (!member.userId || member.userId === UNAUTHORIZED_USER.userId)) {
3581
3604
  member.userId = currentUser.userId;
3582
3605
  }
3583
3606
  });
3584
3607
  }
3585
- else if (table.name === "roles") ;
3586
- else if (table.name === "realms") {
3608
+ else if (table.name === 'roles') ;
3609
+ else if (table.name === 'realms') {
3587
3610
  // realms
3588
3611
  yield table.toCollection().modify((realm) => {
3589
- if (!ignoredRealms.has(realm.realmId) && (realm.owner === undefined || realm.owner === UNAUTHORIZED_USER.userId)) {
3612
+ if (!ignoredRealms.has(realm.realmId) &&
3613
+ (realm.owner === undefined ||
3614
+ realm.owner === UNAUTHORIZED_USER.userId)) {
3590
3615
  realm.owner = currentUser.userId;
3591
3616
  }
3592
3617
  });
@@ -3619,8 +3644,8 @@ function throwIfCancelled(cancelToken) {
3619
3644
  let isOnline = false;
3620
3645
  if (typeof self !== 'undefined' && typeof navigator !== 'undefined') {
3621
3646
  isOnline = navigator.onLine;
3622
- self.addEventListener('online', () => isOnline = true);
3623
- self.addEventListener('offline', () => isOnline = false);
3647
+ self.addEventListener('online', () => (isOnline = true));
3648
+ self.addEventListener('offline', () => (isOnline = false));
3624
3649
  }
3625
3650
 
3626
3651
  function updateBaseRevs(db, schema, latestRevisions, serverRev) {
@@ -3637,7 +3662,10 @@ function updateBaseRevs(db, schema, latestRevisions, serverRev) {
3637
3662
  }));
3638
3663
  // Clean up baseRevs for tables that do not exist anymore or are no longer marked for sync
3639
3664
  // Resolve #2168 by also cleaning up baseRevs for tables that are not marked for sync
3640
- yield db.$baseRevs.where('tableName').noneOf(Object.keys(schema).filter((table) => schema[table].markedForSync)).delete();
3665
+ yield db.$baseRevs
3666
+ .where('tableName')
3667
+ .noneOf(Object.keys(schema).filter((table) => schema[table].markedForSync))
3668
+ .delete();
3641
3669
  });
3642
3670
  }
3643
3671
 
@@ -3783,10 +3811,7 @@ function applyServerChanges(changes, db) {
3783
3811
  const DEXIE_CLOUD_SYNCER_ID = 'dexie-cloud-syncer';
3784
3812
 
3785
3813
  function listUpdatesSince(yTable, sinceIncluding) {
3786
- return yTable
3787
- .where('i')
3788
- .between(sinceIncluding, Infinity, true)
3789
- .toArray();
3814
+ return yTable.where('i').between(sinceIncluding, Infinity, true).toArray();
3790
3815
  }
3791
3816
 
3792
3817
  /** Queries the local database for YMessages to send to server.
@@ -3881,7 +3906,7 @@ function listYClientMessagesAndStateVector(db, tablesToSync) {
3881
3906
  }
3882
3907
  return {
3883
3908
  yMessages: result,
3884
- lastUpdateIds
3909
+ lastUpdateIds,
3885
3910
  };
3886
3911
  });
3887
3912
  }
@@ -3890,7 +3915,8 @@ function getUpdatesTable(db, table, ydocProp) {
3890
3915
  var _a, _b, _c;
3891
3916
  if (!db.dx._allTables[table])
3892
3917
  return undefined;
3893
- const utbl = (_c = (_b = (_a = db.table(table)) === null || _a === void 0 ? void 0 : _a.schema.yProps) === null || _b === void 0 ? void 0 : _b.find(p => p.prop === ydocProp)) === null || _c === void 0 ? void 0 : _c.updatesTable;
3918
+ const utbl = (_c = (_b = (_a = db
3919
+ .table(table)) === null || _a === void 0 ? void 0 : _a.schema.yProps) === null || _b === void 0 ? void 0 : _b.find((p) => p.prop === ydocProp)) === null || _c === void 0 ? void 0 : _c.updatesTable;
3894
3920
  if (!utbl) {
3895
3921
  console.debug(`No updatesTable found for ${table}.${ydocProp}`);
3896
3922
  return undefined;
@@ -4023,10 +4049,18 @@ const blobEndpointSupported = new Map();
4023
4049
  */
4024
4050
  // TypedArray/DataView tags for size check
4025
4051
  const ARRAYBUFFER_VIEW_TAGS = new Set([
4026
- 'Int8Array', 'Uint8Array', 'Uint8ClampedArray',
4027
- 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array',
4028
- 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array',
4029
- 'DataView'
4052
+ 'Int8Array',
4053
+ 'Uint8Array',
4054
+ 'Uint8ClampedArray',
4055
+ 'Int16Array',
4056
+ 'Uint16Array',
4057
+ 'Int32Array',
4058
+ 'Uint32Array',
4059
+ 'Float32Array',
4060
+ 'Float64Array',
4061
+ 'BigInt64Array',
4062
+ 'BigUint64Array',
4063
+ 'DataView',
4030
4064
  ]);
4031
4065
  // Static Set for O(1) lookup of binary type tags
4032
4066
  const BINARY_TYPE_TAGS = new Set([
@@ -4126,7 +4160,7 @@ function uploadBlob(databaseUrl, getCachedAccessToken, blob) {
4126
4160
  const response = yield fetch(uploadUrl, {
4127
4161
  method: 'PUT',
4128
4162
  headers: {
4129
- 'Authorization': `Bearer ${accessToken}`,
4163
+ Authorization: `Bearer ${accessToken}`,
4130
4164
  'Content-Type': contentType,
4131
4165
  },
4132
4166
  body,
@@ -4142,8 +4176,7 @@ function uploadBlob(databaseUrl, getCachedAccessToken, blob) {
4142
4176
  // The server returns the ref with version prefix (e.g., "1:blobId")
4143
4177
  const result = yield response.json();
4144
4178
  // Return BlobRef with server's ref (includes version) and original type preserved in _bt
4145
- return Object.assign({ _bt: origType, ref: result.ref, size: size }, (origType === 'Blob' ? { ct: contentType } : {}) // Only include content type for Blobs
4146
- );
4179
+ return Object.assign({ _bt: origType, ref: result.ref, size: size }, (origType === 'Blob' ? { ct: contentType } : {}));
4147
4180
  });
4148
4181
  }
4149
4182
  function offloadBlobsAndMarkDirty(obj_1, databaseUrl_1, getCachedAccessToken_1) {
@@ -4151,7 +4184,10 @@ function offloadBlobsAndMarkDirty(obj_1, databaseUrl_1, getCachedAccessToken_1)
4151
4184
  const dirtyFlag = { dirty: false };
4152
4185
  const result = yield offloadBlobs(obj, databaseUrl, getCachedAccessToken, maxStringLength, dirtyFlag);
4153
4186
  // Mark the object as dirty for sync if any blobs were offloaded
4154
- if (dirtyFlag.dirty && typeof result === 'object' && result !== null && result.constructor === Object) {
4187
+ if (dirtyFlag.dirty &&
4188
+ typeof result === 'object' &&
4189
+ result !== null &&
4190
+ result.constructor === Object) {
4155
4191
  result._hasBlobRefs = 1;
4156
4192
  }
4157
4193
  return result;
@@ -4167,7 +4203,9 @@ function offloadBlobs(obj_1, databaseUrl_1, getCachedAccessToken_1) {
4167
4203
  return obj;
4168
4204
  }
4169
4205
  // Check if this is a long string that should be offloaded
4170
- if (typeof obj === 'string' && obj.length > maxStringLength && maxStringLength !== Infinity) {
4206
+ if (typeof obj === 'string' &&
4207
+ obj.length > maxStringLength &&
4208
+ maxStringLength !== Infinity) {
4171
4209
  if (blobEndpointSupported.get(databaseUrl) === false) {
4172
4210
  return obj;
4173
4211
  }
@@ -4253,11 +4291,11 @@ function offloadBlobsInOperation(op_1, databaseUrl_1, getCachedAccessToken_1) {
4253
4291
  switch (op.type) {
4254
4292
  case 'insert':
4255
4293
  case 'upsert': {
4256
- const processedValues = yield Promise.all(op.values.map(value => offloadBlobsAndMarkDirty(value, databaseUrl, getCachedAccessToken, maxStringLength)));
4294
+ const processedValues = yield Promise.all(op.values.map((value) => offloadBlobsAndMarkDirty(value, databaseUrl, getCachedAccessToken, maxStringLength)));
4257
4295
  return Object.assign(Object.assign({}, op), { values: processedValues });
4258
4296
  }
4259
4297
  case 'update': {
4260
- const processedChangeSpecs = yield Promise.all(op.changeSpecs.map(spec => offloadBlobsAndMarkDirty(spec, databaseUrl, getCachedAccessToken, maxStringLength)));
4298
+ const processedChangeSpecs = yield Promise.all(op.changeSpecs.map((spec) => offloadBlobsAndMarkDirty(spec, databaseUrl, getCachedAccessToken, maxStringLength)));
4261
4299
  return Object.assign(Object.assign({}, op), { changeSpecs: processedChangeSpecs });
4262
4300
  }
4263
4301
  case 'modify': {
@@ -4290,9 +4328,9 @@ function hasLargeBlobsInOperation(op, maxStringLength) {
4290
4328
  switch (op.type) {
4291
4329
  case 'insert':
4292
4330
  case 'upsert':
4293
- return op.values.some(value => hasLargeBlobs(value, maxStringLength));
4331
+ return op.values.some((value) => hasLargeBlobs(value, maxStringLength));
4294
4332
  case 'update':
4295
- return op.changeSpecs.some(spec => hasLargeBlobs(spec, maxStringLength));
4333
+ return op.changeSpecs.some((spec) => hasLargeBlobs(spec, maxStringLength));
4296
4334
  case 'modify':
4297
4335
  return hasLargeBlobs(op.changeSpec, maxStringLength);
4298
4336
  default:
@@ -4304,7 +4342,9 @@ function hasLargeBlobs(obj, maxStringLength, visited = new WeakSet()) {
4304
4342
  return false;
4305
4343
  }
4306
4344
  // Check long strings
4307
- if (typeof obj === 'string' && obj.length > maxStringLength && maxStringLength !== Infinity) {
4345
+ if (typeof obj === 'string' &&
4346
+ obj.length > maxStringLength &&
4347
+ maxStringLength !== Infinity) {
4308
4348
  return true;
4309
4349
  }
4310
4350
  if (shouldOffloadBlob(obj)) {
@@ -4319,13 +4359,13 @@ function hasLargeBlobs(obj, maxStringLength, visited = new WeakSet()) {
4319
4359
  }
4320
4360
  visited.add(obj);
4321
4361
  if (Array.isArray(obj)) {
4322
- return obj.some(item => hasLargeBlobs(item, maxStringLength, visited));
4362
+ return obj.some((item) => hasLargeBlobs(item, maxStringLength, visited));
4323
4363
  }
4324
4364
  // Traverse plain objects (POJO-like) - use duck typing since IndexedDB
4325
4365
  // may return objects where constructor !== Object
4326
4366
  const proto = Object.getPrototypeOf(obj);
4327
4367
  if (proto === Object.prototype || proto === null) {
4328
- return Object.values(obj).some(value => hasLargeBlobs(value, maxStringLength, visited));
4368
+ return Object.values(obj).some((value) => hasLargeBlobs(value, maxStringLength, visited));
4329
4369
  }
4330
4370
  return false;
4331
4371
  }
@@ -4379,7 +4419,7 @@ function updateYSyncStates(lastUpdateIdsBeforeSync, receivedUntilsAfterSync, db)
4379
4419
  yield db.table(yTable).add({
4380
4420
  i: DEXIE_CLOUD_SYNCER_ID,
4381
4421
  unsentFrom,
4382
- receivedUntil
4422
+ receivedUntil,
4383
4423
  });
4384
4424
  }
4385
4425
  else {
@@ -4519,19 +4559,30 @@ function loadCachedAccessToken(db) {
4519
4559
  return Promise.resolve(cached.accessToken);
4520
4560
  }
4521
4561
  const currentUser = db.cloud.currentUser.value;
4522
- if (currentUser && currentUser.accessToken && ((_b = (_a = currentUser.accessTokenExpiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : Infinity) > Date.now() + 5 * MINUTES) {
4562
+ if (currentUser &&
4563
+ currentUser.accessToken &&
4564
+ ((_b = (_a = currentUser.accessTokenExpiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : Infinity) >
4565
+ Date.now() + 5 * MINUTES) {
4523
4566
  wm$2.set(db, {
4524
4567
  accessToken: currentUser.accessToken,
4525
- expiration: (_d = (_c = currentUser.accessTokenExpiration) === null || _c === void 0 ? void 0 : _c.getTime()) !== null && _d !== void 0 ? _d : Infinity
4568
+ expiration: (_d = (_c = currentUser.accessTokenExpiration) === null || _c === void 0 ? void 0 : _c.getTime()) !== null && _d !== void 0 ? _d : Infinity,
4526
4569
  });
4527
4570
  return Promise.resolve(currentUser.accessToken);
4528
4571
  }
4529
- return Dexie.ignoreTransaction(() => loadAccessToken(db).then(user => {
4572
+ // If the current user is not logged in (no isLoggedIn flag), there's no
4573
+ // token to load from the database — skip the Dexie.ignoreTransaction() call.
4574
+ // This avoids a crash in service worker context where Dexie's Promise zone
4575
+ // (PSD.transless.env) may be undefined when called from within an active
4576
+ // rw transaction (e.g. during applyServerChanges).
4577
+ if (!(currentUser === null || currentUser === void 0 ? void 0 : currentUser.isLoggedIn)) {
4578
+ return Promise.resolve(null);
4579
+ }
4580
+ return Dexie.ignoreTransaction(() => loadAccessToken(db).then((user) => {
4530
4581
  var _a, _b;
4531
4582
  if (user === null || user === void 0 ? void 0 : user.accessToken) {
4532
4583
  wm$2.set(db, {
4533
4584
  accessToken: user.accessToken,
4534
- expiration: (_b = (_a = user.accessTokenExpiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : Infinity
4585
+ expiration: (_b = (_a = user.accessTokenExpiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : Infinity,
4535
4586
  });
4536
4587
  }
4537
4588
  return (user === null || user === void 0 ? void 0 : user.accessToken) || null;
@@ -4542,7 +4593,8 @@ const CURRENT_SYNC_WORKER = 'currentSyncWorker';
4542
4593
  function sync(db, options, schema, syncOptions) {
4543
4594
  return _sync(db, options, schema, syncOptions)
4544
4595
  .then((result) => {
4545
- if (!(syncOptions === null || syncOptions === void 0 ? void 0 : syncOptions.justCheckIfNeeded)) { // && syncOptions?.purpose !== 'push') {
4596
+ if (!(syncOptions === null || syncOptions === void 0 ? void 0 : syncOptions.justCheckIfNeeded)) {
4597
+ // && syncOptions?.purpose !== 'push') {
4546
4598
  db.syncStateChangedEvent.next({
4547
4599
  phase: 'in-sync',
4548
4600
  });
@@ -4629,7 +4681,7 @@ function _sync(db_1, options_1, schema_1) {
4629
4681
  const syncState = yield db.getPersistedSyncState();
4630
4682
  let baseRevs = yield db.$baseRevs.toArray();
4631
4683
  // Resolve #2168
4632
- baseRevs = baseRevs.filter(br => tablesToSync.some(tbl => tbl.name === br.tableName));
4684
+ baseRevs = baseRevs.filter((br) => tablesToSync.some((tbl) => tbl.name === br.tableName));
4633
4685
  let clientChanges = yield listClientChanges(mutationTables, db);
4634
4686
  const yResults = yield listYClientMessagesAndStateVector(db, tablesToSync);
4635
4687
  throwIfCancelled(cancelToken);
@@ -4645,7 +4697,7 @@ function _sync(db_1, options_1, schema_1) {
4645
4697
  }
4646
4698
  return [clientChanges, syncState, baseRevs, yResults];
4647
4699
  }));
4648
- const pushSyncIsNeeded = clientChangeSet.some((set) => set.muts.some((mut) => mut.keys.length > 0)) || yMessages.some(m => m.type === 'u-c');
4700
+ const pushSyncIsNeeded = clientChangeSet.some((set) => set.muts.some((mut) => mut.keys.length > 0)) || yMessages.some((m) => m.type === 'u-c');
4649
4701
  if (justCheckIfNeeded) {
4650
4702
  console.debug('Sync is needed:', pushSyncIsNeeded);
4651
4703
  return pushSyncIsNeeded;
@@ -4789,7 +4841,7 @@ function _sync(db_1, options_1, schema_1) {
4789
4841
  db.$syncState.put(newSyncState, 'syncState');
4790
4842
  return {
4791
4843
  done: addedClientChanges.length === 0,
4792
- newSyncState
4844
+ newSyncState,
4793
4845
  };
4794
4846
  }));
4795
4847
  if (!done) {
@@ -4797,7 +4849,7 @@ function _sync(db_1, options_1, schema_1) {
4797
4849
  yield checkSyncRateLimitDelay(db);
4798
4850
  return yield _sync(db, options, schema, { isInitialSync, cancelToken });
4799
4851
  }
4800
- const usingYProps = Object.values(schema).some(tbl => { var _a; return (_a = tbl.yProps) === null || _a === void 0 ? void 0 : _a.length; });
4852
+ const usingYProps = Object.values(schema).some((tbl) => { var _a; return (_a = tbl.yProps) === null || _a === void 0 ? void 0 : _a.length; });
4801
4853
  const serverSupportsYprops = !!res.yMessages;
4802
4854
  if (usingYProps && serverSupportsYprops) {
4803
4855
  try {
@@ -5104,11 +5156,14 @@ class BlobDownloadTracker {
5104
5156
  download(blobRef, dbUrl) {
5105
5157
  let promise = this.inFlight.get(blobRef.ref);
5106
5158
  if (!promise) {
5107
- promise = loadCachedAccessToken(this.db).then(accessToken => {
5108
- if (!accessToken)
5109
- throw new Error("No access token available for blob download");
5159
+ promise = loadCachedAccessToken(this.db)
5160
+ .then((accessToken) => {
5161
+ // accessToken may be null for anonymous/unauthenticated users.
5162
+ // Public realm blobs (rlm-public) are accessible without auth.
5163
+ // downloadBlob will omit the Authorization header when token is null.
5110
5164
  return downloadBlob(blobRef, dbUrl, accessToken);
5111
- }).finally(() => this.inFlight.delete(blobRef.ref));
5165
+ })
5166
+ .finally(() => this.inFlight.delete(blobRef.ref));
5112
5167
  // When the promise settles (either fulfilled or rejected), remove it from the in-flight map
5113
5168
  this.inFlight.set(blobRef.ref, promise);
5114
5169
  }
@@ -5118,19 +5173,22 @@ class BlobDownloadTracker {
5118
5173
  /**
5119
5174
  * Download blob data from server via proxy endpoint.
5120
5175
  * Uses auth header for authentication (same as sync).
5176
+ * When accessToken is null, the request is made without Authorization header —
5177
+ * this allows downloading blobs from public realms (rlm-public) for
5178
+ * unauthenticated users.
5121
5179
  *
5122
5180
  * @param blobRef - The BlobRef to download
5123
5181
  * @param dbUrl - Base URL for the database (e.g., 'https://mydb.dexie.cloud')
5124
- * @param accessToken - Access token for authentication
5182
+ * @param accessToken - Access token for authentication, or null for anonymous access
5125
5183
  */
5126
5184
  function downloadBlob(blobRef, dbUrl, accessToken) {
5127
5185
  return __awaiter(this, void 0, void 0, function* () {
5128
5186
  const downloadUrl = `${dbUrl}/blob/${blobRef.ref}`;
5129
- const response = yield fetch(downloadUrl, {
5130
- headers: {
5131
- 'Authorization': `Bearer ${accessToken}`
5132
- }
5133
- });
5187
+ const headers = {};
5188
+ if (accessToken) {
5189
+ headers['Authorization'] = `Bearer ${accessToken}`;
5190
+ }
5191
+ const response = yield fetch(downloadUrl, { headers });
5134
5192
  if (!response.ok) {
5135
5193
  throw new Error(`Failed to download blob ${blobRef.ref}: ${response.status} ${response.statusText}`);
5136
5194
  }
@@ -5221,7 +5279,9 @@ function DexieCloudDB(dx) {
5221
5279
  return db.$syncState.get('schema').then((schema) => {
5222
5280
  if (schema) {
5223
5281
  for (const table of db.tables) {
5224
- if (table.schema.primKey && table.schema.primKey.keyPath && schema[table.name]) {
5282
+ if (table.schema.primKey &&
5283
+ table.schema.primKey.keyPath &&
5284
+ schema[table.name]) {
5225
5285
  schema[table.name].primaryKey = nameFromKeyPath(table.schema.primKey.keyPath);
5226
5286
  }
5227
5287
  }
@@ -5249,9 +5309,11 @@ function DexieCloudDB(dx) {
5249
5309
  return db;
5250
5310
  }
5251
5311
  function nameFromKeyPath(keyPath) {
5252
- return typeof keyPath === 'string' ?
5253
- keyPath :
5254
- keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : "";
5312
+ return typeof keyPath === 'string'
5313
+ ? keyPath
5314
+ : keyPath
5315
+ ? '[' + [].join.call(keyPath, '+') + ']'
5316
+ : '';
5255
5317
  }
5256
5318
 
5257
5319
  // @ts-ignore
@@ -5273,7 +5335,7 @@ const safariVersion = isSafari
5273
5335
  const DISABLE_SERVICEWORKER_STRATEGY = (isSafari && safariVersion <= 605) || // Disable for Safari for now.
5274
5336
  isFirefox; // Disable for Firefox for now. Seems to have a bug in reading CryptoKeys from IDB from service workers
5275
5337
 
5276
- const IS_SERVICE_WORKER = typeof self !== "undefined" && "clients" in self && !self.document;
5338
+ const IS_SERVICE_WORKER = typeof self !== 'undefined' && 'clients' in self && !self.document;
5277
5339
 
5278
5340
  function throwVersionIncrementNeeded() {
5279
5341
  throw new Dexie.SchemaError(`Version increment needed to allow dexie-cloud change tracking`);
@@ -5519,7 +5581,7 @@ function createImplicitPropSetterMiddleware(db) {
5519
5581
  // We must also degrade from consistent modify operations for the
5520
5582
  // same reason - object might be there on server. Must but put up instead.
5521
5583
  // FUTURE: This clumpsy behavior of private IDs could be refined later.
5522
- // Suggestion is to in future, treat private IDs as we treat all objects
5584
+ // Suggestion is to in future, treat private IDs as we treat all objects
5523
5585
  // and sync operations normally. Only that deletions should become soft deletes
5524
5586
  // for them - so that server knows when a private ID has been deleted on server
5525
5587
  // not accept insert/upserts on them.
@@ -5542,19 +5604,20 @@ function createImplicitPropSetterMiddleware(db) {
5542
5604
  }
5543
5605
 
5544
5606
  function allSettled(possiblePromises) {
5545
- return new Promise(resolve => {
5607
+ return new Promise((resolve) => {
5546
5608
  if (possiblePromises.length === 0)
5547
5609
  resolve([]);
5548
5610
  let remaining = possiblePromises.length;
5549
5611
  const results = new Array(remaining);
5550
- possiblePromises.forEach((p, i) => Promise.resolve(p).then(value => results[i] = { status: "fulfilled", value }, reason => results[i] = { status: "rejected", reason })
5612
+ possiblePromises.forEach((p, i) => Promise.resolve(p)
5613
+ .then((value) => (results[i] = { status: 'fulfilled', value }), (reason) => (results[i] = { status: 'rejected', reason }))
5551
5614
  .then(() => --remaining || resolve(results)));
5552
5615
  });
5553
5616
  }
5554
5617
 
5555
5618
  let counter$1 = 0;
5556
5619
  function guardedTable(table) {
5557
- const prop = "$lock" + (++counter$1);
5620
+ const prop = '$lock' + ++counter$1;
5558
5621
  return Object.assign(Object.assign({}, table), { count: readLock(table.count, prop), get: readLock(table.get, prop), getMany: readLock(table.getMany, prop), openCursor: readLock(table.openCursor, prop), query: readLock(table.query, prop), mutate: writeLock(table.mutate, prop) });
5559
5622
  }
5560
5623
  function readLock(fn, prop) {
@@ -5563,7 +5626,9 @@ function readLock(fn, prop) {
5563
5626
  const numWriters = writers.length;
5564
5627
  const promise = (numWriters > 0
5565
5628
  ? writers[numWriters - 1].then(() => fn(req), () => fn(req))
5566
- : fn(req)).finally(() => { readers.splice(readers.indexOf(promise)); });
5629
+ : fn(req)).finally(() => {
5630
+ readers.splice(readers.indexOf(promise));
5631
+ });
5567
5632
  readers.push(promise);
5568
5633
  return promise;
5569
5634
  };
@@ -5575,7 +5640,9 @@ function writeLock(fn, prop) {
5575
5640
  ? writers[writers.length - 1].then(() => fn(req), () => fn(req))
5576
5641
  : readers.length > 0
5577
5642
  ? allSettled(readers).then(() => fn(req))
5578
- : fn(req)).finally(() => { writers.shift(); });
5643
+ : fn(req)).finally(() => {
5644
+ writers.shift();
5645
+ });
5579
5646
  writers.push(promise);
5580
5647
  return promise;
5581
5648
  };
@@ -5853,16 +5920,17 @@ function createMutationTrackingMiddleware({ currentUserObservable, db, }) {
5853
5920
  userId,
5854
5921
  values,
5855
5922
  }
5856
- : upsert && updates ? {
5857
- type: 'upsert',
5858
- ts,
5859
- opNo,
5860
- keys,
5861
- values,
5862
- changeSpecs: updates.changeSpecs.filter((_, idx) => !failures[idx]),
5863
- txid,
5864
- userId,
5865
- }
5923
+ : upsert && updates
5924
+ ? {
5925
+ type: 'upsert',
5926
+ ts,
5927
+ opNo,
5928
+ keys,
5929
+ values,
5930
+ changeSpecs: updates.changeSpecs.filter((_, idx) => !failures[idx]),
5931
+ txid,
5932
+ userId,
5933
+ }
5866
5934
  : criteria && changeSpec
5867
5935
  ? {
5868
5936
  // Common changeSpec for all keys
@@ -5975,7 +6043,8 @@ class BlobSavingQueue {
5975
6043
  return;
5976
6044
  }
5977
6045
  // Atomic update of just the blob property
5978
- this.db.transaction('rw', item.tableName, (tx) => {
6046
+ this.db
6047
+ .transaction('rw', item.tableName, (tx) => {
5979
6048
  const trans = tx.idbtrans;
5980
6049
  trans.disableChangeTracking = true; // Don't regard this as a change for sync purposes
5981
6050
  trans.disableAccessControl = true; // Bypass any access control checks since this is an internal operation
@@ -5984,7 +6053,7 @@ class BlobSavingQueue {
5984
6053
  for (const blob of item.resolvedBlobs) {
5985
6054
  updateSpec[blob.keyPath] = blob.data;
5986
6055
  }
5987
- tx.table(item.tableName).update(item.primaryKey, obj => {
6056
+ tx.table(item.tableName).update(item.primaryKey, (obj) => {
5988
6057
  // Check that object still has the same unresolved blob refs before applying update (i.e. it hasn't been modified since we read it)
5989
6058
  for (const blob of item.resolvedBlobs) {
5990
6059
  // Verify atomicity - none of the blob properties has been modified since we read it. If any of them was modified, skip updating this item to avoid overwriting user changes.
@@ -6005,9 +6074,11 @@ class BlobSavingQueue {
6005
6074
  }
6006
6075
  delete obj._hasBlobRefs; // Clear the _hasBlobRefs marker if all refs was resolved.
6007
6076
  });
6008
- }).catch((error) => {
6077
+ })
6078
+ .catch((error) => {
6009
6079
  console.error(`Error saving resolved blobs on ${item.tableName}:${item.primaryKey}:`, error);
6010
- }).finally(() => {
6080
+ })
6081
+ .finally(() => {
6011
6082
  // Process next item in the queue
6012
6083
  return this.processQueue();
6013
6084
  });
@@ -6058,7 +6129,7 @@ function createBlobResolveMiddleware(db) {
6058
6129
  if ((_a = req.trans) === null || _a === void 0 ? void 0 : _a.disableBlobResolve) {
6059
6130
  return downlevelTable.get(req);
6060
6131
  }
6061
- return downlevelTable.get(req).then(result => {
6132
+ return downlevelTable.get(req).then((result) => {
6062
6133
  if (result && hasUnresolvedBlobRefs(result)) {
6063
6134
  return resolveAndSave(downlevelTable, req.trans, req.key, result, blobSavingQueue, db);
6064
6135
  }
@@ -6070,9 +6141,9 @@ function createBlobResolveMiddleware(db) {
6070
6141
  if ((_a = req.trans) === null || _a === void 0 ? void 0 : _a.disableBlobResolve) {
6071
6142
  return downlevelTable.getMany(req);
6072
6143
  }
6073
- return downlevelTable.getMany(req).then(results => {
6144
+ return downlevelTable.getMany(req).then((results) => {
6074
6145
  // Check if any results need resolution
6075
- const needsResolution = results.some(r => r && hasUnresolvedBlobRefs(r));
6146
+ const needsResolution = results.some((r) => r && hasUnresolvedBlobRefs(r));
6076
6147
  if (!needsResolution)
6077
6148
  return results;
6078
6149
  return Dexie.Promise.all(results.map((result, index) => {
@@ -6088,19 +6159,19 @@ function createBlobResolveMiddleware(db) {
6088
6159
  if ((_a = req.trans) === null || _a === void 0 ? void 0 : _a.disableBlobResolve) {
6089
6160
  return downlevelTable.query(req);
6090
6161
  }
6091
- return downlevelTable.query(req).then(result => {
6162
+ return downlevelTable.query(req).then((result) => {
6092
6163
  if (!result.result || !Array.isArray(result.result))
6093
6164
  return result;
6094
6165
  // Check if any results need resolution
6095
- const needsResolution = result.result.some(r => r && hasUnresolvedBlobRefs(r));
6166
+ const needsResolution = result.result.some((r) => r && hasUnresolvedBlobRefs(r));
6096
6167
  if (!needsResolution)
6097
6168
  return result;
6098
- return Dexie.Promise.all(result.result.map(item => {
6169
+ return Dexie.Promise.all(result.result.map((item) => {
6099
6170
  if (item && hasUnresolvedBlobRefs(item)) {
6100
6171
  return resolveAndSave(downlevelTable, req.trans, undefined, item, blobSavingQueue, db);
6101
6172
  }
6102
6173
  return item;
6103
- })).then(resolved => (Object.assign(Object.assign({}, result), { result: resolved })));
6174
+ })).then((resolved) => (Object.assign(Object.assign({}, result), { result: resolved })));
6104
6175
  });
6105
6176
  },
6106
6177
  openCursor(req) {
@@ -6108,7 +6179,7 @@ function createBlobResolveMiddleware(db) {
6108
6179
  if ((_a = req.trans) === null || _a === void 0 ? void 0 : _a.disableBlobResolve) {
6109
6180
  return downlevelTable.openCursor(req);
6110
6181
  }
6111
- return downlevelTable.openCursor(req).then(cursor => {
6182
+ return downlevelTable.openCursor(req).then((cursor) => {
6112
6183
  if (!cursor)
6113
6184
  return cursor; // No results, so no resolution needed
6114
6185
  if (!req.values)
@@ -6138,7 +6209,7 @@ function createBlobResolvingCursor(cursor, table, blobSavingQueue, db) {
6138
6209
  value: {
6139
6210
  value: cursor.value,
6140
6211
  enumerable: true,
6141
- writable: true
6212
+ writable: true,
6142
6213
  },
6143
6214
  start: {
6144
6215
  value(onNext) {
@@ -6150,17 +6221,17 @@ function createBlobResolvingCursor(cursor, table, blobSavingQueue, db) {
6150
6221
  onNext();
6151
6222
  return;
6152
6223
  }
6153
- resolveAndSave(table, cursor.trans, cursor.primaryKey, rawValue, blobSavingQueue, db, true).then(resolved => {
6224
+ resolveAndSave(table, cursor.trans, cursor.primaryKey, rawValue, blobSavingQueue, db, true).then((resolved) => {
6154
6225
  wrappedCursor.value = resolved;
6155
6226
  onNext();
6156
- }, err => {
6227
+ }, (err) => {
6157
6228
  console.error('Failed to resolve BlobRefs for cursor value:', err);
6158
6229
  wrappedCursor.value = rawValue;
6159
6230
  onNext();
6160
6231
  });
6161
6232
  });
6162
- }
6163
- }
6233
+ },
6234
+ },
6164
6235
  });
6165
6236
  return wrappedCursor;
6166
6237
  }
@@ -6205,12 +6276,15 @@ obj, blobSavingQueue, db, isCursorValue = false // Flag to indicate if we're res
6205
6276
  const resolvePromise = needsWaitFor
6206
6277
  ? Dexie.waitFor(resolutionPromise)
6207
6278
  : Dexie.Promise.resolve(resolutionPromise);
6208
- return resolvePromise.then(resolved => {
6279
+ return resolvePromise
6280
+ .then((resolved) => {
6209
6281
  // Get primary key from the object
6210
6282
  const primaryKey = table.schema.primaryKey;
6211
- const key = pKey !== undefined ? pKey : primaryKey.keyPath
6212
- ? Dexie.getByKeyPath(obj, primaryKey.keyPath)
6213
- : undefined;
6283
+ const key = pKey !== undefined
6284
+ ? pKey
6285
+ : primaryKey.keyPath
6286
+ ? Dexie.getByKeyPath(obj, primaryKey.keyPath)
6287
+ : undefined;
6214
6288
  if (key !== undefined) {
6215
6289
  // Queue each resolved blob individually for atomic update
6216
6290
  // This uses setTimeout(fn, 0) to completely isolate from
@@ -6221,13 +6295,16 @@ obj, blobSavingQueue, db, isCursorValue = false // Flag to indicate if we're res
6221
6295
  else {
6222
6296
  // For rw transactions, we can save directly without queueing
6223
6297
  // since we're still in the same transaction context
6224
- table.mutate({ type: 'put', keys: [key], values: [resolved], trans }).catch(err => {
6298
+ table
6299
+ .mutate({ type: 'put', keys: [key], values: [resolved], trans })
6300
+ .catch((err) => {
6225
6301
  console.error(`Failed to save resolved blob on ${table.name}:${key}:`, err);
6226
6302
  });
6227
6303
  }
6228
6304
  }
6229
6305
  return resolved;
6230
- }).catch(err => {
6306
+ })
6307
+ .catch((err) => {
6231
6308
  console.error(`[dexie-cloud:blobResolve] Failed to resolve BlobRefs on ${table.name}:`, err);
6232
6309
  return obj; // Return original object on error - never block the read pipeline
6233
6310
  });
@@ -6256,9 +6333,13 @@ function overrideParseStoresSpec(origFunc, dexie) {
6256
6333
  return; // Continue
6257
6334
  }
6258
6335
  // They have declared this table. Merge indexes in case they didn't declare all indexes we need.
6259
- const requestedIndexes = schemaSrc.split(',').map(spec => spec.trim());
6260
- const builtInIndexes = DEXIE_CLOUD_SCHEMA[tableName].split(',').map(spec => spec.trim());
6261
- const requestedIndexSet = new Set(requestedIndexes.map(index => index.replace(/([&*]|\+\+)/g, "")));
6336
+ const requestedIndexes = schemaSrc
6337
+ .split(',')
6338
+ .map((spec) => spec.trim());
6339
+ const builtInIndexes = DEXIE_CLOUD_SCHEMA[tableName]
6340
+ .split(',')
6341
+ .map((spec) => spec.trim());
6342
+ const requestedIndexSet = new Set(requestedIndexes.map((index) => index.replace(/([&*]|\+\+)/g, '')));
6262
6343
  // Verify that primary key is unchanged
6263
6344
  if (requestedIndexes[0] !== builtInIndexes[0]) {
6264
6345
  // Primary key must match exactly
@@ -6267,7 +6348,7 @@ function overrideParseStoresSpec(origFunc, dexie) {
6267
6348
  // Merge indexes
6268
6349
  for (let i = 1; i < builtInIndexes.length; ++i) {
6269
6350
  const builtInIndex = builtInIndexes[i];
6270
- if (!requestedIndexSet.has(builtInIndex.replace(/([&*]|\+\+)/g, ""))) {
6351
+ if (!requestedIndexSet.has(builtInIndex.replace(/([&*]|\+\+)/g, ''))) {
6271
6352
  // Add built-in index if not already requested
6272
6353
  storesClone[tableName] += `,${builtInIndex}`;
6273
6354
  }
@@ -6276,7 +6357,7 @@ function overrideParseStoresSpec(origFunc, dexie) {
6276
6357
  // Populate dexie.cloud.schema
6277
6358
  const cloudSchema = dexie.cloud.schema || (dexie.cloud.schema = {});
6278
6359
  const allPrefixes = new Set();
6279
- Object.keys(storesClone).forEach(tableName => {
6360
+ Object.keys(storesClone).forEach((tableName) => {
6280
6361
  var _a;
6281
6362
  const schemaSrc = (_a = storesClone[tableName]) === null || _a === void 0 ? void 0 : _a.trim();
6282
6363
  const cloudTableSchema = cloudSchema[tableName] || (cloudSchema[tableName] = {});
@@ -6405,7 +6486,7 @@ if (typeof document !== 'undefined') {
6405
6486
  class TokenExpiredError extends Error {
6406
6487
  constructor() {
6407
6488
  super(...arguments);
6408
- this.name = "TokenExpiredError";
6489
+ this.name = 'TokenExpiredError';
6409
6490
  }
6410
6491
  }
6411
6492
 
@@ -6629,7 +6710,7 @@ class WSConnection extends Subscription {
6629
6710
  // Connect the WebSocket to given url:
6630
6711
  console.debug('dexie-cloud WebSocket create');
6631
6712
  const ws = (this.ws = new WebSocket(`${wsUrl}/changes?${searchParams}`));
6632
- ws.binaryType = "arraybuffer";
6713
+ ws.binaryType = 'arraybuffer';
6633
6714
  ws.onclose = (event) => {
6634
6715
  if (!this.pinger)
6635
6716
  return;
@@ -6668,10 +6749,17 @@ class WSConnection extends Subscription {
6668
6749
  getOpenDocSignal(doc).next(); // Make yHandler reopen the document on server.
6669
6750
  }
6670
6751
  }
6671
- else if (msg.type === 'u-ack' || msg.type === 'u-reject' || msg.type === 'u-s' || msg.type === 'in-sync' || msg.type === 'outdated-server-rev' || msg.type === 'y-complete-sync-done') {
6752
+ else if (msg.type === 'u-ack' ||
6753
+ msg.type === 'u-reject' ||
6754
+ msg.type === 'u-s' ||
6755
+ msg.type === 'in-sync' ||
6756
+ msg.type === 'outdated-server-rev' ||
6757
+ msg.type === 'y-complete-sync-done') {
6672
6758
  applyYServerMessages([msg], this.db).then((_a) => __awaiter(this, [_a], void 0, function* ({ resyncNeeded, yServerRevision, receivedUntils }) {
6673
6759
  if (yServerRevision) {
6674
- yield this.db.$syncState.update('syncState', { yServerRevision: yServerRevision });
6760
+ yield this.db.$syncState.update('syncState', {
6761
+ yServerRevision: yServerRevision,
6762
+ });
6675
6763
  }
6676
6764
  if (msg.type === 'u-s' && receivedUntils) {
6677
6765
  const utbl = getUpdatesTable(this.db, msg.table, msg.prop);
@@ -6874,7 +6962,9 @@ function isSyncNeeded(db) {
6874
6962
  return __awaiter(this, void 0, void 0, function* () {
6875
6963
  var _a;
6876
6964
  return ((_a = db.cloud.options) === null || _a === void 0 ? void 0 : _a.databaseUrl) && db.cloud.schema
6877
- ? yield sync(db, db.cloud.options, db.cloud.schema, { justCheckIfNeeded: true })
6965
+ ? yield sync(db, db.cloud.options, db.cloud.schema, {
6966
+ justCheckIfNeeded: true,
6967
+ })
6878
6968
  : false;
6879
6969
  });
6880
6970
  }
@@ -7086,243 +7176,243 @@ var n,l$1,u$1,i$1,r$1,o$1,e$1,f$1,c$1,s$1,a$1,p$1={},v$1=[],y=/acit|ex(?:s|g|n|p
7086
7176
  const Styles = {
7087
7177
  Alert: {
7088
7178
  error: {
7089
- color: "red",
7090
- fontWeight: "bold"
7179
+ color: 'red',
7180
+ fontWeight: 'bold',
7091
7181
  },
7092
7182
  warning: {
7093
- color: "#f80",
7094
- fontWeight: "bold"
7183
+ color: '#f80',
7184
+ fontWeight: 'bold',
7095
7185
  },
7096
7186
  info: {
7097
- color: "black"
7098
- }
7187
+ color: 'black',
7188
+ },
7099
7189
  },
7100
7190
  Darken: {
7101
- position: "fixed",
7191
+ position: 'fixed',
7102
7192
  top: 0,
7103
7193
  left: 0,
7104
7194
  opacity: 0.5,
7105
- backgroundColor: "#000",
7106
- width: "100vw",
7107
- height: "100vh",
7195
+ backgroundColor: '#000',
7196
+ width: '100vw',
7197
+ height: '100vh',
7108
7198
  zIndex: 150,
7109
- webkitBackdropFilter: "blur(2px)",
7110
- backdropFilter: "blur(2px)",
7199
+ webkitBackdropFilter: 'blur(2px)',
7200
+ backdropFilter: 'blur(2px)',
7111
7201
  },
7112
7202
  DialogOuter: {
7113
- position: "fixed",
7203
+ position: 'fixed',
7114
7204
  top: 0,
7115
7205
  left: 0,
7116
- width: "100vw",
7117
- height: "100vh",
7206
+ width: '100vw',
7207
+ height: '100vh',
7118
7208
  zIndex: 150,
7119
- alignItems: "center",
7120
- display: "flex",
7121
- justifyContent: "center",
7122
- padding: "16px",
7123
- boxSizing: "border-box"
7209
+ alignItems: 'center',
7210
+ display: 'flex',
7211
+ justifyContent: 'center',
7212
+ padding: '16px',
7213
+ boxSizing: 'border-box',
7124
7214
  },
7125
7215
  DialogInner: {
7126
- position: "relative",
7127
- color: "#222",
7128
- backgroundColor: "#fff",
7129
- padding: "24px",
7130
- marginBottom: "2em",
7131
- maxWidth: "400px",
7132
- width: "100%",
7133
- maxHeight: "90%",
7134
- overflowY: "auto",
7135
- border: "3px solid #3d3d5d",
7136
- borderRadius: "8px",
7137
- boxShadow: "0 0 80px 10px #666",
7138
- fontFamily: "sans-serif",
7139
- boxSizing: "border-box"
7216
+ position: 'relative',
7217
+ color: '#222',
7218
+ backgroundColor: '#fff',
7219
+ padding: '24px',
7220
+ marginBottom: '2em',
7221
+ maxWidth: '400px',
7222
+ width: '100%',
7223
+ maxHeight: '90%',
7224
+ overflowY: 'auto',
7225
+ border: '3px solid #3d3d5d',
7226
+ borderRadius: '8px',
7227
+ boxShadow: '0 0 80px 10px #666',
7228
+ fontFamily: 'sans-serif',
7229
+ boxSizing: 'border-box',
7140
7230
  },
7141
7231
  Input: {
7142
- height: "35px",
7143
- width: "100%",
7144
- maxWidth: "100%",
7145
- borderColor: "#ccf4",
7146
- outline: "none",
7147
- fontSize: "16px",
7148
- padding: "8px",
7149
- boxSizing: "border-box",
7150
- backgroundColor: "#f9f9f9",
7151
- borderRadius: "4px",
7152
- border: "1px solid #ccc",
7153
- marginTop: "6px",
7154
- fontFamily: "inherit"
7232
+ height: '35px',
7233
+ width: '100%',
7234
+ maxWidth: '100%',
7235
+ borderColor: '#ccf4',
7236
+ outline: 'none',
7237
+ fontSize: '16px',
7238
+ padding: '8px',
7239
+ boxSizing: 'border-box',
7240
+ backgroundColor: '#f9f9f9',
7241
+ borderRadius: '4px',
7242
+ border: '1px solid #ccc',
7243
+ marginTop: '6px',
7244
+ fontFamily: 'inherit',
7155
7245
  },
7156
7246
  Button: {
7157
- padding: "10px 20px",
7158
- margin: "0 4px",
7159
- border: "1px solid #d1d5db",
7160
- borderRadius: "6px",
7161
- backgroundColor: "#ffffff",
7162
- cursor: "pointer",
7163
- fontSize: "14px",
7164
- fontWeight: "500",
7165
- color: "#374151",
7166
- transition: "all 0.2s ease"
7247
+ padding: '10px 20px',
7248
+ margin: '0 4px',
7249
+ border: '1px solid #d1d5db',
7250
+ borderRadius: '6px',
7251
+ backgroundColor: '#ffffff',
7252
+ cursor: 'pointer',
7253
+ fontSize: '14px',
7254
+ fontWeight: '500',
7255
+ color: '#374151',
7256
+ transition: 'all 0.2s ease',
7167
7257
  },
7168
7258
  PrimaryButton: {
7169
- padding: "10px 20px",
7170
- margin: "0 4px",
7171
- border: "1px solid #3b82f6",
7172
- borderRadius: "6px",
7173
- backgroundColor: "#3b82f6",
7174
- color: "white",
7175
- cursor: "pointer",
7176
- fontSize: "14px",
7177
- fontWeight: "500",
7178
- transition: "all 0.2s ease"
7259
+ padding: '10px 20px',
7260
+ margin: '0 4px',
7261
+ border: '1px solid #3b82f6',
7262
+ borderRadius: '6px',
7263
+ backgroundColor: '#3b82f6',
7264
+ color: 'white',
7265
+ cursor: 'pointer',
7266
+ fontSize: '14px',
7267
+ fontWeight: '500',
7268
+ transition: 'all 0.2s ease',
7179
7269
  },
7180
7270
  ButtonsDiv: {
7181
- display: "flex",
7182
- justifyContent: "flex-end",
7183
- gap: "12px",
7184
- marginTop: "24px",
7185
- paddingTop: "20px"
7271
+ display: 'flex',
7272
+ justifyContent: 'flex-end',
7273
+ gap: '12px',
7274
+ marginTop: '24px',
7275
+ paddingTop: '20px',
7186
7276
  },
7187
7277
  Label: {
7188
- display: "block",
7189
- marginBottom: "12px",
7190
- fontSize: "14px",
7191
- fontWeight: "500",
7192
- color: "#333"
7278
+ display: 'block',
7279
+ marginBottom: '12px',
7280
+ fontSize: '14px',
7281
+ fontWeight: '500',
7282
+ color: '#333',
7193
7283
  },
7194
7284
  WindowHeader: {
7195
- margin: "0 0 20px 0",
7196
- fontSize: "18px",
7197
- fontWeight: "600",
7198
- color: "#333",
7199
- borderBottom: "1px solid #eee",
7200
- paddingBottom: "10px"
7285
+ margin: '0 0 20px 0',
7286
+ fontSize: '18px',
7287
+ fontWeight: '600',
7288
+ color: '#333',
7289
+ borderBottom: '1px solid #eee',
7290
+ paddingBottom: '10px',
7201
7291
  },
7202
7292
  // OAuth Provider Button Styles
7203
7293
  ProviderButton: {
7204
- display: "flex",
7205
- alignItems: "center",
7206
- justifyContent: "center",
7207
- width: "100%",
7208
- padding: "12px 16px",
7209
- marginBottom: "10px",
7210
- border: "1px solid #d1d5db",
7211
- borderRadius: "6px",
7212
- backgroundColor: "#ffffff",
7213
- cursor: "pointer",
7214
- fontSize: "14px",
7215
- fontWeight: "500",
7216
- color: "#374151",
7217
- transition: "all 0.2s ease",
7218
- gap: "12px"
7294
+ display: 'flex',
7295
+ alignItems: 'center',
7296
+ justifyContent: 'center',
7297
+ width: '100%',
7298
+ padding: '12px 16px',
7299
+ marginBottom: '10px',
7300
+ border: '1px solid #d1d5db',
7301
+ borderRadius: '6px',
7302
+ backgroundColor: '#ffffff',
7303
+ cursor: 'pointer',
7304
+ fontSize: '14px',
7305
+ fontWeight: '500',
7306
+ color: '#374151',
7307
+ transition: 'all 0.2s ease',
7308
+ gap: '12px',
7219
7309
  },
7220
7310
  ProviderButtonIcon: {
7221
- width: "20px",
7222
- height: "20px",
7311
+ width: '20px',
7312
+ height: '20px',
7223
7313
  flexShrink: 0,
7224
- display: "flex",
7225
- alignItems: "center",
7226
- justifyContent: "center"
7314
+ display: 'flex',
7315
+ alignItems: 'center',
7316
+ justifyContent: 'center',
7227
7317
  },
7228
7318
  ProviderButtonText: {
7229
7319
  flex: 1,
7230
- textAlign: "left"
7320
+ textAlign: 'left',
7231
7321
  },
7232
7322
  // Provider-specific colors
7233
7323
  ProviderGoogle: {
7234
- backgroundColor: "#ffffff",
7235
- border: "1px solid #dadce0",
7236
- color: "#3c4043"
7324
+ backgroundColor: '#ffffff',
7325
+ border: '1px solid #dadce0',
7326
+ color: '#3c4043',
7237
7327
  },
7238
7328
  ProviderGitHub: {
7239
- backgroundColor: "#ffffff",
7240
- border: "1px solid #dadce0",
7241
- color: "#181717"
7329
+ backgroundColor: '#ffffff',
7330
+ border: '1px solid #dadce0',
7331
+ color: '#181717',
7242
7332
  },
7243
7333
  ProviderMicrosoft: {
7244
- backgroundColor: "#ffffff",
7245
- border: "1px solid #dadce0",
7246
- color: "#5e5e5e"
7334
+ backgroundColor: '#ffffff',
7335
+ border: '1px solid #dadce0',
7336
+ color: '#5e5e5e',
7247
7337
  },
7248
7338
  ProviderApple: {
7249
- backgroundColor: "#000000",
7250
- border: "1px solid #000000",
7251
- color: "#ffffff"
7339
+ backgroundColor: '#000000',
7340
+ border: '1px solid #000000',
7341
+ color: '#ffffff',
7252
7342
  },
7253
7343
  ProviderCustom: {
7254
- backgroundColor: "#ffffff",
7255
- border: "1px solid #dadce0",
7256
- color: "#181717"
7344
+ backgroundColor: '#ffffff',
7345
+ border: '1px solid #dadce0',
7346
+ color: '#181717',
7257
7347
  },
7258
7348
  // Divider styles
7259
7349
  Divider: {
7260
- display: "flex",
7261
- alignItems: "center",
7262
- margin: "20px 0",
7263
- color: "#6b7280",
7264
- fontSize: "13px"
7350
+ display: 'flex',
7351
+ alignItems: 'center',
7352
+ margin: '20px 0',
7353
+ color: '#6b7280',
7354
+ fontSize: '13px',
7265
7355
  },
7266
7356
  DividerLine: {
7267
7357
  flex: 1,
7268
- height: "1px",
7269
- backgroundColor: "#e5e7eb"
7358
+ height: '1px',
7359
+ backgroundColor: '#e5e7eb',
7270
7360
  },
7271
7361
  DividerText: {
7272
- padding: "0 12px",
7273
- color: "#9ca3af"
7362
+ padding: '0 12px',
7363
+ color: '#9ca3af',
7274
7364
  },
7275
7365
  // OTP Button (Continue with email)
7276
7366
  OtpButton: {
7277
- display: "flex",
7278
- alignItems: "center",
7279
- justifyContent: "center",
7280
- width: "100%",
7281
- padding: "12px 16px",
7282
- border: "1px solid #d1d5db",
7283
- borderRadius: "6px",
7284
- backgroundColor: "#f9fafb",
7285
- cursor: "pointer",
7286
- fontSize: "14px",
7287
- fontWeight: "500",
7288
- color: "#374151",
7289
- transition: "all 0.2s ease",
7290
- gap: "12px"
7367
+ display: 'flex',
7368
+ alignItems: 'center',
7369
+ justifyContent: 'center',
7370
+ width: '100%',
7371
+ padding: '12px 16px',
7372
+ border: '1px solid #d1d5db',
7373
+ borderRadius: '6px',
7374
+ backgroundColor: '#f9fafb',
7375
+ cursor: 'pointer',
7376
+ fontSize: '14px',
7377
+ fontWeight: '500',
7378
+ color: '#374151',
7379
+ transition: 'all 0.2s ease',
7380
+ gap: '12px',
7291
7381
  },
7292
7382
  // Copy button for alerts with copyText
7293
7383
  CopyButton: {
7294
- display: "inline-flex",
7295
- alignItems: "center",
7296
- gap: "4px",
7297
- padding: "4px 10px",
7298
- marginTop: "8px",
7299
- border: "1px solid #d1d5db",
7300
- borderRadius: "4px",
7301
- backgroundColor: "#f9fafb",
7302
- cursor: "pointer",
7303
- fontSize: "12px",
7304
- fontWeight: "500",
7305
- color: "#374151",
7306
- transition: "all 0.15s ease",
7307
- fontFamily: "monospace"
7384
+ display: 'inline-flex',
7385
+ alignItems: 'center',
7386
+ gap: '4px',
7387
+ padding: '4px 10px',
7388
+ marginTop: '8px',
7389
+ border: '1px solid #d1d5db',
7390
+ borderRadius: '4px',
7391
+ backgroundColor: '#f9fafb',
7392
+ cursor: 'pointer',
7393
+ fontSize: '12px',
7394
+ fontWeight: '500',
7395
+ color: '#374151',
7396
+ transition: 'all 0.15s ease',
7397
+ fontFamily: 'monospace',
7308
7398
  },
7309
7399
  CopyButtonCopied: {
7310
- display: "inline-flex",
7311
- alignItems: "center",
7312
- gap: "4px",
7313
- padding: "4px 10px",
7314
- marginTop: "8px",
7315
- border: "1px solid #22c55e",
7316
- borderRadius: "4px",
7317
- backgroundColor: "#f0fdf4",
7318
- cursor: "default",
7319
- fontSize: "12px",
7320
- fontWeight: "500",
7321
- color: "#16a34a",
7322
- fontFamily: "monospace"
7400
+ display: 'inline-flex',
7401
+ alignItems: 'center',
7402
+ gap: '4px',
7403
+ padding: '4px 10px',
7404
+ marginTop: '8px',
7405
+ border: '1px solid #22c55e',
7406
+ borderRadius: '4px',
7407
+ backgroundColor: '#f0fdf4',
7408
+ cursor: 'default',
7409
+ fontSize: '12px',
7410
+ fontWeight: '500',
7411
+ color: '#16a34a',
7412
+ fontFamily: 'monospace',
7323
7413
  }};
7324
7414
 
7325
- function Dialog({ children, className }) {
7415
+ function Dialog({ children, className, }) {
7326
7416
  return (_$1("div", { className: `dexie-dialog ${className || ''}` },
7327
7417
  _$1("div", { style: Styles.Darken }),
7328
7418
  _$1("div", { style: Styles.DialogOuter },
@@ -7346,7 +7436,7 @@ var t,r,u,i,o=0,f=[],c=l$1,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__
7346
7436
  * @returns A final message where parameters have been replaced with values.
7347
7437
  */
7348
7438
  function resolveText({ message, messageCode, messageParams }) {
7349
- return message.replace(/\{\w+\}/ig, n => messageParams[n.substring(1, n.length - 1)]);
7439
+ return message.replace(/\{\w+\}/gi, (n) => messageParams[n.substring(1, n.length - 1)]);
7350
7440
  }
7351
7441
 
7352
7442
  /** Get style based on styleHint (for provider branding, etc.) */
@@ -7433,13 +7523,13 @@ function LoginDialog({ title, alerts, fields, options, submitLabel, cancelLabel,
7433
7523
  alerts.map((alert, idx) => (_$1("div", { key: idx },
7434
7524
  _$1("p", { style: Styles.Alert[alert.type] }, resolveText(alert)),
7435
7525
  alert.copyText && _$1(CopyButton, { text: alert.copyText })))),
7436
- hasOptions && (_$1("div", { class: "dxc-options" }, hasMultipleGroups ? (
7437
- // Render with dividers between groups
7438
- Array.from(optionGroups.entries()).map(([groupName, groupOptions], groupIdx) => (_$1(k$1, { key: groupName },
7439
- groupIdx > 0 && _$1(Divider, null),
7440
- groupOptions.map((option) => (_$1(OptionButton, { key: `${option.name}-${option.value}`, option: option, onClick: () => handleOptionClick(option) }))))))) : (
7441
- // Simple case: all options in one group
7442
- options.map((option) => (_$1(OptionButton, { key: `${option.name}-${option.value}`, option: option, onClick: () => handleOptionClick(option) })))))),
7526
+ hasOptions && (_$1("div", { class: "dxc-options" }, hasMultipleGroups
7527
+ ? // Render with dividers between groups
7528
+ Array.from(optionGroups.entries()).map(([groupName, groupOptions], groupIdx) => (_$1(k$1, { key: groupName },
7529
+ groupIdx > 0 && _$1(Divider, null),
7530
+ groupOptions.map((option) => (_$1(OptionButton, { key: `${option.name}-${option.value}`, option: option, onClick: () => handleOptionClick(option) }))))))
7531
+ : // Simple case: all options in one group
7532
+ options.map((option) => (_$1(OptionButton, { key: `${option.name}-${option.value}`, option: option, onClick: () => handleOptionClick(option) }))))),
7443
7533
  hasOptions && hasFields && _$1(Divider, null),
7444
7534
  hasFields && (_$1("form", { onSubmit: (ev) => {
7445
7535
  ev.preventDefault();
@@ -7451,7 +7541,8 @@ function LoginDialog({ title, alerts, fields, options, submitLabel, cancelLabel,
7451
7541
  const value = valueTransformer(type, (_a = ev.target) === null || _a === void 0 ? void 0 : _a['value']);
7452
7542
  let updatedParams = Object.assign(Object.assign({}, params), { [fieldName]: value });
7453
7543
  setParams(updatedParams);
7454
- if (type === 'otp' && (value === null || value === void 0 ? void 0 : value.trim().length) === OTP_LENGTH) {
7544
+ if (type === 'otp' &&
7545
+ (value === null || value === void 0 ? void 0 : value.trim().length) === OTP_LENGTH) {
7455
7546
  // Auto-submit when OTP is filled in.
7456
7547
  onSubmit(updatedParams);
7457
7548
  }
@@ -7493,7 +7584,10 @@ function CopyButton({ text }) {
7493
7584
  const handleClick = () => {
7494
7585
  var _a;
7495
7586
  if (typeof navigator !== 'undefined' && ((_a = navigator.clipboard) === null || _a === void 0 ? void 0 : _a.writeText)) {
7496
- navigator.clipboard.writeText(text).then(scheduleCopiedReset).catch(() => {
7587
+ navigator.clipboard
7588
+ .writeText(text)
7589
+ .then(scheduleCopiedReset)
7590
+ .catch(() => {
7497
7591
  fallbackCopy(text, scheduleCopiedReset);
7498
7592
  });
7499
7593
  }
@@ -7564,7 +7658,7 @@ function setupDefaultGUI(db) {
7564
7658
  },
7565
7659
  get closed() {
7566
7660
  return closed;
7567
- }
7661
+ },
7568
7662
  };
7569
7663
  }
7570
7664
 
@@ -7609,14 +7703,14 @@ function computeSyncState(db) {
7609
7703
  lazyWebSocketStatus,
7610
7704
  db.syncStateChangedEvent.pipe(startWith({ phase: 'initial' })),
7611
7705
  getCurrentUserEmitter(db.dx._novip),
7612
- userIsReallyActive
7706
+ userIsReallyActive,
7613
7707
  ]).pipe(map(([status, syncState, user, userIsActive]) => {
7614
7708
  var _a;
7615
7709
  if (((_a = user.license) === null || _a === void 0 ? void 0 : _a.status) && user.license.status !== 'ok') {
7616
7710
  return {
7617
7711
  phase: 'offline',
7618
7712
  status: 'offline',
7619
- license: user.license.status
7713
+ license: user.license.status,
7620
7714
  };
7621
7715
  }
7622
7716
  let { phase, error, progress } = syncState;
@@ -7636,7 +7730,8 @@ function computeSyncState(db) {
7636
7730
  }
7637
7731
  const previousPhase = db.cloud.syncState.value.phase;
7638
7732
  //const previousStatus = db.cloud.syncState.value.status;
7639
- if (previousPhase === 'error' && (syncState.phase === 'pushing' || syncState.phase === 'pulling')) {
7733
+ if (previousPhase === 'error' &&
7734
+ (syncState.phase === 'pushing' || syncState.phase === 'pulling')) {
7640
7735
  // We were in an errored state but is now doing sync. Show "connecting" icon.
7641
7736
  adjustedStatus = 'connecting';
7642
7737
  }
@@ -7651,7 +7746,7 @@ function computeSyncState(db) {
7651
7746
  error,
7652
7747
  progress,
7653
7748
  status: isOnline ? adjustedStatus : 'offline',
7654
- license: 'ok'
7749
+ license: 'ok',
7655
7750
  };
7656
7751
  return retState;
7657
7752
  }));
@@ -7672,7 +7767,7 @@ function createSharedValueObservable(o, defaultValue) {
7672
7767
  },
7673
7768
  complete() {
7674
7769
  observer.complete();
7675
- }
7770
+ },
7676
7771
  });
7677
7772
  if (!didEmit && !subscription.closed) {
7678
7773
  observer.next(currentValue);
@@ -7913,7 +8008,9 @@ function permissions(dexie, obj, tableName) {
7913
8008
  const realm = permissionsLookup[realmId || dexie.cloud.currentUserId];
7914
8009
  if (!realm)
7915
8010
  return new PermissionChecker({}, tableName, !owner || owner === dexie.cloud.currentUserId);
7916
- return new PermissionChecker(realm.permissions, tableName, realmId === undefined || realmId === dexie.cloud.currentUserId || owner === dexie.cloud.currentUserId);
8011
+ return new PermissionChecker(realm.permissions, tableName, realmId === undefined ||
8012
+ realmId === dexie.cloud.currentUserId ||
8013
+ owner === dexie.cloud.currentUserId);
7917
8014
  };
7918
8015
  const o = source.pipe(map(mapper));
7919
8016
  o.getValue = () => mapper(source.getValue());
@@ -7955,7 +8052,19 @@ function createYHandler(db) {
7955
8052
  return; // The table that holds the doc is not marked for sync - leave it to dexie. No syncing, no awareness.
7956
8053
  }
7957
8054
  let awareness;
8055
+ const existingDescriptor = Object.getOwnPropertyDescriptor(provider, 'awareness');
8056
+ if (existingDescriptor) {
8057
+ // Provider already initialized — likely a leaked handler from a previous db instance
8058
+ // (e.g. HMR where db.close() didn't fire). Destroy the stale awareness so the new
8059
+ // handler can take over cleanly.
8060
+ const staleAwareness = provider.awareness;
8061
+ if (staleAwareness) {
8062
+ staleAwareness.destroy();
8063
+ awarenessWeakMap.delete(doc);
8064
+ }
8065
+ }
7958
8066
  Object.defineProperty(provider, 'awareness', {
8067
+ configurable: true,
7959
8068
  get() {
7960
8069
  if (awareness)
7961
8070
  return awareness;
@@ -8138,10 +8247,12 @@ function parseOAuthCallback(url) {
8138
8247
  const { code, provider, state, error } = payload;
8139
8248
  // Check for error first
8140
8249
  if (error) {
8141
- if (error.toLowerCase().includes('access_denied') || error.toLowerCase().includes('access denied')) {
8250
+ if (error.toLowerCase().includes('access_denied') ||
8251
+ error.toLowerCase().includes('access denied')) {
8142
8252
  throw new OAuthError('access_denied', provider, error);
8143
8253
  }
8144
- if (error.toLowerCase().includes('email') && error.toLowerCase().includes('verif')) {
8254
+ if (error.toLowerCase().includes('email') &&
8255
+ error.toLowerCase().includes('verif')) {
8145
8256
  throw new OAuthError('email_not_verified', provider, error);
8146
8257
  }
8147
8258
  throw new OAuthError('provider_error', provider, error);
@@ -8167,7 +8278,9 @@ function cleanupOAuthUrl() {
8167
8278
  return;
8168
8279
  }
8169
8280
  url.searchParams.delete('dxc-auth');
8170
- const cleanUrl = url.pathname + (url.searchParams.toString() ? `?${url.searchParams.toString()}` : '') + url.hash;
8281
+ const cleanUrl = url.pathname +
8282
+ (url.searchParams.toString() ? `?${url.searchParams.toString()}` : '') +
8283
+ url.hash;
8171
8284
  window.history.replaceState(null, '', cleanUrl);
8172
8285
  }
8173
8286
 
@@ -8180,8 +8293,8 @@ function getTiedObjectId(realmId) {
8180
8293
 
8181
8294
  const ydocTriggers = {};
8182
8295
  const middlewares = new WeakMap();
8183
- const txRunner = TriggerRunner("tx"); // Trigger registry for transaction completion. Avoids open docs.
8184
- const unloadRunner = TriggerRunner("unload"); // Trigger registry for unload. Runs when a document is closed.
8296
+ const txRunner = TriggerRunner('tx'); // Trigger registry for transaction completion. Avoids open docs.
8297
+ const unloadRunner = TriggerRunner('unload'); // Trigger registry for unload. Runs when a document is closed.
8185
8298
  function TriggerRunner(name) {
8186
8299
  let triggerExecPromise = null;
8187
8300
  let triggerScheduled = false;
@@ -8220,7 +8333,7 @@ function TriggerRunner(name) {
8220
8333
  yield triggerExecPromise.catch(() => { });
8221
8334
  setTimeout(() => {
8222
8335
  // setTimeout() is to escape from Promise.PSD zones and never run within liveQueries or transaction scopes
8223
- console.log("Running trigger really!", name);
8336
+ console.log('Running trigger really!', name);
8224
8337
  triggerScheduled = false;
8225
8338
  const registryCopy = registry;
8226
8339
  registry = new Map();
@@ -8387,7 +8500,7 @@ function dexieCloud(dexie) {
8387
8500
  const downloading$ = createDownloadingState();
8388
8501
  dexie.cloud = {
8389
8502
  // @ts-ignore
8390
- version: "4.4.6",
8503
+ version: "4.4.8",
8391
8504
  options: Object.assign({}, DEFAULT_OPTIONS),
8392
8505
  schema: null,
8393
8506
  get currentUserId() {
@@ -8443,7 +8556,10 @@ function dexieCloud(dexie) {
8443
8556
  const callback = parseOAuthCallback();
8444
8557
  if (callback) {
8445
8558
  // Store the pending auth code for processing when db is ready
8446
- pendingOAuthCode = { code: callback.code, provider: callback.provider };
8559
+ pendingOAuthCode = {
8560
+ code: callback.code,
8561
+ provider: callback.provider,
8562
+ };
8447
8563
  console.debug('[dexie-cloud] OAuth callback detected, auth code stored for processing');
8448
8564
  }
8449
8565
  }
@@ -8560,7 +8676,7 @@ function dexieCloud(dexie) {
8560
8676
  if (eagerBlobDownloadInFlight)
8561
8677
  return;
8562
8678
  eagerBlobDownloadInFlight = Dexie.ignoreTransaction(() => downloadUnresolvedBlobs(db, downloading$))
8563
- .catch(err => {
8679
+ .catch((err) => {
8564
8680
  console.error('[dexie-cloud] Eager blob download failed:', err);
8565
8681
  })
8566
8682
  .finally(() => {
@@ -8653,7 +8769,10 @@ function dexieCloud(dexie) {
8653
8769
  // Let's assign all props as the newPersistedSchems should be what we should be working with.
8654
8770
  Object.assign(schema, newPersistedSchema);
8655
8771
  }
8656
- return [persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.initiallySynced, persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms];
8772
+ return [
8773
+ persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.initiallySynced,
8774
+ persistedSyncState === null || persistedSyncState === void 0 ? void 0 : persistedSyncState.realms,
8775
+ ];
8657
8776
  }));
8658
8777
  if (initiallySynced) {
8659
8778
  db.setInitiallySynced(true);
@@ -8662,8 +8781,10 @@ function dexieCloud(dexie) {
8662
8781
  // Manage CurrentUser observable:
8663
8782
  throwIfClosed();
8664
8783
  if (!db.cloud.isServiceWorkerDB) {
8665
- subscriptions.push(liveQuery(() => db.getCurrentUser().then(user => {
8666
- if (!user.isLoggedIn && typeof location !== 'undefined' && /dxc-auth\=/.test(location.search)) {
8784
+ subscriptions.push(liveQuery(() => db.getCurrentUser().then((user) => {
8785
+ if (!user.isLoggedIn &&
8786
+ typeof location !== 'undefined' &&
8787
+ /dxc-auth\=/.test(location.search)) {
8667
8788
  // Still loading user because OAuth redirect just happened.
8668
8789
  // Keep isLoading true.
8669
8790
  return Object.assign(Object.assign({}, user), { isLoading: true });
@@ -8701,7 +8822,7 @@ function dexieCloud(dexie) {
8701
8822
  type: 'error',
8702
8823
  messageCode: 'GENERIC_ERROR',
8703
8824
  message: error.message,
8704
- messageParams: { provider: error.provider || 'unknown' }
8825
+ messageParams: { provider: error.provider || 'unknown' },
8705
8826
  });
8706
8827
  // Clean up URL (remove dxc-auth param)
8707
8828
  cleanupOAuthUrl();
@@ -8751,7 +8872,8 @@ function dexieCloud(dexie) {
8751
8872
  }
8752
8873
  }
8753
8874
  }
8754
- if (user.isLoggedIn && (!lastSyncedRealms || !lastSyncedRealms.includes(user.userId))) {
8875
+ if (user.isLoggedIn &&
8876
+ (!lastSyncedRealms || !lastSyncedRealms.includes(user.userId))) {
8755
8877
  // User has been logged in but this is not reflected in the sync state.
8756
8878
  // This can happen if page is reloaded after login but before the sync call following
8757
8879
  // the login was complete.
@@ -8814,7 +8936,7 @@ function dexieCloud(dexie) {
8814
8936
  }
8815
8937
  }
8816
8938
  // @ts-ignore
8817
- dexieCloud.version = "4.4.6";
8939
+ dexieCloud.version = "4.4.8";
8818
8940
  Dexie.Cloud = dexieCloud;
8819
8941
 
8820
8942
  export { dexieCloud as default, defineYDocTrigger, dexieCloud, getTiedObjectId, getTiedRealmId, resolveText };