@unicitylabs/sphere-sdk 0.4.0 → 0.4.3

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.
@@ -435,28 +435,38 @@ var IndexedDBStorageProvider = class {
435
435
  // ===========================================================================
436
436
  async connect() {
437
437
  if (this.status === "connected" && this.db) return;
438
- this.status = "connecting";
439
- try {
440
- this.db = await Promise.race([
441
- this.openDatabase(),
442
- new Promise(
443
- (_, reject) => setTimeout(() => reject(new Error("IndexedDB open timed out after 5s")), 5e3)
444
- )
445
- ]);
446
- this.status = "connected";
447
- this.log("Connected to IndexedDB");
448
- } catch (error) {
449
- this.status = "error";
450
- throw new Error(`IndexedDB not available: ${error}`);
438
+ for (let attempt = 0; attempt < 2; attempt++) {
439
+ this.status = "connecting";
440
+ console.log(`[IndexedDBStorage] connect: opening db=${this.dbName}${attempt > 0 ? " (retry)" : ""}`);
441
+ try {
442
+ this.db = await Promise.race([
443
+ this.openDatabase(),
444
+ new Promise(
445
+ (_, reject) => setTimeout(() => reject(new Error("IndexedDB open timed out after 5s")), 5e3)
446
+ )
447
+ ]);
448
+ this.status = "connected";
449
+ console.log(`[IndexedDBStorage] connect: connected to db=${this.dbName}`);
450
+ return;
451
+ } catch (error) {
452
+ if (attempt === 0) {
453
+ console.warn(`[IndexedDBStorage] connect: open failed, retrying in 1s...`);
454
+ this.status = "disconnected";
455
+ await new Promise((r) => setTimeout(r, 1e3));
456
+ continue;
457
+ }
458
+ this.status = "error";
459
+ throw new Error(`IndexedDB not available: ${error}`);
460
+ }
451
461
  }
452
462
  }
453
463
  async disconnect() {
464
+ console.log(`[IndexedDBStorage] disconnect: closing db=${this.dbName}, wasConnected=${!!this.db}`);
454
465
  if (this.db) {
455
466
  this.db.close();
456
467
  this.db = null;
457
468
  }
458
469
  this.status = "disconnected";
459
- this.log("Disconnected from IndexedDB");
460
470
  }
461
471
  isConnected() {
462
472
  return this.status === "connected" && this.db !== null;
@@ -508,6 +518,7 @@ var IndexedDBStorageProvider = class {
508
518
  }
509
519
  async clear(prefix) {
510
520
  if (!prefix) {
521
+ console.log(`[IndexedDBStorage] clear: starting, db=${this.dbName}, wasConnected=${!!this.db}`);
511
522
  if (this.db) {
512
523
  this.db.close();
513
524
  this.db = null;
@@ -516,9 +527,23 @@ var IndexedDBStorageProvider = class {
516
527
  await new Promise((resolve) => {
517
528
  try {
518
529
  const req = indexedDB.deleteDatabase(this.dbName);
519
- req.onsuccess = () => resolve();
520
- req.onerror = () => resolve();
521
- req.onblocked = () => resolve();
530
+ const timer = setTimeout(() => {
531
+ console.warn(`[IndexedDBStorage] clear: deleteDatabase timed out for db=${this.dbName}`);
532
+ resolve();
533
+ }, 5e3);
534
+ req.onsuccess = () => {
535
+ clearTimeout(timer);
536
+ console.log(`[IndexedDBStorage] clear: deleted db=${this.dbName}`);
537
+ resolve();
538
+ };
539
+ req.onerror = () => {
540
+ clearTimeout(timer);
541
+ console.warn(`[IndexedDBStorage] clear: error deleting db=${this.dbName}`, req.error);
542
+ resolve();
543
+ };
544
+ req.onblocked = () => {
545
+ console.warn(`[IndexedDBStorage] clear: deleteDatabase blocked for db=${this.dbName}, waiting...`);
546
+ };
522
547
  } catch {
523
548
  resolve();
524
549
  }
@@ -689,12 +714,19 @@ var IndexedDBTokenStorageProvider = class {
689
714
  const addressId = getAddressId(identity.directAddress);
690
715
  this.dbName = `${this.dbNamePrefix}-${addressId}`;
691
716
  }
717
+ console.log(`[IndexedDBTokenStorage] setIdentity \u2192 db=${this.dbName}`);
692
718
  }
693
719
  async initialize() {
694
720
  try {
721
+ if (this.db) {
722
+ console.log(`[IndexedDBTokenStorage] initialize: closing existing connection before re-open (db=${this.dbName})`);
723
+ this.db.close();
724
+ this.db = null;
725
+ }
726
+ console.log(`[IndexedDBTokenStorage] initialize: opening db=${this.dbName}`);
695
727
  this.db = await this.openDatabase();
696
728
  this.status = "connected";
697
- this.cleanupStaleDatabases();
729
+ console.log(`[IndexedDBTokenStorage] initialize: connected to db=${this.dbName}`);
698
730
  return true;
699
731
  } catch (error) {
700
732
  console.error("[IndexedDBTokenStorage] Failed to initialize:", error);
@@ -703,6 +735,7 @@ var IndexedDBTokenStorageProvider = class {
703
735
  }
704
736
  }
705
737
  async shutdown() {
738
+ console.log(`[IndexedDBTokenStorage] shutdown: closing db=${this.dbName}, wasConnected=${!!this.db}`);
706
739
  if (this.db) {
707
740
  this.db.close();
708
741
  this.db = null;
@@ -723,6 +756,7 @@ var IndexedDBTokenStorageProvider = class {
723
756
  }
724
757
  async load() {
725
758
  if (!this.db) {
759
+ console.warn(`[IndexedDBTokenStorage] load: db not initialized (db=${this.dbName})`);
726
760
  return {
727
761
  success: false,
728
762
  error: "Database not initialized",
@@ -771,6 +805,8 @@ var IndexedDBTokenStorageProvider = class {
771
805
  if (invalid) {
772
806
  data._invalid = invalid;
773
807
  }
808
+ const tokenKeys = Object.keys(data).filter((k) => k.startsWith("_") && !["_meta", "_tombstones", "_outbox", "_sent", "_invalid"].includes(k));
809
+ console.log(`[IndexedDBTokenStorage] load: db=${this.dbName}, tokens=${tokenKeys.length}`);
774
810
  return {
775
811
  success: true,
776
812
  data,
@@ -778,6 +814,7 @@ var IndexedDBTokenStorageProvider = class {
778
814
  timestamp: Date.now()
779
815
  };
780
816
  } catch (error) {
817
+ console.error(`[IndexedDBTokenStorage] load failed: db=${this.dbName}`, error);
781
818
  return {
782
819
  success: false,
783
820
  error: error instanceof Error ? error.message : "Unknown error",
@@ -788,6 +825,7 @@ var IndexedDBTokenStorageProvider = class {
788
825
  }
789
826
  async save(data) {
790
827
  if (!this.db) {
828
+ console.warn(`[IndexedDBTokenStorage] save: db not initialized (db=${this.dbName})`);
791
829
  return {
792
830
  success: false,
793
831
  error: "Database not initialized",
@@ -795,6 +833,9 @@ var IndexedDBTokenStorageProvider = class {
795
833
  };
796
834
  }
797
835
  try {
836
+ const tokenKeys = Object.keys(data).filter((k) => k.startsWith("_") && !["_meta", "_tombstones", "_outbox", "_sent", "_invalid"].includes(k));
837
+ const archivedKeys = Object.keys(data).filter((k) => k.startsWith("archived-"));
838
+ console.log(`[IndexedDBTokenStorage] save: db=${this.dbName}, tokens=${tokenKeys.length}, archived=${archivedKeys.length}, tombstones=${data._tombstones?.length ?? 0}`);
798
839
  await this.putToStore(STORE_META, "meta", data._meta);
799
840
  if (data._tombstones) {
800
841
  await this.putToStore(STORE_META, "tombstones", data._tombstones);
@@ -853,6 +894,7 @@ var IndexedDBTokenStorageProvider = class {
853
894
  }
854
895
  async clear() {
855
896
  try {
897
+ console.log(`[IndexedDBTokenStorage] clear: starting, db=${this.dbName}, wasConnected=${!!this.db}`);
856
898
  if (this.db) {
857
899
  this.db.close();
858
900
  this.db = null;
@@ -875,13 +917,21 @@ var IndexedDBTokenStorageProvider = class {
875
917
  } catch {
876
918
  }
877
919
  }
920
+ console.log(`[IndexedDBTokenStorage] clear: deleting ${dbNames.length} database(s):`, dbNames);
878
921
  await Promise.all(dbNames.map(
879
922
  (name) => new Promise((resolve) => {
880
923
  try {
881
924
  const req = indexedDB.deleteDatabase(name);
882
- req.onsuccess = () => resolve();
883
- req.onerror = () => resolve();
925
+ req.onsuccess = () => {
926
+ console.log(`[IndexedDBTokenStorage] clear: deleted db=${name}`);
927
+ resolve();
928
+ };
929
+ req.onerror = () => {
930
+ console.warn(`[IndexedDBTokenStorage] clear: error deleting db=${name}`, req.error);
931
+ resolve();
932
+ };
884
933
  req.onblocked = () => {
934
+ console.warn(`[IndexedDBTokenStorage] clear: deleteDatabase blocked for db=${name}`);
885
935
  resolve();
886
936
  };
887
937
  } catch {
@@ -889,6 +939,7 @@ var IndexedDBTokenStorageProvider = class {
889
939
  }
890
940
  })
891
941
  ));
942
+ console.log(`[IndexedDBTokenStorage] clear: done`);
892
943
  return true;
893
944
  } catch (err) {
894
945
  console.warn("[IndexedDBTokenStorage] clear() failed:", err);
@@ -898,26 +949,6 @@ var IndexedDBTokenStorageProvider = class {
898
949
  // =========================================================================
899
950
  // Private IndexedDB helpers
900
951
  // =========================================================================
901
- /**
902
- * Delete stale databases from other addresses (fire-and-forget, background).
903
- * Called after the current database is already open, so deleteDatabase
904
- * on other databases won't block anything.
905
- */
906
- cleanupStaleDatabases() {
907
- if (typeof indexedDB.databases !== "function") return;
908
- indexedDB.databases().then((dbs) => {
909
- for (const dbInfo of dbs) {
910
- if (dbInfo.name && dbInfo.name.startsWith(this.dbNamePrefix) && dbInfo.name !== this.dbName) {
911
- const req = indexedDB.deleteDatabase(dbInfo.name);
912
- req.onerror = () => {
913
- };
914
- req.onblocked = () => {
915
- };
916
- }
917
- }
918
- }).catch(() => {
919
- });
920
- }
921
952
  openDatabase() {
922
953
  return new Promise((resolve, reject) => {
923
954
  const request = indexedDB.open(this.dbName, DB_VERSION2);