@gethashd/bytecave-browser 1.0.57 → 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.
- package/dist/{chunk-TQKA66LZ.js → chunk-FOQ3CE3H.js} +31 -374
- package/dist/client.d.ts +0 -17
- package/dist/index.cjs +31 -374
- package/dist/index.js +1 -1
- package/dist/react/index.cjs +0 -1
- package/dist/react/index.js +1 -1
- package/dist/types.d.ts +0 -4
- package/package.json +1 -1
- package/src/client.ts +35 -301
- package/src/types.ts +0 -4
- package/dist/storage-webtransport.d.ts +0 -47
- package/src/storage-webtransport.ts +0 -199
|
@@ -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,135 +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
|
-
return `https://${ip}:${port}/storage`;
|
|
6318
|
-
} catch (error) {
|
|
6319
|
-
console.error("[WebTransport] Failed to parse multiaddr:", error);
|
|
6320
|
-
return null;
|
|
6321
|
-
}
|
|
6322
|
-
}
|
|
6323
|
-
/**
|
|
6324
|
-
* Extract certificate hash from multiaddr
|
|
6325
|
-
* Format: /ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEi...
|
|
6326
|
-
*/
|
|
6327
|
-
extractCertHash(multiaddr2) {
|
|
6328
|
-
try {
|
|
6329
|
-
const parts = multiaddr2.split("/").filter((p) => p);
|
|
6330
|
-
const certhashIndex = parts.indexOf("certhash");
|
|
6331
|
-
if (certhashIndex !== -1 && certhashIndex + 1 < parts.length) {
|
|
6332
|
-
return parts[certhashIndex + 1];
|
|
6333
|
-
}
|
|
6334
|
-
return null;
|
|
6335
|
-
} catch (error) {
|
|
6336
|
-
console.error("[WebTransport] Failed to extract cert hash:", error);
|
|
6337
|
-
return null;
|
|
6338
|
-
}
|
|
6339
|
-
}
|
|
6340
|
-
/**
|
|
6341
|
-
* Convert libp2p multihash cert hash to SHA-256 ArrayBuffer for WebTransport
|
|
6342
|
-
* The certhash in multiaddr format is: uEi<hex-hash>
|
|
6343
|
-
* where 'u' = base32 multibase, 'Ei' = multihash prefix for SHA-256
|
|
6344
|
-
*/
|
|
6345
|
-
async certHashToSHA256(multihash) {
|
|
6346
|
-
try {
|
|
6347
|
-
let hexHash = multihash.startsWith("uEi") ? multihash.slice(3) : multihash;
|
|
6348
|
-
const bytes = new Uint8Array(hexHash.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
6349
|
-
console.log("[WebTransport] Decoded certificate hash:", hexHash);
|
|
6350
|
-
console.log("[WebTransport] Hash bytes length:", bytes.length);
|
|
6351
|
-
return bytes.buffer;
|
|
6352
|
-
} catch (error) {
|
|
6353
|
-
console.error("[WebTransport] Failed to convert cert hash:", error);
|
|
6354
|
-
throw new Error("Failed to decode certificate hash");
|
|
6355
|
-
}
|
|
6356
|
-
}
|
|
6357
|
-
};
|
|
6358
|
-
|
|
6359
6229
|
// src/contracts/ContentRegistry.ts
|
|
6360
6230
|
var CONTENT_REGISTRY_ABI = [
|
|
6361
6231
|
"function registerContent(bytes32 cid, address owner, bytes32 appId, uint256 hashIdToken) external",
|
|
@@ -6372,7 +6242,6 @@ var ByteCaveClient = class {
|
|
|
6372
6242
|
this.knownPeers = /* @__PURE__ */ new Map();
|
|
6373
6243
|
this.connectionState = "disconnected";
|
|
6374
6244
|
this.eventListeners = /* @__PURE__ */ new Map();
|
|
6375
|
-
this.PEERS_CACHE_KEY = "bytecave_known_peers";
|
|
6376
6245
|
this.config = {
|
|
6377
6246
|
maxPeers: 10,
|
|
6378
6247
|
connectionTimeout: 3e4,
|
|
@@ -6385,7 +6254,6 @@ var ByteCaveClient = class {
|
|
|
6385
6254
|
if (config.vaultNodeRegistryAddress && config.rpcUrl) {
|
|
6386
6255
|
this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
|
|
6387
6256
|
}
|
|
6388
|
-
this.loadCachedPeers();
|
|
6389
6257
|
}
|
|
6390
6258
|
/**
|
|
6391
6259
|
* Initialize and start the P2P client
|
|
@@ -6415,7 +6283,6 @@ var ByteCaveClient = class {
|
|
|
6415
6283
|
transports: [
|
|
6416
6284
|
webRTC(),
|
|
6417
6285
|
webSockets(),
|
|
6418
|
-
webTransport(),
|
|
6419
6286
|
circuitRelayTransport()
|
|
6420
6287
|
],
|
|
6421
6288
|
connectionEncrypters: [noise()],
|
|
@@ -6556,19 +6423,14 @@ var ByteCaveClient = class {
|
|
|
6556
6423
|
}
|
|
6557
6424
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6558
6425
|
if (health) {
|
|
6559
|
-
|
|
6426
|
+
this.knownPeers.set(peer.peerId, {
|
|
6560
6427
|
peerId: peer.peerId,
|
|
6561
6428
|
publicKey: health.publicKey || "",
|
|
6562
6429
|
contentTypes: health.contentTypes || "all",
|
|
6563
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6564
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6565
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6566
6430
|
connected: true,
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6571
|
-
this.saveCachedPeers();
|
|
6431
|
+
nodeId: health.nodeId
|
|
6432
|
+
});
|
|
6433
|
+
console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6572
6434
|
}
|
|
6573
6435
|
} catch (err) {
|
|
6574
6436
|
console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6604,9 +6466,6 @@ var ByteCaveClient = class {
|
|
|
6604
6466
|
connectedPeers: connectedPeers.length,
|
|
6605
6467
|
discoveredPeers: this.knownPeers.size
|
|
6606
6468
|
});
|
|
6607
|
-
setTimeout(() => {
|
|
6608
|
-
this.dialCachedPeers();
|
|
6609
|
-
}, 2e3);
|
|
6610
6469
|
} catch (error) {
|
|
6611
6470
|
this.setConnectionState("error");
|
|
6612
6471
|
console.error("Failed to start ByteCave client:", error);
|
|
@@ -6660,19 +6519,14 @@ var ByteCaveClient = class {
|
|
|
6660
6519
|
try {
|
|
6661
6520
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6662
6521
|
if (health) {
|
|
6663
|
-
|
|
6522
|
+
this.knownPeers.set(peer.peerId, {
|
|
6664
6523
|
peerId: peer.peerId,
|
|
6665
6524
|
publicKey: health.publicKey || "",
|
|
6666
6525
|
contentTypes: health.contentTypes || "all",
|
|
6667
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6668
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6669
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6670
6526
|
connected: true,
|
|
6671
|
-
|
|
6672
|
-
|
|
6673
|
-
|
|
6674
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6675
|
-
this.saveCachedPeers();
|
|
6527
|
+
nodeId: health.nodeId
|
|
6528
|
+
});
|
|
6529
|
+
console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6676
6530
|
}
|
|
6677
6531
|
} catch (err) {
|
|
6678
6532
|
console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6737,81 +6591,15 @@ Nonce: ${nonce}`;
|
|
|
6737
6591
|
console.warn("[ByteCave] Failed to create authorization:", err.message);
|
|
6738
6592
|
}
|
|
6739
6593
|
}
|
|
6740
|
-
if (this.config.relayWsUrl) {
|
|
6741
|
-
|
|
6742
|
-
try {
|
|
6743
|
-
if (!this.storageWsClient) {
|
|
6744
|
-
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6745
|
-
}
|
|
6746
|
-
const wsAuth = authorization ? {
|
|
6747
|
-
signature: authorization.signature,
|
|
6748
|
-
address: authorization.sender,
|
|
6749
|
-
timestamp: authorization.timestamp,
|
|
6750
|
-
nonce: authorization.nonce,
|
|
6751
|
-
appId: authorization.appId,
|
|
6752
|
-
contentHash: authorization.contentHash
|
|
6753
|
-
} : void 0;
|
|
6754
|
-
const result = await this.storageWsClient.store({
|
|
6755
|
-
data: dataArray,
|
|
6756
|
-
contentType: mimeType || "application/octet-stream",
|
|
6757
|
-
hashIdToken,
|
|
6758
|
-
authorization: wsAuth,
|
|
6759
|
-
timeout: 3e4
|
|
6760
|
-
});
|
|
6761
|
-
if (result.success && result.cid) {
|
|
6762
|
-
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6763
|
-
return {
|
|
6764
|
-
success: true,
|
|
6765
|
-
cid: result.cid,
|
|
6766
|
-
peerId: "relay-ws"
|
|
6767
|
-
};
|
|
6768
|
-
}
|
|
6769
|
-
console.warn("[ByteCave] WebSocket storage failed, trying WebTransport:", result.error);
|
|
6770
|
-
} catch (err) {
|
|
6771
|
-
console.warn("[ByteCave] WebSocket storage exception, trying WebTransport:", err.message);
|
|
6772
|
-
}
|
|
6773
|
-
} else {
|
|
6774
|
-
console.log("[ByteCave] WebSocket relay not configured, trying WebTransport");
|
|
6594
|
+
if (!this.config.relayWsUrl) {
|
|
6595
|
+
return { success: false, error: "WebSocket relay URL not configured" };
|
|
6775
6596
|
}
|
|
6776
|
-
console.log("[ByteCave]
|
|
6597
|
+
console.log("[ByteCave] Storing via WebSocket relay");
|
|
6777
6598
|
try {
|
|
6778
|
-
|
|
6779
|
-
|
|
6780
|
-
console.log("[ByteCave] No cached peers, trying discovery services");
|
|
6781
|
-
if (this.relayDiscovery) {
|
|
6782
|
-
nodes = await this.relayDiscovery.getConnectedPeers();
|
|
6783
|
-
} else if (this.contractDiscovery) {
|
|
6784
|
-
nodes = await this.contractDiscovery.getActiveNodes();
|
|
6785
|
-
}
|
|
6786
|
-
} else {
|
|
6787
|
-
console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
|
|
6788
|
-
}
|
|
6789
|
-
if (nodes.length === 0) {
|
|
6790
|
-
return {
|
|
6791
|
-
success: false,
|
|
6792
|
-
error: "No nodes available for WebTransport storage"
|
|
6793
|
-
};
|
|
6794
|
-
}
|
|
6795
|
-
const nodeWithWebTransport = nodes.find(
|
|
6796
|
-
(node) => node.multiaddrs?.some((addr) => addr.includes("/webtransport"))
|
|
6797
|
-
);
|
|
6798
|
-
if (!nodeWithWebTransport || !nodeWithWebTransport.multiaddrs) {
|
|
6799
|
-
return {
|
|
6800
|
-
success: false,
|
|
6801
|
-
error: "No nodes with WebTransport support found"
|
|
6802
|
-
};
|
|
6803
|
-
}
|
|
6804
|
-
const wtMultiaddr = nodeWithWebTransport.multiaddrs.find(
|
|
6805
|
-
(addr) => addr.includes("/webtransport")
|
|
6806
|
-
);
|
|
6807
|
-
if (!wtMultiaddr) {
|
|
6808
|
-
return {
|
|
6809
|
-
success: false,
|
|
6810
|
-
error: "No WebTransport multiaddr found"
|
|
6811
|
-
};
|
|
6599
|
+
if (!this.storageWsClient) {
|
|
6600
|
+
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6812
6601
|
}
|
|
6813
|
-
const
|
|
6814
|
-
const wtAuth = authorization ? {
|
|
6602
|
+
const wsAuth = authorization ? {
|
|
6815
6603
|
signature: authorization.signature,
|
|
6816
6604
|
address: authorization.sender,
|
|
6817
6605
|
timestamp: authorization.timestamp,
|
|
@@ -6819,25 +6607,26 @@ Nonce: ${nonce}`;
|
|
|
6819
6607
|
appId: authorization.appId,
|
|
6820
6608
|
contentHash: authorization.contentHash
|
|
6821
6609
|
} : void 0;
|
|
6822
|
-
const result = await
|
|
6610
|
+
const result = await this.storageWsClient.store({
|
|
6823
6611
|
data: dataArray,
|
|
6824
6612
|
contentType: mimeType || "application/octet-stream",
|
|
6825
6613
|
hashIdToken,
|
|
6826
|
-
authorization:
|
|
6614
|
+
authorization: wsAuth,
|
|
6615
|
+
timeout: 3e4
|
|
6827
6616
|
});
|
|
6828
6617
|
if (result.success && result.cid) {
|
|
6829
|
-
console.log("[ByteCave] \u2713
|
|
6618
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6830
6619
|
return {
|
|
6831
6620
|
success: true,
|
|
6832
6621
|
cid: result.cid,
|
|
6833
|
-
peerId:
|
|
6622
|
+
peerId: "relay-ws"
|
|
6834
6623
|
};
|
|
6835
6624
|
}
|
|
6836
|
-
console.
|
|
6837
|
-
return { success: false, error: result.error || "
|
|
6625
|
+
console.warn("[ByteCave] WebSocket storage failed:", result.error);
|
|
6626
|
+
return { success: false, error: result.error || "WebSocket storage failed" };
|
|
6838
6627
|
} catch (err) {
|
|
6839
|
-
console.error("[ByteCave]
|
|
6840
|
-
return { success: false, error:
|
|
6628
|
+
console.error("[ByteCave] WebSocket storage exception:", err.message);
|
|
6629
|
+
return { success: false, error: err.message };
|
|
6841
6630
|
}
|
|
6842
6631
|
}
|
|
6843
6632
|
/**
|
|
@@ -6989,48 +6778,14 @@ Nonce: ${nonce}`;
|
|
|
6989
6778
|
try {
|
|
6990
6779
|
const peerInfo = this.knownPeers.get(peerId);
|
|
6991
6780
|
const relayAddrs = peerInfo?.relayAddrs;
|
|
6992
|
-
|
|
6993
|
-
|
|
6994
|
-
|
|
6995
|
-
|
|
6996
|
-
|
|
6997
|
-
|
|
6998
|
-
|
|
6999
|
-
|
|
7000
|
-
const ma = multiaddr(relayAddrs[0]);
|
|
7001
|
-
await this.node.dial(ma);
|
|
7002
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7003
|
-
} catch (dialError) {
|
|
7004
|
-
console.warn("[ByteCave] Relay dial failed:", dialError.message);
|
|
7005
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7006
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7007
|
-
if (wtAddr) {
|
|
7008
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7009
|
-
try {
|
|
7010
|
-
const ma = multiaddr(wtAddr);
|
|
7011
|
-
await this.node.dial(ma);
|
|
7012
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7013
|
-
} catch (wtError) {
|
|
7014
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7015
|
-
}
|
|
7016
|
-
}
|
|
7017
|
-
}
|
|
7018
|
-
}
|
|
7019
|
-
} else if (multiaddrs && multiaddrs.length > 0) {
|
|
7020
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7021
|
-
if (wtAddr) {
|
|
7022
|
-
console.log("[ByteCave] Trying WebTransport address (no relay):", wtAddr.slice(0, 60));
|
|
7023
|
-
try {
|
|
7024
|
-
const ma = multiaddr(wtAddr);
|
|
7025
|
-
await this.node.dial(ma);
|
|
7026
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7027
|
-
} catch (wtError) {
|
|
7028
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7029
|
-
}
|
|
7030
|
-
}
|
|
7031
|
-
}
|
|
7032
|
-
} else {
|
|
7033
|
-
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);
|
|
7034
6789
|
}
|
|
7035
6790
|
}
|
|
7036
6791
|
const health = await p2pProtocolClient.getHealthFromPeer(peerId);
|
|
@@ -7136,106 +6891,8 @@ Nonce: ${nonce}`;
|
|
|
7136
6891
|
onChainNodeId: announcement.onChainNodeId
|
|
7137
6892
|
};
|
|
7138
6893
|
this.knownPeers.set(announcement.peerId, peerInfo);
|
|
7139
|
-
this.saveCachedPeers();
|
|
7140
|
-
if (this.node && !peerInfo.connected) {
|
|
7141
|
-
this.dialPeer(announcement.peerId, peerInfo.relayAddrs, peerInfo.multiaddrs).catch((err) => {
|
|
7142
|
-
console.warn("[ByteCave] Failed to dial announced peer:", err.message);
|
|
7143
|
-
});
|
|
7144
|
-
}
|
|
7145
6894
|
this.emit("peerAnnounce", peerInfo);
|
|
7146
6895
|
}
|
|
7147
|
-
/**
|
|
7148
|
-
* Attempt to dial a peer using relay or WebTransport addresses
|
|
7149
|
-
*/
|
|
7150
|
-
async dialPeer(peerId, relayAddrs, multiaddrs) {
|
|
7151
|
-
if (!this.node) return;
|
|
7152
|
-
const connections = this.node.getConnections().filter((c) => c.remotePeer.toString() === peerId);
|
|
7153
|
-
if (connections.length > 0) {
|
|
7154
|
-
console.log("[ByteCave] Already connected to peer:", peerId.slice(0, 12));
|
|
7155
|
-
return;
|
|
7156
|
-
}
|
|
7157
|
-
console.log("[ByteCave] Attempting to dial peer:", peerId.slice(0, 12));
|
|
7158
|
-
if (relayAddrs && relayAddrs.length > 0) {
|
|
7159
|
-
console.log("[ByteCave] Trying relay address:", relayAddrs[0].slice(0, 60));
|
|
7160
|
-
try {
|
|
7161
|
-
const ma = multiaddr(relayAddrs[0]);
|
|
7162
|
-
await this.node.dial(ma);
|
|
7163
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7164
|
-
const peer = this.knownPeers.get(peerId);
|
|
7165
|
-
if (peer) {
|
|
7166
|
-
peer.connected = true;
|
|
7167
|
-
}
|
|
7168
|
-
return;
|
|
7169
|
-
} catch (error) {
|
|
7170
|
-
console.warn("[ByteCave] Relay dial failed:", error.message);
|
|
7171
|
-
}
|
|
7172
|
-
}
|
|
7173
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7174
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7175
|
-
if (wtAddr) {
|
|
7176
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7177
|
-
try {
|
|
7178
|
-
const ma = multiaddr(wtAddr);
|
|
7179
|
-
await this.node.dial(ma);
|
|
7180
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7181
|
-
const peer = this.knownPeers.get(peerId);
|
|
7182
|
-
if (peer) {
|
|
7183
|
-
peer.connected = true;
|
|
7184
|
-
}
|
|
7185
|
-
} catch (error) {
|
|
7186
|
-
console.warn("[ByteCave] WebTransport dial failed:", error.message);
|
|
7187
|
-
}
|
|
7188
|
-
}
|
|
7189
|
-
}
|
|
7190
|
-
}
|
|
7191
|
-
/**
|
|
7192
|
-
* Load cached peers from localStorage
|
|
7193
|
-
*/
|
|
7194
|
-
loadCachedPeers() {
|
|
7195
|
-
try {
|
|
7196
|
-
const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
|
|
7197
|
-
if (cached) {
|
|
7198
|
-
const peers = JSON.parse(cached);
|
|
7199
|
-
console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
|
|
7200
|
-
for (const peer of peers) {
|
|
7201
|
-
this.knownPeers.set(peer.peerId, { ...peer, connected: false });
|
|
7202
|
-
}
|
|
7203
|
-
}
|
|
7204
|
-
} catch (error) {
|
|
7205
|
-
console.warn("[ByteCave] Failed to load cached peers:", error);
|
|
7206
|
-
}
|
|
7207
|
-
}
|
|
7208
|
-
/**
|
|
7209
|
-
* Dial all cached peers (used on startup when relay might be down)
|
|
7210
|
-
*/
|
|
7211
|
-
async dialCachedPeers() {
|
|
7212
|
-
console.log("[ByteCave] Dialing", this.knownPeers.size, "cached peers...");
|
|
7213
|
-
for (const [peerId, peerInfo] of this.knownPeers) {
|
|
7214
|
-
if (peerInfo.connected) {
|
|
7215
|
-
continue;
|
|
7216
|
-
}
|
|
7217
|
-
const relayAddrs = peerInfo.relayAddrs;
|
|
7218
|
-
const multiaddrs = peerInfo.multiaddrs;
|
|
7219
|
-
if (relayAddrs || multiaddrs) {
|
|
7220
|
-
this.dialPeer(peerId, relayAddrs, multiaddrs).catch((err) => {
|
|
7221
|
-
console.warn("[ByteCave] Failed to dial cached peer:", peerId.slice(0, 12), err.message);
|
|
7222
|
-
});
|
|
7223
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
7224
|
-
}
|
|
7225
|
-
}
|
|
7226
|
-
}
|
|
7227
|
-
/**
|
|
7228
|
-
* Save known peers to localStorage
|
|
7229
|
-
*/
|
|
7230
|
-
saveCachedPeers() {
|
|
7231
|
-
try {
|
|
7232
|
-
const peers = Array.from(this.knownPeers.values());
|
|
7233
|
-
localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
|
|
7234
|
-
console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
|
|
7235
|
-
} catch (error) {
|
|
7236
|
-
console.warn("[ByteCave] Failed to save cached peers:", error);
|
|
7237
|
-
}
|
|
7238
|
-
}
|
|
7239
6896
|
/**
|
|
7240
6897
|
* Check if a nodeId is registered in the on-chain registry
|
|
7241
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
|
*/
|