@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.
@@ -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
- if (!this.node) {
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
- if (!this.node) {
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
@@ -13,7 +13,7 @@ import {
13
13
  useHashdImage,
14
14
  useHashdMedia,
15
15
  useHashdUrl
16
- } from "./chunk-544OXLKK.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-544OXLKK.js";
11
+ } from "../chunk-SIGWRCA5.js";
12
12
  import "../chunk-EEZWRIUI.js";
13
13
  export {
14
14
  HashdAudio,
@@ -5,6 +5,7 @@
5
5
  export interface StoreViaWebSocketOptions {
6
6
  data: Uint8Array;
7
7
  contentType: string;
8
+ hashIdToken?: number;
8
9
  authorization?: {
9
10
  signature: string;
10
11
  address: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gethashd/bytecave-browser",
3
- "version": "1.0.37",
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) {
@@ -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
- console.error('[ByteCave] All storage methods failed. Errors:', errors);
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
  /**
@@ -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