@libp2p/webrtc 6.0.32 → 6.0.33-16fba5630

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.
Files changed (64) hide show
  1. package/README.md +22 -1
  2. package/dist/index.min.js +9 -9
  3. package/dist/index.min.js.map +4 -4
  4. package/dist/src/constants.d.ts +2 -1
  5. package/dist/src/constants.d.ts.map +1 -1
  6. package/dist/src/constants.js +2 -1
  7. package/dist/src/constants.js.map +1 -1
  8. package/dist/src/index.d.ts +22 -1
  9. package/dist/src/index.d.ts.map +1 -1
  10. package/dist/src/index.js +22 -1
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/private-to-public/listener.d.ts.map +1 -1
  13. package/dist/src/private-to-public/listener.js +9 -7
  14. package/dist/src/private-to-public/listener.js.map +1 -1
  15. package/dist/src/private-to-public/transport.browser.d.ts +9 -0
  16. package/dist/src/private-to-public/transport.browser.d.ts.map +1 -1
  17. package/dist/src/private-to-public/transport.browser.js +33 -5
  18. package/dist/src/private-to-public/transport.browser.js.map +1 -1
  19. package/dist/src/private-to-public/utils/connect.d.ts +16 -0
  20. package/dist/src/private-to-public/utils/connect.d.ts.map +1 -1
  21. package/dist/src/private-to-public/utils/connect.js +77 -16
  22. package/dist/src/private-to-public/utils/connect.js.map +1 -1
  23. package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts +4 -1
  24. package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts.map +1 -1
  25. package/dist/src/private-to-public/utils/get-rtcpeerconnection.js +18 -11
  26. package/dist/src/private-to-public/utils/get-rtcpeerconnection.js.map +1 -1
  27. package/dist/src/private-to-public/utils/sdp.d.ts +3 -1
  28. package/dist/src/private-to-public/utils/sdp.d.ts.map +1 -1
  29. package/dist/src/private-to-public/utils/sdp.js +16 -2
  30. package/dist/src/private-to-public/utils/sdp.js.map +1 -1
  31. package/dist/src/private-to-public/utils/stun-listener.browser.d.ts +9 -0
  32. package/dist/src/private-to-public/utils/stun-listener.browser.d.ts.map +1 -0
  33. package/dist/src/private-to-public/utils/stun-listener.browser.js +6 -0
  34. package/dist/src/private-to-public/utils/stun-listener.browser.js.map +1 -0
  35. package/dist/src/private-to-public/utils/stun-listener.d.ts +2 -4
  36. package/dist/src/private-to-public/utils/stun-listener.d.ts.map +1 -1
  37. package/dist/src/private-to-public/utils/stun-listener.js +8 -2
  38. package/dist/src/private-to-public/utils/stun-listener.js.map +1 -1
  39. package/dist/src/private-to-public/utils/stun.d.ts +34 -0
  40. package/dist/src/private-to-public/utils/stun.d.ts.map +1 -0
  41. package/dist/src/private-to-public/utils/stun.js +107 -0
  42. package/dist/src/private-to-public/utils/stun.js.map +1 -0
  43. package/dist/src/util.d.ts +3 -5
  44. package/dist/src/util.d.ts.map +1 -1
  45. package/dist/src/util.js +3 -24
  46. package/dist/src/util.js.map +1 -1
  47. package/dist/src/webrtc/node-datachannel.browser.d.ts +7 -0
  48. package/dist/src/webrtc/node-datachannel.browser.d.ts.map +1 -0
  49. package/dist/src/webrtc/node-datachannel.browser.js +16 -0
  50. package/dist/src/webrtc/node-datachannel.browser.js.map +1 -0
  51. package/package.json +13 -10
  52. package/src/constants.ts +2 -1
  53. package/src/index.ts +22 -1
  54. package/src/private-to-public/listener.ts +9 -7
  55. package/src/private-to-public/transport.browser.ts +48 -5
  56. package/src/private-to-public/utils/connect.ts +112 -17
  57. package/src/private-to-public/utils/get-rtcpeerconnection.ts +20 -11
  58. package/src/private-to-public/utils/sdp.ts +21 -2
  59. package/src/private-to-public/utils/stun-listener.browser.ts +14 -0
  60. package/src/private-to-public/utils/stun-listener.ts +9 -7
  61. package/src/private-to-public/utils/stun.ts +128 -0
  62. package/src/util.ts +5 -32
  63. package/src/webrtc/node-datachannel.browser.ts +17 -0
  64. package/dist/typedoc-urls.json +0 -14
@@ -1 +1 @@
1
- {"version":3,"file":"get-rtcpeerconnection.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAGxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAI9D,UAAU,2BAA4B,SAAQ,gBAAgB;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAEjB,IAAI,EAAE,2BAA2B;IAmBxC,WAAW,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAOnE,YAAY,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAS1E,OAAO,CAAC,aAAa;IAerB,iBAAiB,IAAK,sBAAsB;CAO7C;AAkBD,MAAM,WAAW,oCAAoC;IACnD,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1F,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA;AACrO,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"get-rtcpeerconnection.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAGxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAI9D,UAAU,2BAA4B,SAAQ,gBAAgB;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,IAAI,EAAE,2BAA2B;IAoBxC,WAAW,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAOnE,YAAY,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAY1E,OAAO,CAAC,mBAAmB;IAe3B,iBAAiB,IAAK,sBAAsB;CAO7C;AAkBD,MAAM,WAAW,oCAAoC;IACnD,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1F,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA;AACrO,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA"}
@@ -4,16 +4,18 @@ import { PeerConnection } from 'node-datachannel';
4
4
  import { RTCPeerConnection } from 'node-datachannel/polyfill';
5
5
  import { DEFAULT_ICE_SERVERS, MAX_MESSAGE_SIZE } from "../../constants.js";
6
6
  import { DataChannelMuxerFactory } from "../../muxer.js";
7
- import { isValidUfrag } from "../../util.js";
8
7
  import { generateTransportCertificate } from "./generate-certificates.js";
8
+ import { isIcePwd, isIceUfrag } from "./stun.js";
9
9
  const crypto = new Crypto();
10
10
  export class DirectRTCPeerConnection extends RTCPeerConnection {
11
11
  peerConnection;
12
12
  ufrag;
13
+ pwd;
13
14
  constructor(init) {
14
15
  super(init);
15
16
  this.peerConnection = init.peerConnection;
16
17
  this.ufrag = init.ufrag;
18
+ this.pwd = init.pwd;
17
19
  // make sure C++ peer connection is garbage collected
18
20
  // https://github.com/murat-dogan/node-datachannel/issues/366#issuecomment-3228453155
19
21
  this.addEventListener('connectionstatechange', () => {
@@ -27,27 +29,30 @@ export class DirectRTCPeerConnection extends RTCPeerConnection {
27
29
  });
28
30
  }
29
31
  async createOffer() {
30
- // have to set ufrag before creating offer
31
- this.setLocalUfrag('offer');
32
+ // have to set the ICE credentials before creating the offer
33
+ this.setLocalCredentials('offer');
32
34
  return super.createOffer();
33
35
  }
34
36
  async createAnswer() {
35
- // have to set ufrag before creating answer
36
- this.setLocalUfrag('answer');
37
+ // have to set the ICE credentials before creating the answer
38
+ this.setLocalCredentials('answer');
37
39
  return super.createAnswer();
38
40
  }
39
- // this.ufrag is reused as the ICE password; an invalid value aborts the process
40
- // inside the native ICE stack, so reject it with a recoverable error first
41
- setLocalUfrag(type) {
41
+ // node-datachannel needs the ICE credentials set before the description is
42
+ // created. On the server they come from an attacker-controlled STUN username
43
+ // and an invalid value aborts the process inside the native ICE stack, so
44
+ // reject it with a recoverable error first. The browser path uses a native
45
+ // RTCPeerConnection and never reaches this class.
46
+ setLocalCredentials(type) {
42
47
  if (this.connectionState !== 'new') {
43
48
  return;
44
49
  }
45
- if (!isValidUfrag(this.ufrag)) {
46
- throw new InvalidParametersError('ufrag is not a valid ICE credential');
50
+ if (!isIceUfrag(this.ufrag) || !isIcePwd(this.pwd)) {
51
+ throw new InvalidParametersError('ufrag or pwd is not a valid ICE credential');
47
52
  }
48
53
  this.peerConnection?.setLocalDescription(type, {
49
54
  iceUfrag: this.ufrag,
50
- icePwd: this.ufrag
55
+ icePwd: this.pwd
51
56
  });
52
57
  }
53
58
  remoteFingerprint() {
@@ -86,9 +91,11 @@ export async function createDialerRTCPeerConnection(role, ufrag, options = {}) {
86
91
  });
87
92
  }
88
93
  const rtcConfig = typeof options.rtcConfiguration === 'function' ? await options.rtcConfiguration() : options.rtcConfiguration;
94
+ const pwd = options.pwd ?? ufrag;
89
95
  const peerConnection = new DirectRTCPeerConnection({
90
96
  ...rtcConfig,
91
97
  ufrag,
98
+ pwd,
92
99
  peerConnection: new PeerConnection(`${role}-${Date.now()}`, {
93
100
  disableFingerprintVerification: true,
94
101
  disableAutoNegotiation: true,
@@ -1 +1 @@
1
- {"version":3,"file":"get-rtcpeerconnection.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-rtcpeerconnection.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import type { MultihashDigest } from 'multiformats/hashes/interface';
5
5
  */
6
6
  export declare const multibaseDecoder: any;
7
7
  export declare function getFingerprintFromSdp(sdp: string | undefined): string | undefined;
8
+ export declare function getIceUfragFromSdp(sdp: string | undefined): string | undefined;
9
+ export declare function getIcePwdFromSdp(sdp: string | undefined): string | undefined;
8
10
  export declare function certhash(ma: Multiaddr): string;
9
11
  /**
10
12
  * Convert a certhash into a multihash
@@ -28,7 +30,7 @@ export declare function serverAnswerFromMultiaddr(ma: Multiaddr, ufrag: string):
28
30
  /**
29
31
  * Create an offer SDP message from a multiaddr
30
32
  */
31
- export declare function clientOfferFromMultiAddr(ma: Multiaddr, ufrag: string): RTCSessionDescriptionInit;
33
+ export declare function clientOfferFromMultiAddr(ma: Multiaddr, ufrag: string, pwd?: string): RTCSessionDescriptionInit;
32
34
  /**
33
35
  * Replace (munge) the ufrag and password values in a SDP
34
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sdp.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/sdp.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE;;GAEG;AAEH,eAAO,MAAM,gBAAgB,EAAE,GAAwE,CAAA;AAGvG,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOlF;AAGD,wBAAgB,QAAQ,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAEjE;AAED,wBAAgB,qBAAqB,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAWrD;AAED,wBAAgB,cAAc,CAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAM9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAWtF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CA+BlG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CA6BjG;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAgBhG"}
1
+ {"version":3,"file":"sdp.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/sdp.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE;;GAEG;AAEH,eAAO,MAAM,gBAAgB,EAAE,GAAwE,CAAA;AAMvG,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOlF;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM7E;AAGD,wBAAgB,QAAQ,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAEjE;AAED,wBAAgB,qBAAqB,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAE,EAAE,EAAE,SAAS,GAAG,MAAM,CAWrD;AAED,wBAAgB,cAAc,CAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAM9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAWtF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CA+BlG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAc,GAAG,yBAAyB,CA6BtH;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAgBhG"}
@@ -13,6 +13,8 @@ import { InvalidFingerprintError, UnsupportedHashAlgorithmError } from "../../er
13
13
  // @ts-expect-error - Not easy to combine these types.
14
14
  export const multibaseDecoder = Object.values(bases).map(b => b.decoder).reduce((d, b) => d.or(b));
15
15
  const fingerprintRegex = /^a=fingerprint:(?:\w+-[0-9]+)\s(?<fingerprint>(:?[0-9a-fA-F]{2})+)$/m;
16
+ const iceUfragRegex = /^a=ice-ufrag:(?<ufrag>[^\r\n]+)$/m;
17
+ const icePwdRegex = /^a=ice-pwd:(?<pwd>[^\r\n]+)$/m;
16
18
  export function getFingerprintFromSdp(sdp) {
17
19
  if (sdp == null) {
18
20
  return undefined;
@@ -20,6 +22,18 @@ export function getFingerprintFromSdp(sdp) {
20
22
  const searchResult = sdp.match(fingerprintRegex);
21
23
  return searchResult?.groups?.fingerprint;
22
24
  }
25
+ export function getIceUfragFromSdp(sdp) {
26
+ if (sdp == null) {
27
+ return undefined;
28
+ }
29
+ return sdp.match(iceUfragRegex)?.groups?.ufrag;
30
+ }
31
+ export function getIcePwdFromSdp(sdp) {
32
+ if (sdp == null) {
33
+ return undefined;
34
+ }
35
+ return sdp.match(icePwdRegex)?.groups?.pwd;
36
+ }
23
37
  // Extract the certhash from a multiaddr
24
38
  export function certhash(ma) {
25
39
  const components = ma.getComponents();
@@ -114,7 +128,7 @@ a=end-of-candidates
114
128
  /**
115
129
  * Create an offer SDP message from a multiaddr
116
130
  */
117
- export function clientOfferFromMultiAddr(ma, ufrag) {
131
+ export function clientOfferFromMultiAddr(ma, ufrag, pwd = ufrag) {
118
132
  const { host, port, type } = getNetConfig(ma);
119
133
  if (type !== 'ip4' && type !== 'ip6') {
120
134
  throw new InvalidParametersError(`Multiaddr ${ma} was not an IPv4 or IPv6 address`);
@@ -129,7 +143,7 @@ m=application ${port} UDP/DTLS/SCTP webrtc-datachannel
129
143
  a=mid:0
130
144
  a=setup:active
131
145
  a=ice-ufrag:${ufrag}
132
- a=ice-pwd:${ufrag}
146
+ a=ice-pwd:${pwd}
133
147
  a=fingerprint:sha-256 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
134
148
  a=sctp-port:5000
135
149
  a=max-message-size:${MAX_MESSAGE_SIZE}
@@ -1 +1 @@
1
- {"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/sdp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdp.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/sdp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { StunRequestCallback } from './stun.ts';
2
+ import type { Logger } from '@libp2p/interface';
3
+ export { parseStunUsernameUfrags } from './stun.ts';
4
+ export interface StunServer {
5
+ close(): Promise<void>;
6
+ address(): never;
7
+ }
8
+ export declare function stunListener(host: string, port: number, log: Logger, cb: StunRequestCallback): Promise<StunServer>;
9
+ //# sourceMappingURL=stun-listener.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stun-listener.browser.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAEnD,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,KAAK,CAAA;CACjB;AAED,wBAAsB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAEzH"}
@@ -0,0 +1,6 @@
1
+ import { UnimplementedError } from "../../error.js";
2
+ export { parseStunUsernameUfrags } from "./stun.js";
3
+ export async function stunListener(host, port, log, cb) {
4
+ throw new UnimplementedError('stunListener');
5
+ }
6
+ //# sourceMappingURL=stun-listener.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stun-listener.browser.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAInD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AAOnD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,EAAuB;IAClG,MAAM,IAAI,kBAAkB,CAAC,cAAc,CAAC,CAAA;AAC9C,CAAC"}
@@ -1,11 +1,9 @@
1
+ import type { StunRequestCallback } from './stun.ts';
1
2
  import type { Logger } from '@libp2p/interface';
2
3
  import type { AddressInfo } from 'node:net';
3
4
  export interface StunServer {
4
5
  close(): Promise<void>;
5
6
  address(): AddressInfo;
6
7
  }
7
- export interface Callback {
8
- (ufrag: string, remoteHost: string, remotePort: number): void;
9
- }
10
- export declare function stunListener(host: string, port: number, log: Logger, cb: Callback): Promise<StunServer>;
8
+ export declare function stunListener(host: string, port: number, log: Logger, cb: StunRequestCallback): Promise<StunServer>;
11
9
  //# sourceMappingURL=stun-listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stun-listener.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,WAAW,CAAA;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9D;AAED,wBAAsB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB9G"}
1
+ {"version":3,"file":"stun-listener.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,WAAW,CAAA;CACvB;AAED,wBAAsB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBzH"}
@@ -1,10 +1,16 @@
1
1
  import { isIPv4 } from '@chainsafe/is-ip';
2
2
  import { IceUdpMuxListener } from 'node-datachannel';
3
- import { handleStunRequest } from "../../util.js";
3
+ import { handleStunRequest } from "./stun.js";
4
4
  export async function stunListener(host, port, log, cb) {
5
5
  const listener = new IceUdpMuxListener(port, host);
6
6
  listener.onUnhandledStunRequest(request => {
7
- handleStunRequest(request, log, cb);
7
+ // this runs inside a native callback where a throw would crash the process
8
+ try {
9
+ handleStunRequest(request, log, cb);
10
+ }
11
+ catch (err) {
12
+ log.error('error handling STUN request from %s:%d - %e', request.host, request.port, err);
13
+ }
8
14
  });
9
15
  return {
10
16
  close: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"stun-listener.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAajD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,EAAY;IACvF,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAClD,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;QACxC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,QAAQ,CAAC,IAAI,EAAE,CAAA;QACjB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACtC,IAAI;aACL,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"stun-listener.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAU7C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,IAAY,EAAE,IAAY,EAAE,GAAW,EAAE,EAAuB;IAClG,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAClD,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;QACxC,2EAA2E;QAC3E,IAAI,CAAC;YACH,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,6CAA6C,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,QAAQ,CAAC,IAAI,EAAE,CAAA;QACjB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACtC,IAAI;aACL,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { Logger } from '@libp2p/interface';
2
+ import type { IceUdpMuxRequest } from 'node-datachannel';
3
+ /**
4
+ * True if `value` is a valid ICE username fragment
5
+ * (RFC 8839 section 5.4: ufrag = 4*256ice-char).
6
+ */
7
+ export declare function isIceUfrag(value: string): boolean;
8
+ /**
9
+ * True if `value` is a valid ICE password
10
+ * (RFC 8839 section 5.4: password = 22*256ice-char).
11
+ */
12
+ export declare function isIcePwd(value: string): boolean;
13
+ export declare function parseStunUsernameUfrags(serverUfrag: string, clientUfrag: string): {
14
+ serverUfrag: string;
15
+ clientUfrag: string;
16
+ } | undefined;
17
+ /**
18
+ * The v2 server ufrag carries the client's ICE password so the server can
19
+ * infer the client's offer from the STUN USERNAME alone.
20
+ */
21
+ export declare function serverUfragV2(clientIcePwd: string): string;
22
+ export declare function decodeV2ClientPwd(serverUfrag: string): string | undefined;
23
+ export interface StunRequestCallback {
24
+ (serverUfrag: string, clientUfrag: string, clientPwd: string | undefined, remoteHost: string, remotePort: number): void;
25
+ }
26
+ /**
27
+ * Validate a STUN request received by the UDP mux listener and forward the ICE
28
+ * credentials it carries. Every value comes from the attacker-controlled STUN
29
+ * USERNAME and is reused as an ICE credential during native connection setup,
30
+ * where an invalid value aborts the process, so anything malformed is dropped
31
+ * here.
32
+ */
33
+ export declare function handleStunRequest(request: IceUdpMuxRequest, log: Logger, cb: StunRequestCallback): void;
34
+ //# sourceMappingURL=stun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stun.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAiBxD;;;GAGG;AACH,wBAAgB,UAAU,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,uBAAuB,CAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAa3I;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,iBAAiB,CAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc1E;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CACxH;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,mBAAmB,GAAG,IAAI,CA0CxG"}
@@ -0,0 +1,107 @@
1
+ import { UFRAG_PREFIX_V1, UFRAG_PREFIX_V2 } from "../../constants.js";
2
+ // ICE credential charset and length, per RFC 8839 section 5.4
3
+ // (ice-char = ALPHA / DIGIT / "+" / "/"; ufrag = 4*256ice-char;
4
+ // password = 22*256ice-char).
5
+ //
6
+ // ice-char is ASCII-only, so any string that passes ICE_CHAR_REGEX has exactly
7
+ // one UTF-16 code unit per character. The String.length checks below therefore
8
+ // equal both the ice-char count and the byte length that go-libp2p measures with
9
+ // len(), so the two implementations accept the same credentials; non-ice-char
10
+ // input (including any multi-byte character) is rejected by both regardless of
11
+ // how each counts length.
12
+ const ICE_CHAR_REGEX = /^[A-Za-z0-9+/]+$/;
13
+ const ICE_UFRAG_MIN_LENGTH = 4;
14
+ const ICE_PWD_MIN_LENGTH = 22;
15
+ const ICE_CREDENTIAL_MAX_LENGTH = 256;
16
+ /**
17
+ * True if `value` is a valid ICE username fragment
18
+ * (RFC 8839 section 5.4: ufrag = 4*256ice-char).
19
+ */
20
+ export function isIceUfrag(value) {
21
+ return value.length >= ICE_UFRAG_MIN_LENGTH && value.length <= ICE_CREDENTIAL_MAX_LENGTH && ICE_CHAR_REGEX.test(value);
22
+ }
23
+ /**
24
+ * True if `value` is a valid ICE password
25
+ * (RFC 8839 section 5.4: password = 22*256ice-char).
26
+ */
27
+ export function isIcePwd(value) {
28
+ return value.length >= ICE_PWD_MIN_LENGTH && value.length <= ICE_CREDENTIAL_MAX_LENGTH && ICE_CHAR_REGEX.test(value);
29
+ }
30
+ export function parseStunUsernameUfrags(serverUfrag, clientUfrag) {
31
+ // Both fragments come from the attacker-controlled STUN USERNAME
32
+ // ("<remote-ufrag>:<local-ufrag>", RFC 8445 section 7.2.2) and are ICE username
33
+ // fragments. Reject anything outside ice-char or the length bounds in RFC 8839
34
+ // section 5.4 before it goes into an SDP offer.
35
+ if (!isIceUfrag(serverUfrag) || !isIceUfrag(clientUfrag)) {
36
+ return undefined;
37
+ }
38
+ return {
39
+ serverUfrag,
40
+ clientUfrag
41
+ };
42
+ }
43
+ /**
44
+ * The v2 server ufrag carries the client's ICE password so the server can
45
+ * infer the client's offer from the STUN USERNAME alone.
46
+ */
47
+ export function serverUfragV2(clientIcePwd) {
48
+ return `${UFRAG_PREFIX_V2}${clientIcePwd}`;
49
+ }
50
+ export function decodeV2ClientPwd(serverUfrag) {
51
+ if (!serverUfrag.startsWith(UFRAG_PREFIX_V2)) {
52
+ return undefined;
53
+ }
54
+ const clientPwd = serverUfrag.substring(UFRAG_PREFIX_V2.length);
55
+ // The recovered value becomes the inferred offer's ice-pwd, so it must be a
56
+ // valid ICE password (ice-char, length 22..256) per RFC 8839 section 5.4.
57
+ if (!isIcePwd(clientPwd)) {
58
+ return undefined;
59
+ }
60
+ return clientPwd;
61
+ }
62
+ /**
63
+ * Validate a STUN request received by the UDP mux listener and forward the ICE
64
+ * credentials it carries. Every value comes from the attacker-controlled STUN
65
+ * USERNAME and is reused as an ICE credential during native connection setup,
66
+ * where an invalid value aborts the process, so anything malformed is dropped
67
+ * here.
68
+ */
69
+ export function handleStunRequest(request, log, cb) {
70
+ if (request.ufrag == null) {
71
+ return;
72
+ }
73
+ // The STUN USERNAME is "server_ufrag:client_ufrag" (RFC 8445 section 7.2.2),
74
+ // libjuice drops usernames without a colon so both halves are always present
75
+ const serverUfrag = request.localUfrag;
76
+ const clientUfrag = request.ufrag;
77
+ const parsed = parseStunUsernameUfrags(serverUfrag, clientUfrag);
78
+ if (parsed == null) {
79
+ log.trace('incoming STUN packet from %s:%d had invalid ufrags %s %s', request.host, request.port, serverUfrag, clientUfrag);
80
+ return;
81
+ }
82
+ // Select the version explicitly from the server ufrag prefix. An unrecognized
83
+ // version is rejected, never assumed to be v1. See https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md.
84
+ if (parsed.serverUfrag.startsWith(UFRAG_PREFIX_V2)) {
85
+ const clientPwd = decodeV2ClientPwd(parsed.serverUfrag);
86
+ if (clientPwd == null) {
87
+ log.trace('incoming v2 STUN packet from %s:%d had an invalid client password %s', request.host, request.port, parsed.serverUfrag);
88
+ return;
89
+ }
90
+ log.trace('incoming v2 STUN packet from %s:%d %s:%s', request.host, request.port, parsed.serverUfrag, parsed.clientUfrag);
91
+ cb(parsed.serverUfrag, parsed.clientUfrag, clientPwd, request.host, request.port);
92
+ return;
93
+ }
94
+ if (parsed.serverUfrag.startsWith(UFRAG_PREFIX_V1)) {
95
+ // v1 reuses both ufrags as ICE passwords, so they must also satisfy the
96
+ // password length bound or native setup aborts the process
97
+ if (!isIcePwd(parsed.serverUfrag) || !isIcePwd(parsed.clientUfrag)) {
98
+ log.trace('incoming v1 STUN packet from %s:%d had ufrags that are not valid ICE passwords %s %s', request.host, request.port, parsed.serverUfrag, parsed.clientUfrag);
99
+ return;
100
+ }
101
+ log.trace('incoming v1 STUN packet from %s:%d %s', request.host, request.port, parsed.serverUfrag);
102
+ cb(parsed.serverUfrag, parsed.clientUfrag, undefined, request.host, request.port);
103
+ return;
104
+ }
105
+ log.trace('incoming STUN packet from %s:%d has an unsupported version prefix %s', request.host, request.port, parsed.serverUfrag);
106
+ }
107
+ //# sourceMappingURL=stun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stun.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/stun.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import type { Logger, LoggerOptions } from '@libp2p/interface';
1
+ import type { LoggerOptions } from '@libp2p/interface';
2
2
  import type { Duplex } from 'it-stream-types';
3
- import type { IceUdpMuxRequest, PeerConnection } from 'node-datachannel';
3
+ import type { PeerConnection } from 'node-datachannel';
4
4
  export declare const nopSource: () => AsyncGenerator<Uint8Array, any, unknown>;
5
5
  export declare const nopSink: (_: any) => Promise<void>;
6
6
  export declare function inertDuplex(): Duplex<any, any, any>;
@@ -11,7 +11,5 @@ export interface AbortPromiseOptions {
11
11
  }
12
12
  export declare function isPeerConnection(obj: any): obj is PeerConnection;
13
13
  export declare function getRtcConfiguration(config?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>)): Promise<RTCConfiguration>;
14
- export declare const genUfrag: (len?: number) => string;
15
- export declare const isValidUfrag: (ufrag: string) => boolean;
16
- export declare function handleStunRequest(request: IceUdpMuxRequest, log: Logger, cb: (ufrag: string, host: string, port: number) => void): void;
14
+ export declare const genUfrag: (len?: number, prefix?: string) => string;
17
15
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAExE,eAAO,MAAM,SAAS,QAA4B,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAI,CAAA;AAE7F,eAAO,MAAM,OAAO,GAAU,GAAG,GAAG,KAAG,OAAO,CAAC,IAAI,CAAO,CAAA;AAG1D,wBAAgB,WAAW,IAAK,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAiBpD;AAED,wBAAgB,aAAa,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAA6B,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA8C1J;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,cAAc,CAEjE;AAED,wBAAsB,mBAAmB,CAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CActJ;AAED,eAAO,MAAM,QAAQ,GAAI,MAAK,MAAW,KAAG,MAE3C,CAAA;AAOD,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAE5C,CAAA;AAKD,wBAAgB,iBAAiB,CAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAaxI"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,eAAO,MAAM,SAAS,QAA4B,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAI,CAAA;AAE7F,eAAO,MAAM,OAAO,GAAU,GAAG,GAAG,KAAG,OAAO,CAAC,IAAI,CAAO,CAAA;AAG1D,wBAAgB,WAAW,IAAK,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAiBpD;AAED,wBAAgB,aAAa,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAA6B,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA8C1J;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,cAAc,CAEjE;AAED,wBAAsB,mBAAmB,CAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CActJ;AAED,eAAO,MAAM,QAAQ,GAAI,MAAK,MAAW,EAAE,SAAQ,MAAwB,KAAG,MAE7E,CAAA"}
package/dist/src/util.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import pDefer from 'p-defer';
2
2
  import pTimeout from 'p-timeout';
3
- import { DATA_CHANNEL_DRAIN_TIMEOUT, DEFAULT_ICE_SERVERS, UFRAG_ALPHABET, UFRAG_PREFIX } from "./constants.js";
3
+ import { DATA_CHANNEL_DRAIN_TIMEOUT, DEFAULT_ICE_SERVERS, UFRAG_ALPHABET, UFRAG_PREFIX_V1 } from "./constants.js";
4
4
  export const nopSource = async function* nop() { };
5
5
  export const nopSink = async (_) => { };
6
6
  // Duplex that does nothing. Needed to fulfill the interface
@@ -78,28 +78,7 @@ export async function getRtcConfiguration(config) {
78
78
  }));
79
79
  return config;
80
80
  }
81
- export const genUfrag = (len = 32) => {
82
- return UFRAG_PREFIX + [...Array(len)].map(() => UFRAG_ALPHABET.at(Math.floor(Math.random() * UFRAG_ALPHABET.length))).join('');
81
+ export const genUfrag = (len = 32, prefix = UFRAG_PREFIX_V1) => {
82
+ return prefix + [...Array(len)].map(() => UFRAG_ALPHABET.at(Math.floor(Math.random() * UFRAG_ALPHABET.length))).join('');
83
83
  };
84
- // WebRTC-direct reuses the ufrag as the ICE password, which RFC 8445 requires to
85
- // be 22-256 chars from the ice-char set [a-zA-Z0-9+/]; other values crash the
86
- // process during native ICE setup, so reject them beforehand.
87
- const ICE_CREDENTIAL_REGEX = /^[a-zA-Z0-9+/]{22,256}$/;
88
- export const isValidUfrag = (ufrag) => {
89
- return ICE_CREDENTIAL_REGEX.test(ufrag);
90
- };
91
- // Validate and forward a STUN request received by the UDP mux listener. The ufrag
92
- // is attacker-controlled and reused as the ICE password in native setup, where an
93
- // invalid value aborts the process, so drop anything that is not a valid credential.
94
- export function handleStunRequest(request, log, cb) {
95
- if (request.ufrag == null) {
96
- return;
97
- }
98
- if (!isValidUfrag(request.ufrag)) {
99
- log.trace('dropping incoming STUN packet from %s:%d with invalid ufrag', request.host, request.port);
100
- return;
101
- }
102
- log.trace('incoming STUN packet from %s:%d %s', request.host, request.port, request.ufrag);
103
- cb(request.ufrag, request.host, request.port);
104
- }
105
84
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class PeerConnection {
2
+ constructor();
3
+ }
4
+ export declare class IceUdpMuxListener {
5
+ constructor();
6
+ }
7
+ //# sourceMappingURL=node-datachannel.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-datachannel.browser.d.ts","sourceRoot":"","sources":["../../../src/webrtc/node-datachannel.browser.ts"],"names":[],"mappings":"AAMA,qBAAa,cAAc;;CAI1B;AAED,qBAAa,iBAAiB;;CAI7B"}
@@ -0,0 +1,16 @@
1
+ class NodeDataChannelUnavailableError extends Error {
2
+ constructor() {
3
+ super('node-datachannel is not available in browsers');
4
+ }
5
+ }
6
+ export class PeerConnection {
7
+ constructor() {
8
+ throw new NodeDataChannelUnavailableError();
9
+ }
10
+ }
11
+ export class IceUdpMuxListener {
12
+ constructor() {
13
+ throw new NodeDataChannelUnavailableError();
14
+ }
15
+ }
16
+ //# sourceMappingURL=node-datachannel.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-datachannel.browser.js","sourceRoot":"","sources":["../../../src/webrtc/node-datachannel.browser.ts"],"names":[],"mappings":"AAAA,MAAM,+BAAgC,SAAQ,KAAK;IACjD;QACE,KAAK,CAAC,+CAA+C,CAAC,CAAA;IACxD,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IACzB;QACE,MAAM,IAAI,+BAA+B,EAAE,CAAA;IAC7C,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IAC5B;QACE,MAAM,IAAI,+BAA+B,EAAE,CAAA;IAC7C,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/webrtc",
3
- "version": "6.0.32",
3
+ "version": "6.0.33-16fba5630",
4
4
  "description": "A libp2p transport using WebRTC connections",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-webrtc#readme",
@@ -46,13 +46,13 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@chainsafe/is-ip": "^2.1.0",
49
- "@libp2p/crypto": "^5.1.23",
50
- "@libp2p/interface": "^3.3.0",
51
- "@libp2p/interface-internal": "^3.1.13",
52
- "@libp2p/keychain": "^6.1.7",
53
- "@libp2p/noise": "^17.0.2",
54
- "@libp2p/peer-id": "^6.0.15",
55
- "@libp2p/utils": "^7.4.1",
49
+ "@libp2p/crypto": "5.1.23-16fba5630",
50
+ "@libp2p/interface": "3.3.0-16fba5630",
51
+ "@libp2p/interface-internal": "3.1.13-16fba5630",
52
+ "@libp2p/keychain": "6.1.7-16fba5630",
53
+ "@libp2p/noise": "17.0.3-16fba5630",
54
+ "@libp2p/peer-id": "6.0.15-16fba5630",
55
+ "@libp2p/utils": "7.4.1-16fba5630",
56
56
  "@multiformats/multiaddr": "^13.0.3",
57
57
  "@multiformats/multiaddr-matcher": "^3.0.2",
58
58
  "@peculiar/webcrypto": "^1.5.0",
@@ -63,7 +63,7 @@
63
63
  "it-protobuf-stream": "^3.0.0",
64
64
  "it-pushable": "^3.2.3",
65
65
  "it-stream-types": "^2.0.2",
66
- "main-event": "^1.0.1",
66
+ "main-event": "^1.0.5",
67
67
  "multiformats": "^14.0.0",
68
68
  "node-datachannel": "^0.33.0",
69
69
  "p-defer": "^4.0.1",
@@ -80,7 +80,7 @@
80
80
  "uint8arrays": "^6.1.1"
81
81
  },
82
82
  "devDependencies": {
83
- "@libp2p/logger": "^6.2.13",
83
+ "@libp2p/logger": "6.2.13-16fba5630",
84
84
  "@types/sinon": "^22.0.0",
85
85
  "aegir": "^48.1.1",
86
86
  "any-signal": "^4.1.1",
@@ -97,6 +97,9 @@
97
97
  "./dist/src/private-to-public/listener.js": "./dist/src/private-to-public/listener.browser.js",
98
98
  "./dist/src/private-to-public/transport.js": "./dist/src/private-to-public/transport.browser.js",
99
99
  "./dist/src/private-to-public/utils/get-rtcpeerconnection.js": "./dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js",
100
+ "./dist/src/private-to-public/utils/stun-listener.js": "./dist/src/private-to-public/utils/stun-listener.browser.js",
101
+ "node-datachannel": "./dist/src/webrtc/node-datachannel.browser.js",
102
+ "node-datachannel/polyfill": "./dist/src/webrtc/index.browser.js",
100
103
  "node:net": false,
101
104
  "node:os": false
102
105
  },