@gethashd/bytecave-browser 1.0.58 → 1.0.59

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.
@@ -6057,7 +6057,6 @@ var p2pProtocolClient = new P2PProtocolClient();
6057
6057
  import { createLibp2p } from "libp2p";
6058
6058
  import { webRTC } from "@libp2p/webrtc";
6059
6059
  import { webSockets } from "@libp2p/websockets";
6060
- import { webTransport } from "@libp2p/webtransport";
6061
6060
  import { noise } from "@chainsafe/libp2p-noise";
6062
6061
  import { yamux } from "@chainsafe/libp2p-yamux";
6063
6062
  import { floodsub } from "@libp2p/floodsub";
@@ -6227,136 +6226,6 @@ var StorageWebSocketClient = class {
6227
6226
  }
6228
6227
  };
6229
6228
 
6230
- // src/storage-webtransport.ts
6231
- var StorageWebTransportClient = class {
6232
- constructor(nodeMultiaddr) {
6233
- this.nodeMultiaddr = nodeMultiaddr;
6234
- }
6235
- /**
6236
- * Store data via WebTransport direct to node
6237
- */
6238
- async store(request) {
6239
- try {
6240
- if (typeof WebTransport === "undefined") {
6241
- return {
6242
- success: false,
6243
- error: "WebTransport not supported in this browser"
6244
- };
6245
- }
6246
- const url = this.multiaddrToWebTransportUrl(this.nodeMultiaddr);
6247
- if (!url) {
6248
- return {
6249
- success: false,
6250
- error: "Invalid WebTransport multiaddr"
6251
- };
6252
- }
6253
- console.log("[WebTransport] Connecting to node:", url);
6254
- const transport = new WebTransport(url);
6255
- await transport.ready;
6256
- console.log("[WebTransport] Connected, opening bidirectional stream");
6257
- const stream = await transport.createBidirectionalStream();
6258
- const writer = stream.writable.getWriter();
6259
- const reader = stream.readable.getReader();
6260
- const requestData = {
6261
- type: "storage-request",
6262
- data: Array.from(request.data),
6263
- // Convert Uint8Array to array for JSON
6264
- contentType: request.contentType,
6265
- hashIdToken: request.hashIdToken,
6266
- authorization: request.authorization
6267
- };
6268
- const requestJson = JSON.stringify(requestData);
6269
- const requestBytes = new TextEncoder().encode(requestJson);
6270
- await writer.write(requestBytes);
6271
- await writer.close();
6272
- console.log("[WebTransport] Request sent, waiting for response");
6273
- const { value, done } = await reader.read();
6274
- if (done || !value) {
6275
- return {
6276
- success: false,
6277
- error: "No response from node"
6278
- };
6279
- }
6280
- const responseJson = new TextDecoder().decode(value);
6281
- const response = JSON.parse(responseJson);
6282
- console.log("[WebTransport] Response received:", response);
6283
- await transport.close();
6284
- return response;
6285
- } catch (error) {
6286
- console.error("[WebTransport] Storage failed:", error);
6287
- return {
6288
- success: false,
6289
- error: error.message || "WebTransport storage failed"
6290
- };
6291
- }
6292
- }
6293
- /**
6294
- * Convert libp2p multiaddr to WebTransport URL
6295
- */
6296
- multiaddrToWebTransportUrl(multiaddr2) {
6297
- try {
6298
- const parts = multiaddr2.split("/").filter((p) => p);
6299
- let ip = "";
6300
- let port = "";
6301
- let hasQuic = false;
6302
- let hasWebTransport = false;
6303
- for (let i = 0; i < parts.length; i++) {
6304
- if (parts[i] === "ip4" && i + 1 < parts.length) {
6305
- ip = parts[i + 1];
6306
- } else if (parts[i] === "udp" && i + 1 < parts.length) {
6307
- port = parts[i + 1];
6308
- } else if (parts[i] === "quic-v1") {
6309
- hasQuic = true;
6310
- } else if (parts[i] === "webtransport") {
6311
- hasWebTransport = true;
6312
- }
6313
- }
6314
- if (!ip || !port || !hasQuic || !hasWebTransport) {
6315
- return null;
6316
- }
6317
- const host = ip === "127.0.0.1" ? "localhost" : ip;
6318
- return `https://${host}:${port}/storage`;
6319
- } catch (error) {
6320
- console.error("[WebTransport] Failed to parse multiaddr:", error);
6321
- return null;
6322
- }
6323
- }
6324
- /**
6325
- * Extract certificate hash from multiaddr
6326
- * Format: /ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEi...
6327
- */
6328
- extractCertHash(multiaddr2) {
6329
- try {
6330
- const parts = multiaddr2.split("/").filter((p) => p);
6331
- const certhashIndex = parts.indexOf("certhash");
6332
- if (certhashIndex !== -1 && certhashIndex + 1 < parts.length) {
6333
- return parts[certhashIndex + 1];
6334
- }
6335
- return null;
6336
- } catch (error) {
6337
- console.error("[WebTransport] Failed to extract cert hash:", error);
6338
- return null;
6339
- }
6340
- }
6341
- /**
6342
- * Convert libp2p multihash cert hash to SHA-256 ArrayBuffer for WebTransport
6343
- * The certhash in multiaddr format is: uEi<hex-hash>
6344
- * where 'u' = base32 multibase, 'Ei' = multihash prefix for SHA-256
6345
- */
6346
- async certHashToSHA256(multihash) {
6347
- try {
6348
- let hexHash = multihash.startsWith("uEi") ? multihash.slice(3) : multihash;
6349
- const bytes = new Uint8Array(hexHash.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
6350
- console.log("[WebTransport] Decoded certificate hash:", hexHash);
6351
- console.log("[WebTransport] Hash bytes length:", bytes.length);
6352
- return bytes.buffer;
6353
- } catch (error) {
6354
- console.error("[WebTransport] Failed to convert cert hash:", error);
6355
- throw new Error("Failed to decode certificate hash");
6356
- }
6357
- }
6358
- };
6359
-
6360
6229
  // src/contracts/ContentRegistry.ts
6361
6230
  var CONTENT_REGISTRY_ABI = [
6362
6231
  "function registerContent(bytes32 cid, address owner, bytes32 appId, uint256 hashIdToken) external",
@@ -6373,7 +6242,6 @@ var ByteCaveClient = class {
6373
6242
  this.knownPeers = /* @__PURE__ */ new Map();
6374
6243
  this.connectionState = "disconnected";
6375
6244
  this.eventListeners = /* @__PURE__ */ new Map();
6376
- this.PEERS_CACHE_KEY = "bytecave_known_peers";
6377
6245
  this.config = {
6378
6246
  maxPeers: 10,
6379
6247
  connectionTimeout: 3e4,
@@ -6386,7 +6254,6 @@ var ByteCaveClient = class {
6386
6254
  if (config.vaultNodeRegistryAddress && config.rpcUrl) {
6387
6255
  this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
6388
6256
  }
6389
- this.loadCachedPeers();
6390
6257
  }
6391
6258
  /**
6392
6259
  * Initialize and start the P2P client
@@ -6416,7 +6283,6 @@ var ByteCaveClient = class {
6416
6283
  transports: [
6417
6284
  webRTC(),
6418
6285
  webSockets(),
6419
- webTransport(),
6420
6286
  circuitRelayTransport()
6421
6287
  ],
6422
6288
  connectionEncrypters: [noise()],
@@ -6557,19 +6423,14 @@ var ByteCaveClient = class {
6557
6423
  }
6558
6424
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6559
6425
  if (health) {
6560
- const peerInfo = {
6426
+ this.knownPeers.set(peer.peerId, {
6561
6427
  peerId: peer.peerId,
6562
6428
  publicKey: health.publicKey || "",
6563
6429
  contentTypes: health.contentTypes || "all",
6564
- httpEndpoint: health.httpEndpoint || "",
6565
- multiaddrs: peer.multiaddrs || [],
6566
- relayAddrs: peer.relayAddrs || [],
6567
6430
  connected: true,
6568
- isRegistered: peer.isRegistered || false,
6569
- onChainNodeId: peer.onChainNodeId || ""
6570
- };
6571
- this.knownPeers.set(peer.peerId, peerInfo);
6572
- this.saveCachedPeers();
6431
+ nodeId: health.nodeId
6432
+ });
6433
+ console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
6573
6434
  }
6574
6435
  } catch (err) {
6575
6436
  console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
@@ -6605,9 +6466,6 @@ var ByteCaveClient = class {
6605
6466
  connectedPeers: connectedPeers.length,
6606
6467
  discoveredPeers: this.knownPeers.size
6607
6468
  });
6608
- setTimeout(() => {
6609
- this.dialCachedPeers();
6610
- }, 2e3);
6611
6469
  } catch (error) {
6612
6470
  this.setConnectionState("error");
6613
6471
  console.error("Failed to start ByteCave client:", error);
@@ -6661,19 +6519,14 @@ var ByteCaveClient = class {
6661
6519
  try {
6662
6520
  const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
6663
6521
  if (health) {
6664
- const peerInfo = {
6522
+ this.knownPeers.set(peer.peerId, {
6665
6523
  peerId: peer.peerId,
6666
6524
  publicKey: health.publicKey || "",
6667
6525
  contentTypes: health.contentTypes || "all",
6668
- httpEndpoint: health.httpEndpoint || "",
6669
- multiaddrs: peer.multiaddrs || [],
6670
- relayAddrs: peer.relayAddrs || [],
6671
6526
  connected: true,
6672
- isRegistered: peer.isRegistered || false,
6673
- onChainNodeId: peer.onChainNodeId || ""
6674
- };
6675
- this.knownPeers.set(peer.peerId, peerInfo);
6676
- this.saveCachedPeers();
6527
+ nodeId: health.nodeId
6528
+ });
6529
+ console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
6677
6530
  }
6678
6531
  } catch (err) {
6679
6532
  console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
@@ -6738,81 +6591,15 @@ Nonce: ${nonce}`;
6738
6591
  console.warn("[ByteCave] Failed to create authorization:", err.message);
6739
6592
  }
6740
6593
  }
6741
- if (this.config.relayWsUrl) {
6742
- console.log("[ByteCave] Attempting storage via WebSocket relay");
6743
- try {
6744
- if (!this.storageWsClient) {
6745
- this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
6746
- }
6747
- const wsAuth = authorization ? {
6748
- signature: authorization.signature,
6749
- address: authorization.sender,
6750
- timestamp: authorization.timestamp,
6751
- nonce: authorization.nonce,
6752
- appId: authorization.appId,
6753
- contentHash: authorization.contentHash
6754
- } : void 0;
6755
- const result = await this.storageWsClient.store({
6756
- data: dataArray,
6757
- contentType: mimeType || "application/octet-stream",
6758
- hashIdToken,
6759
- authorization: wsAuth,
6760
- timeout: 3e4
6761
- });
6762
- if (result.success && result.cid) {
6763
- console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
6764
- return {
6765
- success: true,
6766
- cid: result.cid,
6767
- peerId: "relay-ws"
6768
- };
6769
- }
6770
- console.warn("[ByteCave] WebSocket storage failed, trying WebTransport:", result.error);
6771
- } catch (err) {
6772
- console.warn("[ByteCave] WebSocket storage exception, trying WebTransport:", err.message);
6773
- }
6774
- } else {
6775
- console.log("[ByteCave] WebSocket relay not configured, trying WebTransport");
6594
+ if (!this.config.relayWsUrl) {
6595
+ return { success: false, error: "WebSocket relay URL not configured" };
6776
6596
  }
6777
- console.log("[ByteCave] Attempting storage via WebTransport direct");
6597
+ console.log("[ByteCave] Storing via WebSocket relay");
6778
6598
  try {
6779
- let nodes = Array.from(this.knownPeers.values());
6780
- if (nodes.length === 0) {
6781
- console.log("[ByteCave] No cached peers, trying discovery services");
6782
- if (this.relayDiscovery) {
6783
- nodes = await this.relayDiscovery.getConnectedPeers();
6784
- } else if (this.contractDiscovery) {
6785
- nodes = await this.contractDiscovery.getActiveNodes();
6786
- }
6787
- } else {
6788
- console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
6789
- }
6790
- if (nodes.length === 0) {
6791
- return {
6792
- success: false,
6793
- error: "No nodes available for WebTransport storage"
6794
- };
6795
- }
6796
- const nodeWithWebTransport = nodes.find(
6797
- (node) => node.multiaddrs?.some((addr) => addr.includes("/webtransport"))
6798
- );
6799
- if (!nodeWithWebTransport || !nodeWithWebTransport.multiaddrs) {
6800
- return {
6801
- success: false,
6802
- error: "No nodes with WebTransport support found"
6803
- };
6804
- }
6805
- const wtMultiaddr = nodeWithWebTransport.multiaddrs.find(
6806
- (addr) => addr.includes("/webtransport")
6807
- );
6808
- if (!wtMultiaddr) {
6809
- return {
6810
- success: false,
6811
- error: "No WebTransport multiaddr found"
6812
- };
6599
+ if (!this.storageWsClient) {
6600
+ this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
6813
6601
  }
6814
- const wtClient = new StorageWebTransportClient(wtMultiaddr);
6815
- const wtAuth = authorization ? {
6602
+ const wsAuth = authorization ? {
6816
6603
  signature: authorization.signature,
6817
6604
  address: authorization.sender,
6818
6605
  timestamp: authorization.timestamp,
@@ -6820,25 +6607,26 @@ Nonce: ${nonce}`;
6820
6607
  appId: authorization.appId,
6821
6608
  contentHash: authorization.contentHash
6822
6609
  } : void 0;
6823
- const result = await wtClient.store({
6610
+ const result = await this.storageWsClient.store({
6824
6611
  data: dataArray,
6825
6612
  contentType: mimeType || "application/octet-stream",
6826
6613
  hashIdToken,
6827
- authorization: wtAuth
6614
+ authorization: wsAuth,
6615
+ timeout: 3e4
6828
6616
  });
6829
6617
  if (result.success && result.cid) {
6830
- console.log("[ByteCave] \u2713 WebTransport storage successful:", result.cid);
6618
+ console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
6831
6619
  return {
6832
6620
  success: true,
6833
6621
  cid: result.cid,
6834
- peerId: nodeWithWebTransport.peerId
6622
+ peerId: "relay-ws"
6835
6623
  };
6836
6624
  }
6837
- console.error("[ByteCave] WebTransport storage failed:", result.error);
6838
- return { success: false, error: result.error || "All storage methods failed" };
6625
+ console.warn("[ByteCave] WebSocket storage failed:", result.error);
6626
+ return { success: false, error: result.error || "WebSocket storage failed" };
6839
6627
  } catch (err) {
6840
- console.error("[ByteCave] WebTransport storage exception:", err.message);
6841
- return { success: false, error: `All storage methods failed: ${err.message}` };
6628
+ console.error("[ByteCave] WebSocket storage exception:", err.message);
6629
+ return { success: false, error: err.message };
6842
6630
  }
6843
6631
  }
6844
6632
  /**
@@ -6990,48 +6778,14 @@ Nonce: ${nonce}`;
6990
6778
  try {
6991
6779
  const peerInfo = this.knownPeers.get(peerId);
6992
6780
  const relayAddrs = peerInfo?.relayAddrs;
6993
- const multiaddrs = peerInfo?.multiaddrs;
6994
- if (this.node) {
6995
- const connections = this.node.getConnections().filter((c) => c.remotePeer.toString() === peerId);
6996
- if (connections.length === 0) {
6997
- console.log("[ByteCave] No existing connection to peer, attempting to dial");
6998
- if (relayAddrs && relayAddrs.length > 0) {
6999
- console.log("[ByteCave] Trying relay address:", relayAddrs[0].slice(0, 60));
7000
- try {
7001
- const ma = multiaddr(relayAddrs[0]);
7002
- await this.node.dial(ma);
7003
- console.log("[ByteCave] \u2713 Connected via relay");
7004
- } catch (dialError) {
7005
- console.warn("[ByteCave] Relay dial failed:", dialError.message);
7006
- if (multiaddrs && multiaddrs.length > 0) {
7007
- const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
7008
- if (wtAddr) {
7009
- console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
7010
- try {
7011
- const ma = multiaddr(wtAddr);
7012
- await this.node.dial(ma);
7013
- console.log("[ByteCave] \u2713 Connected via WebTransport");
7014
- } catch (wtError) {
7015
- console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
7016
- }
7017
- }
7018
- }
7019
- }
7020
- } else if (multiaddrs && multiaddrs.length > 0) {
7021
- const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
7022
- if (wtAddr) {
7023
- console.log("[ByteCave] Trying WebTransport address (no relay):", wtAddr.slice(0, 60));
7024
- try {
7025
- const ma = multiaddr(wtAddr);
7026
- await this.node.dial(ma);
7027
- console.log("[ByteCave] \u2713 Connected via WebTransport");
7028
- } catch (wtError) {
7029
- console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
7030
- }
7031
- }
7032
- }
7033
- } else {
7034
- console.log("[ByteCave] Already connected to peer via", connections[0].remoteAddr.toString().slice(0, 60));
6781
+ if (relayAddrs && relayAddrs.length > 0 && this.node) {
6782
+ console.log("[ByteCave] Dialing peer through relay:", peerId.slice(0, 12), relayAddrs[0]);
6783
+ try {
6784
+ const ma = multiaddr(relayAddrs[0]);
6785
+ await this.node.dial(ma);
6786
+ console.log("[ByteCave] Successfully dialed peer through relay");
6787
+ } catch (dialError) {
6788
+ console.warn("[ByteCave] Failed to dial through relay:", dialError);
7035
6789
  }
7036
6790
  }
7037
6791
  const health = await p2pProtocolClient.getHealthFromPeer(peerId);
@@ -7137,106 +6891,8 @@ Nonce: ${nonce}`;
7137
6891
  onChainNodeId: announcement.onChainNodeId
7138
6892
  };
7139
6893
  this.knownPeers.set(announcement.peerId, peerInfo);
7140
- this.saveCachedPeers();
7141
- if (this.node && !peerInfo.connected) {
7142
- this.dialPeer(announcement.peerId, peerInfo.relayAddrs, peerInfo.multiaddrs).catch((err) => {
7143
- console.warn("[ByteCave] Failed to dial announced peer:", err.message);
7144
- });
7145
- }
7146
6894
  this.emit("peerAnnounce", peerInfo);
7147
6895
  }
7148
- /**
7149
- * Attempt to dial a peer using relay or WebTransport addresses
7150
- */
7151
- async dialPeer(peerId, relayAddrs, multiaddrs) {
7152
- if (!this.node) return;
7153
- const connections = this.node.getConnections().filter((c) => c.remotePeer.toString() === peerId);
7154
- if (connections.length > 0) {
7155
- console.log("[ByteCave] Already connected to peer:", peerId.slice(0, 12));
7156
- return;
7157
- }
7158
- console.log("[ByteCave] Attempting to dial peer:", peerId.slice(0, 12));
7159
- if (relayAddrs && relayAddrs.length > 0) {
7160
- console.log("[ByteCave] Trying relay address:", relayAddrs[0].slice(0, 60));
7161
- try {
7162
- const ma = multiaddr(relayAddrs[0]);
7163
- await this.node.dial(ma);
7164
- console.log("[ByteCave] \u2713 Connected via relay");
7165
- const peer = this.knownPeers.get(peerId);
7166
- if (peer) {
7167
- peer.connected = true;
7168
- }
7169
- return;
7170
- } catch (error) {
7171
- console.warn("[ByteCave] Relay dial failed:", error.message);
7172
- }
7173
- }
7174
- if (multiaddrs && multiaddrs.length > 0) {
7175
- const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
7176
- if (wtAddr) {
7177
- console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
7178
- try {
7179
- const ma = multiaddr(wtAddr);
7180
- await this.node.dial(ma);
7181
- console.log("[ByteCave] \u2713 Connected via WebTransport");
7182
- const peer = this.knownPeers.get(peerId);
7183
- if (peer) {
7184
- peer.connected = true;
7185
- }
7186
- } catch (error) {
7187
- console.warn("[ByteCave] WebTransport dial failed:", error.message);
7188
- }
7189
- }
7190
- }
7191
- }
7192
- /**
7193
- * Load cached peers from localStorage
7194
- */
7195
- loadCachedPeers() {
7196
- try {
7197
- const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
7198
- if (cached) {
7199
- const peers = JSON.parse(cached);
7200
- console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
7201
- for (const peer of peers) {
7202
- this.knownPeers.set(peer.peerId, { ...peer, connected: false });
7203
- }
7204
- }
7205
- } catch (error) {
7206
- console.warn("[ByteCave] Failed to load cached peers:", error);
7207
- }
7208
- }
7209
- /**
7210
- * Dial all cached peers (used on startup when relay might be down)
7211
- */
7212
- async dialCachedPeers() {
7213
- console.log("[ByteCave] Dialing", this.knownPeers.size, "cached peers...");
7214
- for (const [peerId, peerInfo] of this.knownPeers) {
7215
- if (peerInfo.connected) {
7216
- continue;
7217
- }
7218
- const relayAddrs = peerInfo.relayAddrs;
7219
- const multiaddrs = peerInfo.multiaddrs;
7220
- if (relayAddrs || multiaddrs) {
7221
- this.dialPeer(peerId, relayAddrs, multiaddrs).catch((err) => {
7222
- console.warn("[ByteCave] Failed to dial cached peer:", peerId.slice(0, 12), err.message);
7223
- });
7224
- await new Promise((resolve) => setTimeout(resolve, 500));
7225
- }
7226
- }
7227
- }
7228
- /**
7229
- * Save known peers to localStorage
7230
- */
7231
- saveCachedPeers() {
7232
- try {
7233
- const peers = Array.from(this.knownPeers.values());
7234
- localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
7235
- console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
7236
- } catch (error) {
7237
- console.warn("[ByteCave] Failed to save cached peers:", error);
7238
- }
7239
- }
7240
6896
  /**
7241
6897
  * Check if a nodeId is registered in the on-chain registry
7242
6898
  */
package/dist/client.d.ts CHANGED
@@ -14,7 +14,6 @@ export declare class ByteCaveClient {
14
14
  private knownPeers;
15
15
  private connectionState;
16
16
  private eventListeners;
17
- private readonly PEERS_CACHE_KEY;
18
17
  constructor(config: ByteCaveConfig);
19
18
  /**
20
19
  * Initialize and start the P2P client
@@ -98,22 +97,6 @@ export declare class ByteCaveClient {
98
97
  private setupEventListeners;
99
98
  private setupPubsub;
100
99
  private handlePeerAnnouncement;
101
- /**
102
- * Attempt to dial a peer using relay or WebTransport addresses
103
- */
104
- private dialPeer;
105
- /**
106
- * Load cached peers from localStorage
107
- */
108
- private loadCachedPeers;
109
- /**
110
- * Dial all cached peers (used on startup when relay might be down)
111
- */
112
- private dialCachedPeers;
113
- /**
114
- * Save known peers to localStorage
115
- */
116
- private saveCachedPeers;
117
100
  /**
118
101
  * Check if a nodeId is registered in the on-chain registry
119
102
  */