@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
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,136 +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
|
-
const host = ip === "127.0.0.1" ? "localhost" : ip;
|
|
6371
|
-
return `https://${host}:${port}/storage`;
|
|
6372
|
-
} catch (error) {
|
|
6373
|
-
console.error("[WebTransport] Failed to parse multiaddr:", error);
|
|
6374
|
-
return null;
|
|
6375
|
-
}
|
|
6376
|
-
}
|
|
6377
|
-
/**
|
|
6378
|
-
* Extract certificate hash from multiaddr
|
|
6379
|
-
* Format: /ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEi...
|
|
6380
|
-
*/
|
|
6381
|
-
extractCertHash(multiaddr2) {
|
|
6382
|
-
try {
|
|
6383
|
-
const parts = multiaddr2.split("/").filter((p) => p);
|
|
6384
|
-
const certhashIndex = parts.indexOf("certhash");
|
|
6385
|
-
if (certhashIndex !== -1 && certhashIndex + 1 < parts.length) {
|
|
6386
|
-
return parts[certhashIndex + 1];
|
|
6387
|
-
}
|
|
6388
|
-
return null;
|
|
6389
|
-
} catch (error) {
|
|
6390
|
-
console.error("[WebTransport] Failed to extract cert hash:", error);
|
|
6391
|
-
return null;
|
|
6392
|
-
}
|
|
6393
|
-
}
|
|
6394
|
-
/**
|
|
6395
|
-
* Convert libp2p multihash cert hash to SHA-256 ArrayBuffer for WebTransport
|
|
6396
|
-
* The certhash in multiaddr format is: uEi<hex-hash>
|
|
6397
|
-
* where 'u' = base32 multibase, 'Ei' = multihash prefix for SHA-256
|
|
6398
|
-
*/
|
|
6399
|
-
async certHashToSHA256(multihash) {
|
|
6400
|
-
try {
|
|
6401
|
-
let hexHash = multihash.startsWith("uEi") ? multihash.slice(3) : multihash;
|
|
6402
|
-
const bytes = new Uint8Array(hexHash.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
6403
|
-
console.log("[WebTransport] Decoded certificate hash:", hexHash);
|
|
6404
|
-
console.log("[WebTransport] Hash bytes length:", bytes.length);
|
|
6405
|
-
return bytes.buffer;
|
|
6406
|
-
} catch (error) {
|
|
6407
|
-
console.error("[WebTransport] Failed to convert cert hash:", error);
|
|
6408
|
-
throw new Error("Failed to decode certificate hash");
|
|
6409
|
-
}
|
|
6410
|
-
}
|
|
6411
|
-
};
|
|
6412
|
-
|
|
6413
6282
|
// src/contracts/ContentRegistry.ts
|
|
6414
6283
|
var CONTENT_REGISTRY_ABI = [
|
|
6415
6284
|
"function registerContent(bytes32 cid, address owner, bytes32 appId, uint256 hashIdToken) external",
|
|
@@ -6426,7 +6295,6 @@ var ByteCaveClient = class {
|
|
|
6426
6295
|
this.knownPeers = /* @__PURE__ */ new Map();
|
|
6427
6296
|
this.connectionState = "disconnected";
|
|
6428
6297
|
this.eventListeners = /* @__PURE__ */ new Map();
|
|
6429
|
-
this.PEERS_CACHE_KEY = "bytecave_known_peers";
|
|
6430
6298
|
this.config = {
|
|
6431
6299
|
maxPeers: 10,
|
|
6432
6300
|
connectionTimeout: 3e4,
|
|
@@ -6439,7 +6307,6 @@ var ByteCaveClient = class {
|
|
|
6439
6307
|
if (config.vaultNodeRegistryAddress && config.rpcUrl) {
|
|
6440
6308
|
this.contractDiscovery = new ContractDiscovery(config.vaultNodeRegistryAddress, config.rpcUrl);
|
|
6441
6309
|
}
|
|
6442
|
-
this.loadCachedPeers();
|
|
6443
6310
|
}
|
|
6444
6311
|
/**
|
|
6445
6312
|
* Initialize and start the P2P client
|
|
@@ -6469,7 +6336,6 @@ var ByteCaveClient = class {
|
|
|
6469
6336
|
transports: [
|
|
6470
6337
|
(0, import_webrtc.webRTC)(),
|
|
6471
6338
|
(0, import_websockets.webSockets)(),
|
|
6472
|
-
(0, import_webtransport.webTransport)(),
|
|
6473
6339
|
(0, import_circuit_relay_v2.circuitRelayTransport)()
|
|
6474
6340
|
],
|
|
6475
6341
|
connectionEncrypters: [(0, import_libp2p_noise.noise)()],
|
|
@@ -6610,19 +6476,14 @@ var ByteCaveClient = class {
|
|
|
6610
6476
|
}
|
|
6611
6477
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6612
6478
|
if (health) {
|
|
6613
|
-
|
|
6479
|
+
this.knownPeers.set(peer.peerId, {
|
|
6614
6480
|
peerId: peer.peerId,
|
|
6615
6481
|
publicKey: health.publicKey || "",
|
|
6616
6482
|
contentTypes: health.contentTypes || "all",
|
|
6617
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6618
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6619
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6620
6483
|
connected: true,
|
|
6621
|
-
|
|
6622
|
-
|
|
6623
|
-
|
|
6624
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6625
|
-
this.saveCachedPeers();
|
|
6484
|
+
nodeId: health.nodeId
|
|
6485
|
+
});
|
|
6486
|
+
console.log("[ByteCave] \u2713 Discovered peer:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6626
6487
|
}
|
|
6627
6488
|
} catch (err) {
|
|
6628
6489
|
console.warn("[ByteCave] Failed to process peer from directory:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6658,9 +6519,6 @@ var ByteCaveClient = class {
|
|
|
6658
6519
|
connectedPeers: connectedPeers.length,
|
|
6659
6520
|
discoveredPeers: this.knownPeers.size
|
|
6660
6521
|
});
|
|
6661
|
-
setTimeout(() => {
|
|
6662
|
-
this.dialCachedPeers();
|
|
6663
|
-
}, 2e3);
|
|
6664
6522
|
} catch (error) {
|
|
6665
6523
|
this.setConnectionState("error");
|
|
6666
6524
|
console.error("Failed to start ByteCave client:", error);
|
|
@@ -6714,19 +6572,14 @@ var ByteCaveClient = class {
|
|
|
6714
6572
|
try {
|
|
6715
6573
|
const health = await p2pProtocolClient.getHealthFromPeer(peer.peerId);
|
|
6716
6574
|
if (health) {
|
|
6717
|
-
|
|
6575
|
+
this.knownPeers.set(peer.peerId, {
|
|
6718
6576
|
peerId: peer.peerId,
|
|
6719
6577
|
publicKey: health.publicKey || "",
|
|
6720
6578
|
contentTypes: health.contentTypes || "all",
|
|
6721
|
-
httpEndpoint: health.httpEndpoint || "",
|
|
6722
|
-
multiaddrs: peer.multiaddrs || [],
|
|
6723
|
-
relayAddrs: peer.relayAddrs || [],
|
|
6724
6579
|
connected: true,
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
this.knownPeers.set(peer.peerId, peerInfo);
|
|
6729
|
-
this.saveCachedPeers();
|
|
6580
|
+
nodeId: health.nodeId
|
|
6581
|
+
});
|
|
6582
|
+
console.log("[ByteCave] Refresh: \u2713 Updated peer info:", health.nodeId || peer.peerId.slice(0, 12));
|
|
6730
6583
|
}
|
|
6731
6584
|
} catch (err) {
|
|
6732
6585
|
console.warn("[ByteCave] Refresh: Failed to get health from peer:", peer.peerId.slice(0, 12), err.message);
|
|
@@ -6791,81 +6644,15 @@ Nonce: ${nonce}`;
|
|
|
6791
6644
|
console.warn("[ByteCave] Failed to create authorization:", err.message);
|
|
6792
6645
|
}
|
|
6793
6646
|
}
|
|
6794
|
-
if (this.config.relayWsUrl) {
|
|
6795
|
-
|
|
6796
|
-
try {
|
|
6797
|
-
if (!this.storageWsClient) {
|
|
6798
|
-
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6799
|
-
}
|
|
6800
|
-
const wsAuth = authorization ? {
|
|
6801
|
-
signature: authorization.signature,
|
|
6802
|
-
address: authorization.sender,
|
|
6803
|
-
timestamp: authorization.timestamp,
|
|
6804
|
-
nonce: authorization.nonce,
|
|
6805
|
-
appId: authorization.appId,
|
|
6806
|
-
contentHash: authorization.contentHash
|
|
6807
|
-
} : void 0;
|
|
6808
|
-
const result = await this.storageWsClient.store({
|
|
6809
|
-
data: dataArray,
|
|
6810
|
-
contentType: mimeType || "application/octet-stream",
|
|
6811
|
-
hashIdToken,
|
|
6812
|
-
authorization: wsAuth,
|
|
6813
|
-
timeout: 3e4
|
|
6814
|
-
});
|
|
6815
|
-
if (result.success && result.cid) {
|
|
6816
|
-
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6817
|
-
return {
|
|
6818
|
-
success: true,
|
|
6819
|
-
cid: result.cid,
|
|
6820
|
-
peerId: "relay-ws"
|
|
6821
|
-
};
|
|
6822
|
-
}
|
|
6823
|
-
console.warn("[ByteCave] WebSocket storage failed, trying WebTransport:", result.error);
|
|
6824
|
-
} catch (err) {
|
|
6825
|
-
console.warn("[ByteCave] WebSocket storage exception, trying WebTransport:", err.message);
|
|
6826
|
-
}
|
|
6827
|
-
} else {
|
|
6828
|
-
console.log("[ByteCave] WebSocket relay not configured, trying WebTransport");
|
|
6647
|
+
if (!this.config.relayWsUrl) {
|
|
6648
|
+
return { success: false, error: "WebSocket relay URL not configured" };
|
|
6829
6649
|
}
|
|
6830
|
-
console.log("[ByteCave]
|
|
6650
|
+
console.log("[ByteCave] Storing via WebSocket relay");
|
|
6831
6651
|
try {
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
console.log("[ByteCave] No cached peers, trying discovery services");
|
|
6835
|
-
if (this.relayDiscovery) {
|
|
6836
|
-
nodes = await this.relayDiscovery.getConnectedPeers();
|
|
6837
|
-
} else if (this.contractDiscovery) {
|
|
6838
|
-
nodes = await this.contractDiscovery.getActiveNodes();
|
|
6839
|
-
}
|
|
6840
|
-
} else {
|
|
6841
|
-
console.log("[ByteCave] Using", nodes.length, "cached peers for WebTransport");
|
|
6842
|
-
}
|
|
6843
|
-
if (nodes.length === 0) {
|
|
6844
|
-
return {
|
|
6845
|
-
success: false,
|
|
6846
|
-
error: "No nodes available for WebTransport storage"
|
|
6847
|
-
};
|
|
6848
|
-
}
|
|
6849
|
-
const nodeWithWebTransport = nodes.find(
|
|
6850
|
-
(node) => node.multiaddrs?.some((addr) => addr.includes("/webtransport"))
|
|
6851
|
-
);
|
|
6852
|
-
if (!nodeWithWebTransport || !nodeWithWebTransport.multiaddrs) {
|
|
6853
|
-
return {
|
|
6854
|
-
success: false,
|
|
6855
|
-
error: "No nodes with WebTransport support found"
|
|
6856
|
-
};
|
|
6857
|
-
}
|
|
6858
|
-
const wtMultiaddr = nodeWithWebTransport.multiaddrs.find(
|
|
6859
|
-
(addr) => addr.includes("/webtransport")
|
|
6860
|
-
);
|
|
6861
|
-
if (!wtMultiaddr) {
|
|
6862
|
-
return {
|
|
6863
|
-
success: false,
|
|
6864
|
-
error: "No WebTransport multiaddr found"
|
|
6865
|
-
};
|
|
6652
|
+
if (!this.storageWsClient) {
|
|
6653
|
+
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
6866
6654
|
}
|
|
6867
|
-
const
|
|
6868
|
-
const wtAuth = authorization ? {
|
|
6655
|
+
const wsAuth = authorization ? {
|
|
6869
6656
|
signature: authorization.signature,
|
|
6870
6657
|
address: authorization.sender,
|
|
6871
6658
|
timestamp: authorization.timestamp,
|
|
@@ -6873,25 +6660,26 @@ Nonce: ${nonce}`;
|
|
|
6873
6660
|
appId: authorization.appId,
|
|
6874
6661
|
contentHash: authorization.contentHash
|
|
6875
6662
|
} : void 0;
|
|
6876
|
-
const result = await
|
|
6663
|
+
const result = await this.storageWsClient.store({
|
|
6877
6664
|
data: dataArray,
|
|
6878
6665
|
contentType: mimeType || "application/octet-stream",
|
|
6879
6666
|
hashIdToken,
|
|
6880
|
-
authorization:
|
|
6667
|
+
authorization: wsAuth,
|
|
6668
|
+
timeout: 3e4
|
|
6881
6669
|
});
|
|
6882
6670
|
if (result.success && result.cid) {
|
|
6883
|
-
console.log("[ByteCave] \u2713
|
|
6671
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6884
6672
|
return {
|
|
6885
6673
|
success: true,
|
|
6886
6674
|
cid: result.cid,
|
|
6887
|
-
peerId:
|
|
6675
|
+
peerId: "relay-ws"
|
|
6888
6676
|
};
|
|
6889
6677
|
}
|
|
6890
|
-
console.
|
|
6891
|
-
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" };
|
|
6892
6680
|
} catch (err) {
|
|
6893
|
-
console.error("[ByteCave]
|
|
6894
|
-
return { success: false, error:
|
|
6681
|
+
console.error("[ByteCave] WebSocket storage exception:", err.message);
|
|
6682
|
+
return { success: false, error: err.message };
|
|
6895
6683
|
}
|
|
6896
6684
|
}
|
|
6897
6685
|
/**
|
|
@@ -7043,48 +6831,14 @@ Nonce: ${nonce}`;
|
|
|
7043
6831
|
try {
|
|
7044
6832
|
const peerInfo = this.knownPeers.get(peerId);
|
|
7045
6833
|
const relayAddrs = peerInfo?.relayAddrs;
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7051
|
-
|
|
7052
|
-
|
|
7053
|
-
|
|
7054
|
-
const ma = (0, import_multiaddr.multiaddr)(relayAddrs[0]);
|
|
7055
|
-
await this.node.dial(ma);
|
|
7056
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7057
|
-
} catch (dialError) {
|
|
7058
|
-
console.warn("[ByteCave] Relay dial failed:", dialError.message);
|
|
7059
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7060
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7061
|
-
if (wtAddr) {
|
|
7062
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7063
|
-
try {
|
|
7064
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7065
|
-
await this.node.dial(ma);
|
|
7066
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7067
|
-
} catch (wtError) {
|
|
7068
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7069
|
-
}
|
|
7070
|
-
}
|
|
7071
|
-
}
|
|
7072
|
-
}
|
|
7073
|
-
} else if (multiaddrs && multiaddrs.length > 0) {
|
|
7074
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7075
|
-
if (wtAddr) {
|
|
7076
|
-
console.log("[ByteCave] Trying WebTransport address (no relay):", wtAddr.slice(0, 60));
|
|
7077
|
-
try {
|
|
7078
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7079
|
-
await this.node.dial(ma);
|
|
7080
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7081
|
-
} catch (wtError) {
|
|
7082
|
-
console.warn("[ByteCave] WebTransport dial failed:", wtError.message);
|
|
7083
|
-
}
|
|
7084
|
-
}
|
|
7085
|
-
}
|
|
7086
|
-
} else {
|
|
7087
|
-
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);
|
|
7088
6842
|
}
|
|
7089
6843
|
}
|
|
7090
6844
|
const health = await p2pProtocolClient.getHealthFromPeer(peerId);
|
|
@@ -7190,106 +6944,8 @@ Nonce: ${nonce}`;
|
|
|
7190
6944
|
onChainNodeId: announcement.onChainNodeId
|
|
7191
6945
|
};
|
|
7192
6946
|
this.knownPeers.set(announcement.peerId, peerInfo);
|
|
7193
|
-
this.saveCachedPeers();
|
|
7194
|
-
if (this.node && !peerInfo.connected) {
|
|
7195
|
-
this.dialPeer(announcement.peerId, peerInfo.relayAddrs, peerInfo.multiaddrs).catch((err) => {
|
|
7196
|
-
console.warn("[ByteCave] Failed to dial announced peer:", err.message);
|
|
7197
|
-
});
|
|
7198
|
-
}
|
|
7199
6947
|
this.emit("peerAnnounce", peerInfo);
|
|
7200
6948
|
}
|
|
7201
|
-
/**
|
|
7202
|
-
* Attempt to dial a peer using relay or WebTransport addresses
|
|
7203
|
-
*/
|
|
7204
|
-
async dialPeer(peerId, relayAddrs, multiaddrs) {
|
|
7205
|
-
if (!this.node) return;
|
|
7206
|
-
const connections = this.node.getConnections().filter((c) => c.remotePeer.toString() === peerId);
|
|
7207
|
-
if (connections.length > 0) {
|
|
7208
|
-
console.log("[ByteCave] Already connected to peer:", peerId.slice(0, 12));
|
|
7209
|
-
return;
|
|
7210
|
-
}
|
|
7211
|
-
console.log("[ByteCave] Attempting to dial peer:", peerId.slice(0, 12));
|
|
7212
|
-
if (relayAddrs && relayAddrs.length > 0) {
|
|
7213
|
-
console.log("[ByteCave] Trying relay address:", relayAddrs[0].slice(0, 60));
|
|
7214
|
-
try {
|
|
7215
|
-
const ma = (0, import_multiaddr.multiaddr)(relayAddrs[0]);
|
|
7216
|
-
await this.node.dial(ma);
|
|
7217
|
-
console.log("[ByteCave] \u2713 Connected via relay");
|
|
7218
|
-
const peer = this.knownPeers.get(peerId);
|
|
7219
|
-
if (peer) {
|
|
7220
|
-
peer.connected = true;
|
|
7221
|
-
}
|
|
7222
|
-
return;
|
|
7223
|
-
} catch (error) {
|
|
7224
|
-
console.warn("[ByteCave] Relay dial failed:", error.message);
|
|
7225
|
-
}
|
|
7226
|
-
}
|
|
7227
|
-
if (multiaddrs && multiaddrs.length > 0) {
|
|
7228
|
-
const wtAddr = multiaddrs.find((addr) => addr.includes("/webtransport"));
|
|
7229
|
-
if (wtAddr) {
|
|
7230
|
-
console.log("[ByteCave] Trying WebTransport address:", wtAddr.slice(0, 60));
|
|
7231
|
-
try {
|
|
7232
|
-
const ma = (0, import_multiaddr.multiaddr)(wtAddr);
|
|
7233
|
-
await this.node.dial(ma);
|
|
7234
|
-
console.log("[ByteCave] \u2713 Connected via WebTransport");
|
|
7235
|
-
const peer = this.knownPeers.get(peerId);
|
|
7236
|
-
if (peer) {
|
|
7237
|
-
peer.connected = true;
|
|
7238
|
-
}
|
|
7239
|
-
} catch (error) {
|
|
7240
|
-
console.warn("[ByteCave] WebTransport dial failed:", error.message);
|
|
7241
|
-
}
|
|
7242
|
-
}
|
|
7243
|
-
}
|
|
7244
|
-
}
|
|
7245
|
-
/**
|
|
7246
|
-
* Load cached peers from localStorage
|
|
7247
|
-
*/
|
|
7248
|
-
loadCachedPeers() {
|
|
7249
|
-
try {
|
|
7250
|
-
const cached = localStorage.getItem(this.PEERS_CACHE_KEY);
|
|
7251
|
-
if (cached) {
|
|
7252
|
-
const peers = JSON.parse(cached);
|
|
7253
|
-
console.log("[ByteCave] Loaded", peers.length, "cached peers from localStorage");
|
|
7254
|
-
for (const peer of peers) {
|
|
7255
|
-
this.knownPeers.set(peer.peerId, { ...peer, connected: false });
|
|
7256
|
-
}
|
|
7257
|
-
}
|
|
7258
|
-
} catch (error) {
|
|
7259
|
-
console.warn("[ByteCave] Failed to load cached peers:", error);
|
|
7260
|
-
}
|
|
7261
|
-
}
|
|
7262
|
-
/**
|
|
7263
|
-
* Dial all cached peers (used on startup when relay might be down)
|
|
7264
|
-
*/
|
|
7265
|
-
async dialCachedPeers() {
|
|
7266
|
-
console.log("[ByteCave] Dialing", this.knownPeers.size, "cached peers...");
|
|
7267
|
-
for (const [peerId, peerInfo] of this.knownPeers) {
|
|
7268
|
-
if (peerInfo.connected) {
|
|
7269
|
-
continue;
|
|
7270
|
-
}
|
|
7271
|
-
const relayAddrs = peerInfo.relayAddrs;
|
|
7272
|
-
const multiaddrs = peerInfo.multiaddrs;
|
|
7273
|
-
if (relayAddrs || multiaddrs) {
|
|
7274
|
-
this.dialPeer(peerId, relayAddrs, multiaddrs).catch((err) => {
|
|
7275
|
-
console.warn("[ByteCave] Failed to dial cached peer:", peerId.slice(0, 12), err.message);
|
|
7276
|
-
});
|
|
7277
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
7278
|
-
}
|
|
7279
|
-
}
|
|
7280
|
-
}
|
|
7281
|
-
/**
|
|
7282
|
-
* Save known peers to localStorage
|
|
7283
|
-
*/
|
|
7284
|
-
saveCachedPeers() {
|
|
7285
|
-
try {
|
|
7286
|
-
const peers = Array.from(this.knownPeers.values());
|
|
7287
|
-
localStorage.setItem(this.PEERS_CACHE_KEY, JSON.stringify(peers));
|
|
7288
|
-
console.log("[ByteCave] Saved", peers.length, "peers to localStorage");
|
|
7289
|
-
} catch (error) {
|
|
7290
|
-
console.warn("[ByteCave] Failed to save cached peers:", error);
|
|
7291
|
-
}
|
|
7292
|
-
}
|
|
7293
6949
|
/**
|
|
7294
6950
|
* Check if a nodeId is registered in the on-chain registry
|
|
7295
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;
|