werift 0.22.1 → 0.22.3

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 (244) hide show
  1. package/lib/common/src/binary.d.ts +8 -7
  2. package/lib/common/src/binary.js +5 -2
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/common/src/event.d.ts +1 -0
  5. package/lib/common/src/event.js +5 -0
  6. package/lib/common/src/event.js.map +1 -1
  7. package/lib/common/src/log.d.ts +1 -2
  8. package/lib/common/src/transport.d.ts +4 -1
  9. package/lib/common/src/transport.js +35 -14
  10. package/lib/common/src/transport.js.map +1 -1
  11. package/lib/dtls/src/cipher/create.d.ts +2 -1
  12. package/lib/dtls/src/cipher/create.js.map +1 -1
  13. package/lib/dtls/src/cipher/prf.d.ts +12 -12
  14. package/lib/dtls/src/cipher/suites/abstract.d.ts +2 -1
  15. package/lib/dtls/src/cipher/suites/abstract.js.map +1 -1
  16. package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
  17. package/lib/dtls/src/cipher/suites/aead.js +34 -41
  18. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  19. package/lib/dtls/src/context/cipher.d.ts +4 -4
  20. package/lib/dtls/src/context/cipher.js +25 -15
  21. package/lib/dtls/src/context/cipher.js.map +1 -1
  22. package/lib/dtls/src/context/srtp.d.ts +3 -3
  23. package/lib/dtls/src/context/srtp.js.map +1 -1
  24. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  25. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  26. package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
  27. package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
  28. package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
  29. package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
  30. package/lib/dtls/src/handshake/extensions/useSrtp.js +4 -7
  31. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  32. package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
  33. package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
  34. package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
  35. package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
  36. package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
  37. package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
  38. package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
  39. package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
  40. package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
  41. package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
  42. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
  43. package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
  44. package/lib/dtls/src/handshake/random.d.ts +3 -3
  45. package/lib/dtls/src/record/message/fragment.d.ts +1 -1
  46. package/lib/dtls/src/record/message/header.d.ts +2 -19
  47. package/lib/dtls/src/record/message/header.js +1 -60
  48. package/lib/dtls/src/record/message/header.js.map +1 -1
  49. package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
  50. package/lib/dtls/src/record/message/plaintext.js +34 -16
  51. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  52. package/lib/dtls/src/socket.d.ts +4 -4
  53. package/lib/dtls/src/socket.js.map +1 -1
  54. package/lib/dtls/src/util/binary.d.ts +1 -1
  55. package/lib/ice/src/candidate.js +1 -5
  56. package/lib/ice/src/candidate.js.map +1 -1
  57. package/lib/ice/src/helper.d.ts +1 -1
  58. package/lib/ice/src/ice.d.ts +4 -3
  59. package/lib/ice/src/ice.js +93 -72
  60. package/lib/ice/src/ice.js.map +1 -1
  61. package/lib/ice/src/iceBase.d.ts +21 -2
  62. package/lib/ice/src/iceBase.js +47 -1
  63. package/lib/ice/src/iceBase.js.map +1 -1
  64. package/lib/ice/src/stun/attributes.d.ts +2 -2
  65. package/lib/ice/src/stun/attributes.js +48 -29
  66. package/lib/ice/src/stun/attributes.js.map +1 -1
  67. package/lib/ice/src/stun/message.d.ts +2 -2
  68. package/lib/ice/src/stun/message.js +22 -23
  69. package/lib/ice/src/stun/message.js.map +1 -1
  70. package/lib/ice/src/stun/protocol.d.ts +2 -2
  71. package/lib/ice/src/stun/protocol.js +6 -0
  72. package/lib/ice/src/stun/protocol.js.map +1 -1
  73. package/lib/ice/src/turn/protocol.d.ts +2 -2
  74. package/lib/ice/src/turn/protocol.js +3 -0
  75. package/lib/ice/src/turn/protocol.js.map +1 -1
  76. package/lib/index.mjs +2707 -1883
  77. package/lib/nonstandard/index.mjs +737 -698
  78. package/lib/rtp/src/codec/av1.d.ts +2 -2
  79. package/lib/rtp/src/codec/opus.d.ts +1 -1
  80. package/lib/rtp/src/extra/container/mp4/container.js +18 -8
  81. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  82. package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
  83. package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
  84. package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
  85. package/lib/rtp/src/extra/container/webm/container.d.ts +9 -9
  86. package/lib/rtp/src/extra/container/webm/container.js +24 -12
  87. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  88. package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +35 -1
  89. package/lib/rtp/src/extra/container/webm/ebml/ebml.js +75 -1
  90. package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
  91. package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
  92. package/lib/rtp/src/extra/container/webm/index.d.ts +1 -0
  93. package/lib/rtp/src/extra/container/webm/index.js +1 -0
  94. package/lib/rtp/src/extra/container/webm/index.js.map +1 -1
  95. package/lib/rtp/src/extra/container/webm/util.d.ts +8 -0
  96. package/lib/rtp/src/extra/container/webm/util.js +100 -0
  97. package/lib/rtp/src/extra/container/webm/util.js.map +1 -0
  98. package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
  99. package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
  100. package/lib/rtp/src/extra/processor/dtx.d.ts +1 -1
  101. package/lib/rtp/src/extra/processor/dtx.js +1 -1
  102. package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
  103. package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
  104. package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
  105. package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
  106. package/lib/rtp/src/extra/processor/lipsync.js +1 -1
  107. package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
  108. package/lib/rtp/src/extra/processor/mp4.js +3 -0
  109. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  110. package/lib/rtp/src/extra/processor/mute.d.ts +1 -1
  111. package/lib/rtp/src/extra/processor/mute.js +1 -1
  112. package/lib/rtp/src/extra/processor/mute.js.map +1 -1
  113. package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
  114. package/lib/rtp/src/extra/processor/ntpTime.d.ts +1 -1
  115. package/lib/rtp/src/extra/processor/ntpTime.js +1 -1
  116. package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
  117. package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
  118. package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
  119. package/lib/rtp/src/extra/processor/webm.d.ts +3 -3
  120. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  121. package/lib/rtp/src/extra/processor/webmStream.d.ts +2 -2
  122. package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
  123. package/lib/rtp/src/helper.d.ts +1 -1
  124. package/lib/rtp/src/rtcp/header.d.ts +2 -1
  125. package/lib/rtp/src/rtcp/header.js +10 -0
  126. package/lib/rtp/src/rtcp/header.js.map +1 -1
  127. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
  128. package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
  129. package/lib/rtp/src/rtcp/psfb/index.js +2 -2
  130. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  131. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
  132. package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
  133. package/lib/rtp/src/rtcp/rr.d.ts +2 -2
  134. package/lib/rtp/src/rtcp/rr.js +2 -2
  135. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  136. package/lib/rtp/src/rtcp/rtcp.d.ts +0 -1
  137. package/lib/rtp/src/rtcp/rtcp.js +0 -10
  138. package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
  139. package/lib/rtp/src/rtcp/rtpfb/const.d.ts +1 -0
  140. package/lib/rtp/src/rtcp/rtpfb/const.js +5 -0
  141. package/lib/rtp/src/rtcp/rtpfb/const.js.map +1 -0
  142. package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
  143. package/lib/rtp/src/rtcp/rtpfb/index.js +2 -1
  144. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  145. package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
  146. package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
  147. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  148. package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
  149. package/lib/rtp/src/rtcp/sdes.d.ts +4 -4
  150. package/lib/rtp/src/rtcp/sdes.js +2 -2
  151. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  152. package/lib/rtp/src/rtcp/sr.d.ts +2 -2
  153. package/lib/rtp/src/rtcp/sr.js +2 -2
  154. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  155. package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
  156. package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
  157. package/lib/rtp/src/rtp/rtp.d.ts +2 -2
  158. package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
  159. package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
  160. package/lib/rtp/src/srtp/const.d.ts +3 -3
  161. package/lib/rtp/src/srtp/const.js.map +1 -1
  162. package/lib/rtp/src/srtp/context/context.d.ts +10 -10
  163. package/lib/rtp/src/srtp/context/context.js +10 -4
  164. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  165. package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
  166. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  167. package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
  168. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  169. package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
  170. package/lib/rtp/src/srtp/srtp.d.ts +2 -2
  171. package/lib/sctp/src/chunk.d.ts +12 -12
  172. package/lib/sctp/src/chunk.js +87 -66
  173. package/lib/sctp/src/chunk.js.map +1 -1
  174. package/lib/sctp/src/param.d.ts +3 -3
  175. package/lib/sctp/src/param.js +4 -5
  176. package/lib/sctp/src/param.js.map +1 -1
  177. package/lib/sctp/src/sctp.d.ts +3 -1
  178. package/lib/sctp/src/sctp.js +58 -15
  179. package/lib/sctp/src/sctp.js.map +1 -1
  180. package/lib/webrtc/src/dataChannel.d.ts +15 -4
  181. package/lib/webrtc/src/dataChannel.js +42 -7
  182. package/lib/webrtc/src/dataChannel.js.map +1 -1
  183. package/lib/webrtc/src/index.d.ts +1 -0
  184. package/lib/webrtc/src/index.js +1 -0
  185. package/lib/webrtc/src/index.js.map +1 -1
  186. package/lib/webrtc/src/media/index.d.ts +2 -0
  187. package/lib/webrtc/src/media/index.js +2 -0
  188. package/lib/webrtc/src/media/index.js.map +1 -1
  189. package/lib/webrtc/src/media/parameters.d.ts +2 -2
  190. package/lib/webrtc/src/media/parameters.js.map +1 -1
  191. package/lib/webrtc/src/media/receiver/nack.js +3 -7
  192. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  193. package/lib/webrtc/src/media/receiver/receiverTwcc.d.ts +2 -2
  194. package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
  195. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  196. package/lib/webrtc/src/media/router.js +2 -1
  197. package/lib/webrtc/src/media/router.js.map +1 -1
  198. package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -3
  199. package/lib/webrtc/src/media/rtpReceiver.js +53 -4
  200. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  201. package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
  202. package/lib/webrtc/src/media/rtpSender.js +64 -26
  203. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  204. package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
  205. package/lib/webrtc/src/media/rtpTransceiver.js +30 -26
  206. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  207. package/lib/webrtc/src/media/stats.d.ts +279 -0
  208. package/lib/webrtc/src/media/stats.js +35 -1
  209. package/lib/webrtc/src/media/stats.js.map +1 -1
  210. package/lib/webrtc/src/media/track.js +3 -3
  211. package/lib/webrtc/src/media/track.js.map +1 -1
  212. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  213. package/lib/webrtc/src/nonstandard/userMedia.js +2 -2
  214. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  215. package/lib/webrtc/src/peerConnection.d.ts +35 -64
  216. package/lib/webrtc/src/peerConnection.js +337 -1034
  217. package/lib/webrtc/src/peerConnection.js.map +1 -1
  218. package/lib/webrtc/src/sctpManager.d.ts +27 -0
  219. package/lib/webrtc/src/sctpManager.js +147 -0
  220. package/lib/webrtc/src/sctpManager.js.map +1 -0
  221. package/lib/webrtc/src/sdp.d.ts +3 -2
  222. package/lib/webrtc/src/sdp.js +17 -7
  223. package/lib/webrtc/src/sdp.js.map +1 -1
  224. package/lib/webrtc/src/sdpManager.d.ts +78 -0
  225. package/lib/webrtc/src/sdpManager.js +391 -0
  226. package/lib/webrtc/src/sdpManager.js.map +1 -0
  227. package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
  228. package/lib/webrtc/src/secureTransportManager.js +349 -0
  229. package/lib/webrtc/src/secureTransportManager.js.map +1 -0
  230. package/lib/webrtc/src/transceiverManager.d.ts +40 -0
  231. package/lib/webrtc/src/transceiverManager.js +355 -0
  232. package/lib/webrtc/src/transceiverManager.js.map +1 -0
  233. package/lib/webrtc/src/transport/dtls.d.ts +18 -6
  234. package/lib/webrtc/src/transport/dtls.js +128 -13
  235. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  236. package/lib/webrtc/src/transport/ice.d.ts +24 -0
  237. package/lib/webrtc/src/transport/ice.js +88 -2
  238. package/lib/webrtc/src/transport/ice.js.map +1 -1
  239. package/lib/webrtc/src/transport/sctp.js +13 -26
  240. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  241. package/lib/webrtc/src/utils.d.ts +9 -4
  242. package/lib/webrtc/src/utils.js +34 -13
  243. package/lib/webrtc/src/utils.js.map +1 -1
  244. package/package.json +12 -26
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecureTransportManager = void 0;
4
+ const const_1 = require("./const");
5
+ const common_1 = require("./imports/common");
6
+ const dtls_1 = require("./transport/dtls");
7
+ const ice_1 = require("./transport/ice");
8
+ const utils_1 = require("./utils");
9
+ const log = (0, common_1.debug)("werift:packages/webrtc/src/transport/secureTransportManager.ts");
10
+ class SecureTransportManager {
11
+ constructor({ config, transceiverManager, sctpManager, }) {
12
+ Object.defineProperty(this, "connectionState", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: "new"
17
+ });
18
+ Object.defineProperty(this, "iceConnectionState", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: "new"
23
+ });
24
+ Object.defineProperty(this, "iceGatheringState", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: "new"
29
+ });
30
+ Object.defineProperty(this, "certificate", {
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ value: void 0
35
+ });
36
+ Object.defineProperty(this, "iceGatheringStateChange", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: new common_1.Event()
41
+ });
42
+ Object.defineProperty(this, "iceConnectionStateChange", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: new common_1.Event()
47
+ });
48
+ Object.defineProperty(this, "onIceCandidate", {
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true,
52
+ value: new common_1.Event()
53
+ });
54
+ Object.defineProperty(this, "connectionStateChange", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: new common_1.Event()
59
+ });
60
+ Object.defineProperty(this, "config", {
61
+ enumerable: true,
62
+ configurable: true,
63
+ writable: true,
64
+ value: void 0
65
+ });
66
+ Object.defineProperty(this, "transceiverManager", {
67
+ enumerable: true,
68
+ configurable: true,
69
+ writable: true,
70
+ value: void 0
71
+ });
72
+ Object.defineProperty(this, "sctpManager", {
73
+ enumerable: true,
74
+ configurable: true,
75
+ writable: true,
76
+ value: void 0
77
+ });
78
+ this.config = config;
79
+ this.transceiverManager = transceiverManager;
80
+ this.sctpManager = sctpManager;
81
+ if (this.config.dtls) {
82
+ const { keys } = this.config.dtls;
83
+ if (keys) {
84
+ this.setupCertificate(keys);
85
+ }
86
+ }
87
+ }
88
+ get dtlsTransports() {
89
+ const transports = [
90
+ ...this.transceiverManager.getTransceivers().map((t) => t.dtlsTransport),
91
+ this.sctpManager.sctpTransport?.dtlsTransport,
92
+ ].filter((t) => t != undefined);
93
+ return transports.reduce((acc, cur) => {
94
+ if (!acc.map((d) => d.id).includes(cur.id)) {
95
+ acc.push(cur);
96
+ }
97
+ return acc;
98
+ }, []);
99
+ }
100
+ get iceTransports() {
101
+ return this.dtlsTransports.map((d) => d.iceTransport);
102
+ }
103
+ setupCertificate(keys) {
104
+ this.certificate = new dtls_1.RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash);
105
+ }
106
+ createTransport() {
107
+ const [existing] = this.iceTransports;
108
+ const iceGatherer = new ice_1.RTCIceGatherer({
109
+ ...(0, utils_1.parseIceServers)(this.config.iceServers),
110
+ forceTurn: this.config.iceTransportPolicy === "relay",
111
+ portRange: this.config.icePortRange,
112
+ interfaceAddresses: this.config.iceInterfaceAddresses,
113
+ additionalHostAddresses: this.config.iceAdditionalHostAddresses,
114
+ filterStunResponse: this.config.iceFilterStunResponse,
115
+ filterCandidatePair: this.config.iceFilterCandidatePair,
116
+ localPasswordPrefix: this.config.icePasswordPrefix,
117
+ useIpv4: this.config.iceUseIpv4,
118
+ useIpv6: this.config.iceUseIpv6,
119
+ turnTransport: this.config.forceTurnTCP === true ? "tcp" : "udp",
120
+ useLinkLocalAddress: this.config.iceUseLinkLocalAddress,
121
+ });
122
+ if (existing) {
123
+ iceGatherer.connection.localUsername = existing.connection.localUsername;
124
+ iceGatherer.connection.localPassword = existing.connection.localPassword;
125
+ }
126
+ iceGatherer.onGatheringStateChange.subscribe(() => {
127
+ this.updateIceGatheringState();
128
+ });
129
+ this.updateIceGatheringState();
130
+ const iceTransport = new ice_1.RTCIceTransport(iceGatherer);
131
+ iceTransport.onStateChange.subscribe(() => {
132
+ this.updateIceConnectionState();
133
+ });
134
+ const dtlsTransport = new dtls_1.RTCDtlsTransport(this.config, iceTransport, this.certificate, srtpProfiles);
135
+ return dtlsTransport;
136
+ }
137
+ handleNewIceCandidate({ candidate, media, remoteIsBundled, transceiver, sctpTransport, bundlePolicy, }) {
138
+ // Assign sdpMid and sdpMLineIndex
139
+ if (bundlePolicy === "max-bundle" || remoteIsBundled) {
140
+ candidate.sdpMLineIndex = 0;
141
+ if (media) {
142
+ candidate.sdpMid = media.rtp.muxId;
143
+ }
144
+ }
145
+ else {
146
+ if (transceiver) {
147
+ candidate.sdpMLineIndex = transceiver.mLineIndex;
148
+ candidate.sdpMid = transceiver.mid;
149
+ }
150
+ if (sctpTransport) {
151
+ candidate.sdpMLineIndex = sctpTransport.mLineIndex;
152
+ candidate.sdpMid = sctpTransport.mid;
153
+ }
154
+ }
155
+ if (candidate.foundation &&
156
+ !candidate.foundation.startsWith("candidate:")) {
157
+ candidate.foundation = "candidate:" + candidate.foundation;
158
+ }
159
+ this.onIceCandidate.execute(candidate);
160
+ return candidate;
161
+ }
162
+ async addIceCandidate(sdp, candidateMessage) {
163
+ const candidate = ice_1.IceCandidate.fromJSON(candidateMessage);
164
+ if (!candidate) {
165
+ return;
166
+ }
167
+ let iceTransport;
168
+ if (typeof candidate.sdpMid === "number") {
169
+ iceTransport = this.getTransportByMid(candidate.sdpMid);
170
+ }
171
+ if (!iceTransport && typeof candidate.sdpMLineIndex === "number") {
172
+ iceTransport = this.getTransportByMLineIndex(sdp, candidate.sdpMLineIndex);
173
+ }
174
+ if (!iceTransport) {
175
+ iceTransport = this.iceTransports[0];
176
+ }
177
+ if (iceTransport) {
178
+ await iceTransport.addRemoteCandidate(candidate);
179
+ }
180
+ else {
181
+ log("iceTransport not found for candidate", candidate);
182
+ }
183
+ }
184
+ getTransportByMid(mid) {
185
+ let iceTransport;
186
+ const transceiver = this.transceiverManager
187
+ .getTransceivers()
188
+ .find((t) => t.mid === mid);
189
+ if (transceiver) {
190
+ iceTransport = transceiver.dtlsTransport.iceTransport;
191
+ }
192
+ else if (!iceTransport && this.sctpManager.sctpTransport?.mid === mid) {
193
+ iceTransport = this.sctpManager.sctpTransport.dtlsTransport.iceTransport;
194
+ }
195
+ return iceTransport;
196
+ }
197
+ getTransportByMLineIndex(sdp, index) {
198
+ const media = sdp.media[index];
199
+ if (!media) {
200
+ return;
201
+ }
202
+ const transport = this.getTransportByMid(media.rtp.muxId);
203
+ return transport;
204
+ }
205
+ restartIce() {
206
+ for (const transport of this.iceTransports) {
207
+ transport.restart();
208
+ }
209
+ }
210
+ setLocalRole({ type, role, }) {
211
+ for (const dtlsTransport of this.dtlsTransports) {
212
+ const iceTransport = dtlsTransport.iceTransport;
213
+ if (type === "offer") {
214
+ iceTransport.connection.iceControlling = true;
215
+ }
216
+ else {
217
+ iceTransport.connection.iceControlling = false;
218
+ }
219
+ // RFC 8445 S6.1.1
220
+ if (iceTransport.connection.remoteIsLite) {
221
+ iceTransport.connection.iceControlling = true;
222
+ }
223
+ // # set DTLS role for mediasoup
224
+ if (type === "answer") {
225
+ if (role) {
226
+ dtlsTransport.role = role;
227
+ }
228
+ }
229
+ }
230
+ }
231
+ // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate
232
+ updateIceGatheringState() {
233
+ const all = this.iceTransports;
234
+ function allMatch(...state) {
235
+ return (all.filter((check) => state.includes(check.gatheringState)).length ===
236
+ all.length);
237
+ }
238
+ let newState;
239
+ if (all.length && allMatch("complete")) {
240
+ newState = "complete";
241
+ }
242
+ else if (!all.length || allMatch("new", "complete")) {
243
+ newState = "new";
244
+ }
245
+ else if (all.map((check) => check.gatheringState).includes("gathering")) {
246
+ newState = "gathering";
247
+ }
248
+ else {
249
+ newState = "new";
250
+ }
251
+ if (this.iceGatheringState === newState) {
252
+ return;
253
+ }
254
+ this.iceGatheringState = newState;
255
+ this.iceGatheringStateChange.execute(newState);
256
+ }
257
+ // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate
258
+ updateIceConnectionState() {
259
+ const all = this.iceTransports;
260
+ let newState;
261
+ function allMatch(...state) {
262
+ return (all.filter((check) => state.includes(check.state)).length === all.length);
263
+ }
264
+ function anyMatch(...state) {
265
+ return all.some((check) => state.includes(check.state));
266
+ }
267
+ if (this.connectionState === "closed") {
268
+ newState = "closed";
269
+ }
270
+ else if (anyMatch("failed")) {
271
+ newState = "failed";
272
+ }
273
+ else if (anyMatch("disconnected")) {
274
+ newState = "disconnected";
275
+ }
276
+ else if (allMatch("new", "closed")) {
277
+ newState = "new";
278
+ }
279
+ else if (anyMatch("new", "checking")) {
280
+ newState = "checking";
281
+ }
282
+ else if (allMatch("completed", "closed")) {
283
+ newState = "completed";
284
+ }
285
+ else if (allMatch("connected", "completed", "closed")) {
286
+ newState = "connected";
287
+ }
288
+ else {
289
+ // unreachable?
290
+ newState = "new";
291
+ }
292
+ if (this.iceConnectionState === newState) {
293
+ return;
294
+ }
295
+ log("iceConnectionStateChange", newState);
296
+ this.iceConnectionState = newState;
297
+ this.iceConnectionStateChange.execute(newState);
298
+ }
299
+ async gatherCandidates(remoteIsBundled) {
300
+ const connected = this.iceTransports.find((transport) => transport.state === "connected" || transport.state === "completed");
301
+ if (remoteIsBundled && connected) {
302
+ // no need to gather ice candidates on an existing bundled connection
303
+ log("skipping ICE gathering for bundled connection");
304
+ }
305
+ else {
306
+ await Promise.allSettled(this.iceTransports.map((iceTransport) => iceTransport.gather())).catch((e) => {
307
+ // エラーハンドリングを追加 (例: ログ出力)
308
+ log("gatherCandidates failed", e);
309
+ });
310
+ }
311
+ }
312
+ setConnectionState(state) {
313
+ log("connectionStateChange", state);
314
+ this.connectionState = state;
315
+ this.connectionStateChange.execute(state);
316
+ }
317
+ async getStats() {
318
+ const stats = [];
319
+ for (const dtlsTransport of this.dtlsTransports) {
320
+ const transportStats = await dtlsTransport.getStats();
321
+ if (transportStats) {
322
+ stats.push(...transportStats);
323
+ }
324
+ }
325
+ return stats;
326
+ }
327
+ async ensureCerts() {
328
+ if (!this.certificate) {
329
+ this.certificate = await dtls_1.RTCDtlsTransport.SetupCertificate();
330
+ }
331
+ for (const dtlsTransport of this.dtlsTransports) {
332
+ dtlsTransport.localCertificate = this.certificate;
333
+ }
334
+ }
335
+ async close() {
336
+ this.setConnectionState("closed");
337
+ await Promise.allSettled([...this.dtlsTransports.map((t) => t.stop())]);
338
+ this.iceGatheringStateChange.allUnsubscribe();
339
+ this.iceConnectionStateChange.allUnsubscribe();
340
+ this.onIceCandidate.allUnsubscribe();
341
+ this.connectionStateChange.allUnsubscribe();
342
+ }
343
+ }
344
+ exports.SecureTransportManager = SecureTransportManager;
345
+ const srtpProfiles = [
346
+ const_1.SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer
347
+ const_1.SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,
348
+ ];
349
+ //# sourceMappingURL=secureTransportManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secureTransportManager.js","sourceRoot":"","sources":["../../../src/secureTransportManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { SRTP_PROFILE } from \"./const\";\nimport { Event, debug } from \"./imports/common\";\nimport type { RTCRtpTransceiver, TransceiverManager } from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport type { PeerConfig } from \"./peerConnection\";\nimport type { SctpTransportManager } from \"./sctpManager\";\nimport type { BundlePolicy, MediaDescription, SessionDescription } from \"./sdp\";\nimport {\n type DtlsKeys,\n RTCCertificate,\n RTCDtlsTransport,\n} from \"./transport/dtls\";\nimport { IceCandidate, RTCIceGatherer, RTCIceTransport } from \"./transport/ice\";\nimport type {\n IceGathererState,\n RTCIceCandidate,\n RTCIceCandidateInit,\n RTCIceConnectionState,\n} from \"./transport/ice\";\nimport type { RTCSctpTransport } from \"./transport/sctp\";\nimport type { ConnectionState } from \"./types/domain\";\nimport { parseIceServers } from \"./utils\";\n\nconst log = debug(\n \"werift:packages/webrtc/src/transport/secureTransportManager.ts\",\n);\nexport class SecureTransportManager {\n connectionState: ConnectionState = \"new\";\n iceConnectionState: RTCIceConnectionState = \"new\";\n iceGatheringState: IceGathererState = \"new\";\n certificate?: RTCCertificate;\n\n readonly iceGatheringStateChange = new Event<[IceGathererState]>();\n readonly iceConnectionStateChange = new Event<[RTCIceConnectionState]>();\n readonly onIceCandidate = new Event<[IceCandidate | undefined]>();\n readonly connectionStateChange = new Event<[ConnectionState]>();\n\n private config: PeerConfig;\n private transceiverManager: TransceiverManager;\n private sctpManager: SctpTransportManager;\n\n constructor({\n config,\n transceiverManager,\n sctpManager,\n }: {\n config: PeerConfig;\n transceiverManager: TransceiverManager;\n sctpManager: SctpTransportManager;\n }) {\n this.config = config;\n this.transceiverManager = transceiverManager;\n this.sctpManager = sctpManager;\n\n if (this.config.dtls) {\n const { keys } = this.config.dtls;\n\n if (keys) {\n this.setupCertificate(keys);\n }\n }\n }\n\n get dtlsTransports() {\n const transports = [\n ...this.transceiverManager.getTransceivers().map((t) => t.dtlsTransport),\n this.sctpManager.sctpTransport?.dtlsTransport,\n ].filter((t) => t != undefined);\n\n return transports.reduce((acc: RTCDtlsTransport[], cur) => {\n if (!acc.map((d) => d.id).includes(cur.id)) {\n acc.push(cur);\n }\n return acc;\n }, []);\n }\n\n get iceTransports() {\n return this.dtlsTransports.map((d) => d.iceTransport);\n }\n\n setupCertificate(keys: DtlsKeys) {\n this.certificate = new RTCCertificate(\n keys.keyPem,\n keys.certPem,\n keys.signatureHash,\n );\n }\n\n createTransport() {\n const [existing] = this.iceTransports;\n\n const iceGatherer = new RTCIceGatherer({\n ...parseIceServers(this.config.iceServers),\n forceTurn: this.config.iceTransportPolicy === \"relay\",\n portRange: this.config.icePortRange,\n interfaceAddresses: this.config.iceInterfaceAddresses,\n additionalHostAddresses: this.config.iceAdditionalHostAddresses,\n filterStunResponse: this.config.iceFilterStunResponse,\n filterCandidatePair: this.config.iceFilterCandidatePair,\n localPasswordPrefix: this.config.icePasswordPrefix,\n useIpv4: this.config.iceUseIpv4,\n useIpv6: this.config.iceUseIpv6,\n turnTransport: this.config.forceTurnTCP === true ? \"tcp\" : \"udp\",\n useLinkLocalAddress: this.config.iceUseLinkLocalAddress,\n });\n\n if (existing) {\n iceGatherer.connection.localUsername = existing.connection.localUsername;\n iceGatherer.connection.localPassword = existing.connection.localPassword;\n }\n\n iceGatherer.onGatheringStateChange.subscribe(() => {\n this.updateIceGatheringState();\n });\n this.updateIceGatheringState();\n\n const iceTransport = new RTCIceTransport(iceGatherer);\n iceTransport.onStateChange.subscribe(() => {\n this.updateIceConnectionState();\n });\n\n const dtlsTransport = new RTCDtlsTransport(\n this.config,\n iceTransport,\n this.certificate,\n srtpProfiles,\n );\n\n return dtlsTransport;\n }\n\n handleNewIceCandidate({\n candidate,\n media,\n remoteIsBundled,\n transceiver,\n sctpTransport,\n bundlePolicy,\n }: {\n candidate: IceCandidate;\n media?: MediaDescription;\n remoteIsBundled: boolean;\n transceiver?: RTCRtpTransceiver;\n sctpTransport?: RTCSctpTransport;\n bundlePolicy?: BundlePolicy;\n }) {\n // Assign sdpMid and sdpMLineIndex\n if (bundlePolicy === \"max-bundle\" || remoteIsBundled) {\n candidate.sdpMLineIndex = 0;\n if (media) {\n candidate.sdpMid = media.rtp.muxId;\n }\n } else {\n if (transceiver) {\n candidate.sdpMLineIndex = transceiver.mLineIndex;\n candidate.sdpMid = transceiver.mid;\n }\n if (sctpTransport) {\n candidate.sdpMLineIndex = sctpTransport.mLineIndex;\n candidate.sdpMid = sctpTransport.mid;\n }\n }\n\n if (\n candidate.foundation &&\n !candidate.foundation.startsWith(\"candidate:\")\n ) {\n candidate.foundation = \"candidate:\" + candidate.foundation;\n }\n\n this.onIceCandidate.execute(candidate);\n\n return candidate;\n }\n\n async addIceCandidate(\n sdp: SessionDescription,\n candidateMessage: RTCIceCandidate | RTCIceCandidateInit,\n ) {\n const candidate = IceCandidate.fromJSON(candidateMessage);\n if (!candidate) {\n return;\n }\n\n let iceTransport: RTCIceTransport | undefined;\n\n if (typeof candidate.sdpMid === \"number\") {\n iceTransport = this.getTransportByMid(candidate.sdpMid);\n }\n\n if (!iceTransport && typeof candidate.sdpMLineIndex === \"number\") {\n iceTransport = this.getTransportByMLineIndex(\n sdp,\n candidate.sdpMLineIndex,\n );\n }\n\n if (!iceTransport) {\n iceTransport = this.iceTransports[0];\n }\n\n if (iceTransport) {\n await iceTransport.addRemoteCandidate(candidate);\n } else {\n log(\"iceTransport not found for candidate\", candidate);\n }\n }\n\n private getTransportByMid(mid: string) {\n let iceTransport: RTCIceTransport | undefined;\n\n const transceiver = this.transceiverManager\n .getTransceivers()\n .find((t) => t.mid === mid);\n if (transceiver) {\n iceTransport = transceiver.dtlsTransport.iceTransport;\n } else if (!iceTransport && this.sctpManager.sctpTransport?.mid === mid) {\n iceTransport = this.sctpManager.sctpTransport.dtlsTransport.iceTransport;\n }\n\n return iceTransport;\n }\n\n private getTransportByMLineIndex(sdp: SessionDescription, index: number) {\n const media = sdp.media[index];\n if (!media) {\n return;\n }\n const transport = this.getTransportByMid(media.rtp.muxId!);\n\n return transport;\n }\n\n restartIce() {\n for (const transport of this.iceTransports) {\n transport.restart();\n }\n }\n\n setLocalRole({\n type,\n role,\n }: {\n type: \"offer\" | \"answer\";\n role: \"auto\" | \"client\" | \"server\" | undefined;\n }) {\n for (const dtlsTransport of this.dtlsTransports) {\n const iceTransport = dtlsTransport.iceTransport;\n if (type === \"offer\") {\n iceTransport.connection.iceControlling = true;\n } else {\n iceTransport.connection.iceControlling = false;\n }\n // RFC 8445 S6.1.1\n if (iceTransport.connection.remoteIsLite) {\n iceTransport.connection.iceControlling = true;\n }\n\n // # set DTLS role for mediasoup\n if (type === \"answer\") {\n if (role) {\n dtlsTransport.role = role;\n }\n }\n }\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtcicegatheringstate\n private updateIceGatheringState() {\n const all = this.iceTransports;\n\n function allMatch(...state: IceGathererState[]) {\n return (\n all.filter((check) => state.includes(check.gatheringState)).length ===\n all.length\n );\n }\n\n let newState: IceGathererState;\n\n if (all.length && allMatch(\"complete\")) {\n newState = \"complete\";\n } else if (!all.length || allMatch(\"new\", \"complete\")) {\n newState = \"new\";\n } else if (all.map((check) => check.gatheringState).includes(\"gathering\")) {\n newState = \"gathering\";\n } else {\n newState = \"new\";\n }\n\n if (this.iceGatheringState === newState) {\n return;\n }\n\n this.iceGatheringState = newState;\n this.iceGatheringStateChange.execute(newState);\n }\n\n // https://w3c.github.io/webrtc-pc/#dom-rtciceconnectionstate\n updateIceConnectionState() {\n const all = this.iceTransports;\n let newState: RTCIceConnectionState;\n\n function allMatch(...state: RTCIceConnectionState[]) {\n return (\n all.filter((check) => state.includes(check.state)).length === all.length\n );\n }\n\n function anyMatch(...state: RTCIceConnectionState[]) {\n return all.some((check) => state.includes(check.state));\n }\n\n if (this.connectionState === \"closed\") {\n newState = \"closed\";\n } else if (anyMatch(\"failed\")) {\n newState = \"failed\";\n } else if (anyMatch(\"disconnected\")) {\n newState = \"disconnected\";\n } else if (allMatch(\"new\", \"closed\")) {\n newState = \"new\";\n } else if (anyMatch(\"new\", \"checking\")) {\n newState = \"checking\";\n } else if (allMatch(\"completed\", \"closed\")) {\n newState = \"completed\";\n } else if (allMatch(\"connected\", \"completed\", \"closed\")) {\n newState = \"connected\";\n } else {\n // unreachable?\n newState = \"new\";\n }\n\n if (this.iceConnectionState === newState) {\n return;\n }\n\n log(\"iceConnectionStateChange\", newState);\n this.iceConnectionState = newState;\n this.iceConnectionStateChange.execute(newState);\n }\n\n async gatherCandidates(remoteIsBundled: boolean) {\n const connected = this.iceTransports.find(\n (transport) =>\n transport.state === \"connected\" || transport.state === \"completed\",\n );\n if (remoteIsBundled && connected) {\n // no need to gather ice candidates on an existing bundled connection\n log(\"skipping ICE gathering for bundled connection\");\n } else {\n await Promise.allSettled(\n this.iceTransports.map((iceTransport) => iceTransport.gather()),\n ).catch((e) => {\n // エラーハンドリングを追加 (例: ログ出力)\n log(\"gatherCandidates failed\", e);\n });\n }\n }\n\n setConnectionState(state: ConnectionState) {\n log(\"connectionStateChange\", state);\n this.connectionState = state;\n this.connectionStateChange.execute(state);\n }\n\n async getStats(): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const dtlsTransport of this.dtlsTransports) {\n const transportStats = await dtlsTransport.getStats();\n if (transportStats) {\n stats.push(...transportStats);\n }\n }\n\n return stats;\n }\n\n async ensureCerts() {\n if (!this.certificate) {\n this.certificate = await RTCDtlsTransport.SetupCertificate();\n }\n\n for (const dtlsTransport of this.dtlsTransports) {\n dtlsTransport.localCertificate = this.certificate;\n }\n }\n\n async close() {\n this.setConnectionState(\"closed\");\n\n await Promise.allSettled([...this.dtlsTransports.map((t) => t.stop())]);\n\n this.iceGatheringStateChange.allUnsubscribe();\n this.iceConnectionStateChange.allUnsubscribe();\n this.onIceCandidate.allUnsubscribe();\n this.connectionStateChange.allUnsubscribe();\n }\n}\n\nconst srtpProfiles = [\n SRTP_PROFILE.SRTP_AEAD_AES_128_GCM, // prefer\n SRTP_PROFILE.SRTP_AES128_CM_HMAC_SHA1_80,\n];\n"]}
@@ -0,0 +1,40 @@
1
+ import { Event } from "./imports/common";
2
+ import { MediaStream, type MediaStreamTrack, type RTCRtpParameters, type RTCRtpReceiveParameters, RTCRtpReceiver, RTCRtpSender, RTCRtpTransceiver, type RtpRouter, type TransceiverOptions } from "./media";
3
+ import type { RTCStats } from "./media/stats";
4
+ import { type PeerConfig } from "./peerConnection";
5
+ import { type MediaDescription } from "./sdp";
6
+ import type { RTCDtlsTransport } from "./transport/dtls";
7
+ import type { Kind } from "./types/domain";
8
+ export declare class TransceiverManager {
9
+ private readonly cname;
10
+ private readonly config;
11
+ private readonly router;
12
+ private readonly transceivers;
13
+ readonly onTransceiverAdded: Event<[RTCRtpTransceiver]>;
14
+ readonly onRemoteTransceiverAdded: Event<[RTCRtpTransceiver]>;
15
+ readonly onTrack: Event<[{
16
+ track: MediaStreamTrack;
17
+ transceiver: RTCRtpTransceiver;
18
+ stream: MediaStream;
19
+ }]>;
20
+ readonly onNegotiationNeeded: Event<[]>;
21
+ constructor(cname: string, config: Required<PeerConfig>, router: RtpRouter);
22
+ getTransceivers(): RTCRtpTransceiver[];
23
+ getSenders(): RTCRtpSender[];
24
+ getReceivers(): RTCRtpReceiver[];
25
+ getTransceiverByMLineIndex(index: number): RTCRtpTransceiver | undefined;
26
+ pushTransceiver(t: RTCRtpTransceiver): void;
27
+ replaceTransceiver(t: RTCRtpTransceiver, index: number): void;
28
+ addTransceiver(trackOrKind: Kind | MediaStreamTrack, dtlsTransport?: RTCDtlsTransport, options?: Partial<TransceiverOptions>): RTCRtpTransceiver;
29
+ addTrack(track: MediaStreamTrack, ms?: MediaStream): RTCRtpTransceiver;
30
+ removeTrack(sender: RTCRtpSender): void;
31
+ assignTransceiverCodecs(transceiver: RTCRtpTransceiver): void;
32
+ getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters;
33
+ getRemoteRtpParams(media: MediaDescription, transceiver: RTCRtpTransceiver): RTCRtpReceiveParameters;
34
+ setRemoteRTP(transceiver: RTCRtpTransceiver, remoteMedia: MediaDescription, type: "offer" | "answer", mLineIndex: number): void;
35
+ getStats(selector?: MediaStreamTrack | null): Promise<RTCStats[]>;
36
+ /**
37
+ * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド
38
+ */
39
+ close(): void;
40
+ }