werift 0.22.9 → 0.24.0

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 (173) hide show
  1. package/README.md +46 -0
  2. package/lib/common/src/transport.d.ts +22 -9
  3. package/lib/common/src/transport.js +152 -25
  4. package/lib/common/src/transport.js.map +1 -1
  5. package/lib/dtls/src/flight/server/flight6.js +12 -2
  6. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  7. package/lib/dtls/src/server.js +6 -1
  8. package/lib/dtls/src/server.js.map +1 -1
  9. package/lib/dtls/src/socket.d.ts +1 -0
  10. package/lib/dtls/src/socket.js +3 -0
  11. package/lib/dtls/src/socket.js.map +1 -1
  12. package/lib/ice/src/candidate.d.ts +16 -1
  13. package/lib/ice/src/candidate.js +99 -15
  14. package/lib/ice/src/candidate.js.map +1 -1
  15. package/lib/ice/src/ice.d.ts +2 -0
  16. package/lib/ice/src/ice.js +171 -41
  17. package/lib/ice/src/ice.js.map +1 -1
  18. package/lib/ice/src/iceBase.d.ts +23 -2
  19. package/lib/ice/src/iceBase.js +63 -1
  20. package/lib/ice/src/iceBase.js.map +1 -1
  21. package/lib/ice/src/index.d.ts +2 -0
  22. package/lib/ice/src/index.js +2 -0
  23. package/lib/ice/src/index.js.map +1 -1
  24. package/lib/ice/src/stun/const.d.ts +1 -26
  25. package/lib/ice/src/stun/const.js +15 -54
  26. package/lib/ice/src/stun/const.js.map +1 -1
  27. package/lib/ice/src/stun/message.d.ts +1 -25
  28. package/lib/ice/src/stun/message.js +15 -149
  29. package/lib/ice/src/stun/message.js.map +1 -1
  30. package/lib/ice/src/stun/protocol.d.ts +1 -1
  31. package/lib/ice/src/stun/protocol.js +2 -2
  32. package/lib/ice/src/stun/protocol.js.map +1 -1
  33. package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
  34. package/lib/ice/src/stun/tcpFrame.js +26 -0
  35. package/lib/ice/src/stun/tcpFrame.js.map +1 -0
  36. package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
  37. package/lib/ice/src/stun/tcpProtocol.js +326 -0
  38. package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
  39. package/lib/ice/src/stun/transaction.d.ts +2 -1
  40. package/lib/ice/src/stun/transaction.js +9 -3
  41. package/lib/ice/src/stun/transaction.js.map +1 -1
  42. package/lib/ice/src/turn/frame.d.ts +1 -0
  43. package/lib/ice/src/turn/frame.js +18 -0
  44. package/lib/ice/src/turn/frame.js.map +1 -0
  45. package/lib/ice/src/turn/protocol.d.ts +9 -7
  46. package/lib/ice/src/turn/protocol.js +32 -44
  47. package/lib/ice/src/turn/protocol.js.map +1 -1
  48. package/lib/ice/src/types/model.d.ts +1 -1
  49. package/lib/ice/src/types/model.js.map +1 -1
  50. package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
  51. package/lib/{ice → ice-server}/src/stun/attributes.js +60 -19
  52. package/lib/ice-server/src/stun/attributes.js.map +1 -0
  53. package/lib/ice-server/src/stun/const.d.ts +28 -0
  54. package/lib/ice-server/src/stun/const.js +88 -0
  55. package/lib/ice-server/src/stun/const.js.map +1 -0
  56. package/lib/ice-server/src/stun/message.d.ts +37 -0
  57. package/lib/ice-server/src/stun/message.js +190 -0
  58. package/lib/ice-server/src/stun/message.js.map +1 -0
  59. package/lib/ice-server/src/turn/auth.d.ts +1 -0
  60. package/lib/ice-server/src/turn/auth.js +10 -0
  61. package/lib/ice-server/src/turn/auth.js.map +1 -0
  62. package/lib/ice-server/src/turn/frame.d.ts +13 -0
  63. package/lib/ice-server/src/turn/frame.js +69 -0
  64. package/lib/ice-server/src/turn/frame.js.map +1 -0
  65. package/lib/index.mjs +3075 -883
  66. package/lib/nonstandard/index.mjs +1964 -447
  67. package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
  68. package/lib/rtp/src/extra/container/mp4/container.js +258 -173
  69. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  70. package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
  71. package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
  72. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  73. package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
  74. package/lib/rtp/src/extra/processor/mp4.js +115 -60
  75. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  76. package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
  77. package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
  78. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  79. package/lib/rtp/src/index.d.ts +1 -0
  80. package/lib/rtp/src/index.js +1 -0
  81. package/lib/rtp/src/index.js.map +1 -1
  82. package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
  83. package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
  84. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  85. package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
  86. package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
  87. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  88. package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
  89. package/lib/rtp/src/srtp/cipher/index.js +1 -1
  90. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  91. package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
  92. package/lib/rtp/src/srtp/context/srtp.js +22 -5
  93. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  94. package/lib/rtp/src/srtp/error.d.ts +3 -0
  95. package/lib/rtp/src/srtp/error.js +11 -0
  96. package/lib/rtp/src/srtp/error.js.map +1 -0
  97. package/lib/rtp/src/srtp/packet.d.ts +5 -0
  98. package/lib/rtp/src/srtp/packet.js +48 -0
  99. package/lib/rtp/src/srtp/packet.js.map +1 -0
  100. package/lib/webrtc/src/dataChannel.d.ts +4 -2
  101. package/lib/webrtc/src/dataChannel.js +14 -4
  102. package/lib/webrtc/src/dataChannel.js.map +1 -1
  103. package/lib/webrtc/src/errors.d.ts +3 -0
  104. package/lib/webrtc/src/errors.js +11 -0
  105. package/lib/webrtc/src/errors.js.map +1 -0
  106. package/lib/webrtc/src/helper.d.ts +5 -1
  107. package/lib/webrtc/src/helper.js +33 -1
  108. package/lib/webrtc/src/helper.js.map +1 -1
  109. package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
  110. package/lib/webrtc/src/media/receiver/statistics.js +22 -0
  111. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  112. package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
  113. package/lib/webrtc/src/media/rtpReceiver.js +135 -20
  114. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  115. package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
  116. package/lib/webrtc/src/media/rtpSender.js +177 -28
  117. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  118. package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
  119. package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
  120. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  121. package/lib/webrtc/src/media/stats.d.ts +15 -1
  122. package/lib/webrtc/src/media/stats.js +55 -1
  123. package/lib/webrtc/src/media/stats.js.map +1 -1
  124. package/lib/webrtc/src/media/track.d.ts +2 -1
  125. package/lib/webrtc/src/media/track.js +7 -1
  126. package/lib/webrtc/src/media/track.js.map +1 -1
  127. package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
  128. package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
  129. package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
  130. package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
  131. package/lib/webrtc/src/nonstandard/navigator.js +96 -32
  132. package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
  133. package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
  134. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
  135. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
  136. package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
  137. package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
  138. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  139. package/lib/webrtc/src/peerConnection.d.ts +185 -49
  140. package/lib/webrtc/src/peerConnection.js +477 -107
  141. package/lib/webrtc/src/peerConnection.js.map +1 -1
  142. package/lib/webrtc/src/sctpManager.d.ts +2 -2
  143. package/lib/webrtc/src/sctpManager.js +30 -9
  144. package/lib/webrtc/src/sctpManager.js.map +1 -1
  145. package/lib/webrtc/src/sdp.d.ts +10 -7
  146. package/lib/webrtc/src/sdp.js +39 -9
  147. package/lib/webrtc/src/sdp.js.map +1 -1
  148. package/lib/webrtc/src/sdpManager.d.ts +5 -4
  149. package/lib/webrtc/src/sdpManager.js +53 -31
  150. package/lib/webrtc/src/sdpManager.js.map +1 -1
  151. package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
  152. package/lib/webrtc/src/secureTransportManager.js +101 -23
  153. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  154. package/lib/webrtc/src/transceiverManager.d.ts +5 -4
  155. package/lib/webrtc/src/transceiverManager.js +64 -64
  156. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  157. package/lib/webrtc/src/transport/dtls.d.ts +16 -4
  158. package/lib/webrtc/src/transport/dtls.js +208 -35
  159. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  160. package/lib/webrtc/src/transport/ice.d.ts +21 -3
  161. package/lib/webrtc/src/transport/ice.js +159 -30
  162. package/lib/webrtc/src/transport/ice.js.map +1 -1
  163. package/lib/webrtc/src/transport/sctp.d.ts +10 -3
  164. package/lib/webrtc/src/transport/sctp.js +44 -13
  165. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  166. package/lib/webrtc/src/utils.d.ts +14 -4
  167. package/lib/webrtc/src/utils.js +138 -16
  168. package/lib/webrtc/src/utils.js.map +1 -1
  169. package/package.json +7 -4
  170. package/lib/ice/src/stun/attributes.js.map +0 -1
  171. package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
  172. package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
  173. package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TransceiverManager = void 0;
4
4
  const const_1 = require("./const");
5
+ const errors_1 = require("./errors");
5
6
  const common_1 = require("./imports/common");
6
7
  const media_1 = require("./media");
7
8
  const peerConnection_1 = require("./peerConnection");
@@ -84,13 +85,16 @@ class TransceiverManager {
84
85
  const receiver = new media_1.RTCRtpReceiver(this.config, kind, sender.ssrc);
85
86
  const newTransceiver = new media_1.RTCRtpTransceiver(kind, dtlsTransport, receiver, sender, direction);
86
87
  newTransceiver.options = options;
88
+ newTransceiver.sender.setStreams(options.streams ?? []);
89
+ newTransceiver.sender.setSendEncodings((options.sendEncodings ?? []).map((encoding) => ({ ...encoding })));
87
90
  this.router.registerRtpSender(newTransceiver.sender);
88
91
  // reuse inactive
89
- const inactiveTransceiverIndex = this.transceivers.findIndex((t) => t.currentDirection === "inactive");
90
- const inactiveTransceiver = this.transceivers.find((t) => t.currentDirection === "inactive");
92
+ const inactiveTransceiverIndex = this.transceivers.findIndex((t) => t.currentDirection === "inactive" && !t.usedForSender);
93
+ const inactiveTransceiver = this.transceivers.find((t) => t.currentDirection === "inactive" && !t.usedForSender);
91
94
  if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {
92
95
  this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);
93
96
  newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;
97
+ newTransceiver.mid = inactiveTransceiver.mid;
94
98
  inactiveTransceiver.setCurrentDirection(undefined);
95
99
  }
96
100
  else {
@@ -99,16 +103,21 @@ class TransceiverManager {
99
103
  this.onTransceiverAdded.execute(newTransceiver);
100
104
  return newTransceiver;
101
105
  }
102
- addTrack(track, ms) {
106
+ addTrack(track, streams = []) {
103
107
  if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {
104
- throw new Error("Track already added");
108
+ throw (0, errors_1.createWebRtcDomException)("InvalidAccessError", "Track already added");
105
109
  }
106
110
  const emptyTrackSenderTransceiver = this.transceivers.find((t) => t.sender.track == undefined &&
107
111
  t.kind === track.kind &&
108
112
  const_1.SenderDirections.includes(t.direction) === true);
109
113
  if (emptyTrackSenderTransceiver) {
110
114
  const sender = emptyTrackSenderTransceiver.sender;
115
+ sender.setStreams(streams);
111
116
  sender.registerTrack(track);
117
+ emptyTrackSenderTransceiver.options = {
118
+ ...emptyTrackSenderTransceiver.options,
119
+ streams,
120
+ };
112
121
  return emptyTrackSenderTransceiver;
113
122
  }
114
123
  const notSendTransceiver = this.transceivers.find((t) => t.sender.track == undefined &&
@@ -117,7 +126,12 @@ class TransceiverManager {
117
126
  !t.usedForSender);
118
127
  if (notSendTransceiver) {
119
128
  const sender = notSendTransceiver.sender;
129
+ sender.setStreams(streams);
120
130
  sender.registerTrack(track);
131
+ notSendTransceiver.options = {
132
+ ...notSendTransceiver.options,
133
+ streams,
134
+ };
121
135
  switch (notSendTransceiver.direction) {
122
136
  case "recvonly":
123
137
  notSendTransceiver.setDirection("sendrecv");
@@ -131,33 +145,32 @@ class TransceiverManager {
131
145
  else {
132
146
  const transceiver = this.addTransceiver(track, undefined, {
133
147
  direction: "sendrecv",
148
+ streams,
134
149
  });
135
150
  return transceiver;
136
151
  }
137
152
  }
138
153
  removeTrack(sender) {
139
154
  if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {
140
- throw new Error("Sender does not exist");
155
+ throw (0, errors_1.createWebRtcDomException)("InvalidAccessError", "Sender does not exist");
141
156
  }
142
157
  const transceiver = this.transceivers.find(({ sender: { ssrc } }) => sender.ssrc === ssrc);
143
158
  if (!transceiver)
144
159
  throw new Error("No matching transceiver found");
160
+ if (transceiver.stopping || transceiver.stopped) {
161
+ return;
162
+ }
145
163
  sender.stop();
146
- if (transceiver.currentDirection === "recvonly") {
164
+ if (["recvonly", "inactive"].includes(transceiver.currentDirection ?? "")) {
147
165
  this.onNegotiationNeeded.execute();
148
166
  return;
149
167
  }
150
- if (transceiver.stopping || transceiver.stopped) {
151
- transceiver.setDirection("inactive");
168
+ if (transceiver.direction === "sendrecv") {
169
+ transceiver.setDirection("recvonly");
152
170
  }
153
- else {
154
- if (transceiver.direction === "sendrecv") {
155
- transceiver.setDirection("recvonly");
156
- }
157
- else if (transceiver.direction === "sendonly" ||
158
- transceiver.direction === "recvonly") {
159
- transceiver.setDirection("inactive");
160
- }
171
+ else if (transceiver.direction === "sendonly" ||
172
+ transceiver.direction === "recvonly") {
173
+ transceiver.setDirection("inactive");
161
174
  }
162
175
  }
163
176
  assignTransceiverCodecs(transceiver) {
@@ -224,7 +237,7 @@ class TransceiverManager {
224
237
  }
225
238
  setRemoteRTP(transceiver, remoteMedia, type, mLineIndex) {
226
239
  if (!transceiver.mid) {
227
- transceiver.mid = remoteMedia.rtp.muxId;
240
+ transceiver.mid = remoteMedia.rtp.muxId ?? null;
228
241
  }
229
242
  transceiver.mLineIndex = mLineIndex;
230
243
  // # negotiate codecs
@@ -272,78 +285,65 @@ class TransceiverManager {
272
285
  // register ssrc receiver
273
286
  this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);
274
287
  }
275
- if (["sendonly", "sendrecv"].includes(mediaDirection)) {
276
- if (remoteMedia.msid) {
277
- const [streamId, trackId] = remoteMedia.msid.split(" ");
278
- transceiver.receiver.remoteStreamId = streamId;
279
- transceiver.receiver.remoteTrackId = trackId;
280
- }
288
+ if (remoteMedia.port !== 0 &&
289
+ ["sendonly", "sendrecv"].includes(mediaDirection)) {
290
+ const remoteStreamIds = [
291
+ ...new Set(remoteMedia.msids.map((msid) => msid.split(" ")[0])),
292
+ ];
293
+ const remoteTrackId = remoteMedia.msids[0]?.split(" ")[1];
294
+ transceiver.receiver.remoteStreamId = remoteStreamIds[0];
295
+ transceiver.receiver.remoteStreamIds = remoteStreamIds;
296
+ transceiver.receiver.remoteTrackId = remoteTrackId;
281
297
  this.onTrack.execute({
282
298
  track: transceiver.receiver.track,
283
299
  transceiver,
284
- stream: new media_1.MediaStream({
285
- id: transceiver.receiver.remoteStreamId,
300
+ streams: remoteStreamIds.map((id) => new media_1.MediaStream({
301
+ id,
286
302
  tracks: [transceiver.receiver.track],
287
- }),
303
+ })),
288
304
  });
289
305
  }
290
306
  if (remoteMedia.ssrc[0]?.ssrc) {
291
307
  transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);
292
308
  }
293
309
  }
294
- async getStats(selector) {
310
+ collectStats(timestamp) {
295
311
  const stats = [];
296
312
  for (const transceiver of this.transceivers) {
297
- const includeTransceiverStats = !selector ||
298
- transceiver.sender.track === selector ||
299
- transceiver.receiver.track === selector;
300
313
  if (transceiver.sender) {
301
- const senderStats = await transceiver.sender.getStats();
302
- if (senderStats) {
303
- for (const stat of senderStats) {
304
- if (stat.type === "outbound-rtp" || stat.type === "media-source") {
305
- if (includeTransceiverStats) {
306
- stats.push(stat);
307
- }
308
- }
309
- else {
310
- stats.push(stat);
311
- }
312
- }
313
- }
314
+ stats.push(...transceiver.sender.collectStats(timestamp));
314
315
  }
315
316
  if (transceiver.receiver) {
316
- const receiverStats = await transceiver.receiver.getStats();
317
- if (receiverStats) {
318
- for (const stat of receiverStats) {
319
- if (stat.type === "inbound-rtp" ||
320
- stat.type === "remote-outbound-rtp") {
321
- if (includeTransceiverStats) {
322
- stats.push(stat);
323
- }
324
- }
325
- else {
326
- stats.push(stat);
327
- }
328
- }
329
- }
317
+ stats.push(...transceiver.receiver.collectStats(timestamp));
330
318
  }
331
- if (includeTransceiverStats) {
332
- const codecStats = transceiver.getCodecStats();
333
- if (codecStats) {
334
- stats.push(...codecStats);
335
- }
319
+ const codecStats = transceiver.collectCodecStats(timestamp);
320
+ if (codecStats) {
321
+ stats.push(...codecStats);
336
322
  }
337
323
  }
338
324
  return stats;
339
325
  }
326
+ getStatsRootIds(selector) {
327
+ if (!selector) {
328
+ return [];
329
+ }
330
+ const rootIds = [];
331
+ for (const transceiver of this.transceivers) {
332
+ if (transceiver.sender.track === selector) {
333
+ rootIds.push(...transceiver.sender.getStatsRootIds());
334
+ }
335
+ if (transceiver.receiver.tracks.includes(selector)) {
336
+ rootIds.push(...transceiver.receiver.getStatsRootIds(selector));
337
+ }
338
+ }
339
+ return rootIds;
340
+ }
340
341
  /**
341
342
  * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド
342
343
  */
343
344
  close() {
344
345
  for (const transceiver of this.transceivers) {
345
- transceiver.receiver.stop();
346
- transceiver.sender.stop();
346
+ transceiver.forceStop();
347
347
  }
348
348
  this.onTransceiverAdded.allUnsubscribe();
349
349
  this.onRemoteTransceiverAdded.allUnsubscribe();
@@ -1 +1 @@
1
- {"version":3,"file":"transceiverManager.js","sourceRoot":"","sources":["../../../src/transceiverManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReceiverDirection, SenderDirections } from \"./const\";\nimport { Event, debug } from \"./imports/common\";\nimport {\n MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpReceiver,\n RTCRtpRtxParameters,\n RTCRtpSender,\n RTCRtpTransceiver,\n Recvonly,\n type RtpRouter,\n Sendonly,\n Sendrecv,\n type TransceiverOptions,\n} from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport { type PeerConfig, findCodecByMimeType } from \"./peerConnection\";\nimport { type MediaDescription, codecParametersFromString } from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport type { Kind } from \"./types/domain\";\nimport { reverseDirection } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpTransceiverManager.ts\");\n\nexport class TransceiverManager {\n private readonly transceivers: RTCRtpTransceiver[] = [];\n\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTrack = new Event<\n [\n {\n track: MediaStreamTrack;\n transceiver: RTCRtpTransceiver;\n stream: MediaStream;\n },\n ]\n >();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(\n private readonly cname: string,\n private readonly config: Required<PeerConfig>,\n private readonly router: RtpRouter,\n ) {}\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n getTransceiverByMLineIndex(index: number): RTCRtpTransceiver | undefined {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n pushTransceiver(t: RTCRtpTransceiver): void {\n this.transceivers.push(t);\n }\n\n replaceTransceiver(t: RTCRtpTransceiver, index: number): void {\n this.transceivers[index] = t;\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n dtlsTransport?: RTCDtlsTransport,\n options: Partial<TransceiverOptions> = {},\n ): RTCRtpTransceiver {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.options = options;\n this.router.registerRtpSender(newTransceiver.sender);\n\n // reuse inactive\n const inactiveTransceiverIndex = this.transceivers.findIndex(\n (t) => t.currentDirection === \"inactive\",\n );\n const inactiveTransceiver = this.transceivers.find(\n (t) => t.currentDirection === \"inactive\",\n );\n if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {\n this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);\n newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;\n inactiveTransceiver.setCurrentDirection(undefined);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n return newTransceiver;\n }\n\n addTrack(track: MediaStreamTrack, ms?: MediaStream): RTCRtpTransceiver {\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw new Error(\"Track already added\");\n }\n\n const emptyTrackSenderTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true,\n );\n if (emptyTrackSenderTransceiver) {\n const sender = emptyTrackSenderTransceiver.sender;\n sender.registerTrack(track);\n return emptyTrackSenderTransceiver;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender,\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.registerTrack(track);\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n return notSendTransceiver;\n } else {\n const transceiver = this.addTransceiver(track, undefined, {\n direction: \"sendrecv\",\n });\n return transceiver;\n }\n }\n\n removeTrack(sender: RTCRtpSender): void {\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw new Error(\"Sender does not exist\");\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"No matching transceiver found\");\n\n sender.stop();\n\n if (transceiver.currentDirection === \"recvonly\") {\n this.onNegotiationNeeded.execute();\n return;\n }\n\n if (transceiver.stopping || transceiver.stopped) {\n transceiver.setDirection(\"inactive\");\n } else {\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.setDirection(\"inactive\");\n }\n }\n }\n\n assignTransceiverCodecs(transceiver: RTCRtpTransceiver): void {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\",\n mLineIndex: number,\n ): void {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId;\n }\n transceiver.mLineIndex = mLineIndex;\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) {\n return false;\n }\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) {\n return false;\n }\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.config.headerExtensions[remoteMedia.kind as \"audio\" | \"video\"] ||\n []\n ).find((v) => v.uri === extension.uri),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n for (const param of remoteMedia.simulcastParameters) {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n }\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if ([\"sendonly\", \"sendrecv\"].includes(mediaDirection)) {\n if (remoteMedia.msid) {\n const [streamId, trackId] = remoteMedia.msid.split(\" \");\n transceiver.receiver.remoteStreamId = streamId;\n transceiver.receiver.remoteTrackId = trackId;\n }\n\n this.onTrack.execute({\n track: transceiver.receiver.track,\n transceiver,\n stream: new MediaStream({\n id: transceiver.receiver.remoteStreamId,\n tracks: [transceiver.receiver.track],\n }),\n });\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStats[]> {\n const stats: RTCStats[] = [];\n\n for (const transceiver of this.transceivers) {\n const includeTransceiverStats =\n !selector ||\n transceiver.sender.track === selector ||\n transceiver.receiver.track === selector;\n\n if (transceiver.sender) {\n const senderStats = await transceiver.sender.getStats();\n if (senderStats) {\n for (const stat of senderStats) {\n if (stat.type === \"outbound-rtp\" || stat.type === \"media-source\") {\n if (includeTransceiverStats) {\n stats.push(stat);\n }\n } else {\n stats.push(stat);\n }\n }\n }\n }\n\n if (transceiver.receiver) {\n const receiverStats = await transceiver.receiver.getStats();\n if (receiverStats) {\n for (const stat of receiverStats) {\n if (\n stat.type === \"inbound-rtp\" ||\n stat.type === \"remote-outbound-rtp\"\n ) {\n if (includeTransceiverStats) {\n stats.push(stat);\n }\n } else {\n stats.push(stat);\n }\n }\n }\n }\n\n if (includeTransceiverStats) {\n const codecStats = transceiver.getCodecStats();\n if (codecStats) {\n stats.push(...codecStats);\n }\n }\n }\n\n return stats;\n }\n\n /**\n * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド\n */\n close() {\n for (const transceiver of this.transceivers) {\n transceiver.receiver.stop();\n transceiver.sender.stop();\n }\n\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onTrack.allUnsubscribe();\n this.onNegotiationNeeded.allUnsubscribe();\n }\n}\n"]}
1
+ {"version":3,"file":"transceiverManager.js","sourceRoot":"","sources":["../../../src/transceiverManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReceiverDirection, SenderDirections } from \"./const\";\nimport { createWebRtcDomException } from \"./errors\";\nimport { Event, debug } from \"./imports/common\";\nimport {\n MediaStream,\n type MediaStreamTrack,\n type RTCRtpCodecParameters,\n RTCRtpCodingParameters,\n type RTCRtpEncodingParameters,\n type RTCRtpParameters,\n type RTCRtpReceiveParameters,\n RTCRtpReceiver,\n RTCRtpRtxParameters,\n RTCRtpSender,\n RTCRtpTransceiver,\n Recvonly,\n type RtpRouter,\n Sendonly,\n Sendrecv,\n type TransceiverOptions,\n} from \"./media\";\nimport type { RTCStats } from \"./media/stats\";\nimport { type PeerConfig, findCodecByMimeType } from \"./peerConnection\";\nimport { type MediaDescription, codecParametersFromString } from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport type { Kind } from \"./types/domain\";\nimport { reverseDirection } from \"./utils\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpTransceiverManager.ts\");\n\nexport class TransceiverManager {\n private readonly transceivers: RTCRtpTransceiver[] = [];\n\n readonly onTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onRemoteTransceiverAdded = new Event<[RTCRtpTransceiver]>();\n readonly onTrack = new Event<\n [\n {\n track: MediaStreamTrack;\n transceiver: RTCRtpTransceiver;\n streams: MediaStream[];\n },\n ]\n >();\n readonly onNegotiationNeeded = new Event<[]>();\n\n constructor(\n private readonly cname: string,\n private readonly config: Required<PeerConfig>,\n private readonly router: RtpRouter,\n ) {}\n\n getTransceivers(): RTCRtpTransceiver[] {\n return this.transceivers;\n }\n\n getSenders(): RTCRtpSender[] {\n return this.getTransceivers().map((t) => t.sender);\n }\n\n getReceivers() {\n return this.getTransceivers().map((t) => t.receiver);\n }\n\n getTransceiverByMLineIndex(index: number): RTCRtpTransceiver | undefined {\n return this.transceivers.find(\n (transceiver) => transceiver.mLineIndex === index,\n );\n }\n\n pushTransceiver(t: RTCRtpTransceiver): void {\n this.transceivers.push(t);\n }\n\n replaceTransceiver(t: RTCRtpTransceiver, index: number): void {\n this.transceivers[index] = t;\n }\n\n addTransceiver(\n trackOrKind: Kind | MediaStreamTrack,\n dtlsTransport?: RTCDtlsTransport,\n options: Partial<TransceiverOptions> = {},\n ): RTCRtpTransceiver {\n const kind =\n typeof trackOrKind === \"string\" ? trackOrKind : trackOrKind.kind;\n\n const direction = options.direction || \"sendrecv\";\n\n const sender = new RTCRtpSender(trackOrKind);\n const receiver = new RTCRtpReceiver(this.config, kind, sender.ssrc);\n const newTransceiver = new RTCRtpTransceiver(\n kind,\n dtlsTransport,\n receiver,\n sender,\n direction,\n );\n newTransceiver.options = options;\n newTransceiver.sender.setStreams(options.streams ?? []);\n newTransceiver.sender.setSendEncodings(\n (\n (options.sendEncodings as RTCRtpEncodingParameters[] | undefined) ?? []\n ).map((encoding) => ({ ...encoding })),\n );\n this.router.registerRtpSender(newTransceiver.sender);\n\n // reuse inactive\n const inactiveTransceiverIndex = this.transceivers.findIndex(\n (t) => t.currentDirection === \"inactive\" && !t.usedForSender,\n );\n const inactiveTransceiver = this.transceivers.find(\n (t) => t.currentDirection === \"inactive\" && !t.usedForSender,\n );\n if (inactiveTransceiverIndex > -1 && inactiveTransceiver) {\n this.replaceTransceiver(newTransceiver, inactiveTransceiverIndex);\n newTransceiver.mLineIndex = inactiveTransceiver.mLineIndex;\n newTransceiver.mid = inactiveTransceiver.mid;\n inactiveTransceiver.setCurrentDirection(undefined);\n } else {\n this.pushTransceiver(newTransceiver);\n }\n this.onTransceiverAdded.execute(newTransceiver);\n\n return newTransceiver;\n }\n\n addTrack(\n track: MediaStreamTrack,\n streams: MediaStream[] = [],\n ): RTCRtpTransceiver {\n if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Track already added\",\n );\n }\n\n const emptyTrackSenderTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === true,\n );\n if (emptyTrackSenderTransceiver) {\n const sender = emptyTrackSenderTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n emptyTrackSenderTransceiver.options = {\n ...emptyTrackSenderTransceiver.options,\n streams,\n };\n return emptyTrackSenderTransceiver;\n }\n\n const notSendTransceiver = this.transceivers.find(\n (t) =>\n t.sender.track == undefined &&\n t.kind === track.kind &&\n SenderDirections.includes(t.direction) === false &&\n !t.usedForSender,\n );\n if (notSendTransceiver) {\n const sender = notSendTransceiver.sender;\n sender.setStreams(streams);\n sender.registerTrack(track);\n notSendTransceiver.options = {\n ...notSendTransceiver.options,\n streams,\n };\n switch (notSendTransceiver.direction) {\n case \"recvonly\":\n notSendTransceiver.setDirection(\"sendrecv\");\n break;\n case \"inactive\":\n notSendTransceiver.setDirection(\"sendonly\");\n break;\n }\n return notSendTransceiver;\n } else {\n const transceiver = this.addTransceiver(track, undefined, {\n direction: \"sendrecv\",\n streams,\n });\n return transceiver;\n }\n }\n\n removeTrack(sender: RTCRtpSender): void {\n if (!this.getSenders().find(({ ssrc }) => sender.ssrc === ssrc)) {\n throw createWebRtcDomException(\n \"InvalidAccessError\",\n \"Sender does not exist\",\n );\n }\n\n const transceiver = this.transceivers.find(\n ({ sender: { ssrc } }) => sender.ssrc === ssrc,\n );\n if (!transceiver) throw new Error(\"No matching transceiver found\");\n\n if (transceiver.stopping || transceiver.stopped) {\n return;\n }\n\n sender.stop();\n\n if ([\"recvonly\", \"inactive\"].includes(transceiver.currentDirection ?? \"\")) {\n this.onNegotiationNeeded.execute();\n return;\n }\n\n if (transceiver.direction === \"sendrecv\") {\n transceiver.setDirection(\"recvonly\");\n } else if (\n transceiver.direction === \"sendonly\" ||\n transceiver.direction === \"recvonly\"\n ) {\n transceiver.setDirection(\"inactive\");\n }\n }\n\n assignTransceiverCodecs(transceiver: RTCRtpTransceiver): void {\n const codecs = (\n this.config.codecs[transceiver.kind] as RTCRtpCodecParameters[]\n ).filter((codecCandidate) => {\n switch (codecCandidate.direction) {\n case \"recvonly\": {\n if (ReceiverDirection.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendonly\": {\n if (SenderDirections.includes(transceiver.direction)) return true;\n return false;\n }\n case \"sendrecv\": {\n if ([Sendrecv, Recvonly, Sendonly].includes(transceiver.direction))\n return true;\n return false;\n }\n case \"all\": {\n return true;\n }\n default:\n return false;\n }\n });\n transceiver.codecs = codecs;\n }\n\n getLocalRtpParams(transceiver: RTCRtpTransceiver): RTCRtpParameters {\n if (transceiver.mid == undefined) throw new Error(\"mid not assigned\");\n\n const rtp: RTCRtpParameters = {\n codecs: transceiver.codecs,\n muxId: transceiver.mid,\n headerExtensions: transceiver.headerExtensions,\n rtcp: { cname: this.cname, ssrc: transceiver.sender.ssrc, mux: true },\n };\n return rtp;\n }\n\n getRemoteRtpParams(\n media: MediaDescription,\n transceiver: RTCRtpTransceiver,\n ): RTCRtpReceiveParameters {\n const receiveParameters: RTCRtpReceiveParameters = {\n muxId: media.rtp.muxId,\n rtcp: media.rtp.rtcp,\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n encodings: Object.values(\n transceiver.codecs.reduce(\n (acc: { [pt: number]: RTCRtpCodingParameters }, codec) => {\n if (codec.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(codec.parameters ?? \"\");\n const apt = acc[params[\"apt\"]];\n if (apt && media.ssrc.length === 2) {\n apt.rtx = new RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });\n }\n return acc;\n }\n acc[codec.payloadType] = new RTCRtpCodingParameters({\n ssrc: media.ssrc[0]?.ssrc,\n payloadType: codec.payloadType,\n });\n return acc;\n },\n {},\n ),\n ),\n };\n\n return receiveParameters;\n }\n\n setRemoteRTP(\n transceiver: RTCRtpTransceiver,\n remoteMedia: MediaDescription,\n type: \"offer\" | \"answer\" | \"pranswer\",\n mLineIndex: number,\n ): void {\n if (!transceiver.mid) {\n transceiver.mid = remoteMedia.rtp.muxId ?? null;\n }\n transceiver.mLineIndex = mLineIndex;\n\n // # negotiate codecs\n transceiver.codecs = remoteMedia.rtp.codecs.filter((remoteCodec) => {\n const localCodecs = this.config.codecs[remoteMedia.kind] || [];\n\n const existCodec = findCodecByMimeType(localCodecs, remoteCodec);\n if (!existCodec) {\n return false;\n }\n\n if (existCodec?.name.toLowerCase() === \"rtx\") {\n const params = codecParametersFromString(existCodec.parameters ?? \"\");\n const pt = params[\"apt\"];\n const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);\n if (!origin) {\n return false;\n }\n return !!findCodecByMimeType(localCodecs, origin);\n }\n\n return true;\n });\n\n log(\"negotiated codecs\", transceiver.codecs);\n if (transceiver.codecs.length === 0) {\n throw new Error(\"negotiate codecs failed.\");\n }\n transceiver.headerExtensions = remoteMedia.rtp.headerExtensions.filter(\n (extension) =>\n (\n this.config.headerExtensions[remoteMedia.kind as \"audio\" | \"video\"] ||\n []\n ).find((v) => v.uri === extension.uri),\n );\n\n // # configure direction\n const mediaDirection = remoteMedia.direction ?? \"inactive\";\n const direction = reverseDirection(mediaDirection);\n if ([\"answer\", \"pranswer\"].includes(type)) {\n transceiver.setCurrentDirection(direction);\n } else {\n transceiver.offerDirection = direction;\n }\n const localParams = this.getLocalRtpParams(transceiver);\n transceiver.sender.prepareSend(localParams);\n\n if ([\"recvonly\", \"sendrecv\"].includes(transceiver.direction)) {\n const remotePrams = this.getRemoteRtpParams(remoteMedia, transceiver);\n\n // register simulcast receiver\n for (const param of remoteMedia.simulcastParameters) {\n this.router.registerRtpReceiverByRid(transceiver, param, remotePrams);\n }\n\n transceiver.receiver.prepareReceive(remotePrams);\n // register ssrc receiver\n this.router.registerRtpReceiverBySsrc(transceiver, remotePrams);\n }\n if (\n remoteMedia.port !== 0 &&\n [\"sendonly\", \"sendrecv\"].includes(mediaDirection)\n ) {\n const remoteStreamIds = [\n ...new Set(remoteMedia.msids.map((msid) => msid.split(\" \")[0])),\n ];\n const remoteTrackId = remoteMedia.msids[0]?.split(\" \")[1];\n transceiver.receiver.remoteStreamId = remoteStreamIds[0];\n transceiver.receiver.remoteStreamIds = remoteStreamIds;\n transceiver.receiver.remoteTrackId = remoteTrackId;\n\n this.onTrack.execute({\n track: transceiver.receiver.track,\n transceiver,\n streams: remoteStreamIds.map(\n (id) =>\n new MediaStream({\n id,\n tracks: [transceiver.receiver.track],\n }),\n ),\n });\n }\n\n if (remoteMedia.ssrc[0]?.ssrc) {\n transceiver.receiver.setupTWCC(remoteMedia.ssrc[0].ssrc);\n }\n }\n\n collectStats(timestamp: number): RTCStats[] {\n const stats: RTCStats[] = [];\n\n for (const transceiver of this.transceivers) {\n if (transceiver.sender) {\n stats.push(...transceiver.sender.collectStats(timestamp));\n }\n\n if (transceiver.receiver) {\n stats.push(...transceiver.receiver.collectStats(timestamp));\n }\n\n const codecStats = transceiver.collectCodecStats(timestamp);\n if (codecStats) {\n stats.push(...codecStats);\n }\n }\n\n return stats;\n }\n\n getStatsRootIds(selector: MediaStreamTrack | null | undefined) {\n if (!selector) {\n return [];\n }\n\n const rootIds: string[] = [];\n for (const transceiver of this.transceivers) {\n if (transceiver.sender.track === selector) {\n rootIds.push(...transceiver.sender.getStatsRootIds());\n }\n if (transceiver.receiver.tracks.includes(selector)) {\n rootIds.push(...transceiver.receiver.getStatsRootIds(selector));\n }\n }\n\n return rootIds;\n }\n\n /**\n * 全トランシーバーのreceiver/senderのstopを呼ぶcloseメソッド\n */\n close() {\n for (const transceiver of this.transceivers) {\n transceiver.forceStop();\n }\n\n this.onTransceiverAdded.allUnsubscribe();\n this.onRemoteTransceiverAdded.allUnsubscribe();\n this.onTrack.allUnsubscribe();\n this.onNegotiationNeeded.allUnsubscribe();\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { Event } from "../imports/common";
2
2
  import { type DtlsSocket, type SignatureHash } from "../imports/dtls";
3
3
  import { type RtcpPacket, type RtpHeader, RtpPacket, SrtcpSession, type SrtpProfile, SrtpSession } from "../imports/rtp";
4
4
  import { type RTCStats } from "../media/stats";
5
- import type { PeerConfig } from "../peerConnection";
5
+ import type { DebugConfig } from "../peerConnection";
6
6
  import type { RTCIceTransport } from "./ice";
7
7
  export interface DtlsTransportStats {
8
8
  bytesSent: number;
@@ -11,7 +11,9 @@ export interface DtlsTransportStats {
11
11
  packetsReceived: number;
12
12
  }
13
13
  export declare class RTCDtlsTransport implements DtlsTransportStats {
14
- readonly config: PeerConfig;
14
+ readonly config: {
15
+ debug?: DebugConfig;
16
+ };
15
17
  readonly iceTransport: RTCIceTransport;
16
18
  localCertificate?: RTCCertificate | undefined;
17
19
  private readonly srtpProfiles;
@@ -31,14 +33,24 @@ export declare class RTCDtlsTransport implements DtlsTransportStats {
31
33
  readonly onStateChange: Event<["closed" | "new" | "connected" | "connecting" | "failed"]>;
32
34
  readonly onRtcp: Event<[RtcpPacket]>;
33
35
  readonly onRtp: Event<[RtpPacket]>;
36
+ private readonly events;
37
+ onstatechange?: () => void;
34
38
  static localCertificate?: RTCCertificate;
35
39
  static localCertificatePromise?: Promise<RTCCertificate>;
36
40
  private remoteParameters?;
37
- constructor(config: PeerConfig, iceTransport: RTCIceTransport, localCertificate?: RTCCertificate | undefined, srtpProfiles?: SrtpProfile[]);
41
+ constructor(config: {
42
+ debug?: DebugConfig;
43
+ }, iceTransport: RTCIceTransport, localCertificate?: RTCCertificate | undefined, srtpProfiles?: SrtpProfile[]);
44
+ addEventListener: (type: string, listener: (...args: any[]) => void, options?: boolean | {
45
+ once?: boolean;
46
+ }) => void;
47
+ removeEventListener: (type: string, listener: (...args: any[]) => void) => void;
48
+ dispatchEvent: (event: globalThis.Event) => boolean;
38
49
  get localParameters(): RTCDtlsParameters;
39
50
  static SetupCertificate(): Promise<RTCCertificate>;
40
51
  setRemoteParams(remoteParameters: RTCDtlsParameters): void;
41
52
  start(): Promise<void>;
53
+ private verifyRemoteCertificateFingerprint;
42
54
  updateSrtpSession(): void;
43
55
  startSrtp(): void;
44
56
  readonly sendData: (data: Buffer) => Promise<void>;
@@ -46,7 +58,7 @@ export declare class RTCDtlsTransport implements DtlsTransportStats {
46
58
  sendRtcp(packets: RtcpPacket[]): Promise<number | undefined>;
47
59
  private setState;
48
60
  stop(): Promise<void>;
49
- getStats(): Promise<RTCStats[]>;
61
+ getStats(timestamp?: number): Promise<RTCStats[]>;
50
62
  }
51
63
  export declare const DtlsStates: readonly ["new", "connecting", "connected", "closed", "failed"];
52
64
  export type DtlsState = (typeof DtlsStates)[number];