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,391 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SDPManager = void 0;
4
+ const const_1 = require("./const");
5
+ const parameters_1 = require("./media/parameters");
6
+ const sdp_1 = require("./sdp");
7
+ const sctp_1 = require("./transport/sctp");
8
+ const utils_1 = require("./utils");
9
+ class SDPManager {
10
+ constructor({ cname, midSuffix, bundlePolicy, }) {
11
+ Object.defineProperty(this, "currentLocalDescription", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: void 0
16
+ });
17
+ Object.defineProperty(this, "currentRemoteDescription", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ Object.defineProperty(this, "pendingLocalDescription", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "pendingRemoteDescription", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: void 0
34
+ });
35
+ Object.defineProperty(this, "cname", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: void 0
40
+ });
41
+ Object.defineProperty(this, "midSuffix", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: void 0
46
+ });
47
+ Object.defineProperty(this, "bundlePolicy", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: void 0
52
+ });
53
+ Object.defineProperty(this, "seenMid", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: new Set()
58
+ });
59
+ this.cname = cname;
60
+ this.midSuffix = midSuffix ?? false;
61
+ this.bundlePolicy = bundlePolicy;
62
+ }
63
+ get localDescription() {
64
+ if (!this._localDescription) {
65
+ return undefined;
66
+ }
67
+ return this._localDescription.toJSON();
68
+ }
69
+ get remoteDescription() {
70
+ if (!this._remoteDescription) {
71
+ return undefined;
72
+ }
73
+ return this._remoteDescription.toJSON();
74
+ }
75
+ /**@private */
76
+ get _localDescription() {
77
+ return this.pendingLocalDescription || this.currentLocalDescription;
78
+ }
79
+ /**@private */
80
+ get _remoteDescription() {
81
+ return this.pendingRemoteDescription || this.currentRemoteDescription;
82
+ }
83
+ get inactiveRemoteMedia() {
84
+ return this._remoteDescription?.media?.find?.((m) => m.direction === "inactive");
85
+ }
86
+ /**
87
+ * MediaDescriptionをトランシーバー用に作成
88
+ */
89
+ createMediaDescriptionForTransceiver(transceiver, direction) {
90
+ const media = new sdp_1.MediaDescription(transceiver.kind, 9, "UDP/TLS/RTP/SAVPF", transceiver.codecs.map((c) => c.payloadType));
91
+ media.direction = direction;
92
+ media.msid = transceiver.msid;
93
+ media.rtp = {
94
+ codecs: transceiver.codecs,
95
+ headerExtensions: transceiver.headerExtensions,
96
+ muxId: transceiver.mid,
97
+ };
98
+ media.rtcpHost = "0.0.0.0";
99
+ media.rtcpPort = 9;
100
+ media.rtcpMux = true;
101
+ media.ssrc = [
102
+ new sdp_1.SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),
103
+ ];
104
+ if (transceiver.options.simulcast) {
105
+ media.simulcastParameters = transceiver.options.simulcast.map((o) => new parameters_1.RTCRtpSimulcastParameters(o));
106
+ }
107
+ if (media.rtp.codecs.find((c) => c.name.toLowerCase() === "rtx")) {
108
+ media.ssrc.push(new sdp_1.SsrcDescription({
109
+ ssrc: transceiver.sender.rtxSsrc,
110
+ cname: this.cname,
111
+ }));
112
+ media.ssrcGroup = [
113
+ new sdp_1.GroupDescription("FID", [
114
+ transceiver.sender.ssrc.toString(),
115
+ transceiver.sender.rtxSsrc.toString(),
116
+ ]),
117
+ ];
118
+ }
119
+ this.addTransportDescription(media, transceiver.dtlsTransport);
120
+ return media;
121
+ }
122
+ /**
123
+ * MediaDescriptionをSCTP用に作成
124
+ */
125
+ createMediaDescriptionForSctp(sctp) {
126
+ const media = new sdp_1.MediaDescription("application", const_1.DISCARD_PORT, "UDP/DTLS/SCTP", ["webrtc-datachannel"]);
127
+ media.sctpPort = sctp.port;
128
+ media.rtp.muxId = sctp.mid;
129
+ media.sctpCapabilities = sctp_1.RTCSctpTransport.getCapabilities();
130
+ this.addTransportDescription(media, sctp.dtlsTransport);
131
+ return media;
132
+ }
133
+ /**
134
+ * トランスポートの情報をMediaDescriptionに追加
135
+ */
136
+ addTransportDescription(media, dtlsTransport) {
137
+ const iceTransport = dtlsTransport.iceTransport;
138
+ media.iceCandidates = iceTransport.localCandidates;
139
+ media.iceCandidatesComplete = iceTransport.gatheringState === "complete";
140
+ media.iceParams = iceTransport.localParameters;
141
+ media.iceOptions = "trickle";
142
+ media.host = const_1.DISCARD_HOST;
143
+ media.port = const_1.DISCARD_PORT;
144
+ if (media.direction === "inactive") {
145
+ media.port = 0;
146
+ media.msid = undefined;
147
+ }
148
+ if (!media.dtlsParams) {
149
+ media.dtlsParams = dtlsTransport.localParameters;
150
+ if (!media.dtlsParams.fingerprints) {
151
+ media.dtlsParams.fingerprints =
152
+ dtlsTransport.localParameters.fingerprints;
153
+ }
154
+ }
155
+ }
156
+ /**
157
+ * 一意のMIDを割り当て
158
+ */
159
+ allocateMid(type = "") {
160
+ let mid = "";
161
+ for (let i = 0;;) {
162
+ // rfc9143.html#name-security-considerations
163
+ // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension
164
+ mid = (i++).toString() + type;
165
+ if (!this.seenMid.has(mid))
166
+ break;
167
+ }
168
+ this.seenMid.add(mid);
169
+ return mid;
170
+ }
171
+ parseSdp({ sdp, isLocal, signalingState, type, }) {
172
+ const description = sdp_1.SessionDescription.parse(sdp);
173
+ this.validateDescription({ description, isLocal, signalingState });
174
+ description.type = type;
175
+ return description;
176
+ }
177
+ validateDescription({ description, isLocal, signalingState, }) {
178
+ if (isLocal) {
179
+ if (description.type === "offer") {
180
+ if (!["stable", "have-local-offer"].includes(signalingState))
181
+ throw new Error("Cannot handle offer in signaling state");
182
+ }
183
+ else if (description.type === "answer") {
184
+ if (!["have-remote-offer", "have-local-pranswer"].includes(signalingState)) {
185
+ throw new Error("Cannot handle answer in signaling state");
186
+ }
187
+ }
188
+ }
189
+ else {
190
+ if (description.type === "offer") {
191
+ if (!["stable", "have-remote-offer"].includes(signalingState)) {
192
+ throw new Error("Cannot handle offer in signaling state");
193
+ }
194
+ }
195
+ else if (description.type === "answer") {
196
+ if (!["have-local-offer", "have-remote-pranswer"].includes(signalingState)) {
197
+ throw new Error("Cannot handle answer in signaling state");
198
+ }
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * オファーSDPを構築
204
+ */
205
+ buildOfferSdp(transceivers, sctpTransport) {
206
+ const description = new sdp_1.SessionDescription();
207
+ (0, sdp_1.addSDPHeader)("offer", description);
208
+ // # handle existing transceivers / sctp
209
+ const currentMedia = this.currentLocalDescription?.media ?? [];
210
+ currentMedia.forEach((m, i) => {
211
+ const mid = m.rtp.muxId;
212
+ if (!mid) {
213
+ return;
214
+ }
215
+ if (m.kind === "application") {
216
+ if (!sctpTransport) {
217
+ throw new Error("sctpTransport not found");
218
+ }
219
+ sctpTransport.mLineIndex = i;
220
+ description.media.push(this.createMediaDescriptionForSctp(sctpTransport));
221
+ }
222
+ else {
223
+ const transceiver = transceivers.find((t) => t.mid === mid);
224
+ if (!transceiver) {
225
+ if (m.direction === "inactive") {
226
+ description.media.push(m);
227
+ return;
228
+ }
229
+ throw new Error("transceiver not found");
230
+ }
231
+ transceiver.mLineIndex = i;
232
+ description.media.push(this.createMediaDescriptionForTransceiver(transceiver, transceiver.direction));
233
+ }
234
+ });
235
+ // # handle new transceivers / sctp
236
+ for (const transceiver of transceivers.filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))) {
237
+ if (transceiver.mid == undefined) {
238
+ transceiver.mid = this.allocateMid(this.midSuffix ? "av" : "");
239
+ }
240
+ const mediaDescription = this.createMediaDescriptionForTransceiver(transceiver, transceiver.direction);
241
+ if (transceiver.mLineIndex === undefined) {
242
+ transceiver.mLineIndex = description.media.length;
243
+ description.media.push(mediaDescription);
244
+ }
245
+ else {
246
+ description.media[transceiver.mLineIndex] = mediaDescription;
247
+ }
248
+ }
249
+ if (sctpTransport &&
250
+ !description.media.find((m) => m.kind === "application")) {
251
+ sctpTransport.mLineIndex = description.media.length;
252
+ if (sctpTransport.mid == undefined) {
253
+ sctpTransport.mid = this.allocateMid(this.midSuffix ? "dc" : "");
254
+ }
255
+ description.media.push(this.createMediaDescriptionForSctp(sctpTransport));
256
+ }
257
+ if (this.bundlePolicy !== "disable") {
258
+ const mids = description.media
259
+ .map((m) => (m.direction !== "inactive" ? m.rtp.muxId : undefined))
260
+ .filter((v) => v);
261
+ if (mids.length) {
262
+ const bundle = new sdp_1.GroupDescription("BUNDLE", mids);
263
+ description.group.push(bundle);
264
+ }
265
+ }
266
+ return description;
267
+ }
268
+ /**
269
+ * アンサーSDPを構築
270
+ */
271
+ buildAnswerSdp({ transceivers, sctpTransport, signalingState, }) {
272
+ if (!["have-remote-offer", "have-local-pranswer"].includes(signalingState)) {
273
+ throw new Error("createAnswer failed");
274
+ }
275
+ if (!this._remoteDescription) {
276
+ throw new Error("wrong state");
277
+ }
278
+ const description = new sdp_1.SessionDescription();
279
+ (0, sdp_1.addSDPHeader)("answer", description);
280
+ for (const remoteMedia of this._remoteDescription.media) {
281
+ let dtlsTransport;
282
+ let media;
283
+ if (["audio", "video"].includes(remoteMedia.kind)) {
284
+ const transceiver = transceivers.find((t) => t.mid === remoteMedia.rtp.muxId);
285
+ if (!transceiver) {
286
+ throw new Error(`Transceiver with mid=${remoteMedia.rtp.muxId} not found`);
287
+ }
288
+ media = this.createMediaDescriptionForTransceiver(transceiver, (0, utils_1.andDirection)(transceiver.direction, transceiver.offerDirection));
289
+ dtlsTransport = transceiver.dtlsTransport;
290
+ }
291
+ else if (remoteMedia.kind === "application") {
292
+ if (!sctpTransport || !sctpTransport.mid) {
293
+ throw new Error("sctpTransport not found");
294
+ }
295
+ media = this.createMediaDescriptionForSctp(sctpTransport);
296
+ dtlsTransport = sctpTransport.dtlsTransport;
297
+ }
298
+ else {
299
+ throw new Error("invalid kind");
300
+ }
301
+ // # determine DTLS role, or preserve the currently configured role
302
+ if (media.dtlsParams) {
303
+ if (dtlsTransport.role === "auto") {
304
+ media.dtlsParams.role = "client";
305
+ }
306
+ else {
307
+ media.dtlsParams.role = dtlsTransport.role;
308
+ }
309
+ }
310
+ // Simulcastに関する処理
311
+ if (remoteMedia.simulcastParameters &&
312
+ remoteMedia.simulcastParameters.length > 0) {
313
+ media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({
314
+ ...v,
315
+ direction: v.direction === "send" ? "recv" : "send",
316
+ }));
317
+ }
318
+ description.media.push(media);
319
+ }
320
+ if (this.bundlePolicy !== "disable") {
321
+ const bundle = new sdp_1.GroupDescription("BUNDLE", []);
322
+ for (const media of description.media) {
323
+ if (media.direction !== "inactive") {
324
+ bundle.items.push(media.rtp.muxId);
325
+ }
326
+ }
327
+ description.group.push(bundle);
328
+ }
329
+ return description;
330
+ }
331
+ setLocalDescription(description) {
332
+ this.currentLocalDescription = description;
333
+ if (description.type === "answer") {
334
+ this.pendingLocalDescription = undefined;
335
+ }
336
+ else {
337
+ this.pendingLocalDescription = description;
338
+ }
339
+ }
340
+ setRemoteDescription(sessionDescription, signalingState) {
341
+ if (!sessionDescription.sdp ||
342
+ !sessionDescription.type ||
343
+ sessionDescription.type === "rollback" ||
344
+ sessionDescription.type === "pranswer") {
345
+ throw new Error("invalid sessionDescription");
346
+ }
347
+ // # parse and validate description
348
+ const remoteSdp = this.parseSdp({
349
+ sdp: sessionDescription.sdp,
350
+ isLocal: false,
351
+ signalingState,
352
+ type: sessionDescription.type,
353
+ });
354
+ if (remoteSdp.type === "answer") {
355
+ this.currentRemoteDescription = remoteSdp;
356
+ this.pendingRemoteDescription = undefined;
357
+ }
358
+ else {
359
+ this.pendingRemoteDescription = remoteSdp;
360
+ }
361
+ return remoteSdp;
362
+ }
363
+ registerMid(mid) {
364
+ this.seenMid.add(mid);
365
+ }
366
+ get remoteIsBundled() {
367
+ const remoteSdp = this._remoteDescription;
368
+ if (!remoteSdp) {
369
+ return undefined;
370
+ }
371
+ const bundle = remoteSdp.group.find((g) => g.semantic === "BUNDLE" && this.bundlePolicy !== "disable");
372
+ return bundle;
373
+ }
374
+ /**
375
+ * ローカルセッション記述を設定し、トランスポート情報を追加する
376
+ */
377
+ setLocal(description, transceivers, sctpTransport) {
378
+ description.media
379
+ .filter((m) => ["audio", "video"].includes(m.kind))
380
+ .forEach((m, i) => {
381
+ this.addTransportDescription(m, transceivers[i].dtlsTransport);
382
+ });
383
+ const sctpMedia = description.media.find((m) => m.kind === "application");
384
+ if (sctpTransport && sctpMedia) {
385
+ this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);
386
+ }
387
+ this.setLocalDescription(description);
388
+ }
389
+ }
390
+ exports.SDPManager = SDPManager;
391
+ //# sourceMappingURL=sdpManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdpManager.js","sourceRoot":"","sources":["../../../src/sdpManager.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAErD,mDAA+D;AAE/D,+BAOe;AAEf,2CAAoD;AACpD,mCAAuC;AAEvC,MAAa,UAAU;IAWrB,YAAY,EACV,KAAK,EACL,SAAS,EACT,YAAY,GACwD;QAdtE;;;;;WAA6C;QAC7C;;;;;WAA8C;QAC9C;;;;;WAA6C;QAC7C;;;;;WAA8C;QACrC;;;;;WAAc;QACd;;;;;WAAmB;QACnB;;;;;WAA4B;QAE7B;;;;mBAAU,IAAI,GAAG,EAAU;WAAC;QAOlC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,KAAK,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,gBAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,iBAAiB;QACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,cAAc;IACd,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,CAAC;IACtE,CAAC;IAED,cAAc;IACd,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,CAAC;IACxE,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oCAAoC,CAClC,WAA8B,EAC9B,SAAyB;QAEzB,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,WAAW,CAAC,IAAI,EAChB,CAAC,EACD,mBAAmB,EACnB,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAC7C,CAAC;QACF,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAC5B,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAC9B,KAAK,CAAC,GAAG,GAAG;YACV,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,KAAK,EAAE,WAAW,CAAC,GAAG;SACvB,CAAC;QACF,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,IAAI,GAAG;YACX,IAAI,qBAAe,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC1E,CAAC;QAEF,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,sCAAyB,CAAC,CAAC,CAAC,CACxC,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CACb,IAAI,qBAAe,CAAC;gBAClB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO;gBAChC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CACH,CAAC;YACF,KAAK,CAAC,SAAS,GAAG;gBAChB,IAAI,sBAAgB,CAAC,KAAK,EAAE;oBAC1B,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;iBACtC,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,6BAA6B,CAAC,IAAsB;QAClD,MAAM,KAAK,GAAG,IAAI,sBAAgB,CAChC,aAAa,EACb,oBAAY,EACZ,eAAe,EACf,CAAC,oBAAoB,CAAC,CACvB,CAAC;QACF,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;QAC3B,KAAK,CAAC,gBAAgB,GAAG,uBAAgB,CAAC,eAAe,EAAE,CAAC;QAE5D,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,uBAAuB,CACrB,KAAuB,EACvB,aAA+B;QAE/B,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;QAEhD,KAAK,CAAC,aAAa,GAAG,YAAY,CAAC,eAAe,CAAC;QACnD,KAAK,CAAC,qBAAqB,GAAG,YAAY,CAAC,cAAc,KAAK,UAAU,CAAC;QACzE,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC;QAC/C,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;QAE7B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;QAC1B,KAAK,CAAC,IAAI,GAAG,oBAAY,CAAC;QAE1B,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,eAAe,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,CAAC,YAAY;oBAC3B,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAyB,EAAE;QACrC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,IAAM,CAAC;YACnB,4CAA4C;YAC5C,gGAAgG;YAChG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM;QACpC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,EACP,GAAG,EACH,OAAO,EACP,cAAc,EACd,IAAI,GAML;QACC,MAAM,WAAW,GAAG,wBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QACnE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,mBAAmB,CAAC,EAC1B,WAAW,EACX,OAAO,EACP,cAAc,GAKf;QACC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAC1D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzC,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EACtE,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzC,IACE,CAAC,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EACtE,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CACX,YAAiC,EACjC,aAA2C;QAE3C,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEnC,wCAAwC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAAC;QAE/D,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC7B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,IAAI,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;wBAC/B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC1B,OAAO;oBACT,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC3B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,IAAI,CAAC,oCAAoC,CACvC,WAAW,EACX,WAAW,CAAC,SAAS,CACtB,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAC7D,EAAE,CAAC;YACF,IAAI,WAAW,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,oCAAoC,CAChE,WAAW,EACX,WAAW,CAAC,SAAS,CACtB,CAAC;YACF,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACzC,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,IACE,aAAa;YACb,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EACxD,CAAC;YACD,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YACpD,IAAI,aAAa,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;gBACnC,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAa,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GAMf;QACC,IACE,CAAC,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EACtE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,wBAAkB,EAAE,CAAC;QAC7C,IAAA,kBAAY,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEpC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,aAAgC,CAAC;YACrC,IAAI,KAAuB,CAAC;YAE5B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,KAAK,CACvC,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CACb,wBAAwB,WAAW,CAAC,GAAG,CAAC,KAAK,YAAY,CAC1D,CAAC;gBACJ,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC,oCAAoC,CAC/C,WAAW,EACX,IAAA,oBAAY,EAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,CAChE,CAAC;gBACF,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;YAC5C,CAAC;iBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC7C,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;gBAE1D,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC;YAED,mEAAmE;YACnE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAClC,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,IACE,WAAW,CAAC,mBAAmB;gBAC/B,WAAW,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAC1C,CAAC;gBACD,KAAK,CAAC,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACN,GAAG,CAAC;oBACJ,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;iBACpD,CAAC,CACH,CAAC;YACJ,CAAC;YAED,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,sBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,mBAAmB,CAAC,WAA+B;QACjD,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,oBAAoB,CAClB,kBAA6C,EAC7C,cAAsB;QAEtB,IACE,CAAC,kBAAkB,CAAC,GAAG;YACvB,CAAC,kBAAkB,CAAC,IAAI;YACxB,kBAAkB,CAAC,IAAI,KAAK,UAAU;YACtC,kBAAkB,CAAC,IAAI,KAAK,UAAU,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9B,GAAG,EAAE,kBAAkB,CAAC,GAAG;YAC3B,OAAO,EAAE,KAAK;YACd,cAAc;YACd,IAAI,EAAE,kBAAkB,CAAC,IAAI;SAC9B,CAAC,CAAC;QAEH,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,CAClE,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,WAA+B,EAC/B,YAAiC,EACjC,aAAiE;QAEjE,WAAW,CAAC,KAAK;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAClD,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAChB,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QACL,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC1E,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACF;AA1dD,gCA0dC","sourcesContent":["import { DISCARD_HOST, DISCARD_PORT } from \"./const\";\nimport type { RTCRtpTransceiver } from \"./media\";\nimport { RTCRtpSimulcastParameters } from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type BundlePolicy,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { andDirection } from \"./utils\";\n\nexport class SDPManager {\n currentLocalDescription?: SessionDescription;\n currentRemoteDescription?: SessionDescription;\n pendingLocalDescription?: SessionDescription;\n pendingRemoteDescription?: SessionDescription;\n readonly cname: string;\n readonly midSuffix: boolean;\n readonly bundlePolicy?: BundlePolicy;\n\n private seenMid = new Set<string>();\n\n constructor({\n cname,\n midSuffix,\n bundlePolicy,\n }: { cname: string; midSuffix?: boolean; bundlePolicy?: BundlePolicy }) {\n this.cname = cname;\n this.midSuffix = midSuffix ?? false;\n this.bundlePolicy = bundlePolicy;\n }\n\n get localDescription() {\n if (!this._localDescription) {\n return undefined;\n }\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) {\n return undefined;\n }\n return this._remoteDescription.toJSON();\n }\n\n /**@private */\n get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n /**@private */\n get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n get inactiveRemoteMedia() {\n return this._remoteDescription?.media?.find?.(\n (m) => m.direction === \"inactive\",\n );\n }\n\n /**\n * MediaDescriptionをトランシーバー用に作成\n */\n createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n direction: MediaDirection,\n ): MediaDescription {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType),\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [\n new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),\n ];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o),\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({\n ssrc: transceiver.sender.rtxSsrc,\n cname: this.cname,\n }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n this.addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n }\n\n /**\n * MediaDescriptionをSCTP用に作成\n */\n createMediaDescriptionForSctp(sctp: RTCSctpTransport): MediaDescription {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"],\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n this.addTransportDescription(media, sctp.dtlsTransport);\n return media;\n }\n\n /**\n * トランスポートの情報をMediaDescriptionに追加\n */\n addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n ): void {\n const iceTransport = dtlsTransport.iceTransport;\n\n media.iceCandidates = iceTransport.localCandidates;\n media.iceCandidatesComplete = iceTransport.gatheringState === \"complete\";\n media.iceParams = iceTransport.localParameters;\n media.iceOptions = \"trickle\";\n\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n media.msid = undefined;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n }\n\n /**\n * 一意のMIDを割り当て\n */\n allocateMid(type: \"dc\" | \"av\" | \"\" = \"\"): string {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!this.seenMid.has(mid)) break;\n }\n this.seenMid.add(mid);\n return mid;\n }\n\n parseSdp({\n sdp,\n isLocal,\n signalingState,\n type,\n }: {\n sdp: string;\n isLocal: boolean;\n signalingState: string;\n type: \"offer\" | \"answer\";\n }): SessionDescription {\n const description = SessionDescription.parse(sdp);\n this.validateDescription({ description, isLocal, signalingState });\n description.type = type;\n return description;\n }\n\n private validateDescription({\n description,\n isLocal,\n signalingState,\n }: {\n description: SessionDescription;\n isLocal: boolean;\n signalingState: string;\n }) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n }\n\n /**\n * オファーSDPを構築\n */\n buildOfferSdp(\n transceivers: RTCRtpTransceiver[],\n sctpTransport: RTCSctpTransport | undefined,\n ): SessionDescription {\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n const currentMedia = this.currentLocalDescription?.media ?? [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n return;\n }\n if (m.kind === \"application\") {\n if (!sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n sctpTransport.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForSctp(sctpTransport),\n );\n } else {\n const transceiver = transceivers.find((t) => t.mid === mid);\n if (!transceiver) {\n if (m.direction === \"inactive\") {\n description.media.push(m);\n return;\n }\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n for (const transceiver of transceivers.filter(\n (t) => !description.media.find((m) => m.rtp.muxId === t.mid),\n )) {\n if (transceiver.mid == undefined) {\n transceiver.mid = this.allocateMid(this.midSuffix ? \"av\" : \"\");\n }\n const mediaDescription = this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n );\n if (transceiver.mLineIndex === undefined) {\n transceiver.mLineIndex = description.media.length;\n description.media.push(mediaDescription);\n } else {\n description.media[transceiver.mLineIndex] = mediaDescription;\n }\n }\n\n if (\n sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n sctpTransport.mLineIndex = description.media.length;\n if (sctpTransport.mid == undefined) {\n sctpTransport.mid = this.allocateMid(this.midSuffix ? \"dc\" : \"\");\n }\n description.media.push(this.createMediaDescriptionForSctp(sctpTransport));\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => (m.direction !== \"inactive\" ? m.rtp.muxId : undefined))\n .filter((v) => v) as string[];\n if (mids.length) {\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n }\n\n return description;\n }\n\n /**\n * アンサーSDPを構築\n */\n buildAnswerSdp({\n transceivers,\n sctpTransport,\n signalingState,\n }: {\n transceivers: RTCRtpTransceiver[];\n sctpTransport: RTCSctpTransport | undefined;\n\n signalingState: string;\n }): SessionDescription {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n for (const remoteMedia of this._remoteDescription.media) {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = transceivers.find(\n (t) => t.mid === remoteMedia.rtp.muxId,\n );\n if (!transceiver) {\n throw new Error(\n `Transceiver with mid=${remoteMedia.rtp.muxId} not found`,\n );\n }\n media = this.createMediaDescriptionForTransceiver(\n transceiver,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!sctpTransport || !sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = this.createMediaDescriptionForSctp(sctpTransport);\n\n dtlsTransport = sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (media.dtlsParams) {\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n }\n\n // Simulcastに関する処理\n if (\n remoteMedia.simulcastParameters &&\n remoteMedia.simulcastParameters.length > 0\n ) {\n media.simulcastParameters = remoteMedia.simulcastParameters.map(\n (v) => ({\n ...v,\n direction: v.direction === \"send\" ? \"recv\" : \"send\",\n }),\n );\n }\n\n description.media.push(media);\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n for (const media of description.media) {\n if (media.direction !== \"inactive\") {\n bundle.items.push(media.rtp.muxId!);\n }\n }\n description.group.push(bundle);\n }\n\n return description;\n }\n\n setLocalDescription(description: SessionDescription) {\n this.currentLocalDescription = description;\n if (description.type === \"answer\") {\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n setRemoteDescription(\n sessionDescription: RTCSessionDescriptionInit,\n signalingState: string,\n ) {\n if (\n !sessionDescription.sdp ||\n !sessionDescription.type ||\n sessionDescription.type === \"rollback\" ||\n sessionDescription.type === \"pranswer\"\n ) {\n throw new Error(\"invalid sessionDescription\");\n }\n\n // # parse and validate description\n const remoteSdp = this.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: false,\n signalingState,\n type: sessionDescription.type,\n });\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n return remoteSdp;\n }\n\n registerMid(mid: string): void {\n this.seenMid.add(mid);\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) {\n return undefined;\n }\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n /**\n * ローカルセッション記述を設定し、トランスポート情報を追加する\n */\n setLocal(\n description: SessionDescription,\n transceivers: RTCRtpTransceiver[],\n sctpTransport?: { dtlsTransport: RTCDtlsTransport; mid?: string },\n ) {\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n this.addTransportDescription(m, transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (sctpTransport && sctpMedia) {\n this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);\n }\n\n this.setLocalDescription(description);\n }\n}\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
@@ -0,0 +1,56 @@
1
+ import { Event } from "./imports/common";
2
+ import type { RTCRtpTransceiver, TransceiverManager } from "./media";
3
+ import type { RTCStats } from "./media/stats";
4
+ import type { PeerConfig } from "./peerConnection";
5
+ import type { SctpTransportManager } from "./sctpManager";
6
+ import type { BundlePolicy, MediaDescription, SessionDescription } from "./sdp";
7
+ import { type DtlsKeys, RTCCertificate, RTCDtlsTransport } from "./transport/dtls";
8
+ import { IceCandidate, RTCIceTransport } from "./transport/ice";
9
+ import type { IceGathererState, RTCIceCandidate, RTCIceCandidateInit, RTCIceConnectionState } from "./transport/ice";
10
+ import type { RTCSctpTransport } from "./transport/sctp";
11
+ import type { ConnectionState } from "./types/domain";
12
+ export declare class SecureTransportManager {
13
+ connectionState: ConnectionState;
14
+ iceConnectionState: RTCIceConnectionState;
15
+ iceGatheringState: IceGathererState;
16
+ certificate?: RTCCertificate;
17
+ readonly iceGatheringStateChange: Event<["complete" | "new" | "gathering"]>;
18
+ readonly iceConnectionStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
19
+ readonly onIceCandidate: Event<[IceCandidate | undefined]>;
20
+ readonly connectionStateChange: Event<["disconnected" | "closed" | "new" | "connected" | "connecting" | "failed"]>;
21
+ private config;
22
+ private transceiverManager;
23
+ private sctpManager;
24
+ constructor({ config, transceiverManager, sctpManager, }: {
25
+ config: PeerConfig;
26
+ transceiverManager: TransceiverManager;
27
+ sctpManager: SctpTransportManager;
28
+ });
29
+ get dtlsTransports(): RTCDtlsTransport[];
30
+ get iceTransports(): RTCIceTransport[];
31
+ setupCertificate(keys: DtlsKeys): void;
32
+ createTransport(): RTCDtlsTransport;
33
+ handleNewIceCandidate({ candidate, media, remoteIsBundled, transceiver, sctpTransport, bundlePolicy, }: {
34
+ candidate: IceCandidate;
35
+ media?: MediaDescription;
36
+ remoteIsBundled: boolean;
37
+ transceiver?: RTCRtpTransceiver;
38
+ sctpTransport?: RTCSctpTransport;
39
+ bundlePolicy?: BundlePolicy;
40
+ }): IceCandidate;
41
+ addIceCandidate(sdp: SessionDescription, candidateMessage: RTCIceCandidate | RTCIceCandidateInit): Promise<void>;
42
+ private getTransportByMid;
43
+ private getTransportByMLineIndex;
44
+ restartIce(): void;
45
+ setLocalRole({ type, role, }: {
46
+ type: "offer" | "answer";
47
+ role: "auto" | "client" | "server" | undefined;
48
+ }): void;
49
+ private updateIceGatheringState;
50
+ updateIceConnectionState(): void;
51
+ gatherCandidates(remoteIsBundled: boolean): Promise<void>;
52
+ setConnectionState(state: ConnectionState): void;
53
+ getStats(): Promise<RTCStats[]>;
54
+ ensureCerts(): Promise<void>;
55
+ close(): Promise<void>;
56
+ }