@libp2p/webrtc 6.0.33 → 6.1.0-974e63f20
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/README.md +35 -1
- package/dist/index.min.js +9 -9
- package/dist/index.min.js.map +4 -4
- package/dist/src/constants.d.ts +2 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +2 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/index.d.ts +35 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +35 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/private-to-public/listener.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.js +9 -7
- package/dist/src/private-to-public/listener.js.map +1 -1
- package/dist/src/private-to-public/transport.browser.d.ts +9 -0
- package/dist/src/private-to-public/transport.browser.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.browser.js +33 -5
- package/dist/src/private-to-public/transport.browser.js.map +1 -1
- package/dist/src/private-to-public/utils/connect.d.ts +16 -0
- package/dist/src/private-to-public/utils/connect.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/connect.js +77 -16
- package/dist/src/private-to-public/utils/connect.js.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts +4 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.js +18 -11
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.js.map +1 -1
- package/dist/src/private-to-public/utils/sdp.d.ts +3 -1
- package/dist/src/private-to-public/utils/sdp.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/sdp.js +16 -2
- package/dist/src/private-to-public/utils/sdp.js.map +1 -1
- package/dist/src/private-to-public/utils/stun-listener.browser.d.ts +9 -0
- package/dist/src/private-to-public/utils/stun-listener.browser.d.ts.map +1 -0
- package/dist/src/private-to-public/utils/stun-listener.browser.js +6 -0
- package/dist/src/private-to-public/utils/stun-listener.browser.js.map +1 -0
- package/dist/src/private-to-public/utils/stun-listener.d.ts +2 -4
- package/dist/src/private-to-public/utils/stun-listener.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/stun-listener.js +8 -2
- package/dist/src/private-to-public/utils/stun-listener.js.map +1 -1
- package/dist/src/private-to-public/utils/stun.d.ts +34 -0
- package/dist/src/private-to-public/utils/stun.d.ts.map +1 -0
- package/dist/src/private-to-public/utils/stun.js +107 -0
- package/dist/src/private-to-public/utils/stun.js.map +1 -0
- package/dist/src/util.d.ts +3 -5
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +3 -24
- package/dist/src/util.js.map +1 -1
- package/dist/src/webrtc/node-datachannel.browser.d.ts +7 -0
- package/dist/src/webrtc/node-datachannel.browser.d.ts.map +1 -0
- package/dist/src/webrtc/node-datachannel.browser.js +16 -0
- package/dist/src/webrtc/node-datachannel.browser.js.map +1 -0
- package/package.json +22 -11
- package/src/constants.ts +2 -1
- package/src/index.ts +35 -1
- package/src/private-to-public/listener.ts +9 -7
- package/src/private-to-public/transport.browser.ts +48 -5
- package/src/private-to-public/utils/connect.ts +112 -17
- package/src/private-to-public/utils/get-rtcpeerconnection.ts +20 -11
- package/src/private-to-public/utils/sdp.ts +21 -2
- package/src/private-to-public/utils/stun-listener.browser.ts +14 -0
- package/src/private-to-public/utils/stun-listener.ts +9 -7
- package/src/private-to-public/utils/stun.ts +128 -0
- package/src/util.ts +5 -32
- package/src/webrtc/node-datachannel.browser.ts +17 -0
- package/dist/typedoc-urls.json +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AA+C/D,SAAS,QAAQ,CAAE,OAAsC,EAAE,cAAmB;IAC5E,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAA;AAClC,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,mBAAmB,CAAE,cAA2D,EAAE,KAAgC,EAAE,KAAa,EAAE,GAAW;IAC3J,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;IAE1E,IAAI,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAA;QAClE,MAAM,cAAc,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACvD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,4EAA4E;QAC5E,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC5C,MAAM,GAAG,CAAA;QACX,CAAC;QAED,GAAG,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAA;QACxD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,EAAE,GAAG,CAAA;IAErD,OAAO,GAAG,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAA;AAC/F,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,cAAc,CAAE,cAA2D,EAAE,KAAgC,EAAE,KAAa,EAAE,OAAsB;IACjK,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACtF,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAA;QAEhC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,oBAAoB,CAAC,iFAAiF,CAAC,CAAA;QACnH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;IAC7F,CAAC;IAED,6EAA6E;IAC7E,iEAAiE;IACjE,IAAI,cAAc,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7D,MAAM,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IAE3E,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,uEAAuE;QACvE,6EAA6E;QAC7E,MAAM,IAAI,oBAAoB,CAAC,8EAA8E,CAAC,CAAA;IAChH,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAE3C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,0DAA0D;QAC1D,MAAM,IAAI,oBAAoB,CAAC,+DAA+D,CAAC,CAAA;IACjG,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,OAAO,CAAE,cAA2D,EAAE,YAAqC,EAAE,KAAa,EAAE,OAAsC;IACtL,qEAAqE;IACrE,0EAA0E;IAC1E,+CAA+C;IAC/C,MAAM,oBAAoB,GAAG,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAE9F,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,iEAAiE;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,CAAA;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;YAEhE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAClF,MAAM,SAAS,GAAG,GAAG,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;YAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;YACxE,MAAM,cAAc,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QACtD,CAAC;aAAM,CAAC;YACN,iEAAiE;YACjE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAA;YAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,WAAW,CAAA;YAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;YACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;YAC7E,MAAM,cAAc,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACjD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAA;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAEhD,uEAAuE;YACvE,oEAAoE;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;YACvE,MAAM,cAAc,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,oBAAoB,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2DAA2D,EAAE,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAA;YAC7H,MAAM,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACrD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAE9D,IAAI,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtC,wEAAwE;YACxE,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,cAAc,CAAC,iBAAiB,EAAE,EAAE,KAAK,IAAI,EAAE,CAAA;YACzE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC5F,CAAC;QAED,sBAAsB;QACtB,sEAAsE;QACtE,uCAAuC;QACvC,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,gBAAgB,GAAG,GAAG,CAAC,qBAAqB,CAAC,cAAc,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;QAExF,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,oBAAoB,CAAC,sDAAsD,CAAC,CAAA;QACxF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAChE,MAAM,aAAa,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAE/F,wEAAwE;QACxE,4DAA4D;QAC5D,MAAM,mBAAmB,GAAG,KAAK,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QAE5E,MAAM,eAAe,GAAG,YAAY,CAAC;YACnC,OAAO,EAAE,oBAAoB;YAC7B,SAAS,EAAE,UAAU;YACrB,WAAW,EAAE,IAAI;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAA;QAEF,yDAAyD;QACzD,+DAA+D;QAC/D,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACnC,oCAAoC;YACpC,cAAc;YACd,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC7D,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,iCAAiC,CAAC;SACpE,CAAC,CAAA;QAEF,cAAc,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC5D,QAAQ,cAAc,CAAC,eAAe,EAAE,CAAC;gBACvC,KAAK,QAAQ,CAAC;gBACd,KAAK,cAAc,CAAC;gBACpB,KAAK,QAAQ;oBACX,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;wBACvD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBACnB,CAAC,CAAC,CAAA;oBACF,MAAK;gBACP;oBACE,MAAK;YACT,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,+BAA+B;QAC/B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;QAEpD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,sEAAsE;YACtE,sEAAsE;YACtE,mBAAmB;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,eAAe,EAAE;gBACtE,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,0BAA0B,EAAE,IAAI;aACjC,CAAC,CAAA;YAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YACtD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE;gBAChE,cAAc,EAAE,IAAI;gBACpB,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,YAAY;gBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAA;YAEF,OAAO,UAAU,CAAA;QACnB,CAAC;QAED,yEAAyE;QACzE,4EAA4E;QAC5E,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC,eAAe,EAAE;YACvE,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,0BAA0B,EAAE,IAAI;SACjC,CAAC,CAAA;QAEF,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QAE9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAErD,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE;YAC5C,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qEAAqE;QACrE,YAAY,CAAC,KAAK,EAAE,CAAA;QACpB,oBAAoB,CAAC,KAAK,EAAE,CAAA;QAC5B,cAAc,CAAC,KAAK,EAAE,CAAA;QAEtB,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -6,15 +6,17 @@ import type { CounterGroup, Logger } from '@libp2p/interface';
|
|
|
6
6
|
import type { CertificateFingerprint } from 'node-datachannel';
|
|
7
7
|
interface DirectRTCPeerConnectionInit extends RTCConfiguration {
|
|
8
8
|
ufrag: string;
|
|
9
|
+
pwd: string;
|
|
9
10
|
peerConnection: PeerConnection;
|
|
10
11
|
}
|
|
11
12
|
export declare class DirectRTCPeerConnection extends RTCPeerConnection {
|
|
12
13
|
private peerConnection;
|
|
13
14
|
private readonly ufrag;
|
|
15
|
+
private readonly pwd;
|
|
14
16
|
constructor(init: DirectRTCPeerConnectionInit);
|
|
15
17
|
createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any>;
|
|
16
18
|
createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any>;
|
|
17
|
-
private
|
|
19
|
+
private setLocalCredentials;
|
|
18
20
|
remoteFingerprint(): CertificateFingerprint;
|
|
19
21
|
}
|
|
20
22
|
export interface CreateDialerRTCPeerConnectionOptions {
|
|
@@ -24,6 +26,7 @@ export interface CreateDialerRTCPeerConnectionOptions {
|
|
|
24
26
|
log?: Logger;
|
|
25
27
|
dataChannel?: DataChannelOptions;
|
|
26
28
|
maxEarlyStreams?: number;
|
|
29
|
+
pwd?: string;
|
|
27
30
|
}
|
|
28
31
|
export declare function createDialerRTCPeerConnection(role: 'client', ufrag: string, options?: CreateDialerRTCPeerConnectionOptions): Promise<{
|
|
29
32
|
peerConnection: globalThis.RTCPeerConnection;
|
|
@@ -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;
|
|
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
|
|
31
|
-
this.
|
|
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
|
|
36
|
-
this.
|
|
37
|
+
// have to set the ICE credentials before creating the answer
|
|
38
|
+
this.setLocalCredentials('answer');
|
|
37
39
|
return super.createAnswer();
|
|
38
40
|
}
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
|
|
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 (!
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,
|
|
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;
|
|
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:${
|
|
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
|
|
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,
|
|
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 "
|
|
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
|
-
|
|
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,
|
|
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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"}
|
package/dist/src/util.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LoggerOptions } from '@libp2p/interface';
|
|
2
2
|
import type { Duplex } from 'it-stream-types';
|
|
3
|
-
import type {
|
|
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
|
package/dist/src/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,
|
|
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,
|
|
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
|
|
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
|
package/dist/src/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,QAAQ,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|