@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.
- package/dist/connect/index.cjs +78 -2
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.cts +16 -0
- package/dist/connect/index.d.ts +16 -0
- package/dist/connect/index.js +78 -2
- package/dist/connect/index.js.map +1 -1
- package/dist/core/index.cjs +79 -48
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +7 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.js +79 -48
- package/dist/core/index.js.map +1 -1
- package/dist/impl/browser/connect/index.cjs +11 -2
- package/dist/impl/browser/connect/index.cjs.map +1 -1
- package/dist/impl/browser/connect/index.js +11 -2
- package/dist/impl/browser/connect/index.js.map +1 -1
- package/dist/impl/browser/index.cjs +71 -40
- package/dist/impl/browser/index.cjs.map +1 -1
- package/dist/impl/browser/index.js +71 -40
- package/dist/impl/browser/index.js.map +1 -1
- package/dist/impl/nodejs/connect/index.cjs +11 -2
- package/dist/impl/nodejs/connect/index.cjs.map +1 -1
- package/dist/impl/nodejs/connect/index.js +11 -2
- package/dist/impl/nodejs/connect/index.js.map +1 -1
- package/dist/index.cjs +79 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +79 -48
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -375,28 +375,38 @@ var IndexedDBStorageProvider = class {
|
|
|
375
375
|
// ===========================================================================
|
|
376
376
|
async connect() {
|
|
377
377
|
if (this.status === "connected" && this.db) return;
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
this.
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
(
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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.
|
|
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 = () =>
|
|
823
|
-
|
|
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);
|