@gethashd/bytecave-browser 1.0.48 → 1.0.49

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.
@@ -6337,6 +6337,7 @@ var ByteCaveClient = class {
6337
6337
  this.knownPeers = /* @__PURE__ */ new Map();
6338
6338
  this.connectionState = "disconnected";
6339
6339
  this.eventListeners = /* @__PURE__ */ new Map();
6340
+ this.PEERS_CACHE_KEY = "bytecave_known_peers";
6340
6341
  this.config = {
6341
6342
  maxPeers: 10,
6342
6343
  connectionTimeout: 3e4,
@@ -6349,6 +6350,7 @@ var ByteCaveClient = class {
6349
6350
  if (config.vaultNodeRegistryAddress && config.rpcUrl) {
6350
6351
  this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
6351
6352
  }
6353
+ this.loadCachedPeers();
6352
6354
  }
6353
6355
  /**
6354
6356
  * Initialize and start the P2P client
@@ -6518,14 +6520,19 @@ var ByteCaveClient = class {
6518
6520
  }
6519
6521
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6520
6522
  if (health) {
6521
- this.knownPeers.set(peer.peerId, {
6523
+ const peerInfo = {
6522
6524
  peerId: peer.peerId,
6523
6525
  publicKey: health.publicKey || "",
6524
6526
  contentTypes: health.contentTypes || "all",
6527
+ httpEndpoint: health.httpEndpoint || "",
6528
+ multiaddrs: peer.multiaddrs || [],
6529
+ relayAddrs: peer.relayAddrs || [],
6525
6530
  connected: true,
6526
- nodeId: health.nodeId
6527
- });
6528
- console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
6531
+ isRegistered: peer.isRegistered || false,
6532
+ onChainNodeId: peer.onChainNodeId || ""
6533
+ };
6534
+ this.knownPeers.set(peer.peerId, peerInfo);
6535
+ this.saveCachedPeers();
6529
6536
  }
6530
6537
  } catch (err) {
6531
6538
  console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
@@ -6614,14 +6621,19 @@ var ByteCaveClient = class {
6614
6621
  try {
6615
6622
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6616
6623
  if (health) {
6617
- this.knownPeers.set(peer.peerId, {
6624
+ const peerInfo = {
6618
6625
  peerId: peer.peerId,
6619
6626
  publicKey: health.publicKey || "",
6620
6627
  contentTypes: health.contentTypes || "all",
6628
+ httpEndpoint: health.httpEndpoint || "",
6629
+ multiaddrs: peer.multiaddrs || [],
6630
+ relayAddrs: peer.relayAddrs || [],
6621
6631
  connected: true,
6622
- nodeId: health.nodeId
6623
- });
6624
- console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
6632
+ isRegistered: peer.isRegistered || false,
6633
+ onChainNodeId: peer.onChainNodeId || ""
6634
+ };
6635
+ this.knownPeers.set(peer.peerId, peerInfo);
6636
+ this.saveCachedPeers();
6625
6637
  }
6626
6638
  } catch (err) {
6627
6639
  console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
@@ -6724,11 +6736,16 @@ Nonce: ${nonce}`;
6724
6736
  }
6725
6737
  console.log("[ByteCave] Attempting storage via WebTransport direct");
6726
6738
  try {
6727
- let nodes = [];
6728
- if (this.relayDiscovery) {
6729
- nodes = await this.relayDiscovery.getConnectedPeers();
6730
- } else if (this.contractDiscovery) {
6731
- nodes = await this.contractDiscovery.getActiveNodes();
6739
+ let nodes = Array.from(this.knownPeers.values());
6740
+ if (nodes.length === 0) {
6741
+ console.log("[ByteCave] No cached peers, trying discovery services");
6742
+ if (this.relayDiscovery) {
6743
+ nodes = await this.relayDiscovery.getConnectedPeers();
6744
+ } else if (this.contractDiscovery) {
6745
+ nodes = await this.contractDiscovery.getActiveNodes();
6746
+ }
6747
+ } else {
6748
+ console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
6732
6749
  }
6733
6750
  if (nodes.length === 0) {
6734
6751
  return {
@@ -7046,8 +7063,38 @@ Nonce: ${nonce}`;
7046
7063
  onChainNodeId: announcement.onChainNodeId
7047
7064
  };
7048
7065
  this.knownPeers.set(announcement.peerId, peerInfo);
7066
+ this.saveCachedPeers();
7049
7067
  this.emit("peerAnnounce", peerInfo);
7050
7068
  }
7069
+ /**
7070
+ * Load cached peers from localStorage
7071
+ */
7072
+ loadCachedPeers() {
7073
+ try {
7074
+ const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
7075
+ if (cached) {
7076
+ const peers = JSON.parse(cached);
7077
+ console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
7078
+ for (const peer of peers) {
7079
+ this.knownPeers.set(peer.peerId, { ...peer, connected: false });
7080
+ }
7081
+ }
7082
+ } catch (error) {
7083
+ console.warn("[ByteCave] Failed to load cached peers:", error);
7084
+ }
7085
+ }
7086
+ /**
7087
+ * Save known peers to localStorage
7088
+ */
7089
+ saveCachedPeers() {
7090
+ try {
7091
+ const peers = Array.from(this.knownPeers.values());
7092
+ localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
7093
+ console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
7094
+ } catch (error) {
7095
+ console.warn("[ByteCave] Failed to save cached peers:", error);
7096
+ }
7097
+ }
7051
7098
  /**
7052
7099
  * Check if a nodeId is registered in the on-chain registry
7053
7100
  */
package/dist/client.d.ts CHANGED
@@ -14,6 +14,7 @@ export declare class ByteCaveClient {
14
14
  private knownPeers;
15
15
  private connectionState;
16
16
  private eventListeners;
17
+ private readonly PEERS_CACHE_KEY;
17
18
  constructor(config: ByteCaveConfig);
18
19
  /**
19
20
  * Initialize and start the P2P client
@@ -97,6 +98,14 @@ export declare class ByteCaveClient {
97
98
  private setupEventListeners;
98
99
  private setupPubsub;
99
100
  private handlePeerAnnouncement;
101
+ /**
102
+ * Load cached peers from localStorage
103
+ */
104
+ private loadCachedPeers;
105
+ /**
106
+ * Save known peers to localStorage
107
+ */
108
+ private saveCachedPeers;
100
109
  /**
101
110
  * Check if a nodeId is registered in the on-chain registry
102
111
  */
package/dist/index.cjs CHANGED
@@ -6390,6 +6390,7 @@ var ByteCaveClient = class {
6390
6390
  this.knownPeers = /* @__PURE__ */ new Map();
6391
6391
  this.connectionState = "disconnected";
6392
6392
  this.eventListeners = /* @__PURE__ */ new Map();
6393
+ this.PEERS_CACHE_KEY = "bytecave_known_peers";
6393
6394
  this.config = {
6394
6395
  maxPeers: 10,
6395
6396
  connectionTimeout: 3e4,
@@ -6402,6 +6403,7 @@ var ByteCaveClient = class {
6402
6403
  if (config.vaultNodeRegistryAddress && config.rpcUrl) {
6403
6404
  this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
6404
6405
  }
6406
+ this.loadCachedPeers();
6405
6407
  }
6406
6408
  /**
6407
6409
  * Initialize and start the P2P client
@@ -6571,14 +6573,19 @@ var ByteCaveClient = class {
6571
6573
  }
6572
6574
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6573
6575
  if (health) {
6574
- this.knownPeers.set(peer.peerId, {
6576
+ const peerInfo = {
6575
6577
  peerId: peer.peerId,
6576
6578
  publicKey: health.publicKey || "",
6577
6579
  contentTypes: health.contentTypes || "all",
6580
+ httpEndpoint: health.httpEndpoint || "",
6581
+ multiaddrs: peer.multiaddrs || [],
6582
+ relayAddrs: peer.relayAddrs || [],
6578
6583
  connected: true,
6579
- nodeId: health.nodeId
6580
- });
6581
- console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
6584
+ isRegistered: peer.isRegistered || false,
6585
+ onChainNodeId: peer.onChainNodeId || ""
6586
+ };
6587
+ this.knownPeers.set(peer.peerId, peerInfo);
6588
+ this.saveCachedPeers();
6582
6589
  }
6583
6590
  } catch (err) {
6584
6591
  console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
@@ -6667,14 +6674,19 @@ var ByteCaveClient = class {
6667
6674
  try {
6668
6675
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6669
6676
  if (health) {
6670
- this.knownPeers.set(peer.peerId, {
6677
+ const peerInfo = {
6671
6678
  peerId: peer.peerId,
6672
6679
  publicKey: health.publicKey || "",
6673
6680
  contentTypes: health.contentTypes || "all",
6681
+ httpEndpoint: health.httpEndpoint || "",
6682
+ multiaddrs: peer.multiaddrs || [],
6683
+ relayAddrs: peer.relayAddrs || [],
6674
6684
  connected: true,
6675
- nodeId: health.nodeId
6676
- });
6677
- console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
6685
+ isRegistered: peer.isRegistered || false,
6686
+ onChainNodeId: peer.onChainNodeId || ""
6687
+ };
6688
+ this.knownPeers.set(peer.peerId, peerInfo);
6689
+ this.saveCachedPeers();
6678
6690
  }
6679
6691
  } catch (err) {
6680
6692
  console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
@@ -6777,11 +6789,16 @@ Nonce: ${nonce}`;
6777
6789
  }
6778
6790
  console.log("[ByteCave] Attempting storage via WebTransport direct");
6779
6791
  try {
6780
- let nodes = [];
6781
- if (this.relayDiscovery) {
6782
- nodes = await this.relayDiscovery.getConnectedPeers();
6783
- } else if (this.contractDiscovery) {
6784
- nodes = await this.contractDiscovery.getActiveNodes();
6792
+ let nodes = Array.from(this.knownPeers.values());
6793
+ if (nodes.length === 0) {
6794
+ console.log("[ByteCave] No cached peers, trying discovery services");
6795
+ if (this.relayDiscovery) {
6796
+ nodes = await this.relayDiscovery.getConnectedPeers();
6797
+ } else if (this.contractDiscovery) {
6798
+ nodes = await this.contractDiscovery.getActiveNodes();
6799
+ }
6800
+ } else {
6801
+ console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
6785
6802
  }
6786
6803
  if (nodes.length === 0) {
6787
6804
  return {
@@ -7099,8 +7116,38 @@ Nonce: ${nonce}`;
7099
7116
  onChainNodeId: announcement.onChainNodeId
7100
7117
  };
7101
7118
  this.knownPeers.set(announcement.peerId, peerInfo);
7119
+ this.saveCachedPeers();
7102
7120
  this.emit("peerAnnounce", peerInfo);
7103
7121
  }
7122
+ /**
7123
+ * Load cached peers from localStorage
7124
+ */
7125
+ loadCachedPeers() {
7126
+ try {
7127
+ const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
7128
+ if (cached) {
7129
+ const peers = JSON.parse(cached);
7130
+ console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
7131
+ for (const peer of peers) {
7132
+ this.knownPeers.set(peer.peerId, { ...peer, connected: false });
7133
+ }
7134
+ }
7135
+ } catch (error) {
7136
+ console.warn("[ByteCave] Failed to load cached peers:", error);
7137
+ }
7138
+ }
7139
+ /**
7140
+ * Save known peers to localStorage
7141
+ */
7142
+ saveCachedPeers() {
7143
+ try {
7144
+ const peers = Array.from(this.knownPeers.values());
7145
+ localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
7146
+ console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
7147
+ } catch (error) {
7148
+ console.warn("[ByteCave] Failed to save cached peers:", error);
7149
+ }
7150
+ }
7104
7151
  /**
7105
7152
  * Check if a nodeId is registered in the on-chain registry
7106
7153
  */
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  useHashdImage,
14
14
  useHashdMedia,
15
15
  useHashdUrl
16
- } from "./chunk-FSNCYF3O.js";
16
+ } from "./chunk-CVBYHRQD.js";
17
17
  import {
18
18
  clearHashdCache,
19
19
  createHashdUrl,
@@ -8,7 +8,7 @@ import {
8
8
  useHashdImage,
9
9
  useHashdMedia,
10
10
  useHashdUrl
11
- } from "../chunk-FSNCYF3O.js";
11
+ } from "../chunk-CVBYHRQD.js";
12
12
  import "../chunk-EEZWRIUI.js";
13
13
  export {
14
14
  HashdAudio,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gethashd/bytecave-browser",
3
- "version": "1.0.48",
3
+ "version": "1.0.49",
4
4
  "description": "ByteCave browser client for WebRTC P2P connections to storage nodes",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
package/src/client.ts CHANGED
@@ -44,6 +44,7 @@ export class ByteCaveClient {
44
44
  private knownPeers: Map<string, PeerInfo> = new Map();
45
45
  private connectionState: ConnectionState = 'disconnected';
46
46
  private eventListeners: Map<string, Set<Function>> = new Map();
47
+ private readonly PEERS_CACHE_KEY = 'bytecave_known_peers';
47
48
 
48
49
  constructor(config: ByteCaveConfig) {
49
50
  this.config = {
@@ -62,6 +63,9 @@ export class ByteCaveClient {
62
63
  if (config.vaultNodeRegistryAddress && config.rpcUrl) {
63
64
  this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
64
65
  }
66
+
67
+ // Load cached peers from localStorage
68
+ this.loadCachedPeers();
65
69
  }
66
70
 
67
71
  /**
@@ -277,14 +281,19 @@ export class ByteCaveClient {
277
281
  // Fetch health data
278
282
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
279
283
  if (health) {
280
- this.knownPeers.set(peer.peerId, {
284
+ const peerInfo = {
281
285
  peerId: peer.peerId,
282
286
  publicKey: health.publicKey || '',
283
287
  contentTypes: health.contentTypes || 'all',
288
+ httpEndpoint: (health as any).httpEndpoint || '',
289
+ multiaddrs: peer.multiaddrs || [],
290
+ relayAddrs: (peer as any).relayAddrs || [],
284
291
  connected: true,
285
- nodeId: health.nodeId
286
- });
287
- console.log('[ByteCave] ✓ Discovered peer:', health.nodeId || peer.peerId.slice(0, 12));
292
+ isRegistered: (peer as any).isRegistered || false,
293
+ onChainNodeId: (peer as any).onChainNodeId || ''
294
+ };
295
+ this.knownPeers.set(peer.peerId, peerInfo);
296
+ this.saveCachedPeers();
288
297
  }
289
298
  } catch (err: any) {
290
299
  console.warn('[ByteCave] Failed to process peer from directory:', peer.peerId.slice(0, 12), err.message);
@@ -391,14 +400,19 @@ export class ByteCaveClient {
391
400
  try {
392
401
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
393
402
  if (health) {
394
- this.knownPeers.set(peer.peerId, {
403
+ const peerInfo = {
395
404
  peerId: peer.peerId,
396
405
  publicKey: health.publicKey || '',
397
406
  contentTypes: health.contentTypes || 'all',
407
+ httpEndpoint: (health as any).httpEndpoint || '',
408
+ multiaddrs: (peer as any).multiaddrs || [],
409
+ relayAddrs: (peer as any).relayAddrs || [],
398
410
  connected: true,
399
- nodeId: health.nodeId
400
- });
401
- console.log('[ByteCave] Refresh: ✓ Updated peer info:', health.nodeId || peer.peerId.slice(0, 12));
411
+ isRegistered: (peer as any).isRegistered || false,
412
+ onChainNodeId: (peer as any).onChainNodeId || ''
413
+ };
414
+ this.knownPeers.set(peer.peerId, peerInfo);
415
+ this.saveCachedPeers();
402
416
  }
403
417
  } catch (err: any) {
404
418
  console.warn('[ByteCave] Refresh: Failed to get health from peer:', peer.peerId.slice(0, 12), err.message);
@@ -528,13 +542,18 @@ Nonce: ${nonce}`;
528
542
  console.log('[ByteCave] Attempting storage via WebTransport direct');
529
543
 
530
544
  try {
531
- // Get nodes from relay discovery or contract discovery
532
- let nodes: any[] = [];
545
+ // Try cached peers first, then discovery services
546
+ let nodes: any[] = Array.from(this.knownPeers.values());
533
547
 
534
- if (this.relayDiscovery) {
535
- nodes = await this.relayDiscovery.getConnectedPeers();
536
- } else if (this.contractDiscovery) {
537
- nodes = await this.contractDiscovery.getActiveNodes();
548
+ if (nodes.length === 0) {
549
+ console.log('[ByteCave] No cached peers, trying discovery services');
550
+ if (this.relayDiscovery) {
551
+ nodes = await this.relayDiscovery.getConnectedPeers();
552
+ } else if (this.contractDiscovery) {
553
+ nodes = await this.contractDiscovery.getActiveNodes();
554
+ }
555
+ } else {
556
+ console.log('[ByteCave] Using', nodes.length, 'cached peers for WebTransport');
538
557
  }
539
558
 
540
559
  if (nodes.length === 0) {
@@ -934,11 +953,43 @@ Nonce: ${nonce}`;
934
953
  };
935
954
 
936
955
  this.knownPeers.set(announcement.peerId, peerInfo);
956
+ this.saveCachedPeers();
937
957
 
938
958
  this.emit('peerAnnounce', peerInfo);
939
959
  }
940
960
 
941
961
 
962
+ /**
963
+ * Load cached peers from localStorage
964
+ */
965
+ private loadCachedPeers(): void {
966
+ try {
967
+ const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
968
+ if (cached) {
969
+ const peers = JSON.parse(cached);
970
+ console.log('[ByteCave] Loaded', peers.length, 'cached peers from localStorage');
971
+ for (const peer of peers) {
972
+ this.knownPeers.set(peer.peerId, { ...peer, connected: false });
973
+ }
974
+ }
975
+ } catch (error) {
976
+ console.warn('[ByteCave] Failed to load cached peers:', error);
977
+ }
978
+ }
979
+
980
+ /**
981
+ * Save known peers to localStorage
982
+ */
983
+ private saveCachedPeers(): void {
984
+ try {
985
+ const peers = Array.from(this.knownPeers.values());
986
+ localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
987
+ console.log('[ByteCave] Saved', peers.length, 'peers to localStorage');
988
+ } catch (error) {
989
+ console.warn('[ByteCave] Failed to save cached peers:', error);
990
+ }
991
+ }
992
+
942
993
  /**
943
994
  * Check if a nodeId is registered in the on-chain registry
944
995
  */