@gethashd/bytecave-browser 1.0.38 → 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.
@@ -6224,7 +6224,17 @@ var ByteCaveClient = class {
6224
6224
  console.log("[ByteCave] Bootstrap peers:", bootstrapPeers);
6225
6225
  this.node = await createLibp2p({
6226
6226
  transports: [
6227
- 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
+ }),
6228
6238
  webSockets(),
6229
6239
  circuitRelayTransport()
6230
6240
  ],
@@ -6534,8 +6544,44 @@ Nonce: ${nonce}`;
6534
6544
  console.warn("[ByteCave] Failed to create authorization:", err.message);
6535
6545
  }
6536
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
+ }
6537
6583
  if (this.config.relayWsUrl) {
6538
- console.log("[ByteCave] Attempting WebSocket storage via relay");
6584
+ console.log("[ByteCave] Attempting WebSocket storage via relay (fallback)");
6539
6585
  try {
6540
6586
  if (!this.storageWsClient) {
6541
6587
  this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
@@ -6556,7 +6602,7 @@ Nonce: ${nonce}`;
6556
6602
  timeout: 3e4
6557
6603
  });
6558
6604
  if (result.success && result.cid) {
6559
- console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
6605
+ console.log("[ByteCave] \u2713 WebSocket storage successful (fallback):", result.cid);
6560
6606
  return {
6561
6607
  success: true,
6562
6608
  cid: result.cid,
@@ -6568,50 +6614,7 @@ Nonce: ${nonce}`;
6568
6614
  console.warn("[ByteCave] WebSocket storage exception:", err.message);
6569
6615
  }
6570
6616
  }
6571
- if (!this.node) {
6572
- return { success: false, error: "WebSocket storage failed and P2P node not initialized" };
6573
- }
6574
- console.log("[ByteCave] Falling back to P2P storage");
6575
- const allPeers = this.node.getPeers();
6576
- const connectedPeerIds = allPeers.map((p) => p.toString());
6577
- console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
6578
- if (connectedPeerIds.length === 0) {
6579
- return { success: false, error: "WebSocket storage failed and no P2P peers available" };
6580
- }
6581
- const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
6582
- const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
6583
- const errors = [];
6584
- for (const peerId of storagePeerIds) {
6585
- console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
6586
- try {
6587
- const result = await p2pProtocolClient.storeToPeer(
6588
- peerId,
6589
- dataArray,
6590
- mimeType || "application/octet-stream",
6591
- authorization,
6592
- false,
6593
- // shouldVerifyOnChain - false for browser test storage
6594
- hashIdToken
6595
- );
6596
- if (result.success && result.cid) {
6597
- console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
6598
- return {
6599
- success: true,
6600
- cid: result.cid,
6601
- peerId
6602
- };
6603
- }
6604
- const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
6605
- console.warn("[ByteCave] \u2717 P2P store failed:", errorMsg);
6606
- errors.push(errorMsg);
6607
- } catch (err) {
6608
- const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
6609
- console.error("[ByteCave] \u2717 P2P store exception:", errorMsg);
6610
- errors.push(errorMsg);
6611
- }
6612
- }
6613
- console.error("[ByteCave] All storage methods failed. Errors:", errors);
6614
- return { success: false, error: `All storage methods failed: ${errors.join("; ")}` };
6617
+ return { success: false, error: "All storage methods failed (P2P and WebSocket relay)" };
6615
6618
  }
6616
6619
  /**
6617
6620
  * Retrieve ciphertext from a node via P2P only (no HTTP fallback)
package/dist/index.cjs CHANGED
@@ -6277,7 +6277,17 @@ var ByteCaveClient = class {
6277
6277
  console.log("[ByteCave] Bootstrap peers:", bootstrapPeers);
6278
6278
  this.node = await (0, import_libp2p.createLibp2p)({
6279
6279
  transports: [
6280
- (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
+ }),
6281
6291
  (0, import_websockets.webSockets)(),
6282
6292
  (0, import_circuit_relay_v2.circuitRelayTransport)()
6283
6293
  ],
@@ -6587,8 +6597,44 @@ Nonce: ${nonce}`;
6587
6597
  console.warn("[ByteCave] Failed to create authorization:", err.message);
6588
6598
  }
6589
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
+ }
6590
6636
  if (this.config.relayWsUrl) {
6591
- console.log("[ByteCave] Attempting WebSocket storage via relay");
6637
+ console.log("[ByteCave] Attempting WebSocket storage via relay (fallback)");
6592
6638
  try {
6593
6639
  if (!this.storageWsClient) {
6594
6640
  this.storageWsClient = new StorageWebSocketClient(this.config.relayWsUrl);
@@ -6609,7 +6655,7 @@ Nonce: ${nonce}`;
6609
6655
  timeout: 3e4
6610
6656
  });
6611
6657
  if (result.success && result.cid) {
6612
- console.log("[ByteCave] \u2713 WebSocket storage successful:", result.cid);
6658
+ console.log("[ByteCave] \u2713 WebSocket storage successful (fallback):", result.cid);
6613
6659
  return {
6614
6660
  success: true,
6615
6661
  cid: result.cid,
@@ -6621,50 +6667,7 @@ Nonce: ${nonce}`;
6621
6667
  console.warn("[ByteCave] WebSocket storage exception:", err.message);
6622
6668
  }
6623
6669
  }
6624
- if (!this.node) {
6625
- return { success: false, error: "WebSocket storage failed and P2P node not initialized" };
6626
- }
6627
- console.log("[ByteCave] Falling back to P2P storage");
6628
- const allPeers = this.node.getPeers();
6629
- const connectedPeerIds = allPeers.map((p) => p.toString());
6630
- console.log("[ByteCave] Store - connected storage peers:", connectedPeerIds.length);
6631
- if (connectedPeerIds.length === 0) {
6632
- return { success: false, error: "WebSocket storage failed and no P2P peers available" };
6633
- }
6634
- const registeredPeerIds = Array.from(this.knownPeers.values()).filter((p) => p.isRegistered && connectedPeerIds.includes(p.peerId)).map((p) => p.peerId);
6635
- const storagePeerIds = registeredPeerIds.length > 0 ? [...registeredPeerIds, ...connectedPeerIds.filter((id) => !registeredPeerIds.includes(id))] : connectedPeerIds;
6636
- const errors = [];
6637
- for (const peerId of storagePeerIds) {
6638
- console.log("[ByteCave] Attempting P2P store to peer:", peerId.slice(0, 12) + "...");
6639
- try {
6640
- const result = await p2pProtocolClient.storeToPeer(
6641
- peerId,
6642
- dataArray,
6643
- mimeType || "application/octet-stream",
6644
- authorization,
6645
- false,
6646
- // shouldVerifyOnChain - false for browser test storage
6647
- hashIdToken
6648
- );
6649
- if (result.success && result.cid) {
6650
- console.log("[ByteCave] \u2713 P2P store successful:", result.cid);
6651
- return {
6652
- success: true,
6653
- cid: result.cid,
6654
- peerId
6655
- };
6656
- }
6657
- const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
6658
- console.warn("[ByteCave] \u2717 P2P store failed:", errorMsg);
6659
- errors.push(errorMsg);
6660
- } catch (err) {
6661
- const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
6662
- console.error("[ByteCave] \u2717 P2P store exception:", errorMsg);
6663
- errors.push(errorMsg);
6664
- }
6665
- }
6666
- console.error("[ByteCave] All storage methods failed. Errors:", errors);
6667
- return { success: false, error: `All storage methods failed: ${errors.join("; ")}` };
6670
+ return { success: false, error: "All storage methods failed (P2P and WebSocket relay)" };
6668
6671
  }
6669
6672
  /**
6670
6673
  * Retrieve ciphertext from a node via P2P only (no HTTP fallback)
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  useHashdImage,
14
14
  useHashdMedia,
15
15
  useHashdUrl
16
- } from "./chunk-CIBPIU23.js";
16
+ } from "./chunk-SIGWRCA5.js";
17
17
  import {
18
18
  clearHashdCache,
19
19
  createHashdUrl,
@@ -8,7 +8,7 @@ import {
8
8
  useHashdImage,
9
9
  useHashdMedia,
10
10
  useHashdUrl
11
- } from "../chunk-CIBPIU23.js";
11
+ } from "../chunk-SIGWRCA5.js";
12
12
  import "../chunk-EEZWRIUI.js";
13
13
  export {
14
14
  HashdAudio,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gethashd/bytecave-browser",
3
- "version": "1.0.38",
3
+ "version": "1.0.39",
4
4
  "description": "ByteCave browser client for WebRTC P2P connections to storage nodes",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
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() as any,
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 WebSocket storage first if relay WS URL is configured
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) {
@@ -503,7 +564,7 @@ Nonce: ${nonce}`;
503
564
  });
504
565
 
505
566
  if (result.success && result.cid) {
506
- console.log('[ByteCave] ✓ WebSocket storage successful:', result.cid);
567
+ console.log('[ByteCave] ✓ WebSocket storage successful (fallback):', result.cid);
507
568
  return {
508
569
  success: true,
509
570
  cid: result.cid,
@@ -516,68 +577,8 @@ Nonce: ${nonce}`;
516
577
  console.warn('[ByteCave] WebSocket storage exception:', err.message);
517
578
  }
518
579
  }
519
-
520
- // Fallback to P2P storage
521
- if (!this.node) {
522
- return { success: false, error: 'WebSocket storage failed and P2P node not initialized' };
523
- }
524
-
525
- console.log('[ByteCave] Falling back to P2P storage');
526
-
527
- // Get all connected peers
528
- const allPeers = this.node.getPeers();
529
- const connectedPeerIds = allPeers.map(p => p.toString());
530
-
531
- console.log('[ByteCave] Store - connected storage peers:', connectedPeerIds.length);
532
-
533
- if (connectedPeerIds.length === 0) {
534
- return { success: false, error: 'WebSocket storage failed and no P2P peers available' };
535
- }
536
-
537
- // Prioritize registered peers from knownPeers
538
- const registeredPeerIds = Array.from(this.knownPeers.values())
539
- .filter(p => p.isRegistered && connectedPeerIds.includes(p.peerId))
540
- .map(p => p.peerId);
541
-
542
- const storagePeerIds = registeredPeerIds.length > 0
543
- ? [...registeredPeerIds, ...connectedPeerIds.filter(id => !registeredPeerIds.includes(id))]
544
- : connectedPeerIds;
545
-
546
- const errors: string[] = [];
547
- for (const peerId of storagePeerIds) {
548
- console.log('[ByteCave] Attempting P2P store to peer:', peerId.slice(0, 12) + '...');
549
-
550
- try {
551
- const result = await p2pProtocolClient.storeToPeer(
552
- peerId,
553
- dataArray,
554
- mimeType || 'application/octet-stream',
555
- authorization,
556
- false, // shouldVerifyOnChain - false for browser test storage
557
- hashIdToken
558
- );
559
-
560
- if (result.success && result.cid) {
561
- console.log('[ByteCave] ✓ P2P store successful:', result.cid);
562
- return {
563
- success: true,
564
- cid: result.cid,
565
- peerId
566
- };
567
- }
568
-
569
- const errorMsg = `${peerId.slice(0, 12)}: ${result.error}`;
570
- console.warn('[ByteCave] ✗ P2P store failed:', errorMsg);
571
- errors.push(errorMsg);
572
- } catch (err: any) {
573
- const errorMsg = `${peerId.slice(0, 12)}: ${err.message}`;
574
- console.error('[ByteCave] ✗ P2P store exception:', errorMsg);
575
- errors.push(errorMsg);
576
- }
577
- }
578
580
 
579
- console.error('[ByteCave] All storage methods failed. Errors:', errors);
580
- return { success: false, error: `All storage methods failed: ${errors.join('; ')}` };
581
+ return { success: false, error: 'All storage methods failed (P2P and WebSocket relay)' };
581
582
  }
582
583
 
583
584
  /**