@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.
- package/dist/{chunk-NLZDUMYM.js → chunk-FOQ3CE3H.js} +31 -375
- package/dist/client.d.ts +0 -17
- package/dist/index.cjs +31 -375
- 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 -201
|
@@ -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
|
-
|
|
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
|
-
|
|
6569
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6673
|
-
|
|
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
|
-
|
|
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]
|
|
6597
|
+
console.log("[ByteCave] Storing via WebSocket relay");
|
|
6778
6598
|
try {
|
|
6779
|
-
|
|
6780
|
-
|
|
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
|
|
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
|
|
6610
|
+
const result = await this.storageWsClient.store({
|
|
6824
6611
|
data: dataArray,
|
|
6825
6612
|
contentType: mimeType || "application/octet-stream",
|
|
6826
6613
|
hashIdToken,
|
|
6827
|
-
authorization:
|
|
6614
|
+
authorization: wsAuth,
|
|
6615
|
+
timeout: 3e4
|
|
6828
6616
|
});
|
|
6829
6617
|
if (result.success && result.cid) {
|
|
6830
|
-
console.log("[ByteCave] \u2713
|
|
6618
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6831
6619
|
return {
|
|
6832
6620
|
success: true,
|
|
6833
6621
|
cid: result.cid,
|
|
6834
|
-
peerId:
|
|
6622
|
+
peerId: "relay-ws"
|
|
6835
6623
|
};
|
|
6836
6624
|
}
|
|
6837
|
-
console.
|
|
6838
|
-
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" };
|
|
6839
6627
|
} catch (err) {
|
|
6840
|
-
console.error("[ByteCave]
|
|
6841
|
-
return { success: false, error:
|
|
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
|
-
|
|
6994
|
-
|
|
6995
|
-
|
|
6996
|
-
|
|
6997
|
-
|
|
6998
|
-
|
|
6999
|
-
|
|
7000
|
-
|
|
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
|
*/
|