@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.
@@ -375,28 +375,38 @@ var IndexedDBStorageProvider = class {
375
375
  // ===========================================================================
376
376
  async connect() {
377
377
  if (this.status === "connected" && this.db) return;
378
- this.status = "connecting";
379
- try {
380
- this.db = await Promise.race([
381
- this.openDatabase(),
382
- new Promise(
383
- (_, reject) => setTimeout(() => reject(new Error("IndexedDB open timed out after 5s")), 5e3)
384
- )
385
- ]);
386
- this.status = "connected";
387
- this.log("Connected to IndexedDB");
388
- } catch (error) {
389
- this.status = "error";
390
- throw new Error(`IndexedDB not available: ${error}`);
378
+ for (let attempt = 0; attempt < 2; attempt++) {
379
+ this.status = "connecting";
380
+ console.log(`[IndexedDBStorage] connect: opening db=${this.dbName}${attempt > 0 ? " (retry)" : ""}`);
381
+ try {
382
+ this.db = await Promise.race([
383
+ this.openDatabase(),
384
+ new Promise(
385
+ (_, reject) => setTimeout(() => reject(new Error("IndexedDB open timed out after 5s")), 5e3)
386
+ )
387
+ ]);
388
+ this.status = "connected";
389
+ console.log(`[IndexedDBStorage] connect: connected to db=${this.dbName}`);
390
+ return;
391
+ } catch (error) {
392
+ if (attempt === 0) {
393
+ console.warn(`[IndexedDBStorage] connect: open failed, retrying in 1s...`);
394
+ this.status = "disconnected";
395
+ await new Promise((r) => setTimeout(r, 1e3));
396
+ continue;
397
+ }
398
+ this.status = "error";
399
+ throw new Error(`IndexedDB not available: ${error}`);
400
+ }
391
401
  }
392
402
  }
393
403
  async disconnect() {
404
+ console.log(`[IndexedDBStorage] disconnect: closing db=${this.dbName}, wasConnected=${!!this.db}`);
394
405
  if (this.db) {
395
406
  this.db.close();
396
407
  this.db = null;
397
408
  }
398
409
  this.status = "disconnected";
399
- this.log("Disconnected from IndexedDB");
400
410
  }
401
411
  isConnected() {
402
412
  return this.status === "connected" && this.db !== null;
@@ -448,6 +458,7 @@ var IndexedDBStorageProvider = class {
448
458
  }
449
459
  async clear(prefix) {
450
460
  if (!prefix) {
461
+ console.log(`[IndexedDBStorage] clear: starting, db=${this.dbName}, wasConnected=${!!this.db}`);
451
462
  if (this.db) {
452
463
  this.db.close();
453
464
  this.db = null;
@@ -456,9 +467,23 @@ var IndexedDBStorageProvider = class {
456
467
  await new Promise((resolve) => {
457
468
  try {
458
469
  const req = indexedDB.deleteDatabase(this.dbName);
459
- req.onsuccess = () => resolve();
460
- req.onerror = () => resolve();
461
- req.onblocked = () => resolve();
470
+ const timer = setTimeout(() => {
471
+ console.warn(`[IndexedDBStorage] clear: deleteDatabase timed out for db=${this.dbName}`);
472
+ resolve();
473
+ }, 5e3);
474
+ req.onsuccess = () => {
475
+ clearTimeout(timer);
476
+ console.log(`[IndexedDBStorage] clear: deleted db=${this.dbName}`);
477
+ resolve();
478
+ };
479
+ req.onerror = () => {
480
+ clearTimeout(timer);
481
+ console.warn(`[IndexedDBStorage] clear: error deleting db=${this.dbName}`, req.error);
482
+ resolve();
483
+ };
484
+ req.onblocked = () => {
485
+ console.warn(`[IndexedDBStorage] clear: deleteDatabase blocked for db=${this.dbName}, waiting...`);
486
+ };
462
487
  } catch {
463
488
  resolve();
464
489
  }
@@ -629,12 +654,19 @@ var IndexedDBTokenStorageProvider = class {
629
654
  const addressId = getAddressId(identity.directAddress);
630
655
  this.dbName = `${this.dbNamePrefix}-${addressId}`;
631
656
  }
657
+ console.log(`[IndexedDBTokenStorage] setIdentity \u2192 db=${this.dbName}`);
632
658
  }
633
659
  async initialize() {
634
660
  try {
661
+ if (this.db) {
662
+ console.log(`[IndexedDBTokenStorage] initialize: closing existing connection before re-open (db=${this.dbName})`);
663
+ this.db.close();
664
+ this.db = null;
665
+ }
666
+ console.log(`[IndexedDBTokenStorage] initialize: opening db=${this.dbName}`);
635
667
  this.db = await this.openDatabase();
636
668
  this.status = "connected";
637
- this.cleanupStaleDatabases();
669
+ console.log(`[IndexedDBTokenStorage] initialize: connected to db=${this.dbName}`);
638
670
  return true;
639
671
  } catch (error) {
640
672
  console.error("[IndexedDBTokenStorage] Failed to initialize:", error);
@@ -643,6 +675,7 @@ var IndexedDBTokenStorageProvider = class {
643
675
  }
644
676
  }
645
677
  async shutdown() {
678
+ console.log(`[IndexedDBTokenStorage] shutdown: closing db=${this.dbName}, wasConnected=${!!this.db}`);
646
679
  if (this.db) {
647
680
  this.db.close();
648
681
  this.db = null;
@@ -663,6 +696,7 @@ var IndexedDBTokenStorageProvider = class {
663
696
  }
664
697
  async load() {
665
698
  if (!this.db) {
699
+ console.warn(`[IndexedDBTokenStorage] load: db not initialized (db=${this.dbName})`);
666
700
  return {
667
701
  success: false,
668
702
  error: "Database not initialized",
@@ -711,6 +745,8 @@ var IndexedDBTokenStorageProvider = class {
711
745
  if (invalid) {
712
746
  data._invalid = invalid;
713
747
  }
748
+ const tokenKeys = Object.keys(data).filter((k) => k.startsWith("_") && !["_meta", "_tombstones", "_outbox", "_sent", "_invalid"].includes(k));
749
+ console.log(`[IndexedDBTokenStorage] load: db=${this.dbName}, tokens=${tokenKeys.length}`);
714
750
  return {
715
751
  success: true,
716
752
  data,
@@ -718,6 +754,7 @@ var IndexedDBTokenStorageProvider = class {
718
754
  timestamp: Date.now()
719
755
  };
720
756
  } catch (error) {
757
+ console.error(`[IndexedDBTokenStorage] load failed: db=${this.dbName}`, error);
721
758
  return {
722
759
  success: false,
723
760
  error: error instanceof Error ? error.message : "Unknown error",
@@ -728,6 +765,7 @@ var IndexedDBTokenStorageProvider = class {
728
765
  }
729
766
  async save(data) {
730
767
  if (!this.db) {
768
+ console.warn(`[IndexedDBTokenStorage] save: db not initialized (db=${this.dbName})`);
731
769
  return {
732
770
  success: false,
733
771
  error: "Database not initialized",
@@ -735,6 +773,9 @@ var IndexedDBTokenStorageProvider = class {
735
773
  };
736
774
  }
737
775
  try {
776
+ const tokenKeys = Object.keys(data).filter((k) => k.startsWith("_") && !["_meta", "_tombstones", "_outbox", "_sent", "_invalid"].includes(k));
777
+ const archivedKeys = Object.keys(data).filter((k) => k.startsWith("archived-"));
778
+ console.log(`[IndexedDBTokenStorage] save: db=${this.dbName}, tokens=${tokenKeys.length}, archived=${archivedKeys.length}, tombstones=${data._tombstones?.length ?? 0}`);
738
779
  await this.putToStore(STORE_META, "meta", data._meta);
739
780
  if (data._tombstones) {
740
781
  await this.putToStore(STORE_META, "tombstones", data._tombstones);
@@ -793,6 +834,7 @@ var IndexedDBTokenStorageProvider = class {
793
834
  }
794
835
  async clear() {
795
836
  try {
837
+ console.log(`[IndexedDBTokenStorage] clear: starting, db=${this.dbName}, wasConnected=${!!this.db}`);
796
838
  if (this.db) {
797
839
  this.db.close();
798
840
  this.db = null;
@@ -815,13 +857,21 @@ var IndexedDBTokenStorageProvider = class {
815
857
  } catch {
816
858
  }
817
859
  }
860
+ console.log(`[IndexedDBTokenStorage] clear: deleting ${dbNames.length} database(s):`, dbNames);
818
861
  await Promise.all(dbNames.map(
819
862
  (name) => new Promise((resolve) => {
820
863
  try {
821
864
  const req = indexedDB.deleteDatabase(name);
822
- req.onsuccess = () => resolve();
823
- req.onerror = () => resolve();
865
+ req.onsuccess = () => {
866
+ console.log(`[IndexedDBTokenStorage] clear: deleted db=${name}`);
867
+ resolve();
868
+ };
869
+ req.onerror = () => {
870
+ console.warn(`[IndexedDBTokenStorage] clear: error deleting db=${name}`, req.error);
871
+ resolve();
872
+ };
824
873
  req.onblocked = () => {
874
+ console.warn(`[IndexedDBTokenStorage] clear: deleteDatabase blocked for db=${name}`);
825
875
  resolve();
826
876
  };
827
877
  } catch {
@@ -829,6 +879,7 @@ var IndexedDBTokenStorageProvider = class {
829
879
  }
830
880
  })
831
881
  ));
882
+ console.log(`[IndexedDBTokenStorage] clear: done`);
832
883
  return true;
833
884
  } catch (err) {
834
885
  console.warn("[IndexedDBTokenStorage] clear() failed:", err);
@@ -838,26 +889,6 @@ var IndexedDBTokenStorageProvider = class {
838
889
  // =========================================================================
839
890
  // Private IndexedDB helpers
840
891
  // =========================================================================
841
- /**
842
- * Delete stale databases from other addresses (fire-and-forget, background).
843
- * Called after the current database is already open, so deleteDatabase
844
- * on other databases won't block anything.
845
- */
846
- cleanupStaleDatabases() {
847
- if (typeof indexedDB.databases !== "function") return;
848
- indexedDB.databases().then((dbs) => {
849
- for (const dbInfo of dbs) {
850
- if (dbInfo.name && dbInfo.name.startsWith(this.dbNamePrefix) && dbInfo.name !== this.dbName) {
851
- const req = indexedDB.deleteDatabase(dbInfo.name);
852
- req.onerror = () => {
853
- };
854
- req.onblocked = () => {
855
- };
856
- }
857
- }
858
- }).catch(() => {
859
- });
860
- }
861
892
  openDatabase() {
862
893
  return new Promise((resolve, reject) => {
863
894
  const request = indexedDB.open(this.dbName, DB_VERSION2);