@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
|
@@ -435,28 +435,38 @@ var IndexedDBStorageProvider = class {
|
|
|
435
435
|
// ===========================================================================
|
|
436
436
|
async connect() {
|
|
437
437
|
if (this.status === "connected" && this.db) return;
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
this.
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
(
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
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
|
-
|
|
520
|
-
|
|
521
|
-
|
|
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.
|
|
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 = () =>
|
|
883
|
-
|
|
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);
|