@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
package/dist/index.cjs
CHANGED
|
@@ -61,7 +61,6 @@ module.exports = __toCommonJS(src_exports);
|
|
|
61
61
|
var import_libp2p = require("libp2p");
|
|
62
62
|
var import_webrtc = require("@libp2p/webrtc");
|
|
63
63
|
var import_websockets = require("@libp2p/websockets");
|
|
64
|
-
var import_webtransport = require("@libp2p/webtransport");
|
|
65
64
|
var import_libp2p_noise = require("@chainsafe/libp2p-noise");
|
|
66
65
|
var import_libp2p_yamux = require("@chainsafe/libp2p-yamux");
|
|
67
66
|
var import_floodsub = require("@libp2p/floodsub");
|
|
@@ -6280,135 +6279,6 @@ var StorageWebSocketClient = class {
|
|
|
6280
6279
|
}
|
|
6281
6280
|
};
|
|
6282
6281
|
|
|
6283
|
-
// src/storage-webtransport.ts
|
|
6284
|
-
var StorageWebTransportClient = class {
|
|
6285
|
-
constructor(nodeMultiaddr) {
|
|
6286
|
-
this.nodeMultiaddr = nodeMultiaddr;
|
|
6287
|
-
}
|
|
6288
|
-
/**
|
|
6289
|
-
* Store data via WebTransport direct to node
|
|
6290
|
-
*/
|
|
6291
|
-
async store(request) {
|
|
6292
|
-
try {
|
|
6293
|
-
if (typeof WebTransport === "undefined") {
|
|
6294
|
-
return {
|
|
6295
|
-
success: false,
|
|
6296
|
-
error: "WebTransport not supported in this browser"
|
|
6297
|
-
};
|
|
6298
|
-
}
|
|
6299
|
-
const url = this.multiaddrToWebTransportUrl(this.nodeMultiaddr);
|
|
6300
|
-
if (!url) {
|
|
6301
|
-
return {
|
|
6302
|
-
success: false,
|
|
6303
|
-
error: "Invalid WebTransport multiaddr"
|
|
6304
|
-
};
|
|
6305
|
-
}
|
|
6306
|
-
console.log("[WebTransport] Connecting to node:", url);
|
|
6307
|
-
const transport = new WebTransport(url);
|
|
6308
|
-
await transport.ready;
|
|
6309
|
-
console.log("[WebTransport] Connected, opening bidirectional stream");
|
|
6310
|
-
const stream = await transport.createBidirectionalStream();
|
|
6311
|
-
const writer = stream.writable.getWriter();
|
|
6312
|
-
const reader = stream.readable.getReader();
|
|
6313
|
-
const requestData = {
|
|
6314
|
-
type: "storage-request",
|
|
6315
|
-
data: Array.from(request.data),
|
|
6316
|
-
// Convert Uint8Array to array for JSON
|
|
6317
|
-
contentType: request.contentType,
|
|
6318
|
-
hashIdToken: request.hashIdToken,
|
|
6319
|
-
authorization: request.authorization
|
|
6320
|
-
};
|
|
6321
|
-
const requestJson = JSON.stringify(requestData);
|
|
6322
|
-
const requestBytes = new TextEncoder().encode(requestJson);
|
|
6323
|
-
await writer.write(requestBytes);
|
|
6324
|
-
await writer.close();
|
|
6325
|
-
console.log("[WebTransport] Request sent, waiting for response");
|
|
6326
|
-
const { value, done } = await reader.read();
|
|
6327
|
-
if (done || !value) {
|
|
6328
|
-
return {
|
|
6329
|
-
success: false,
|
|
6330
|
-
error: "No response from node"
|
|
6331
|
-
};
|
|
6332
|
-
}
|
|
6333
|
-
const responseJson = new TextDecoder().decode(value);
|
|
6334
|
-
const response = JSON.parse(responseJson);
|
|
6335
|
-
console.log("[WebTransport] Response received:", response);
|
|
6336
|
-
await transport.close();
|
|
6337
|
-
return response;
|
|
6338
|
-
} catch (error) {
|
|
6339
|
-
console.error("[WebTransport] Storage failed:", error);
|
|
6340
|
-
return {
|
|
6341
|
-
success: false,
|
|
6342
|
-
error: error.message || "WebTransport storage failed"
|
|
6343
|
-
};
|
|
6344
|
-
}
|
|
6345
|
-
}
|
|
6346
|
-
/**
|
|
6347
|
-
* Convert libp2p multiaddr to WebTransport URL
|
|
6348
|
-
*/
|
|
6349
|
-
multiaddrToWebTransportUrl(multiaddr2) {
|
|
6350
|
-
try {
|
|
6351
|
-
const parts = multiaddr2.split("/").filter((p) => p);
|
|
6352
|
-
let ip = "";
|
|
6353
|
-
let port = "";
|
|
6354
|
-
let hasQuic = false;
|
|
6355
|
-
let hasWebTransport = false;
|
|
6356
|
-
for (let i = 0; i < parts.length; i++) {
|
|
6357
|
-
if (parts[i] === "ip4" && i + 1 < parts.length) {
|
|
6358
|
-
ip = parts[i + 1];
|
|
6359
|
-
} else if (parts[i] === "udp" && i + 1 < parts.length) {
|
|
6360
|
-
port = parts[i + 1];
|
|
6361
|
-
} else if (parts[i] === "quic-v1") {
|
|
6362
|
-
hasQuic = true;
|
|
6363
|
-
} else if (parts[i] === "webtransport") {
|
|
6364
|
-
hasWebTransport = true;
|
|
6365
|
-
}
|
|
6366
|
-
}
|
|
6367
|
-
if (!ip || !port || !hasQuic || !hasWebTransport) {
|
|
6368
|
-
return null;
|
|
6369
|
-
}
|
|
6370
|
-
return `https://${ip}:${port}/storage`;
|
|
6371
|
-
} catch (error) {
|
|
6372
|
-
console.error("[WebTransport] Failed to parse multiaddr:", error);
|
|
6373
|
-
return null;
|
|
6374
|
-
}
|
|
6375
|
-
}
|
|
6376
|
-
/**
|
|
6377
|
-
* Extract certificate hash from multiaddr
|
|
6378
|
-
* Format: /ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEi...
|
|
6379
|
-
*/
|
|
6380
|
-
extractCertHash(multiaddr2) {
|
|
6381
|
-
try {
|
|
6382
|
-
const parts = multiaddr2.split("/").filter((p) => p);
|
|
6383
|
-
const certhashIndex = parts.indexOf("certhash");
|
|
6384
|
-
if (certhashIndex !== -1 && certhashIndex + 1 < parts.length) {
|
|
6385
|
-
return parts[certhashIndex + 1];
|
|
6386
|
-
}
|
|
6387
|
-
return null;
|
|
6388
|
-
} catch (error) {
|
|
6389
|
-
console.error("[WebTransport] Failed to extract cert hash:", error);
|
|
6390
|
-
return null;
|
|
6391
|
-
}
|
|
6392
|
-
}
|
|
6393
|
-
/**
|
|
6394
|
-
* Convert libp2p multihash cert hash to SHA-256 ArrayBuffer for WebTransport
|
|
6395
|
-
* The certhash in multiaddr format is: uEi<hex-hash>
|
|
6396
|
-
* where 'u' = base32 multibase, 'Ei' = multihash prefix for SHA-256
|
|
6397
|
-
*/
|
|
6398
|
-
async certHashToSHA256(multihash) {
|
|
6399
|
-
try {
|
|
6400
|
-
let hexHash = multihash.startsWith("uEi") ? multihash.slice(3) : multihash;
|
|
6401
|
-
const bytes = new Uint8Array(hexHash.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
6402
|
-
console.log("[WebTransport] Decoded certificate hash:", hexHash);
|
|
6403
|
-
console.log("[WebTransport] Hash bytes length:", bytes.length);
|
|
6404
|
-
return bytes.buffer;
|
|
6405
|
-
} catch (error) {
|
|
6406
|
-
console.error("[WebTransport] Failed to convert cert hash:", error);
|
|
6407
|
-
throw new Error("Failed to decode certificate hash");
|
|
6408
|
-
}
|
|
6409
|
-
}
|
|
6410
|
-
};
|
|
6411
|
-
|
|
6412
6282
|
// src/contracts/ContentRegistry.ts
|
|
6413
6283
|
var CONTENT_REGISTRY_ABI = [
|
|
6414
6284
|
"function registerContent(bytes32 cid, address owner, bytes32 appId, uint256 hashIdToken) external",
|
|
@@ -6425,7 +6295,6 @@ var ByteCaveClient = class {
|
|
|
6425
6295
|
this.knownPeers = /* @__PURE__ */ new Map();
|
|
6426
6296
|
this.connectionState = "disconnected";
|
|
6427
6297
|
this.eventListeners = /* @__PURE__ */ new Map();
|
|
6428
|
-
this.PEERS_CACHE_KEY = "bytecave_known_peers";
|
|
6429
6298
|
this.config = {
|
|
6430
6299
|
maxPeers: 10,
|
|
6431
6300
|
connectionTimeout: 3e4,
|
|
@@ -6438,7 +6307,6 @@ var ByteCaveClient = class {
|
|
|
6438
6307
|
if (config.vaultNodeRegistryAddress && config.rpcUrl) {
|
|
6439
6308
|
this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
|
|
6440
6309
|
}
|
|
6441
|
-
this.loadCachedPeers();
|
|
6442
6310
|
}
|
|
6443
6311
|
/**
|
|
6444
6312
|
* Initialize and start the P2P client
|
|
@@ -6468,7 +6336,6 @@ var ByteCaveClient = class {
|
|
|
6468
6336
|
transports: [
|
|
6469
6337
|
(0, import_webrtc.webRTC)(),
|
|
6470
6338
|
(0, import_websockets.webSockets)(),
|
|
6471
|
-
(0, import_webtransport.webTransport)(),
|
|
6472
6339
|
(0, import_circuit_relay_v2.circuitRelayTransport)()
|
|
6473
6340
|
],
|
|
6474
6341
|
connectionEncrypters: [(0, import_libp2p_noise.noise)()],
|
|
@@ -6609,19 +6476,14 @@ var ByteCaveClient = class {
|
|
|
6609
6476
|
}
|
|
6610
6477
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6611
6478
|
if (health) {
|
|
6612
|
-
|
|
6479
|
+
this.knownPeers.set(peer.peerId, {
|
|
6613
6480
|
peerId: peer.peerId,
|
|
6614
6481
|
publicKey: health.publicKey || "",
|
|
6615
6482
|
contentTypes: health.contentTypes || "all",
|
|
6616
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6617
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6618
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6619
6483
|
connected: true,
|
|
6620
|
-
|
|
6621
|
-
|
|
6622
|
-
|
|
6623
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6624
|
-
this.saveCachedPeers();
|
|
6484
|
+
nodeId: health.nodeId
|
|
6485
|
+
});
|
|
6486
|
+
console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6625
6487
|
}
|
|
6626
6488
|
} catch (err) {
|
|
6627
6489
|
console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6657,9 +6519,6 @@ var ByteCaveClient = class {
|
|
|
6657
6519
|
connectedPeers: connectedPeers.length,
|
|
6658
6520
|
discoveredPeers: this.knownPeers.size
|
|
6659
6521
|
});
|
|
6660
|
-
setTimeout(() => {
|
|
6661
|
-
this.dialCachedPeers();
|
|
6662
|
-
}, 2e3);
|
|
6663
6522
|
} catch (error) {
|
|
6664
6523
|
this.setConnectionState("error");
|
|
6665
6524
|
console.error("Failed to start ByteCave client:", error);
|
|
@@ -6713,19 +6572,14 @@ var ByteCaveClient = class {
|
|
|
6713
6572
|
try {
|
|
6714
6573
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6715
6574
|
if (health) {
|
|
6716
|
-
|
|
6575
|
+
this.knownPeers.set(peer.peerId, {
|
|
6717
6576
|
peerId: peer.peerId,
|
|
6718
6577
|
publicKey: health.publicKey || "",
|
|
6719
6578
|
contentTypes: health.contentTypes || "all",
|
|
6720
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6721
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6722
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6723
6579
|
connected: true,
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6728
|
-
this.saveCachedPeers();
|
|
6580
|
+
nodeId: health.nodeId
|
|
6581
|
+
});
|
|
6582
|
+
console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6729
6583
|
}
|
|
6730
6584
|
} catch (err) {
|
|
6731
6585
|
console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6790,81 +6644,15 @@ Nonce: ${nonce}`;
|
|
|
6790
6644
|
console.warn("[ByteCave] Failed to create authorization:", err.message);
|
|
6791
6645
|
}
|
|
6792
6646
|
}
|
|
6793
|
-
if (this.config.relayWsUrl) {
|
|
6794
|
-
|
|
6795
|
-
try {
|
|
6796
|
-
if (!this.storageWsClient) {
|
|
6797
|
-
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6798
|
-
}
|
|
6799
|
-
const wsAuth = authorization ? {
|
|
6800
|
-
signature: authorization.signature,
|
|
6801
|
-
address: authorization.sender,
|
|
6802
|
-
timestamp: authorization.timestamp,
|
|
6803
|
-
nonce: authorization.nonce,
|
|
6804
|
-
appId: authorization.appId,
|
|
6805
|
-
contentHash: authorization.contentHash
|
|
6806
|
-
} : void 0;
|
|
6807
|
-
const result = await this.storageWsClient.store({
|
|
6808
|
-
data: dataArray,
|
|
6809
|
-
contentType: mimeType || "application/octet-stream",
|
|
6810
|
-
hashIdToken,
|
|
6811
|
-
authorization: wsAuth,
|
|
6812
|
-
timeout: 3e4
|
|
6813
|
-
});
|
|
6814
|
-
if (result.success && result.cid) {
|
|
6815
|
-
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6816
|
-
return {
|
|
6817
|
-
success: true,
|
|
6818
|
-
cid: result.cid,
|
|
6819
|
-
peerId: "relay-ws"
|
|
6820
|
-
};
|
|
6821
|
-
}
|
|
6822
|
-
console.warn("[ByteCave] WebSocket storage failed, trying WebTransport:", result.error);
|
|
6823
|
-
} catch (err) {
|
|
6824
|
-
console.warn("[ByteCave] WebSocket storage exception, trying WebTransport:", err.message);
|
|
6825
|
-
}
|
|
6826
|
-
} else {
|
|
6827
|
-
console.log("[ByteCave] WebSocket relay not configured, trying WebTransport");
|
|
6647
|
+
if (!this.config.relayWsUrl) {
|
|
6648
|
+
return { success: false, error: "WebSocket relay URL not configured" };
|
|
6828
6649
|
}
|
|
6829
|
-
console.log("[ByteCave]
|
|
6650
|
+
console.log("[ByteCave] Storing via WebSocket relay");
|
|
6830
6651
|
try {
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
console.log("[ByteCave] No cached peers, trying discovery services");
|
|
6834
|
-
if (this.relayDiscovery) {
|
|
6835
|
-
nodes = await this.relayDiscovery.getConnectedPeers();
|
|
6836
|
-
} else if (this.contractDiscovery) {
|
|
6837
|
-
nodes = await this.contractDiscovery.getActiveNodes();
|
|
6838
|
-
}
|
|
6839
|
-
} else {
|
|
6840
|
-
console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
|
|
6841
|
-
}
|
|
6842
|
-
if (nodes.length === 0) {
|
|
6843
|
-
return {
|
|
6844
|
-
success: false,
|
|
6845
|
-
error: "No nodes available for WebTransport storage"
|
|
6846
|
-
};
|
|
6847
|
-
}
|
|
6848
|
-
const nodeWithWebTransport = nodes.find(
|
|
6849
|
-
(node) => node.multiaddrs?.some((addr) => addr.includes("/webtransport"))
|
|
6850
|
-
);
|
|
6851
|
-
if (!nodeWithWebTransport || !nodeWithWebTransport.multiaddrs) {
|
|
6852
|
-
return {
|
|
6853
|
-
success: false,
|
|
6854
|
-
error: "No nodes with WebTransport support found"
|
|
6855
|
-
};
|
|
6856
|
-
}
|
|
6857
|
-
const wtMultiaddr = nodeWithWebTransport.multiaddrs.find(
|
|
6858
|
-
(addr) => addr.includes("/webtransport")
|
|
6859
|
-
);
|
|
6860
|
-
if (!wtMultiaddr) {
|
|
6861
|
-
return {
|
|
6862
|
-
success: false,
|
|
6863
|
-
error: "No WebTransport multiaddr found"
|
|
6864
|
-
};
|
|
6652
|
+
if (!this.storageWsClient) {
|
|
6653
|
+
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6865
6654
|
}
|
|
6866
|
-
const
|
|
6867
|
-
const wtAuth = authorization ? {
|
|
6655
|
+
const wsAuth = authorization ? {
|
|
6868
6656
|
signature: authorization.signature,
|
|
6869
6657
|
address: authorization.sender,
|
|
6870
6658
|
timestamp: authorization.timestamp,
|
|
@@ -6872,25 +6660,26 @@ Nonce: ${nonce}`;
|
|
|
6872
6660
|
appId: authorization.appId,
|
|
6873
6661
|
contentHash: authorization.contentHash
|
|
6874
6662
|
} : void 0;
|
|
6875
|
-
const result = await
|
|
6663
|
+
const result = await this.storageWsClient.store({
|
|
6876
6664
|
data: dataArray,
|
|
6877
6665
|
contentType: mimeType || "application/octet-stream",
|
|
6878
6666
|
hashIdToken,
|
|
6879
|
-
authorization:
|
|
6667
|
+
authorization: wsAuth,
|
|
6668
|
+
timeout: 3e4
|
|
6880
6669
|
});
|
|
6881
6670
|
if (result.success && result.cid) {
|
|
6882
|
-
console.log("[ByteCave] \u2713
|
|
6671
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6883
6672
|
return {
|
|
6884
6673
|
success: true,
|
|
6885
6674
|
cid: result.cid,
|
|
6886
|
-
peerId:
|
|
6675
|
+
peerId: "relay-ws"
|
|
6887
6676
|
};
|
|
6888
6677
|
}
|
|
6889
|
-
console.
|
|
6890
|
-
return { success: false, error: result.error || "
|
|
6678
|
+
console.warn("[ByteCave] WebSocket storage failed:", result.error);
|
|
6679
|
+
return { success: false, error: result.error || "WebSocket storage failed" };
|
|
6891
6680
|
} catch (err) {
|
|
6892
|
-
console.error("[ByteCave]
|
|
6893
|
-
return { success: false, error:
|
|
6681
|
+
console.error("[ByteCave] WebSocket storage exception:", err.message);
|
|
6682
|
+
return { success: false, error: err.message };
|
|
6894
6683
|
}
|
|
6895
6684
|
}
|
|
6896
6685
|
/**
|
|
@@ -7042,48 +6831,14 @@ Nonce: ${nonce}`;
|
|
|
7042
6831
|
try {
|
|
7043
6832
|
const peerInfo = this.knownPeers.get(peerId);
|
|
7044
6833
|
const relayAddrs = peerInfo?.relayAddrs;
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
const ma = (0, import_multiaddr.multiaddr)(relayAddrs[0]);
|
|
7054
|
-
await this.node.dial(ma);
|
|
7055
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7056
|
-
} catch (dialError) {
|
|
7057
|
-
console.warn("[ByteCave] Relay dial failed:", dialError.message);
|
|
7058
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7059
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7060
|
-
if (wtAddr) {
|
|
7061
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7062
|
-
try {
|
|
7063
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7064
|
-
await this.node.dial(ma);
|
|
7065
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7066
|
-
} catch (wtError) {
|
|
7067
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7068
|
-
}
|
|
7069
|
-
}
|
|
7070
|
-
}
|
|
7071
|
-
}
|
|
7072
|
-
} else if (multiaddrs && multiaddrs.length > 0) {
|
|
7073
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7074
|
-
if (wtAddr) {
|
|
7075
|
-
console.log("[ByteCave] Trying WebTransport address (no relay):", wtAddr.slice(0, 60));
|
|
7076
|
-
try {
|
|
7077
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7078
|
-
await this.node.dial(ma);
|
|
7079
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7080
|
-
} catch (wtError) {
|
|
7081
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7082
|
-
}
|
|
7083
|
-
}
|
|
7084
|
-
}
|
|
7085
|
-
} else {
|
|
7086
|
-
console.log("[ByteCave] Already connected to peer via", connections[0].remoteAddr.toString().slice(0, 60));
|
|
6834
|
+
if (relayAddrs && relayAddrs.length > 0 && this.node) {
|
|
6835
|
+
console.log("[ByteCave] Dialing peer through relay:", peerId.slice(0, 12), relayAddrs[0]);
|
|
6836
|
+
try {
|
|
6837
|
+
const ma = (0, import_multiaddr.multiaddr)(relayAddrs[0]);
|
|
6838
|
+
await this.node.dial(ma);
|
|
6839
|
+
console.log("[ByteCave] Successfully dialed peer through relay");
|
|
6840
|
+
} catch (dialError) {
|
|
6841
|
+
console.warn("[ByteCave] Failed to dial through relay:", dialError);
|
|
7087
6842
|
}
|
|
7088
6843
|
}
|
|
7089
6844
|
const health = await p2pProtocolClient.getHealthFromPeer(peerId);
|
|
@@ -7189,106 +6944,8 @@ Nonce: ${nonce}`;
|
|
|
7189
6944
|
onChainNodeId: announcement.onChainNodeId
|
|
7190
6945
|
};
|
|
7191
6946
|
this.knownPeers.set(announcement.peerId, peerInfo);
|
|
7192
|
-
this.saveCachedPeers();
|
|
7193
|
-
if (this.node && !peerInfo.connected) {
|
|
7194
|
-
this.dialPeer(announcement.peerId, peerInfo.relayAddrs, peerInfo.multiaddrs).catch((err) => {
|
|
7195
|
-
console.warn("[ByteCave] Failed to dial announced peer:", err.message);
|
|
7196
|
-
});
|
|
7197
|
-
}
|
|
7198
6947
|
this.emit("peerAnnounce", peerInfo);
|
|
7199
6948
|
}
|
|
7200
|
-
/**
|
|
7201
|
-
* Attempt to dial a peer using relay or WebTransport addresses
|
|
7202
|
-
*/
|
|
7203
|
-
async dialPeer(peerId, relayAddrs, multiaddrs) {
|
|
7204
|
-
if (!this.node) return;
|
|
7205
|
-
const connections = this.node.getConnections().filter((c) => c.remotePeer.toString() === peerId);
|
|
7206
|
-
if (connections.length > 0) {
|
|
7207
|
-
console.log("[ByteCave] Already connected to peer:", peerId.slice(0, 12));
|
|
7208
|
-
return;
|
|
7209
|
-
}
|
|
7210
|
-
console.log("[ByteCave] Attempting to dial peer:", peerId.slice(0, 12));
|
|
7211
|
-
if (relayAddrs && relayAddrs.length > 0) {
|
|
7212
|
-
console.log("[ByteCave] Trying relay address:", relayAddrs[0].slice(0, 60));
|
|
7213
|
-
try {
|
|
7214
|
-
const ma = (0, import_multiaddr.multiaddr)(relayAddrs[0]);
|
|
7215
|
-
await this.node.dial(ma);
|
|
7216
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7217
|
-
const peer = this.knownPeers.get(peerId);
|
|
7218
|
-
if (peer) {
|
|
7219
|
-
peer.connected = true;
|
|
7220
|
-
}
|
|
7221
|
-
return;
|
|
7222
|
-
} catch (error) {
|
|
7223
|
-
console.warn("[ByteCave] Relay dial failed:", error.message);
|
|
7224
|
-
}
|
|
7225
|
-
}
|
|
7226
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7227
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7228
|
-
if (wtAddr) {
|
|
7229
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7230
|
-
try {
|
|
7231
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7232
|
-
await this.node.dial(ma);
|
|
7233
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7234
|
-
const peer = this.knownPeers.get(peerId);
|
|
7235
|
-
if (peer) {
|
|
7236
|
-
peer.connected = true;
|
|
7237
|
-
}
|
|
7238
|
-
} catch (error) {
|
|
7239
|
-
console.warn("[ByteCave] WebTransport dial failed:", error.message);
|
|
7240
|
-
}
|
|
7241
|
-
}
|
|
7242
|
-
}
|
|
7243
|
-
}
|
|
7244
|
-
/**
|
|
7245
|
-
* Load cached peers from localStorage
|
|
7246
|
-
*/
|
|
7247
|
-
loadCachedPeers() {
|
|
7248
|
-
try {
|
|
7249
|
-
const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
|
|
7250
|
-
if (cached) {
|
|
7251
|
-
const peers = JSON.parse(cached);
|
|
7252
|
-
console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
|
|
7253
|
-
for (const peer of peers) {
|
|
7254
|
-
this.knownPeers.set(peer.peerId, { ...peer, connected: false });
|
|
7255
|
-
}
|
|
7256
|
-
}
|
|
7257
|
-
} catch (error) {
|
|
7258
|
-
console.warn("[ByteCave] Failed to load cached peers:", error);
|
|
7259
|
-
}
|
|
7260
|
-
}
|
|
7261
|
-
/**
|
|
7262
|
-
* Dial all cached peers (used on startup when relay might be down)
|
|
7263
|
-
*/
|
|
7264
|
-
async dialCachedPeers() {
|
|
7265
|
-
console.log("[ByteCave] Dialing", this.knownPeers.size, "cached peers...");
|
|
7266
|
-
for (const [peerId, peerInfo] of this.knownPeers) {
|
|
7267
|
-
if (peerInfo.connected) {
|
|
7268
|
-
continue;
|
|
7269
|
-
}
|
|
7270
|
-
const relayAddrs = peerInfo.relayAddrs;
|
|
7271
|
-
const multiaddrs = peerInfo.multiaddrs;
|
|
7272
|
-
if (relayAddrs || multiaddrs) {
|
|
7273
|
-
this.dialPeer(peerId, relayAddrs, multiaddrs).catch((err) => {
|
|
7274
|
-
console.warn("[ByteCave] Failed to dial cached peer:", peerId.slice(0, 12), err.message);
|
|
7275
|
-
});
|
|
7276
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
7277
|
-
}
|
|
7278
|
-
}
|
|
7279
|
-
}
|
|
7280
|
-
/**
|
|
7281
|
-
* Save known peers to localStorage
|
|
7282
|
-
*/
|
|
7283
|
-
saveCachedPeers() {
|
|
7284
|
-
try {
|
|
7285
|
-
const peers = Array.from(this.knownPeers.values());
|
|
7286
|
-
localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
|
|
7287
|
-
console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
|
|
7288
|
-
} catch (error) {
|
|
7289
|
-
console.warn("[ByteCave] Failed to save cached peers:", error);
|
|
7290
|
-
}
|
|
7291
|
-
}
|
|
7292
6949
|
/**
|
|
7293
6950
|
* Check if a nodeId is registered in the on-chain registry
|
|
7294
6951
|
*/
|
package/dist/index.js
CHANGED
package/dist/react/index.cjs
CHANGED
|
@@ -396,7 +396,6 @@ var import_react3 = __toESM(require("react"), 1);
|
|
|
396
396
|
var import_libp2p = require("libp2p");
|
|
397
397
|
var import_webrtc = require("@libp2p/webrtc");
|
|
398
398
|
var import_websockets = require("@libp2p/websockets");
|
|
399
|
-
var import_webtransport = require("@libp2p/webtransport");
|
|
400
399
|
var import_libp2p_noise = require("@chainsafe/libp2p-noise");
|
|
401
400
|
var import_libp2p_yamux = require("@chainsafe/libp2p-yamux");
|
|
402
401
|
var import_floodsub = require("@libp2p/floodsub");
|
package/dist/react/index.js
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -23,10 +23,6 @@ export interface PeerInfo {
|
|
|
23
23
|
nodeUrl?: string;
|
|
24
24
|
isRegistered?: boolean;
|
|
25
25
|
owner?: string;
|
|
26
|
-
multiaddrs?: string[];
|
|
27
|
-
httpEndpoint?: string;
|
|
28
|
-
relayAddrs?: string[];
|
|
29
|
-
onChainNodeId?: string;
|
|
30
26
|
}
|
|
31
27
|
export interface StoreResult {
|
|
32
28
|
success: boolean;
|