werift 0.23.0 → 0.24.1

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 (169) hide show
  1. package/README.md +46 -0
  2. package/lib/common/src/binary.js +2 -3
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/common/src/transport.d.ts +22 -9
  5. package/lib/common/src/transport.js +152 -25
  6. package/lib/common/src/transport.js.map +1 -1
  7. package/lib/ice/src/candidate.d.ts +16 -1
  8. package/lib/ice/src/candidate.js +99 -15
  9. package/lib/ice/src/candidate.js.map +1 -1
  10. package/lib/ice/src/ice.d.ts +2 -0
  11. package/lib/ice/src/ice.js +175 -50
  12. package/lib/ice/src/ice.js.map +1 -1
  13. package/lib/ice/src/iceBase.d.ts +23 -2
  14. package/lib/ice/src/iceBase.js +63 -1
  15. package/lib/ice/src/iceBase.js.map +1 -1
  16. package/lib/ice/src/index.d.ts +2 -0
  17. package/lib/ice/src/index.js +2 -0
  18. package/lib/ice/src/index.js.map +1 -1
  19. package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
  20. package/lib/ice/src/internal/selectAddresses.js +40 -0
  21. package/lib/ice/src/internal/selectAddresses.js.map +1 -0
  22. package/lib/ice/src/stun/const.d.ts +1 -26
  23. package/lib/ice/src/stun/const.js +15 -54
  24. package/lib/ice/src/stun/const.js.map +1 -1
  25. package/lib/ice/src/stun/message.d.ts +1 -25
  26. package/lib/ice/src/stun/message.js +15 -149
  27. package/lib/ice/src/stun/message.js.map +1 -1
  28. package/lib/ice/src/stun/protocol.d.ts +1 -1
  29. package/lib/ice/src/stun/protocol.js +2 -2
  30. package/lib/ice/src/stun/protocol.js.map +1 -1
  31. package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
  32. package/lib/ice/src/stun/tcpFrame.js +26 -0
  33. package/lib/ice/src/stun/tcpFrame.js.map +1 -0
  34. package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
  35. package/lib/ice/src/stun/tcpProtocol.js +326 -0
  36. package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
  37. package/lib/ice/src/stun/transaction.d.ts +2 -1
  38. package/lib/ice/src/stun/transaction.js +9 -3
  39. package/lib/ice/src/stun/transaction.js.map +1 -1
  40. package/lib/ice/src/turn/frame.d.ts +1 -0
  41. package/lib/ice/src/turn/frame.js +18 -0
  42. package/lib/ice/src/turn/frame.js.map +1 -0
  43. package/lib/ice/src/turn/protocol.d.ts +9 -7
  44. package/lib/ice/src/turn/protocol.js +32 -44
  45. package/lib/ice/src/turn/protocol.js.map +1 -1
  46. package/lib/ice/src/types/model.d.ts +1 -1
  47. package/lib/ice/src/types/model.js.map +1 -1
  48. package/lib/ice/src/utils.js +2 -31
  49. package/lib/ice/src/utils.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 +69 -66
  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/ip.d.ts +12 -0
  57. package/lib/ice-server/src/stun/ip.js +88 -0
  58. package/lib/ice-server/src/stun/ip.js.map +1 -0
  59. package/lib/ice-server/src/stun/message.d.ts +37 -0
  60. package/lib/ice-server/src/stun/message.js +190 -0
  61. package/lib/ice-server/src/stun/message.js.map +1 -0
  62. package/lib/ice-server/src/turn/auth.d.ts +1 -0
  63. package/lib/ice-server/src/turn/auth.js +10 -0
  64. package/lib/ice-server/src/turn/auth.js.map +1 -0
  65. package/lib/ice-server/src/turn/frame.d.ts +13 -0
  66. package/lib/ice-server/src/turn/frame.js +69 -0
  67. package/lib/ice-server/src/turn/frame.js.map +1 -0
  68. package/lib/index.mjs +2866 -946
  69. package/lib/nonstandard/index.mjs +1872 -455
  70. package/lib/rtp/src/codec/av1.js +11 -5
  71. package/lib/rtp/src/codec/av1.js.map +1 -1
  72. package/lib/rtp/src/codec/leb128.d.ts +5 -0
  73. package/lib/rtp/src/codec/leb128.js +24 -0
  74. package/lib/rtp/src/codec/leb128.js.map +1 -0
  75. package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
  76. package/lib/rtp/src/extra/container/mp4/container.js +258 -173
  77. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  78. package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
  79. package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
  80. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  81. package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
  82. package/lib/rtp/src/extra/processor/mp4.js +115 -60
  83. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  84. package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
  85. package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
  86. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  87. package/lib/rtp/src/rtp/rtx.js +4 -6
  88. package/lib/rtp/src/rtp/rtx.js.map +1 -1
  89. package/lib/rtp/src/srtp/context/context.d.ts +2 -0
  90. package/lib/rtp/src/srtp/context/context.js +12 -12
  91. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  92. package/lib/sctp/src/param.js +31 -15
  93. package/lib/sctp/src/param.js.map +1 -1
  94. package/lib/sctp/src/sctp.js +10 -9
  95. package/lib/sctp/src/sctp.js.map +1 -1
  96. package/lib/webrtc/src/dataChannel.d.ts +3 -2
  97. package/lib/webrtc/src/dataChannel.js +9 -2
  98. package/lib/webrtc/src/dataChannel.js.map +1 -1
  99. package/lib/webrtc/src/errors.d.ts +3 -0
  100. package/lib/webrtc/src/errors.js +11 -0
  101. package/lib/webrtc/src/errors.js.map +1 -0
  102. package/lib/webrtc/src/helper.d.ts +5 -1
  103. package/lib/webrtc/src/helper.js +33 -1
  104. package/lib/webrtc/src/helper.js.map +1 -1
  105. package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
  106. package/lib/webrtc/src/media/receiver/statistics.js +22 -0
  107. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  108. package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
  109. package/lib/webrtc/src/media/rtpReceiver.js +135 -20
  110. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  111. package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
  112. package/lib/webrtc/src/media/rtpSender.js +179 -31
  113. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  114. package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
  115. package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
  116. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  117. package/lib/webrtc/src/media/stats.d.ts +15 -1
  118. package/lib/webrtc/src/media/stats.js +55 -1
  119. package/lib/webrtc/src/media/stats.js.map +1 -1
  120. package/lib/webrtc/src/media/track.d.ts +2 -1
  121. package/lib/webrtc/src/media/track.js +7 -1
  122. package/lib/webrtc/src/media/track.js.map +1 -1
  123. package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
  124. package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
  125. package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
  126. package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
  127. package/lib/webrtc/src/nonstandard/navigator.js +96 -32
  128. package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
  129. package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
  130. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
  131. package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
  132. package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
  133. package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
  134. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  135. package/lib/webrtc/src/peerConnection.d.ts +183 -50
  136. package/lib/webrtc/src/peerConnection.js +458 -109
  137. package/lib/webrtc/src/peerConnection.js.map +1 -1
  138. package/lib/webrtc/src/sctpManager.d.ts +1 -1
  139. package/lib/webrtc/src/sctpManager.js +27 -7
  140. package/lib/webrtc/src/sctpManager.js.map +1 -1
  141. package/lib/webrtc/src/sdp.d.ts +10 -7
  142. package/lib/webrtc/src/sdp.js +40 -44
  143. package/lib/webrtc/src/sdp.js.map +1 -1
  144. package/lib/webrtc/src/sdpManager.d.ts +4 -3
  145. package/lib/webrtc/src/sdpManager.js +50 -27
  146. package/lib/webrtc/src/sdpManager.js.map +1 -1
  147. package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
  148. package/lib/webrtc/src/secureTransportManager.js +100 -22
  149. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  150. package/lib/webrtc/src/transceiverManager.d.ts +5 -4
  151. package/lib/webrtc/src/transceiverManager.js +61 -62
  152. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  153. package/lib/webrtc/src/transport/dtls.d.ts +15 -4
  154. package/lib/webrtc/src/transport/dtls.js +91 -23
  155. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  156. package/lib/webrtc/src/transport/ice.d.ts +21 -3
  157. package/lib/webrtc/src/transport/ice.js +159 -30
  158. package/lib/webrtc/src/transport/ice.js.map +1 -1
  159. package/lib/webrtc/src/transport/sctp.d.ts +1 -0
  160. package/lib/webrtc/src/transport/sctp.js +26 -22
  161. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  162. package/lib/webrtc/src/utils.d.ts +12 -4
  163. package/lib/webrtc/src/utils.js +118 -16
  164. package/lib/webrtc/src/utils.js.map +1 -1
  165. package/package.json +7 -10
  166. package/lib/ice/src/stun/attributes.js.map +0 -1
  167. package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
  168. package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
  169. package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
@@ -23,7 +23,6 @@ Figure 2: Example for round-trip time computation
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.RTCRtpSender = void 0;
25
25
  const crypto_1 = require("crypto");
26
- const jspack_1 = require("@shinyoshiaki/jspack");
27
26
  const crypto_2 = require("crypto");
28
27
  const promises_1 = require("timers/promises");
29
28
  const common_1 = require("../imports/common");
@@ -59,19 +58,13 @@ class RTCRtpSender {
59
58
  enumerable: true,
60
59
  configurable: true,
61
60
  writable: true,
62
- value: jspack_1.jspack.Unpack("!L", (0, crypto_1.randomBytes)(4))[0]
61
+ value: (0, crypto_1.randomBytes)(4).readUInt32BE(0)
63
62
  });
64
63
  Object.defineProperty(this, "rtxSsrc", {
65
64
  enumerable: true,
66
65
  configurable: true,
67
66
  writable: true,
68
- value: jspack_1.jspack.Unpack("!L", (0, crypto_1.randomBytes)(4))[0]
69
- });
70
- Object.defineProperty(this, "streamId", {
71
- enumerable: true,
72
- configurable: true,
73
- writable: true,
74
- value: (0, crypto_2.randomUUID)().toString()
67
+ value: (0, crypto_1.randomBytes)(4).readUInt32BE(0)
75
68
  });
76
69
  Object.defineProperty(this, "trackId", {
77
70
  enumerable: true,
@@ -175,6 +168,12 @@ class RTCRtpSender {
175
168
  writable: true,
176
169
  value: void 0
177
170
  });
171
+ Object.defineProperty(this, "sendEncodings", {
172
+ enumerable: true,
173
+ configurable: true,
174
+ writable: true,
175
+ value: [{}]
176
+ });
178
177
  // # stats
179
178
  Object.defineProperty(this, "lastSRtimestamp", {
180
179
  enumerable: true,
@@ -212,12 +211,72 @@ class RTCRtpSender {
212
211
  writable: true,
213
212
  value: 0
214
213
  });
214
+ Object.defineProperty(this, "headerBytesSent", {
215
+ enumerable: true,
216
+ configurable: true,
217
+ writable: true,
218
+ value: 0
219
+ });
215
220
  Object.defineProperty(this, "rtt", {
216
221
  enumerable: true,
217
222
  configurable: true,
218
223
  writable: true,
219
224
  value: void 0
220
225
  });
226
+ Object.defineProperty(this, "totalRoundTripTime", {
227
+ enumerable: true,
228
+ configurable: true,
229
+ writable: true,
230
+ value: 0
231
+ });
232
+ Object.defineProperty(this, "roundTripTimeMeasurements", {
233
+ enumerable: true,
234
+ configurable: true,
235
+ writable: true,
236
+ value: 0
237
+ });
238
+ Object.defineProperty(this, "retransmittedPacketsSent", {
239
+ enumerable: true,
240
+ configurable: true,
241
+ writable: true,
242
+ value: 0
243
+ });
244
+ Object.defineProperty(this, "retransmittedBytesSent", {
245
+ enumerable: true,
246
+ configurable: true,
247
+ writable: true,
248
+ value: 0
249
+ });
250
+ Object.defineProperty(this, "nackCount", {
251
+ enumerable: true,
252
+ configurable: true,
253
+ writable: true,
254
+ value: 0
255
+ });
256
+ Object.defineProperty(this, "pliCount", {
257
+ enumerable: true,
258
+ configurable: true,
259
+ writable: true,
260
+ value: 0
261
+ });
262
+ Object.defineProperty(this, "firCount", {
263
+ enumerable: true,
264
+ configurable: true,
265
+ writable: true,
266
+ value: 0
267
+ });
268
+ Object.defineProperty(this, "remotePacketsLost", {
269
+ enumerable: true,
270
+ configurable: true,
271
+ writable: true,
272
+ value: void 0
273
+ });
274
+ Object.defineProperty(this, "remoteFractionLost", {
275
+ enumerable: true,
276
+ configurable: true,
277
+ writable: true,
278
+ value: void 0
279
+ });
221
280
  Object.defineProperty(this, "receiverEstimatedMaxBitrate", {
222
281
  enumerable: true,
223
282
  configurable: true,
@@ -277,7 +336,13 @@ class RTCRtpSender {
277
336
  enumerable: true,
278
337
  configurable: true,
279
338
  writable: true,
280
- value: void 0
339
+ value: null
340
+ });
341
+ Object.defineProperty(this, "streamIds", {
342
+ enumerable: true,
343
+ configurable: true,
344
+ writable: true,
345
+ value: []
281
346
  });
282
347
  Object.defineProperty(this, "stopped", {
283
348
  enumerable: true,
@@ -302,12 +367,18 @@ class RTCRtpSender {
302
367
  ? this.trackOrKind
303
368
  : this.trackOrKind.kind;
304
369
  if (typeof trackOrKind !== "string") {
305
- if (trackOrKind.streamId) {
306
- this.streamId = trackOrKind.streamId;
307
- }
308
370
  this.registerTrack(trackOrKind);
309
371
  }
310
372
  }
373
+ get transport() {
374
+ return this.dtlsTransport ?? null;
375
+ }
376
+ get streamId() {
377
+ return this.streamIds[0];
378
+ }
379
+ set streamId(value) {
380
+ this.streamIds = value ? [value] : [];
381
+ }
311
382
  setDtlsTransport(dtlsTransport) {
312
383
  if (this.dtlsTransport) {
313
384
  this.dtlsDisposer.forEach((dispose) => dispose());
@@ -368,9 +439,21 @@ class RTCRtpSender {
368
439
  this.replaceRTP(header);
369
440
  });
370
441
  }
442
+ setStreams(streams = []) {
443
+ this.streamIds = [...new Set(streams.map((stream) => stream.id))];
444
+ }
445
+ setSendEncodings(encodings = []) {
446
+ this.sendEncodings =
447
+ encodings.length > 0
448
+ ? encodings.map((encoding) => ({ ...encoding }))
449
+ : [{}];
450
+ }
371
451
  async replaceTrack(track) {
372
452
  if (track === null) {
373
- // todo impl
453
+ if (this.disposeTrack) {
454
+ this.disposeTrack();
455
+ }
456
+ this.track = null;
374
457
  return;
375
458
  }
376
459
  if (track.stopped)
@@ -389,7 +472,7 @@ class RTCRtpSender {
389
472
  if (this.disposeTrack) {
390
473
  this.disposeTrack();
391
474
  }
392
- this.track = undefined;
475
+ this.track = null;
393
476
  }
394
477
  async runRtcp() {
395
478
  if (this.rtcpRunning || this.stopped)
@@ -511,6 +594,7 @@ class RTCRtpSender {
511
594
  this.ntpTimestamp = ntpTimestamp;
512
595
  this.rtpTimestamp = header.timestamp;
513
596
  this.octetCount += payload.length;
597
+ this.headerBytesSent += header.serializeSize;
514
598
  this.packetCount = (0, common_1.uint32Add)(this.packetCount, 1);
515
599
  this.rtpCache[header.sequenceNumber % RTP_HISTORY_SIZE] = rtp;
516
600
  let rtpPayload = payload;
@@ -543,11 +627,15 @@ class RTCRtpSender {
543
627
  packet.reports
544
628
  .filter((report) => report.ssrc === this.ssrc)
545
629
  .forEach((report) => {
630
+ this.remotePacketsLost = report.packetsLost;
631
+ this.remoteFractionLost = report.fractionLost / 256;
546
632
  if (this.lastSRtimestamp === report.lsr && report.dlsr) {
547
633
  if (this.lastSentSRTimestamp) {
548
634
  const rtt = (0, utils_1.timestampSeconds)() -
549
635
  this.lastSentSRTimestamp -
550
636
  report.dlsr / 65536;
637
+ this.totalRoundTripTime += rtt;
638
+ this.roundTripTimeMeasurements++;
551
639
  if (this.rtt === undefined) {
552
640
  this.rtt = rtt;
553
641
  }
@@ -572,6 +660,7 @@ class RTCRtpSender {
572
660
  case rtp_1.GenericNack.count:
573
661
  {
574
662
  const feedback = packet.feedback;
663
+ this.nackCount++;
575
664
  feedback.lost.forEach(async (seqNum) => {
576
665
  let packet = this.rtpCache[seqNum % RTP_HISTORY_SIZE];
577
666
  if (packet && packet.header.sequenceNumber !== seqNum) {
@@ -582,6 +671,9 @@ class RTCRtpSender {
582
671
  packet = (0, rtp_1.wrapRtx)(packet, this.rtxPayloadType, this.rtxSequenceNumber, this.rtxSsrc);
583
672
  this.rtxSequenceNumber = (0, common_1.uint16Add)(this.rtxSequenceNumber, 1);
584
673
  }
674
+ this.retransmittedPacketsSent++;
675
+ this.retransmittedBytesSent += packet.payload.length;
676
+ this.headerBytesSent += packet.header.serializeSize;
585
677
  await this.dtlsTransport.sendRtp(packet.payload, packet.header);
586
678
  }
587
679
  });
@@ -603,6 +695,7 @@ class RTCRtpSender {
603
695
  break;
604
696
  case rtp_1.PictureLossIndication.count:
605
697
  {
698
+ this.pliCount++;
606
699
  this.onPictureLossIndication.execute();
607
700
  }
608
701
  break;
@@ -615,51 +708,94 @@ class RTCRtpSender {
615
708
  // todo impl
616
709
  getParameters() {
617
710
  return {
618
- encodings: [],
711
+ encodings: this.sendEncodings.map((encoding) => ({ ...encoding })),
619
712
  };
620
713
  }
621
714
  // todo impl
622
- setParameters(params) { }
623
- async getStats() {
624
- const timestamp = (0, stats_1.getStatsTimestamp)();
625
- const stats = [];
626
- if (!this.dtlsTransport) {
627
- return stats;
715
+ setParameters(params) {
716
+ if (params.encodings) {
717
+ this.setSendEncodings(params.encodings);
628
718
  }
629
- const transportId = (0, stats_1.generateStatsId)("transport", this.dtlsTransport.id);
719
+ }
720
+ get outboundRtpStatsId() {
721
+ return (0, stats_1.generateStatsId)("outbound-rtp", this.trackId);
722
+ }
723
+ get mediaSourceStatsId() {
724
+ return (0, stats_1.generateStatsId)("media-source", this.trackId);
725
+ }
726
+ get remoteInboundRtpStatsId() {
727
+ return (0, stats_1.generateStatsId)("remote-inbound-rtp", this.trackId);
728
+ }
729
+ getStatsRootIds() {
730
+ return [this.outboundRtpStatsId];
731
+ }
732
+ collectStats(timestamp) {
733
+ const stats = [];
734
+ const transportId = this.dtlsTransport
735
+ ? (0, stats_1.generateStatsId)("transport", this.dtlsTransport.id)
736
+ : undefined;
737
+ const codecId = this.codec && transportId
738
+ ? (0, stats_1.generateCodecStatsId)(transportId, this.codec.payloadType, this.trackId)
739
+ : undefined;
630
740
  // Outbound RTP stats
631
741
  const outboundRtpStats = {
632
742
  type: "outbound-rtp",
633
- id: (0, stats_1.generateStatsId)("outbound-rtp", this.ssrc),
743
+ id: this.outboundRtpStatsId,
634
744
  timestamp,
635
745
  ssrc: this.ssrc,
636
746
  kind: this.kind,
637
747
  transportId,
638
- codecId: this.codec
639
- ? (0, stats_1.generateStatsId)("codec", this.codec.payloadType, transportId)
640
- : undefined,
748
+ codecId,
641
749
  mid: this.mid,
642
750
  packetsSent: this.packetCount,
643
751
  bytesSent: this.octetCount,
752
+ headerBytesSent: this.headerBytesSent,
753
+ retransmittedPacketsSent: this.retransmittedPacketsSent || undefined,
754
+ retransmittedBytesSent: this.retransmittedBytesSent || undefined,
644
755
  rtxSsrc: this.rtxPayloadType ? this.rtxSsrc : undefined,
756
+ mediaSourceId: this.track ? this.mediaSourceStatsId : undefined,
757
+ remoteId: this.rtt !== undefined ||
758
+ this.remotePacketsLost !== undefined ||
759
+ this.remoteFractionLost !== undefined
760
+ ? this.remoteInboundRtpStatsId
761
+ : undefined,
762
+ nackCount: this.nackCount || undefined,
763
+ pliCount: this.pliCount || undefined,
764
+ firCount: this.firCount || undefined,
645
765
  };
646
766
  stats.push(outboundRtpStats);
647
767
  // Media source stats
648
768
  if (this.track) {
649
769
  const mediaSourceStats = {
650
770
  type: "media-source",
651
- id: (0, stats_1.generateStatsId)("media-source", this.trackId),
771
+ id: this.mediaSourceStatsId,
652
772
  timestamp,
653
- trackIdentifier: this.trackId,
773
+ trackIdentifier: this.track.id ?? this.trackId,
654
774
  kind: this.kind,
655
775
  };
656
776
  stats.push(mediaSourceStats);
657
777
  }
778
+ if (this.codec && transportId) {
779
+ const codecStats = {
780
+ type: "codec",
781
+ id: codecId,
782
+ timestamp,
783
+ payloadType: this.codec.payloadType,
784
+ transportId,
785
+ mimeType: this.codec.mimeType,
786
+ clockRate: this.codec.clockRate,
787
+ channels: this.codec.channels,
788
+ sdpFmtpLine: this.codec.parameters,
789
+ };
790
+ stats.push(codecStats);
791
+ }
658
792
  // Remote inbound RTP stats (if we have RTT)
659
- if (this.rtt !== undefined) {
793
+ if (this.rtt !== undefined ||
794
+ this.remotePacketsLost !== undefined ||
795
+ this.remoteFractionLost !== undefined) {
660
796
  const remoteInboundStats = {
661
797
  type: "remote-inbound-rtp",
662
- id: (0, stats_1.generateStatsId)("remote-inbound-rtp", this.ssrc),
798
+ id: this.remoteInboundRtpStatsId,
663
799
  timestamp,
664
800
  ssrc: this.ssrc,
665
801
  kind: this.kind,
@@ -667,11 +803,23 @@ class RTCRtpSender {
667
803
  codecId: outboundRtpStats.codecId,
668
804
  localId: outboundRtpStats.id,
669
805
  roundTripTime: this.rtt,
806
+ totalRoundTripTime: this.totalRoundTripTime,
807
+ roundTripTimeMeasurements: this.roundTripTimeMeasurements,
808
+ packetsLost: this.remotePacketsLost,
809
+ fractionLost: this.remoteFractionLost,
670
810
  };
671
811
  stats.push(remoteInboundStats);
672
812
  }
673
813
  return stats;
674
814
  }
815
+ async getStats() {
816
+ const timestamp = (0, stats_1.getStatsTimestamp)();
817
+ const stats = this.collectStats(timestamp);
818
+ if (this.dtlsTransport) {
819
+ stats.push(...(await this.dtlsTransport.getStats(timestamp)));
820
+ }
821
+ return (0, stats_1.buildStatsReport)(stats, this.getStatsRootIds());
822
+ }
675
823
  }
676
824
  exports.RTCRtpSender = RTCRtpSender;
677
825
  //# sourceMappingURL=rtpSender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n [10 Nov 1995 11:33:25.125 UTC] [10 Nov 1995 11:33:36.5 UTC]\n n SR(n) A=b710:8000 (46864.500 s)\n ---------------------------------------------------------------->\n v ^\n ntp_sec =0xb44db705 v ^ dlsr=0x0005:4000 ( 5.250s)\n ntp_frac=0x20000000 v ^ lsr =0xb705:2000 (46853.125s)\n (3024992005.125 s) v ^\n r v ^ RR(n)\n ---------------------------------------------------------------->\n |<-DLSR->|\n (5.250 s)\n \n A 0xb710:8000 (46864.500 s)\n DLSR -0x0005:4000 ( 5.250 s)\n LSR -0xb705:2000 (46853.125 s)\n -------------------------------\n delay 0x0006:2000 ( 6.125 s)\n \nFigure 2: Example for round-trip time computation\n */\n\nimport { randomBytes } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nimport { randomUUID } from \"crypto\";\nimport { setTimeout } from \"timers/promises\";\nimport { Event, random16, uint16Add, uint32Add } from \"../imports/common\";\n\nimport { codecParametersFromString } from \"..\";\nimport {\n type Extension,\n GenericNack,\n PictureLossIndication,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n RedEncoder,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n debug,\n serializeAbsSendTime,\n serializeRepairedRtpStreamId,\n serializeSdesMid,\n serializeSdesRTPStreamID,\n serializeTransportWideCC,\n wrapRtx,\n} from \"../imports/rtp\";\nimport type { RTCDtlsTransport } from \"../transport/dtls\";\nimport type { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime, timestampSeconds } from \"../utils\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, type SentInfo } from \"./sender/senderBWE\";\nimport {\n type RTCMediaSourceStats,\n type RTCOutboundRtpStreamStats,\n type RTCRemoteInboundRtpStreamStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"./stats\";\nimport type { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind: Kind;\n readonly ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n readonly rtxSsrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n streamId = randomUUID().toString();\n readonly trackId = randomUUID().toString();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n redRedundantPayloadType?: number;\n private _redDistance = 2;\n redEncoder = new RedEncoder(this._redDistance);\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n\n // # stats\n private lastSRtimestamp?: number;\n private lastSentSRTimestamp?: number;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private rtt?: number;\n receiverEstimatedMaxBitrate = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n codec?: RTCRtpCodecParameters;\n public dtlsTransport!: RTCDtlsTransport;\n private dtlsDisposer: (() => void)[] = [];\n\n track?: MediaStreamTrack;\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(public trackOrKind: Kind | MediaStreamTrack) {\n this.kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n if (typeof trackOrKind !== \"string\") {\n if (trackOrKind.streamId) {\n this.streamId = trackOrKind.streamId;\n }\n this.registerTrack(trackOrKind);\n }\n }\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport) {\n this.dtlsDisposer.forEach((dispose) => dispose());\n }\n\n this.dtlsTransport = dtlsTransport;\n this.dtlsDisposer = [\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n }).unSubscribe,\n ];\n }\n\n get redDistance() {\n return this._redDistance;\n }\n set redDistance(n: number) {\n this._redDistance = n;\n this.redEncoder.distance = n;\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec) => {\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codecParams[\"apt\"] === this.codec?.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = Number(\n (codec.parameters ?? \"\").split(\"/\")[0],\n );\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe(async (rtp) => {\n await this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n // todo impl\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n this.track = undefined;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lastSRtimestamp = compactNtp(this.ntpTimestamp);\n this.lastSentSRTimestamp = timestampSeconds();\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n }),\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP(\n {\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">,\n discontinuity = false,\n ) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n if (discontinuity) {\n this.seqOffset = uint16Add(this.seqOffset, 2);\n }\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n if (discontinuity) {\n this.timestampOffset = uint16Add(this.timestampOffset, 1);\n }\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n async sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const { header, payload } = rtp;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n const ntpTimestamp = ntpTime();\n\n const originalHeaderExtensions = [...header.extensions];\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return serializeSdesMid(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return serializeSdesRTPStreamID(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return serializeRepairedRtpStreamId(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1,\n );\n return serializeTransportWideCC(\n this.dtlsTransport.transportSequenceNumber,\n );\n case RTP_EXTENSION_URI.absSendTime:\n return serializeAbsSendTime(ntpTimestamp);\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n for (const ext of originalHeaderExtensions) {\n const exist = header.extensions.find((v) => v.id === ext.id);\n if (exist) {\n exist.payload = ext.payload;\n } else {\n header.extensions.push(ext);\n }\n }\n header.extensions = header.extensions.sort((a, b) => a.id - b.id);\n\n this.ntpTimestamp = ntpTimestamp;\n this.rtpTimestamp = header.timestamp;\n this.octetCount += payload.length;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n this.rtpCache[header.sequenceNumber % RTP_HISTORY_SIZE] = rtp;\n\n let rtpPayload = payload;\n\n if (this.redRedundantPayloadType) {\n this.redEncoder.push({\n block: rtpPayload,\n timestamp: header.timestamp,\n blockPT: this.redRedundantPayloadType,\n });\n const red = this.redEncoder.build();\n rtpPayload = red.serialize();\n }\n\n const size = await this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const millitime = milliTime();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: millitime,\n sentAtMs: millitime,\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n if (this.lastSRtimestamp === report.lsr && report.dlsr) {\n if (this.lastSentSRTimestamp) {\n const rtt =\n timestampSeconds() -\n this.lastSentSRTimestamp -\n report.dlsr / 65536;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n feedback.lost.forEach(async (seqNum) => {\n let packet: RtpPacket | undefined =\n this.rtpCache[seqNum % RTP_HISTORY_SIZE];\n if (packet && packet.header.sequenceNumber !== seqNum) {\n packet = undefined;\n }\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc,\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1,\n );\n }\n await this.dtlsTransport.sendRtp(\n packet.payload,\n packet.header,\n );\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n\n // todo impl\n getParameters() {\n return {\n encodings: [],\n };\n }\n\n // todo impl\n setParameters(params: any) {}\n\n async getStats(): Promise<RTCStats[]> {\n const timestamp = getStatsTimestamp();\n const stats: RTCStats[] = [];\n\n if (!this.dtlsTransport) {\n return stats;\n }\n\n const transportId = generateStatsId(\"transport\", this.dtlsTransport.id);\n\n // Outbound RTP stats\n const outboundRtpStats: RTCOutboundRtpStreamStats = {\n type: \"outbound-rtp\",\n id: generateStatsId(\"outbound-rtp\", this.ssrc),\n timestamp,\n ssrc: this.ssrc,\n kind: this.kind,\n transportId,\n codecId: this.codec\n ? generateStatsId(\"codec\", this.codec.payloadType, transportId)\n : undefined,\n mid: this.mid,\n packetsSent: this.packetCount,\n bytesSent: this.octetCount,\n rtxSsrc: this.rtxPayloadType ? this.rtxSsrc : undefined,\n };\n stats.push(outboundRtpStats);\n\n // Media source stats\n if (this.track) {\n const mediaSourceStats: RTCMediaSourceStats = {\n type: \"media-source\",\n id: generateStatsId(\"media-source\", this.trackId),\n timestamp,\n trackIdentifier: this.trackId,\n kind: this.kind,\n };\n stats.push(mediaSourceStats);\n }\n\n // Remote inbound RTP stats (if we have RTT)\n if (this.rtt !== undefined) {\n const remoteInboundStats: RTCRemoteInboundRtpStreamStats = {\n type: \"remote-inbound-rtp\",\n id: generateStatsId(\"remote-inbound-rtp\", this.ssrc),\n timestamp,\n ssrc: this.ssrc,\n kind: this.kind,\n transportId,\n codecId: outboundRtpStats.codecId,\n localId: outboundRtpStats.id,\n roundTripTime: this.rtt,\n };\n stats.push(remoteInboundStats);\n }\n\n return stats;\n }\n}\n"]}
1
+ {"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n [10 Nov 1995 11:33:25.125 UTC] [10 Nov 1995 11:33:36.5 UTC]\n n SR(n) A=b710:8000 (46864.500 s)\n ---------------------------------------------------------------->\n v ^\n ntp_sec =0xb44db705 v ^ dlsr=0x0005:4000 ( 5.250s)\n ntp_frac=0x20000000 v ^ lsr =0xb705:2000 (46853.125s)\n (3024992005.125 s) v ^\n r v ^ RR(n)\n ---------------------------------------------------------------->\n |<-DLSR->|\n (5.250 s)\n \n A 0xb710:8000 (46864.500 s)\n DLSR -0x0005:4000 ( 5.250 s)\n LSR -0xb705:2000 (46853.125 s)\n -------------------------------\n delay 0x0006:2000 ( 6.125 s)\n \nFigure 2: Example for round-trip time computation\n */\n\nimport { randomBytes } from \"crypto\";\n\nimport { randomUUID } from \"crypto\";\nimport { setTimeout } from \"timers/promises\";\nimport { Event, random16, uint16Add, uint32Add } from \"../imports/common\";\n\nimport { codecParametersFromString } from \"..\";\nimport {\n type Extension,\n GenericNack,\n PictureLossIndication,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n RedEncoder,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n debug,\n serializeAbsSendTime,\n serializeRepairedRtpStreamId,\n serializeSdesMid,\n serializeSdesRTPStreamID,\n serializeTransportWideCC,\n wrapRtx,\n} from \"../imports/rtp\";\nimport type { RTCDtlsTransport } from \"../transport/dtls\";\nimport type { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime, timestampSeconds } from \"../utils\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, type SentInfo } from \"./sender/senderBWE\";\nimport {\n type RTCCodecStats,\n type RTCMediaSourceStats,\n type RTCOutboundRtpStreamStats,\n type RTCRemoteInboundRtpStreamStats,\n type RTCStats,\n type RTCStatsReport,\n buildStatsReport,\n generateCodecStatsId,\n generateStatsId,\n getStatsTimestamp,\n} from \"./stats\";\nimport type { MediaStream, MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind: Kind;\n readonly ssrc = randomBytes(4).readUInt32BE(0);\n readonly rtxSsrc = randomBytes(4).readUInt32BE(0);\n readonly trackId = randomUUID().toString();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n redRedundantPayloadType?: number;\n private _redDistance = 2;\n redEncoder = new RedEncoder(this._redDistance);\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n private sendEncodings: Array<Record<string, unknown>> = [{}];\n\n // # stats\n private lastSRtimestamp?: number;\n private lastSentSRTimestamp?: number;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private headerBytesSent = 0;\n private rtt?: number;\n private totalRoundTripTime = 0;\n private roundTripTimeMeasurements = 0;\n private retransmittedPacketsSent = 0;\n private retransmittedBytesSent = 0;\n private nackCount = 0;\n private pliCount = 0;\n private firCount = 0;\n private remotePacketsLost?: number;\n private remoteFractionLost?: number;\n receiverEstimatedMaxBitrate = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n codec?: RTCRtpCodecParameters;\n public dtlsTransport!: RTCDtlsTransport;\n private dtlsDisposer: (() => void)[] = [];\n\n track: MediaStreamTrack | null = null;\n streamIds: string[] = [];\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(public trackOrKind: Kind | MediaStreamTrack) {\n this.kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n if (typeof trackOrKind !== \"string\") {\n this.registerTrack(trackOrKind);\n }\n }\n\n get transport() {\n return this.dtlsTransport ?? null;\n }\n\n get streamId() {\n return this.streamIds[0];\n }\n\n set streamId(value: string | undefined) {\n this.streamIds = value ? [value] : [];\n }\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport) {\n this.dtlsDisposer.forEach((dispose) => dispose());\n }\n\n this.dtlsTransport = dtlsTransport;\n this.dtlsDisposer = [\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n }).unSubscribe,\n ];\n }\n\n get redDistance() {\n return this._redDistance;\n }\n set redDistance(n: number) {\n this._redDistance = n;\n this.redEncoder.distance = n;\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec) => {\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codecParams[\"apt\"] === this.codec?.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = Number(\n (codec.parameters ?? \"\").split(\"/\")[0],\n );\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe(async (rtp) => {\n await this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n setStreams(streams: MediaStream[] = []) {\n this.streamIds = [...new Set(streams.map((stream) => stream.id))];\n }\n\n setSendEncodings(encodings: Array<Record<string, unknown>> = []) {\n this.sendEncodings =\n encodings.length > 0\n ? encodings.map((encoding) => ({ ...encoding }))\n : [{}];\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n this.track = null;\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n this.track = null;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lastSRtimestamp = compactNtp(this.ntpTimestamp);\n this.lastSentSRTimestamp = timestampSeconds();\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n }),\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP(\n {\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">,\n discontinuity = false,\n ) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n if (discontinuity) {\n this.seqOffset = uint16Add(this.seqOffset, 2);\n }\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n if (discontinuity) {\n this.timestampOffset = uint16Add(this.timestampOffset, 1);\n }\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n async sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const { header, payload } = rtp;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n const ntpTimestamp = ntpTime();\n\n const originalHeaderExtensions = [...header.extensions];\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return serializeSdesMid(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return serializeSdesRTPStreamID(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return serializeRepairedRtpStreamId(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1,\n );\n return serializeTransportWideCC(\n this.dtlsTransport.transportSequenceNumber,\n );\n case RTP_EXTENSION_URI.absSendTime:\n return serializeAbsSendTime(ntpTimestamp);\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n for (const ext of originalHeaderExtensions) {\n const exist = header.extensions.find((v) => v.id === ext.id);\n if (exist) {\n exist.payload = ext.payload;\n } else {\n header.extensions.push(ext);\n }\n }\n header.extensions = header.extensions.sort((a, b) => a.id - b.id);\n\n this.ntpTimestamp = ntpTimestamp;\n this.rtpTimestamp = header.timestamp;\n this.octetCount += payload.length;\n this.headerBytesSent += header.serializeSize;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n this.rtpCache[header.sequenceNumber % RTP_HISTORY_SIZE] = rtp;\n\n let rtpPayload = payload;\n\n if (this.redRedundantPayloadType) {\n this.redEncoder.push({\n block: rtpPayload,\n timestamp: header.timestamp,\n blockPT: this.redRedundantPayloadType,\n });\n const red = this.redEncoder.build();\n rtpPayload = red.serialize();\n }\n\n const size = await this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const millitime = milliTime();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: millitime,\n sentAtMs: millitime,\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n this.remotePacketsLost = report.packetsLost;\n this.remoteFractionLost = report.fractionLost / 256;\n if (this.lastSRtimestamp === report.lsr && report.dlsr) {\n if (this.lastSentSRTimestamp) {\n const rtt =\n timestampSeconds() -\n this.lastSentSRTimestamp -\n report.dlsr / 65536;\n this.totalRoundTripTime += rtt;\n this.roundTripTimeMeasurements++;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n this.nackCount++;\n feedback.lost.forEach(async (seqNum) => {\n let packet: RtpPacket | undefined =\n this.rtpCache[seqNum % RTP_HISTORY_SIZE];\n if (packet && packet.header.sequenceNumber !== seqNum) {\n packet = undefined;\n }\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc,\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1,\n );\n }\n this.retransmittedPacketsSent++;\n this.retransmittedBytesSent += packet.payload.length;\n this.headerBytesSent += packet.header.serializeSize;\n await this.dtlsTransport.sendRtp(\n packet.payload,\n packet.header,\n );\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.pliCount++;\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n\n // todo impl\n getParameters() {\n return {\n encodings: this.sendEncodings.map((encoding) => ({ ...encoding })),\n };\n }\n\n // todo impl\n setParameters(params: { encodings?: Array<Record<string, unknown>> }) {\n if (params.encodings) {\n this.setSendEncodings(params.encodings);\n }\n }\n\n private get outboundRtpStatsId() {\n return generateStatsId(\"outbound-rtp\", this.trackId);\n }\n\n private get mediaSourceStatsId() {\n return generateStatsId(\"media-source\", this.trackId);\n }\n\n private get remoteInboundRtpStatsId() {\n return generateStatsId(\"remote-inbound-rtp\", this.trackId);\n }\n\n getStatsRootIds() {\n return [this.outboundRtpStatsId];\n }\n\n collectStats(timestamp: number): RTCStats[] {\n const stats: RTCStats[] = [];\n const transportId = this.dtlsTransport\n ? generateStatsId(\"transport\", this.dtlsTransport.id)\n : undefined;\n const codecId =\n this.codec && transportId\n ? generateCodecStatsId(\n transportId,\n this.codec.payloadType,\n this.trackId,\n )\n : undefined;\n\n // Outbound RTP stats\n const outboundRtpStats: RTCOutboundRtpStreamStats = {\n type: \"outbound-rtp\",\n id: this.outboundRtpStatsId,\n timestamp,\n ssrc: this.ssrc,\n kind: this.kind,\n transportId,\n codecId,\n mid: this.mid,\n packetsSent: this.packetCount,\n bytesSent: this.octetCount,\n headerBytesSent: this.headerBytesSent,\n retransmittedPacketsSent: this.retransmittedPacketsSent || undefined,\n retransmittedBytesSent: this.retransmittedBytesSent || undefined,\n rtxSsrc: this.rtxPayloadType ? this.rtxSsrc : undefined,\n mediaSourceId: this.track ? this.mediaSourceStatsId : undefined,\n remoteId:\n this.rtt !== undefined ||\n this.remotePacketsLost !== undefined ||\n this.remoteFractionLost !== undefined\n ? this.remoteInboundRtpStatsId\n : undefined,\n nackCount: this.nackCount || undefined,\n pliCount: this.pliCount || undefined,\n firCount: this.firCount || undefined,\n };\n stats.push(outboundRtpStats);\n\n // Media source stats\n if (this.track) {\n const mediaSourceStats: RTCMediaSourceStats = {\n type: \"media-source\",\n id: this.mediaSourceStatsId,\n timestamp,\n trackIdentifier: this.track.id ?? this.trackId,\n kind: this.kind,\n };\n stats.push(mediaSourceStats);\n }\n\n if (this.codec && transportId) {\n const codecStats: RTCCodecStats = {\n type: \"codec\",\n id: codecId!,\n timestamp,\n payloadType: this.codec.payloadType,\n transportId,\n mimeType: this.codec.mimeType,\n clockRate: this.codec.clockRate,\n channels: this.codec.channels,\n sdpFmtpLine: this.codec.parameters,\n };\n stats.push(codecStats);\n }\n\n // Remote inbound RTP stats (if we have RTT)\n if (\n this.rtt !== undefined ||\n this.remotePacketsLost !== undefined ||\n this.remoteFractionLost !== undefined\n ) {\n const remoteInboundStats: RTCRemoteInboundRtpStreamStats = {\n type: \"remote-inbound-rtp\",\n id: this.remoteInboundRtpStatsId,\n timestamp,\n ssrc: this.ssrc,\n kind: this.kind,\n transportId,\n codecId: outboundRtpStats.codecId,\n localId: outboundRtpStats.id,\n roundTripTime: this.rtt,\n totalRoundTripTime: this.totalRoundTripTime,\n roundTripTimeMeasurements: this.roundTripTimeMeasurements,\n packetsLost: this.remotePacketsLost,\n fractionLost: this.remoteFractionLost,\n };\n stats.push(remoteInboundStats);\n }\n\n return stats;\n }\n\n async getStats(): Promise<RTCStatsReport> {\n const timestamp = getStatsTimestamp();\n const stats = this.collectStats(timestamp);\n\n if (this.dtlsTransport) {\n stats.push(...(await this.dtlsTransport.getStats(timestamp)));\n }\n\n return buildStatsReport(stats, this.getStatsRootIds());\n }\n}\n"]}
@@ -14,7 +14,7 @@ export declare class RTCRtpTransceiver {
14
14
  private _direction;
15
15
  readonly id: string;
16
16
  readonly onTrack: Event<[MediaStreamTrack, RTCRtpTransceiver]>;
17
- mid?: string;
17
+ mid: string | null;
18
18
  mLineIndex?: number;
19
19
  /**should not be reused because it has been used for sending before. */
20
20
  usedForSender: boolean;
@@ -32,17 +32,21 @@ export declare class RTCRtpTransceiver {
32
32
  _direction: MediaDirection);
33
33
  get dtlsTransport(): RTCDtlsTransport;
34
34
  /**RFC 8829 4.2.4. setDirectionに渡された最後の値を示します */
35
- get direction(): "inactive" | "sendonly" | "recvonly" | "sendrecv";
35
+ get direction(): MediaDirection;
36
+ set direction(direction: MediaDirection);
36
37
  setDirection(direction: MediaDirection): void;
37
38
  /**RFC 8829 4.2.5. last negotiated direction */
38
- get currentDirection(): MediaDirection | undefined;
39
- setCurrentDirection(direction: MediaDirection | undefined): void;
39
+ get currentDirection(): CurrentDirection | null;
40
+ setCurrentDirection(direction: CurrentDirection | undefined): void;
40
41
  setDtlsTransport(dtls: RTCDtlsTransport): void;
41
42
  get msid(): string;
43
+ get msids(): string[];
42
44
  addTrack(track: MediaStreamTrack): void;
43
45
  stop(): void;
46
+ forceStop(): void;
44
47
  getPayloadType(mimeType: string): number | undefined;
45
48
  getCodecStats(): RTCStats[];
49
+ collectCodecStats(timestamp: number): RTCStats[];
46
50
  }
47
51
  export declare const Inactive = "inactive";
48
52
  export declare const Sendonly = "sendonly";
@@ -50,9 +54,14 @@ export declare const Recvonly = "recvonly";
50
54
  export declare const Sendrecv = "sendrecv";
51
55
  export declare const Directions: readonly ["inactive", "sendonly", "recvonly", "sendrecv"];
52
56
  export type MediaDirection = (typeof Directions)[number];
57
+ export type CurrentDirection = MediaDirection | "stopped";
53
58
  type SimulcastDirection = "send" | "recv";
59
+ export interface RTCRtpEncodingParameters {
60
+ active?: boolean;
61
+ }
54
62
  export interface TransceiverOptions {
55
63
  direction: MediaDirection;
64
+ sendEncodings: RTCRtpEncodingParameters[];
56
65
  simulcast: {
57
66
  direction: SimulcastDirection;
58
67
  rid: string;
@@ -55,7 +55,7 @@ class RTCRtpTransceiver {
55
55
  enumerable: true,
56
56
  configurable: true,
57
57
  writable: true,
58
- value: void 0
58
+ value: null
59
59
  });
60
60
  Object.defineProperty(this, "mLineIndex", {
61
61
  enumerable: true,
@@ -123,15 +123,20 @@ class RTCRtpTransceiver {
123
123
  get direction() {
124
124
  return this._direction;
125
125
  }
126
+ set direction(direction) {
127
+ this.setDirection(direction);
128
+ }
126
129
  setDirection(direction) {
127
130
  this._direction = direction;
128
- if (const_1.SenderDirections.includes(this._currentDirection ?? "")) {
131
+ if (this._currentDirection &&
132
+ this._currentDirection !== "stopped" &&
133
+ const_1.SenderDirections.includes(this._currentDirection)) {
129
134
  this.usedForSender = true;
130
135
  }
131
136
  }
132
137
  /**RFC 8829 4.2.5. last negotiated direction */
133
138
  get currentDirection() {
134
- return this._currentDirection;
139
+ return this._currentDirection ?? null;
135
140
  }
136
141
  setCurrentDirection(direction) {
137
142
  this._currentDirection = direction;
@@ -141,7 +146,10 @@ class RTCRtpTransceiver {
141
146
  this.sender.setDtlsTransport(dtls);
142
147
  }
143
148
  get msid() {
144
- return `${this.sender.streamId} ${this.sender.trackId}`;
149
+ return this.msids[0];
150
+ }
151
+ get msids() {
152
+ return this.sender.streamIds.map((streamId) => `${streamId} ${this.sender.trackId}`);
145
153
  }
146
154
  addTrack(track) {
147
155
  const res = this.receiver.addTrack(track);
@@ -158,11 +166,24 @@ class RTCRtpTransceiver {
158
166
  // todo Stop sending and receiving with transceiver.
159
167
  this.stopping = true;
160
168
  }
169
+ forceStop() {
170
+ if (this.stopped) {
171
+ return;
172
+ }
173
+ this.stopping = true;
174
+ this.stopped = true;
175
+ this.setCurrentDirection("stopped");
176
+ this.receiver.stop();
177
+ this.sender.stop();
178
+ }
161
179
  getPayloadType(mimeType) {
162
180
  return this.codecs.find((codec) => codec.mimeType.toLowerCase().includes(mimeType.toLowerCase()))?.payloadType;
163
181
  }
164
182
  getCodecStats() {
165
183
  const timestamp = (0, stats_1.getStatsTimestamp)();
184
+ return this.collectCodecStats(timestamp);
185
+ }
186
+ collectCodecStats(timestamp) {
166
187
  const stats = [];
167
188
  if (!this.dtlsTransport) {
168
189
  return stats;
@@ -172,7 +193,7 @@ class RTCRtpTransceiver {
172
193
  for (const codec of this.codecs) {
173
194
  const codecStats = {
174
195
  type: "codec",
175
- id: (0, stats_1.generateStatsId)("codec", codec.payloadType, transportId),
196
+ id: (0, stats_1.generateCodecStatsId)(transportId, codec.payloadType, this.id),
176
197
  timestamp,
177
198
  payloadType: codec.payloadType,
178
199
  transportId,