@gethashd/bytecave-browser 1.0.37 → 1.0.39
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-544OXLKK.js → chunk-SIGWRCA5.js} +52 -47
- package/dist/index.cjs +52 -47
- package/dist/index.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/storage-websocket.d.ts +1 -0
- package/package.json +1 -1
- package/src/client.ts +67 -65
- package/src/storage-websocket.ts +3 -0
|
@@ -6133,6 +6133,7 @@ var StorageWebSocketClient = class {
|
|
|
6133
6133
|
requestId,
|
|
6134
6134
|
data: base64Data,
|
|
6135
6135
|
contentType: options.contentType,
|
|
6136
|
+
hashIdToken: options.hashIdToken,
|
|
6136
6137
|
authorization: options.authorization
|
|
6137
6138
|
};
|
|
6138
6139
|
return new Promise((resolve, reject) => {
|
|
@@ -6223,7 +6224,17 @@ var ByteCaveClient = class {
|
|
|
6223
6224
|
console.log("[ByteCave] Bootstrap peers:", bootstrapPeers);
|
|
6224
6225
|
this.node = await createLibp2p({
|
|
6225
6226
|
transports: [
|
|
6226
|
-
webRTC(
|
|
6227
|
+
webRTC({
|
|
6228
|
+
rtcConfiguration: {
|
|
6229
|
+
iceServers: [
|
|
6230
|
+
// Google public STUN servers for NAT traversal
|
|
6231
|
+
{ urls: "stun:stun.l.google.com:19302" },
|
|
6232
|
+
{ urls: "stun:stun1.l.google.com:19302" },
|
|
6233
|
+
// Mozilla public STUN server
|
|
6234
|
+
{ urls: "stun:stun.services.mozilla.com" }
|
|
6235
|
+
]
|
|
6236
|
+
}
|
|
6237
|
+
}),
|
|
6227
6238
|
webSockets(),
|
|
6228
6239
|
circuitRelayTransport()
|
|
6229
6240
|
],
|
|
@@ -6533,8 +6544,44 @@ Nonce: ${nonce}`;
|
|
|
6533
6544
|
console.warn("[ByteCave] Failed to create authorization:", err.message);
|
|
6534
6545
|
}
|
|
6535
6546
|
}
|
|
6547
|
+
if (this.node) {
|
|
6548
|
+
console.log("[ByteCave] Attempting direct P2P storage (with STUN NAT traversal)");
|
|
6549
|
+
const allPeers = this.node.getPeers();
|
|
6550
|
+
const connectedPeerIds = allPeers.map((p) => p.toString());
|
|
6551
|
+
console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
|
|
6552
|
+
if (connectedPeerIds.length > 0) {
|
|
6553
|
+
const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
|
|
6554
|
+
const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
|
|
6555
|
+
for (const peerId of storagePeerIds) {
|
|
6556
|
+
console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
|
|
6557
|
+
try {
|
|
6558
|
+
const result = await p2pProtocolClient.storeToPeer(
|
|
6559
|
+
peerId,
|
|
6560
|
+
dataArray,
|
|
6561
|
+
mimeType || "application/octet-stream",
|
|
6562
|
+
authorization,
|
|
6563
|
+
false,
|
|
6564
|
+
// shouldVerifyOnChain - false for browser test storage
|
|
6565
|
+
hashIdToken
|
|
6566
|
+
);
|
|
6567
|
+
if (result.success && result.cid) {
|
|
6568
|
+
console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
|
|
6569
|
+
return {
|
|
6570
|
+
success: true,
|
|
6571
|
+
cid: result.cid,
|
|
6572
|
+
peerId
|
|
6573
|
+
};
|
|
6574
|
+
}
|
|
6575
|
+
console.warn("[ByteCave] \u2717 P2P store failed:", result.error);
|
|
6576
|
+
} catch (err) {
|
|
6577
|
+
console.error("[ByteCave] \u2717 P2P store exception:", err.message);
|
|
6578
|
+
}
|
|
6579
|
+
}
|
|
6580
|
+
}
|
|
6581
|
+
console.log("[ByteCave] P2P storage failed or no peers available, falling back to WebSocket relay");
|
|
6582
|
+
}
|
|
6536
6583
|
if (this.config.relayWsUrl) {
|
|
6537
|
-
console.log("[ByteCave] Attempting WebSocket storage via relay");
|
|
6584
|
+
console.log("[ByteCave] Attempting WebSocket storage via relay (fallback)");
|
|
6538
6585
|
try {
|
|
6539
6586
|
if (!this.storageWsClient) {
|
|
6540
6587
|
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
@@ -6550,11 +6597,12 @@ Nonce: ${nonce}`;
|
|
|
6550
6597
|
const result = await this.storageWsClient.store({
|
|
6551
6598
|
data: dataArray,
|
|
6552
6599
|
contentType: mimeType || "application/octet-stream",
|
|
6600
|
+
hashIdToken,
|
|
6553
6601
|
authorization: wsAuth,
|
|
6554
6602
|
timeout: 3e4
|
|
6555
6603
|
});
|
|
6556
6604
|
if (result.success && result.cid) {
|
|
6557
|
-
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6605
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful (fallback):", result.cid);
|
|
6558
6606
|
return {
|
|
6559
6607
|
success: true,
|
|
6560
6608
|
cid: result.cid,
|
|
@@ -6566,50 +6614,7 @@ Nonce: ${nonce}`;
|
|
|
6566
6614
|
console.warn("[ByteCave] WebSocket storage exception:", err.message);
|
|
6567
6615
|
}
|
|
6568
6616
|
}
|
|
6569
|
-
|
|
6570
|
-
return { success: false, error: "WebSocket storage failed and P2P node not initialized" };
|
|
6571
|
-
}
|
|
6572
|
-
console.log("[ByteCave] Falling back to P2P storage");
|
|
6573
|
-
const allPeers = this.node.getPeers();
|
|
6574
|
-
const connectedPeerIds = allPeers.map((p) => p.toString());
|
|
6575
|
-
console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
|
|
6576
|
-
if (connectedPeerIds.length === 0) {
|
|
6577
|
-
return { success: false, error: "WebSocket storage failed and no P2P peers available" };
|
|
6578
|
-
}
|
|
6579
|
-
const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
|
|
6580
|
-
const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
|
|
6581
|
-
const errors = [];
|
|
6582
|
-
for (const peerId of storagePeerIds) {
|
|
6583
|
-
console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
|
|
6584
|
-
try {
|
|
6585
|
-
const result = await p2pProtocolClient.storeToPeer(
|
|
6586
|
-
peerId,
|
|
6587
|
-
dataArray,
|
|
6588
|
-
mimeType || "application/octet-stream",
|
|
6589
|
-
authorization,
|
|
6590
|
-
false,
|
|
6591
|
-
// shouldVerifyOnChain - false for browser test storage
|
|
6592
|
-
hashIdToken
|
|
6593
|
-
);
|
|
6594
|
-
if (result.success && result.cid) {
|
|
6595
|
-
console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
|
|
6596
|
-
return {
|
|
6597
|
-
success: true,
|
|
6598
|
-
cid: result.cid,
|
|
6599
|
-
peerId
|
|
6600
|
-
};
|
|
6601
|
-
}
|
|
6602
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
|
|
6603
|
-
console.warn("[ByteCave] \u2717 P2P store failed:", errorMsg);
|
|
6604
|
-
errors.push(errorMsg);
|
|
6605
|
-
} catch (err) {
|
|
6606
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
|
|
6607
|
-
console.error("[ByteCave] \u2717 P2P store exception:", errorMsg);
|
|
6608
|
-
errors.push(errorMsg);
|
|
6609
|
-
}
|
|
6610
|
-
}
|
|
6611
|
-
console.error("[ByteCave] All storage methods failed. Errors:", errors);
|
|
6612
|
-
return { success: false, error: `All storage methods failed: ${errors.join("; ")}` };
|
|
6617
|
+
return { success: false, error: "All storage methods failed (P2P and WebSocket relay)" };
|
|
6613
6618
|
}
|
|
6614
6619
|
/**
|
|
6615
6620
|
* Retrieve ciphertext from a node via P2P only (no HTTP fallback)
|
package/dist/index.cjs
CHANGED
|
@@ -6186,6 +6186,7 @@ var StorageWebSocketClient = class {
|
|
|
6186
6186
|
requestId,
|
|
6187
6187
|
data: base64Data,
|
|
6188
6188
|
contentType: options.contentType,
|
|
6189
|
+
hashIdToken: options.hashIdToken,
|
|
6189
6190
|
authorization: options.authorization
|
|
6190
6191
|
};
|
|
6191
6192
|
return new Promise((resolve, reject) => {
|
|
@@ -6276,7 +6277,17 @@ var ByteCaveClient = class {
|
|
|
6276
6277
|
console.log("[ByteCave] Bootstrap peers:", bootstrapPeers);
|
|
6277
6278
|
this.node = await (0, import_libp2p.createLibp2p)({
|
|
6278
6279
|
transports: [
|
|
6279
|
-
(0, import_webrtc.webRTC)(
|
|
6280
|
+
(0, import_webrtc.webRTC)({
|
|
6281
|
+
rtcConfiguration: {
|
|
6282
|
+
iceServers: [
|
|
6283
|
+
// Google public STUN servers for NAT traversal
|
|
6284
|
+
{ urls: "stun:stun.l.google.com:19302" },
|
|
6285
|
+
{ urls: "stun:stun1.l.google.com:19302" },
|
|
6286
|
+
// Mozilla public STUN server
|
|
6287
|
+
{ urls: "stun:stun.services.mozilla.com" }
|
|
6288
|
+
]
|
|
6289
|
+
}
|
|
6290
|
+
}),
|
|
6280
6291
|
(0, import_websockets.webSockets)(),
|
|
6281
6292
|
(0, import_circuit_relay_v2.circuitRelayTransport)()
|
|
6282
6293
|
],
|
|
@@ -6586,8 +6597,44 @@ Nonce: ${nonce}`;
|
|
|
6586
6597
|
console.warn("[ByteCave] Failed to create authorization:", err.message);
|
|
6587
6598
|
}
|
|
6588
6599
|
}
|
|
6600
|
+
if (this.node) {
|
|
6601
|
+
console.log("[ByteCave] Attempting direct P2P storage (with STUN NAT traversal)");
|
|
6602
|
+
const allPeers = this.node.getPeers();
|
|
6603
|
+
const connectedPeerIds = allPeers.map((p) => p.toString());
|
|
6604
|
+
console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
|
|
6605
|
+
if (connectedPeerIds.length > 0) {
|
|
6606
|
+
const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
|
|
6607
|
+
const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
|
|
6608
|
+
for (const peerId of storagePeerIds) {
|
|
6609
|
+
console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
|
|
6610
|
+
try {
|
|
6611
|
+
const result = await p2pProtocolClient.storeToPeer(
|
|
6612
|
+
peerId,
|
|
6613
|
+
dataArray,
|
|
6614
|
+
mimeType || "application/octet-stream",
|
|
6615
|
+
authorization,
|
|
6616
|
+
false,
|
|
6617
|
+
// shouldVerifyOnChain - false for browser test storage
|
|
6618
|
+
hashIdToken
|
|
6619
|
+
);
|
|
6620
|
+
if (result.success && result.cid) {
|
|
6621
|
+
console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
|
|
6622
|
+
return {
|
|
6623
|
+
success: true,
|
|
6624
|
+
cid: result.cid,
|
|
6625
|
+
peerId
|
|
6626
|
+
};
|
|
6627
|
+
}
|
|
6628
|
+
console.warn("[ByteCave] \u2717 P2P store failed:", result.error);
|
|
6629
|
+
} catch (err) {
|
|
6630
|
+
console.error("[ByteCave] \u2717 P2P store exception:", err.message);
|
|
6631
|
+
}
|
|
6632
|
+
}
|
|
6633
|
+
}
|
|
6634
|
+
console.log("[ByteCave] P2P storage failed or no peers available, falling back to WebSocket relay");
|
|
6635
|
+
}
|
|
6589
6636
|
if (this.config.relayWsUrl) {
|
|
6590
|
-
console.log("[ByteCave] Attempting WebSocket storage via relay");
|
|
6637
|
+
console.log("[ByteCave] Attempting WebSocket storage via relay (fallback)");
|
|
6591
6638
|
try {
|
|
6592
6639
|
if (!this.storageWsClient) {
|
|
6593
6640
|
this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
|
|
@@ -6603,11 +6650,12 @@ Nonce: ${nonce}`;
|
|
|
6603
6650
|
const result = await this.storageWsClient.store({
|
|
6604
6651
|
data: dataArray,
|
|
6605
6652
|
contentType: mimeType || "application/octet-stream",
|
|
6653
|
+
hashIdToken,
|
|
6606
6654
|
authorization: wsAuth,
|
|
6607
6655
|
timeout: 3e4
|
|
6608
6656
|
});
|
|
6609
6657
|
if (result.success && result.cid) {
|
|
6610
|
-
console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
|
|
6658
|
+
console.log("[ByteCave] \u2713 WebSocket storage successful (fallback):", result.cid);
|
|
6611
6659
|
return {
|
|
6612
6660
|
success: true,
|
|
6613
6661
|
cid: result.cid,
|
|
@@ -6619,50 +6667,7 @@ Nonce: ${nonce}`;
|
|
|
6619
6667
|
console.warn("[ByteCave] WebSocket storage exception:", err.message);
|
|
6620
6668
|
}
|
|
6621
6669
|
}
|
|
6622
|
-
|
|
6623
|
-
return { success: false, error: "WebSocket storage failed and P2P node not initialized" };
|
|
6624
|
-
}
|
|
6625
|
-
console.log("[ByteCave] Falling back to P2P storage");
|
|
6626
|
-
const allPeers = this.node.getPeers();
|
|
6627
|
-
const connectedPeerIds = allPeers.map((p) => p.toString());
|
|
6628
|
-
console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
|
|
6629
|
-
if (connectedPeerIds.length === 0) {
|
|
6630
|
-
return { success: false, error: "WebSocket storage failed and no P2P peers available" };
|
|
6631
|
-
}
|
|
6632
|
-
const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
|
|
6633
|
-
const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
|
|
6634
|
-
const errors = [];
|
|
6635
|
-
for (const peerId of storagePeerIds) {
|
|
6636
|
-
console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
|
|
6637
|
-
try {
|
|
6638
|
-
const result = await p2pProtocolClient.storeToPeer(
|
|
6639
|
-
peerId,
|
|
6640
|
-
dataArray,
|
|
6641
|
-
mimeType || "application/octet-stream",
|
|
6642
|
-
authorization,
|
|
6643
|
-
false,
|
|
6644
|
-
// shouldVerifyOnChain - false for browser test storage
|
|
6645
|
-
hashIdToken
|
|
6646
|
-
);
|
|
6647
|
-
if (result.success && result.cid) {
|
|
6648
|
-
console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
|
|
6649
|
-
return {
|
|
6650
|
-
success: true,
|
|
6651
|
-
cid: result.cid,
|
|
6652
|
-
peerId
|
|
6653
|
-
};
|
|
6654
|
-
}
|
|
6655
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
|
|
6656
|
-
console.warn("[ByteCave] \u2717 P2P store failed:", errorMsg);
|
|
6657
|
-
errors.push(errorMsg);
|
|
6658
|
-
} catch (err) {
|
|
6659
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
|
|
6660
|
-
console.error("[ByteCave] \u2717 P2P store exception:", errorMsg);
|
|
6661
|
-
errors.push(errorMsg);
|
|
6662
|
-
}
|
|
6663
|
-
}
|
|
6664
|
-
console.error("[ByteCave] All storage methods failed. Errors:", errors);
|
|
6665
|
-
return { success: false, error: `All storage methods failed: ${errors.join("; ")}` };
|
|
6670
|
+
return { success: false, error: "All storage methods failed (P2P and WebSocket relay)" };
|
|
6666
6671
|
}
|
|
6667
6672
|
/**
|
|
6668
6673
|
* Retrieve ciphertext from a node via P2P only (no HTTP fallback)
|
package/dist/index.js
CHANGED
package/dist/react/index.js
CHANGED
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -99,7 +99,17 @@ export class ByteCaveClient {
|
|
|
99
99
|
// Create libp2p node with WebRTC transport
|
|
100
100
|
this.node = await createLibp2p({
|
|
101
101
|
transports: [
|
|
102
|
-
webRTC(
|
|
102
|
+
webRTC({
|
|
103
|
+
rtcConfiguration: {
|
|
104
|
+
iceServers: [
|
|
105
|
+
// Google public STUN servers for NAT traversal
|
|
106
|
+
{ urls: 'stun:stun.l.google.com:19302' },
|
|
107
|
+
{ urls: 'stun:stun1.l.google.com:19302' },
|
|
108
|
+
// Mozilla public STUN server
|
|
109
|
+
{ urls: 'stun:stun.services.mozilla.com' }
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}) as any,
|
|
103
113
|
webSockets() as any,
|
|
104
114
|
circuitRelayTransport() as any
|
|
105
115
|
],
|
|
@@ -476,9 +486,60 @@ Nonce: ${nonce}`;
|
|
|
476
486
|
}
|
|
477
487
|
}
|
|
478
488
|
|
|
479
|
-
// Try
|
|
489
|
+
// Try direct P2P storage first (with STUN for NAT traversal)
|
|
490
|
+
if (this.node) {
|
|
491
|
+
console.log('[ByteCave] Attempting direct P2P storage (with STUN NAT traversal)');
|
|
492
|
+
|
|
493
|
+
const allPeers = this.node.getPeers();
|
|
494
|
+
const connectedPeerIds = allPeers.map(p => p.toString());
|
|
495
|
+
|
|
496
|
+
console.log('[ByteCave] Store - connected storage peers:', connectedPeerIds.length);
|
|
497
|
+
|
|
498
|
+
if (connectedPeerIds.length > 0) {
|
|
499
|
+
// Prioritize registered peers from knownPeers
|
|
500
|
+
const registeredPeerIds = Array.from(this.knownPeers.values())
|
|
501
|
+
.filter(p => p.isRegistered && connectedPeerIds.includes(p.peerId))
|
|
502
|
+
.map(p => p.peerId);
|
|
503
|
+
|
|
504
|
+
const storagePeerIds = registeredPeerIds.length > 0
|
|
505
|
+
? [...registeredPeerIds, ...connectedPeerIds.filter(id => !registeredPeerIds.includes(id))]
|
|
506
|
+
: connectedPeerIds;
|
|
507
|
+
|
|
508
|
+
for (const peerId of storagePeerIds) {
|
|
509
|
+
console.log('[ByteCave] Attempting P2P store to peer:', peerId.slice(0, 12) + '...');
|
|
510
|
+
|
|
511
|
+
try {
|
|
512
|
+
const result = await p2pProtocolClient.storeToPeer(
|
|
513
|
+
peerId,
|
|
514
|
+
dataArray,
|
|
515
|
+
mimeType || 'application/octet-stream',
|
|
516
|
+
authorization,
|
|
517
|
+
false, // shouldVerifyOnChain - false for browser test storage
|
|
518
|
+
hashIdToken
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
if (result.success && result.cid) {
|
|
522
|
+
console.log('[ByteCave] ✓ P2P store successful:', result.cid);
|
|
523
|
+
return {
|
|
524
|
+
success: true,
|
|
525
|
+
cid: result.cid,
|
|
526
|
+
peerId
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
console.warn('[ByteCave] ✗ P2P store failed:', result.error);
|
|
531
|
+
} catch (err: any) {
|
|
532
|
+
console.error('[ByteCave] ✗ P2P store exception:', err.message);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
console.log('[ByteCave] P2P storage failed or no peers available, falling back to WebSocket relay');
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Fallback to WebSocket relay if P2P fails or node not initialized
|
|
480
541
|
if (this.config.relayWsUrl) {
|
|
481
|
-
console.log('[ByteCave] Attempting WebSocket storage via relay');
|
|
542
|
+
console.log('[ByteCave] Attempting WebSocket storage via relay (fallback)');
|
|
482
543
|
|
|
483
544
|
try {
|
|
484
545
|
if (!this.storageWsClient) {
|
|
@@ -497,12 +558,13 @@ Nonce: ${nonce}`;
|
|
|
497
558
|
const result = await this.storageWsClient.store({
|
|
498
559
|
data: dataArray,
|
|
499
560
|
contentType: mimeType || 'application/octet-stream',
|
|
561
|
+
hashIdToken,
|
|
500
562
|
authorization: wsAuth,
|
|
501
563
|
timeout: 30000
|
|
502
564
|
});
|
|
503
565
|
|
|
504
566
|
if (result.success && result.cid) {
|
|
505
|
-
console.log('[ByteCave] ✓ WebSocket storage successful:', result.cid);
|
|
567
|
+
console.log('[ByteCave] ✓ WebSocket storage successful (fallback):', result.cid);
|
|
506
568
|
return {
|
|
507
569
|
success: true,
|
|
508
570
|
cid: result.cid,
|
|
@@ -515,68 +577,8 @@ Nonce: ${nonce}`;
|
|
|
515
577
|
console.warn('[ByteCave] WebSocket storage exception:', err.message);
|
|
516
578
|
}
|
|
517
579
|
}
|
|
518
|
-
|
|
519
|
-
// Fallback to P2P storage
|
|
520
|
-
if (!this.node) {
|
|
521
|
-
return { success: false, error: 'WebSocket storage failed and P2P node not initialized' };
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
console.log('[ByteCave] Falling back to P2P storage');
|
|
525
|
-
|
|
526
|
-
// Get all connected peers
|
|
527
|
-
const allPeers = this.node.getPeers();
|
|
528
|
-
const connectedPeerIds = allPeers.map(p => p.toString());
|
|
529
|
-
|
|
530
|
-
console.log('[ByteCave] Store - connected storage peers:', connectedPeerIds.length);
|
|
531
|
-
|
|
532
|
-
if (connectedPeerIds.length === 0) {
|
|
533
|
-
return { success: false, error: 'WebSocket storage failed and no P2P peers available' };
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
// Prioritize registered peers from knownPeers
|
|
537
|
-
const registeredPeerIds = Array.from(this.knownPeers.values())
|
|
538
|
-
.filter(p => p.isRegistered && connectedPeerIds.includes(p.peerId))
|
|
539
|
-
.map(p => p.peerId);
|
|
540
|
-
|
|
541
|
-
const storagePeerIds = registeredPeerIds.length > 0
|
|
542
|
-
? [...registeredPeerIds, ...connectedPeerIds.filter(id => !registeredPeerIds.includes(id))]
|
|
543
|
-
: connectedPeerIds;
|
|
544
|
-
|
|
545
|
-
const errors: string[] = [];
|
|
546
|
-
for (const peerId of storagePeerIds) {
|
|
547
|
-
console.log('[ByteCave] Attempting P2P store to peer:', peerId.slice(0, 12) + '...');
|
|
548
|
-
|
|
549
|
-
try {
|
|
550
|
-
const result = await p2pProtocolClient.storeToPeer(
|
|
551
|
-
peerId,
|
|
552
|
-
dataArray,
|
|
553
|
-
mimeType || 'application/octet-stream',
|
|
554
|
-
authorization,
|
|
555
|
-
false, // shouldVerifyOnChain - false for browser test storage
|
|
556
|
-
hashIdToken
|
|
557
|
-
);
|
|
558
|
-
|
|
559
|
-
if (result.success && result.cid) {
|
|
560
|
-
console.log('[ByteCave] ✓ P2P store successful:', result.cid);
|
|
561
|
-
return {
|
|
562
|
-
success: true,
|
|
563
|
-
cid: result.cid,
|
|
564
|
-
peerId
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
|
|
569
|
-
console.warn('[ByteCave] ✗ P2P store failed:', errorMsg);
|
|
570
|
-
errors.push(errorMsg);
|
|
571
|
-
} catch (err: any) {
|
|
572
|
-
const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
|
|
573
|
-
console.error('[ByteCave] ✗ P2P store exception:', errorMsg);
|
|
574
|
-
errors.push(errorMsg);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
580
|
|
|
578
|
-
|
|
579
|
-
return { success: false, error: `All storage methods failed: ${errors.join('; ')}` };
|
|
581
|
+
return { success: false, error: 'All storage methods failed (P2P and WebSocket relay)' };
|
|
580
582
|
}
|
|
581
583
|
|
|
582
584
|
/**
|
package/src/storage-websocket.ts
CHANGED
|
@@ -8,6 +8,7 @@ interface StorageRequestMessage {
|
|
|
8
8
|
requestId: string;
|
|
9
9
|
data: string; // base64
|
|
10
10
|
contentType: string;
|
|
11
|
+
hashIdToken?: number;
|
|
11
12
|
authorization?: {
|
|
12
13
|
signature: string;
|
|
13
14
|
address: string;
|
|
@@ -31,6 +32,7 @@ type Message = StorageRequestMessage | StorageResponseMessage;
|
|
|
31
32
|
export interface StoreViaWebSocketOptions {
|
|
32
33
|
data: Uint8Array;
|
|
33
34
|
contentType: string;
|
|
35
|
+
hashIdToken?: number;
|
|
34
36
|
authorization?: {
|
|
35
37
|
signature: string;
|
|
36
38
|
address: string;
|
|
@@ -124,6 +126,7 @@ export class StorageWebSocketClient {
|
|
|
124
126
|
requestId,
|
|
125
127
|
data: base64Data,
|
|
126
128
|
contentType: options.contentType,
|
|
129
|
+
hashIdToken: options.hashIdToken,
|
|
127
130
|
authorization: options.authorization
|
|
128
131
|
};
|
|
129
132
|
|