werift 0.22.0 → 0.22.2

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 (179) hide show
  1. package/lib/common/src/binary.d.ts +6 -6
  2. package/lib/common/src/event.d.ts +1 -0
  3. package/lib/common/src/event.js +5 -0
  4. package/lib/common/src/event.js.map +1 -1
  5. package/lib/common/src/log.d.ts +1 -2
  6. package/lib/common/src/transport.d.ts +2 -1
  7. package/lib/common/src/transport.js +28 -14
  8. package/lib/common/src/transport.js.map +1 -1
  9. package/lib/dtls/src/cipher/prf.d.ts +12 -12
  10. package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
  11. package/lib/dtls/src/cipher/suites/aead.js +31 -38
  12. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  13. package/lib/dtls/src/context/cipher.d.ts +4 -4
  14. package/lib/dtls/src/context/cipher.js +21 -10
  15. package/lib/dtls/src/context/cipher.js.map +1 -1
  16. package/lib/dtls/src/context/srtp.d.ts +3 -3
  17. package/lib/dtls/src/context/srtp.js.map +1 -1
  18. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  19. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  20. package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
  21. package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
  22. package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
  23. package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
  24. package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
  25. package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
  26. package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
  27. package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
  28. package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
  29. package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
  30. package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
  31. package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
  32. package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
  33. package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
  34. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
  35. package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
  36. package/lib/dtls/src/handshake/random.d.ts +3 -3
  37. package/lib/dtls/src/record/message/fragment.d.ts +1 -1
  38. package/lib/dtls/src/record/message/header.d.ts +2 -19
  39. package/lib/dtls/src/record/message/header.js +1 -60
  40. package/lib/dtls/src/record/message/header.js.map +1 -1
  41. package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
  42. package/lib/dtls/src/record/message/plaintext.js +34 -16
  43. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  44. package/lib/dtls/src/socket.d.ts +4 -4
  45. package/lib/dtls/src/socket.js.map +1 -1
  46. package/lib/dtls/src/util/binary.d.ts +1 -1
  47. package/lib/ice/src/helper.d.ts +1 -1
  48. package/lib/ice/src/ice.d.ts +4 -3
  49. package/lib/ice/src/ice.js +89 -68
  50. package/lib/ice/src/ice.js.map +1 -1
  51. package/lib/ice/src/iceBase.d.ts +20 -1
  52. package/lib/ice/src/iceBase.js +46 -0
  53. package/lib/ice/src/iceBase.js.map +1 -1
  54. package/lib/ice/src/stun/attributes.d.ts +2 -2
  55. package/lib/ice/src/stun/attributes.js +47 -27
  56. package/lib/ice/src/stun/attributes.js.map +1 -1
  57. package/lib/ice/src/stun/message.d.ts +2 -2
  58. package/lib/ice/src/stun/message.js +21 -23
  59. package/lib/ice/src/stun/message.js.map +1 -1
  60. package/lib/ice/src/stun/protocol.d.ts +2 -2
  61. package/lib/ice/src/turn/protocol.d.ts +2 -2
  62. package/lib/index.mjs +2252 -1474
  63. package/lib/nonstandard/index.mjs +333 -370
  64. package/lib/rtp/src/codec/av1.d.ts +2 -2
  65. package/lib/rtp/src/codec/opus.d.ts +1 -1
  66. package/lib/rtp/src/extra/container/mp4/container.js +18 -8
  67. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  68. package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
  69. package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
  70. package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
  71. package/lib/rtp/src/extra/container/webm/container.d.ts +7 -7
  72. package/lib/rtp/src/extra/container/webm/container.js +17 -7
  73. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  74. package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +1 -1
  75. package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
  76. package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
  77. package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
  78. package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
  79. package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
  80. package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
  81. package/lib/rtp/src/extra/processor/mp4.js +3 -0
  82. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  83. package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
  84. package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
  85. package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
  86. package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
  87. package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -1
  88. package/lib/rtp/src/extra/processor/webmCallback.js +23 -17
  89. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  90. package/lib/rtp/src/helper.d.ts +1 -1
  91. package/lib/rtp/src/rtcp/header.d.ts +1 -1
  92. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
  93. package/lib/rtp/src/rtcp/psfb/index.d.ts +1 -1
  94. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
  95. package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
  96. package/lib/rtp/src/rtcp/rr.d.ts +2 -2
  97. package/lib/rtp/src/rtcp/rtcp.d.ts +1 -1
  98. package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
  99. package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
  100. package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
  101. package/lib/rtp/src/rtcp/sdes.d.ts +3 -3
  102. package/lib/rtp/src/rtcp/sr.d.ts +2 -2
  103. package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
  104. package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
  105. package/lib/rtp/src/rtp/rtp.d.ts +2 -2
  106. package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
  107. package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
  108. package/lib/rtp/src/srtp/const.d.ts +3 -3
  109. package/lib/rtp/src/srtp/const.js.map +1 -1
  110. package/lib/rtp/src/srtp/context/context.d.ts +7 -7
  111. package/lib/rtp/src/srtp/context/context.js +10 -4
  112. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  113. package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
  114. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  115. package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
  116. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  117. package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
  118. package/lib/rtp/src/srtp/srtp.d.ts +2 -2
  119. package/lib/sctp/src/chunk.d.ts +12 -12
  120. package/lib/sctp/src/chunk.js +87 -66
  121. package/lib/sctp/src/chunk.js.map +1 -1
  122. package/lib/sctp/src/param.d.ts +3 -3
  123. package/lib/sctp/src/sctp.d.ts +3 -1
  124. package/lib/sctp/src/sctp.js +36 -1
  125. package/lib/sctp/src/sctp.js.map +1 -1
  126. package/lib/webrtc/src/dataChannel.d.ts +15 -4
  127. package/lib/webrtc/src/dataChannel.js +42 -7
  128. package/lib/webrtc/src/dataChannel.js.map +1 -1
  129. package/lib/webrtc/src/index.d.ts +1 -0
  130. package/lib/webrtc/src/index.js +1 -0
  131. package/lib/webrtc/src/index.js.map +1 -1
  132. package/lib/webrtc/src/media/index.d.ts +1 -0
  133. package/lib/webrtc/src/media/index.js +1 -0
  134. package/lib/webrtc/src/media/index.js.map +1 -1
  135. package/lib/webrtc/src/media/parameters.d.ts +2 -2
  136. package/lib/webrtc/src/media/parameters.js.map +1 -1
  137. package/lib/webrtc/src/media/router.js +2 -1
  138. package/lib/webrtc/src/media/router.js.map +1 -1
  139. package/lib/webrtc/src/media/rtpReceiver.d.ts +2 -2
  140. package/lib/webrtc/src/media/rtpReceiver.js +51 -2
  141. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  142. package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
  143. package/lib/webrtc/src/media/rtpSender.js +78 -7
  144. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  145. package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
  146. package/lib/webrtc/src/media/rtpTransceiver.js +45 -8
  147. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  148. package/lib/webrtc/src/media/stats.d.ts +279 -0
  149. package/lib/webrtc/src/media/stats.js +35 -1
  150. package/lib/webrtc/src/media/stats.js.map +1 -1
  151. package/lib/webrtc/src/peerConnection.d.ts +34 -64
  152. package/lib/webrtc/src/peerConnection.js +319 -986
  153. package/lib/webrtc/src/peerConnection.js.map +1 -1
  154. package/lib/webrtc/src/sctpManager.d.ts +27 -0
  155. package/lib/webrtc/src/sctpManager.js +147 -0
  156. package/lib/webrtc/src/sctpManager.js.map +1 -0
  157. package/lib/webrtc/src/sdp.d.ts +3 -2
  158. package/lib/webrtc/src/sdp.js +17 -7
  159. package/lib/webrtc/src/sdp.js.map +1 -1
  160. package/lib/webrtc/src/sdpManager.d.ts +78 -0
  161. package/lib/webrtc/src/sdpManager.js +391 -0
  162. package/lib/webrtc/src/sdpManager.js.map +1 -0
  163. package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
  164. package/lib/webrtc/src/secureTransportManager.js +345 -0
  165. package/lib/webrtc/src/secureTransportManager.js.map +1 -0
  166. package/lib/webrtc/src/transceiverManager.d.ts +40 -0
  167. package/lib/webrtc/src/transceiverManager.js +355 -0
  168. package/lib/webrtc/src/transceiverManager.js.map +1 -0
  169. package/lib/webrtc/src/transport/dtls.d.ts +18 -6
  170. package/lib/webrtc/src/transport/dtls.js +119 -11
  171. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  172. package/lib/webrtc/src/transport/ice.d.ts +24 -0
  173. package/lib/webrtc/src/transport/ice.js +86 -0
  174. package/lib/webrtc/src/transport/ice.js.map +1 -1
  175. package/lib/webrtc/src/transport/sctp.js +22 -7
  176. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  177. package/lib/webrtc/src/utils.d.ts +3 -3
  178. package/lib/webrtc/src/utils.js.map +1 -1
  179. package/package.json +15 -21
@@ -1,4 +1,4 @@
1
- import type { Direction } from "./rtpTransceiver";
1
+ import type { MediaDirection } from "./rtpTransceiver";
2
2
  export interface RTCRtpParameters {
3
3
  codecs: RTCRtpCodecParameters[];
4
4
  headerExtensions: RTCRtpHeaderExtensionParameters[];
@@ -22,7 +22,7 @@ export declare class RTCRtpCodecParameters {
22
22
  channels?: number;
23
23
  rtcpFeedback: RTCPFB[];
24
24
  parameters?: string;
25
- direction: Direction | "all";
25
+ direction: MediaDirection | "all";
26
26
  constructor(props: Pick<RTCRtpCodecParameters, "mimeType" | "clockRate"> & Partial<RTCRtpCodecParameters>);
27
27
  get name(): string;
28
28
  get contentType(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;AAaA,MAAa,qBAAqB;IAahC,YACE,KACgC;QAdlC;;;WAGG;QACH;;;;;WAAqB;QACrB;;;;;WAAkB;QAClB;;;;;WAAmB;QACnB;;;;;WAAkB;QAClB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;;WAAoB;QACpB;;;;mBAA+B,KAAK;WAAC;QAMnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,CAAC,IAAI,IAAI,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAjCD,sDAiCC;AAED,MAAa,+BAA+B;IAI1C,YACE,KAC8C;QALhD;;;;;WAAY;QACZ;;;;;WAAa;QAMX,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAVD,0EAUC;AAED,MAAa,iBAAiB;IAK5B,YAAY,QAAoC,EAAE;QAJlD;;;;;WAAe;QACf;;;;mBAAM,KAAK;WAAC;QACZ;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,8CAQC;AAED,MAAa,eAAe;IAI1B,YAAY,QAAkC,EAAE;QAHhD;;;;;WAAc;QACd;;;;;WAAmB;QAGjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAPD,0CAOC;AACD,MAAa,mBAAmB;IAG9B,YAAY,QAAsC,EAAE;QAFpD;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,kDAMC;AAED,MAAa,sBAAsB;IAKjC,YACE,KACsD;QANxD;;;;;WAAc;QACd;;;;;WAAqB;QACrB;;;;;WAA0B;QAMxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAXD,wDAWC;AAQD,MAAa,yBAAyB;IAGpC,YAAY,KAAgC;QAF5C;;;;;WAAa;QACb;;;;;WAA4B;QAE1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,8DAMC","sourcesContent":["import type { Direction } from \"./rtpTransceiver\";\n\nexport interface RTCRtpParameters {\n codecs: RTCRtpCodecParameters[];\n headerExtensions: RTCRtpHeaderExtensionParameters[];\n muxId?: string;\n rtpStreamId?: string;\n repairedRtpStreamId?: string;\n rtcp?: RTCRtcpParameters;\n}\n\nexport type RTCPFB = { type: string; parameter?: string };\n\nexport class RTCRtpCodecParameters {\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n payloadType!: number;\n mimeType!: string;\n clockRate!: number;\n channels?: number;\n rtcpFeedback: RTCPFB[] = [];\n parameters?: string;\n direction: Direction | \"all\" = \"all\";\n\n constructor(\n props: Pick<RTCRtpCodecParameters, \"mimeType\" | \"clockRate\"> &\n Partial<RTCRtpCodecParameters>,\n ) {\n Object.assign(this, props);\n }\n\n get name() {\n return this.mimeType.split(\"/\")[1];\n }\n\n get contentType() {\n return this.mimeType.split(\"/\")[0];\n }\n\n get str() {\n let s = `${this.name}/${this.clockRate}`;\n if (this.channels === 2) s += \"/2\";\n return s;\n }\n}\n\nexport class RTCRtpHeaderExtensionParameters {\n id!: number;\n uri!: string;\n\n constructor(\n props: Partial<RTCRtpHeaderExtensionParameters> &\n Pick<RTCRtpHeaderExtensionParameters, \"uri\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpParameters {\n cname?: string;\n mux = false;\n ssrc?: number;\n\n constructor(props: Partial<RTCRtcpParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpFeedback {\n type!: string;\n parameter?: string;\n\n constructor(props: Partial<RTCRtcpFeedback> = {}) {\n Object.assign(this, props);\n }\n}\nexport class RTCRtpRtxParameters {\n ssrc!: number;\n\n constructor(props: Partial<RTCRtpRtxParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtpCodingParameters {\n ssrc!: number;\n payloadType!: number;\n rtx?: RTCRtpRtxParameters;\n\n constructor(\n props: Partial<RTCRtpCodingParameters> &\n Pick<RTCRtpCodingParameters, \"ssrc\" | \"payloadType\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport interface RTCRtpReceiveParameters extends RTCRtpParameters {\n encodings: RTCRtpCodingParameters[];\n}\n\nexport type RTCRtpSendParameters = RTCRtpParameters;\n\nexport class RTCRtpSimulcastParameters {\n rid!: string;\n direction!: \"send\" | \"recv\";\n constructor(props: RTCRtpSimulcastParameters) {\n Object.assign(this, props);\n }\n}\n"]}
1
+ {"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;AAaA,MAAa,qBAAqB;IAahC,YACE,KACgC;QAdlC;;;WAGG;QACH;;;;;WAAqB;QACrB;;;;;WAAkB;QAClB;;;;;WAAmB;QACnB;;;;;WAAkB;QAClB;;;;mBAAyB,EAAE;WAAC;QAC5B;;;;;WAAoB;QACpB;;;;mBAAoC,KAAK;WAAC;QAMxC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,CAAC,IAAI,IAAI,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAjCD,sDAiCC;AAED,MAAa,+BAA+B;IAI1C,YACE,KAC8C;QALhD;;;;;WAAY;QACZ;;;;;WAAa;QAMX,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAVD,0EAUC;AAED,MAAa,iBAAiB;IAK5B,YAAY,QAAoC,EAAE;QAJlD;;;;;WAAe;QACf;;;;mBAAM,KAAK;WAAC;QACZ;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,8CAQC;AAED,MAAa,eAAe;IAI1B,YAAY,QAAkC,EAAE;QAHhD;;;;;WAAc;QACd;;;;;WAAmB;QAGjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAPD,0CAOC;AACD,MAAa,mBAAmB;IAG9B,YAAY,QAAsC,EAAE;QAFpD;;;;;WAAc;QAGZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,kDAMC;AAED,MAAa,sBAAsB;IAKjC,YACE,KACsD;QANxD;;;;;WAAc;QACd;;;;;WAAqB;QACrB;;;;;WAA0B;QAMxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAXD,wDAWC;AAQD,MAAa,yBAAyB;IAGpC,YAAY,KAAgC;QAF5C;;;;;WAAa;QACb;;;;;WAA4B;QAE1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,8DAMC","sourcesContent":["import type { MediaDirection } from \"./rtpTransceiver\";\n\nexport interface RTCRtpParameters {\n codecs: RTCRtpCodecParameters[];\n headerExtensions: RTCRtpHeaderExtensionParameters[];\n muxId?: string;\n rtpStreamId?: string;\n repairedRtpStreamId?: string;\n rtcp?: RTCRtcpParameters;\n}\n\nexport type RTCPFB = { type: string; parameter?: string };\n\nexport class RTCRtpCodecParameters {\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n payloadType!: number;\n mimeType!: string;\n clockRate!: number;\n channels?: number;\n rtcpFeedback: RTCPFB[] = [];\n parameters?: string;\n direction: MediaDirection | \"all\" = \"all\";\n\n constructor(\n props: Pick<RTCRtpCodecParameters, \"mimeType\" | \"clockRate\"> &\n Partial<RTCRtpCodecParameters>,\n ) {\n Object.assign(this, props);\n }\n\n get name() {\n return this.mimeType.split(\"/\")[1];\n }\n\n get contentType() {\n return this.mimeType.split(\"/\")[0];\n }\n\n get str() {\n let s = `${this.name}/${this.clockRate}`;\n if (this.channels === 2) s += \"/2\";\n return s;\n }\n}\n\nexport class RTCRtpHeaderExtensionParameters {\n id!: number;\n uri!: string;\n\n constructor(\n props: Partial<RTCRtpHeaderExtensionParameters> &\n Pick<RTCRtpHeaderExtensionParameters, \"uri\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpParameters {\n cname?: string;\n mux = false;\n ssrc?: number;\n\n constructor(props: Partial<RTCRtcpParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpFeedback {\n type!: string;\n parameter?: string;\n\n constructor(props: Partial<RTCRtcpFeedback> = {}) {\n Object.assign(this, props);\n }\n}\nexport class RTCRtpRtxParameters {\n ssrc!: number;\n\n constructor(props: Partial<RTCRtpRtxParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtpCodingParameters {\n ssrc!: number;\n payloadType!: number;\n rtx?: RTCRtpRtxParameters;\n\n constructor(\n props: Partial<RTCRtpCodingParameters> &\n Pick<RTCRtpCodingParameters, \"ssrc\" | \"payloadType\">,\n ) {\n Object.assign(this, props);\n }\n}\n\nexport interface RTCRtpReceiveParameters extends RTCRtpParameters {\n encodings: RTCRtpCodingParameters[];\n}\n\nexport type RTCRtpSendParameters = RTCRtpParameters;\n\nexport class RTCRtpSimulcastParameters {\n rid!: string;\n direction!: \"send\" | \"recv\";\n constructor(props: RTCRtpSimulcastParameters) {\n Object.assign(this, props);\n }\n}\n"]}
@@ -115,7 +115,8 @@ class RtpRouter {
115
115
  }
116
116
  break;
117
117
  default:
118
- recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);
118
+ recipients.push(this.ssrcTable[psfb.feedback.senderSsrc] ||
119
+ this.ssrcTable[psfb.feedback.mediaSsrc]);
119
120
  }
120
121
  }
121
122
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/media/router.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Extensions,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n debug,\n rtpHeaderExtensionsParser,\n} from \"../imports/rtp\";\nimport type {\n RTCRtpReceiveParameters,\n RTCRtpSimulcastParameters,\n} from \"./parameters\";\nimport { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { RTCRtpTransceiver } from \"./rtpTransceiver\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/router.ts\");\n\nexport class RtpRouter {\n ssrcTable: { [ssrc: number]: RTCRtpReceiver | RTCRtpSender } = {};\n ridTable: { [rid: string]: RTCRtpReceiver | RTCRtpSender } = {};\n extIdUriMap: { [id: number]: string } = {};\n\n constructor() {}\n\n registerRtpSender(sender: RTCRtpSender) {\n this.ssrcTable[sender.ssrc] = sender;\n }\n\n private registerRtpReceiver(receiver: RTCRtpReceiver, ssrc: number) {\n log(\"registerRtpReceiver\", ssrc);\n this.ssrcTable[ssrc] = receiver;\n }\n\n registerRtpReceiverBySsrc(\n transceiver: RTCRtpTransceiver,\n params: RTCRtpReceiveParameters,\n ) {\n log(\"registerRtpReceiverBySsrc\", params);\n\n params.encodings\n .filter((e) => e.ssrc != undefined) // todo fix\n .forEach((encode, i) => {\n this.registerRtpReceiver(transceiver.receiver, encode.ssrc);\n transceiver.addTrack(\n new MediaStreamTrack({\n ssrc: encode.ssrc,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec: params.codecs[i],\n }),\n );\n if (encode.rtx) {\n this.registerRtpReceiver(transceiver.receiver, encode.rtx.ssrc);\n }\n });\n\n params.headerExtensions.forEach((extension) => {\n this.extIdUriMap[extension.id] = extension.uri;\n });\n }\n\n registerRtpReceiverByRid(\n transceiver: RTCRtpTransceiver,\n param: RTCRtpSimulcastParameters,\n params: RTCRtpReceiveParameters,\n ) {\n // サイマルキャスト利用時のRTXをサポートしていないのでcodecs/encodingsは常に一つ\n const [codec] = params.codecs;\n\n log(\"registerRtpReceiverByRid\", param);\n transceiver.addTrack(\n new MediaStreamTrack({\n rid: param.rid,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec,\n }),\n );\n this.ridTable[param.rid] = transceiver.receiver;\n }\n\n routeRtp = (packet: RtpPacket) => {\n const extensions: Extensions = rtpHeaderExtensionsParser(\n packet.header.extensions,\n this.extIdUriMap,\n );\n\n let rtpReceiver: RTCRtpReceiver | undefined = this.ssrcTable[\n packet.header.ssrc\n ] as RTCRtpReceiver;\n\n const rid = extensions[RTP_EXTENSION_URI.sdesRTPStreamID];\n if (typeof rid === \"string\") {\n rtpReceiver = this.ridTable[rid] as RTCRtpReceiver;\n rtpReceiver.latestRid = rid;\n rtpReceiver.handleRtpByRid(packet, rid, extensions);\n } else if (rtpReceiver) {\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // simulcast after send receiver report\n rtpReceiver = Object.values(this.ridTable)\n .filter((r): r is RTCRtpReceiver => r instanceof RTCRtpReceiver)\n .find((r) => r.trackBySSRC[packet.header.ssrc]);\n if (rtpReceiver) {\n log(\"simulcast register receiver by ssrc\", packet.header.ssrc);\n this.registerRtpReceiver(rtpReceiver, packet.header.ssrc);\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // bug\n }\n }\n\n if (!rtpReceiver) {\n log(\"ssrcReceiver not found\");\n return;\n }\n\n const sdesMid = extensions[RTP_EXTENSION_URI.sdesMid];\n if (typeof sdesMid === \"string\") {\n rtpReceiver.sdesMid = sdesMid;\n }\n\n const repairedRid = extensions[\n RTP_EXTENSION_URI.repairedRtpStreamId\n ] as string;\n if (typeof repairedRid === \"string\") {\n rtpReceiver.latestRepairedRid = repairedRid;\n }\n };\n\n routeRtcp = (packet: RtcpPacket) => {\n const recipients: (RTCRtpReceiver | RTCRtpSender)[] = [];\n\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n packet = packet as RtcpSrPacket;\n recipients.push(this.ssrcTable[packet.ssrc]);\n }\n break;\n case RtcpRrPacket.type:\n {\n packet = packet as RtcpRrPacket;\n packet.reports.forEach((report) => {\n recipients.push(this.ssrcTable[report.ssrc]);\n });\n }\n break;\n case RtcpSourceDescriptionPacket.type:\n {\n const sdes = packet as RtcpSourceDescriptionPacket;\n // log(\"sdes\", JSON.stringify(sdes.chunks));\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const rtpfb = packet as RtcpTransportLayerFeedback;\n if (rtpfb.feedback) {\n recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const psfb = packet as RtcpPayloadSpecificFeedback;\n switch (psfb.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;\n recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);\n }\n break;\n default:\n recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);\n }\n }\n break;\n }\n recipients\n .filter((v) => v) // todo simulcast\n .forEach((recipient) => recipient.handleRtcpPacket(packet));\n };\n}\n"]}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/media/router.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Extensions,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n debug,\n rtpHeaderExtensionsParser,\n} from \"../imports/rtp\";\nimport type {\n RTCRtpReceiveParameters,\n RTCRtpSimulcastParameters,\n} from \"./parameters\";\nimport { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { RTCRtpTransceiver } from \"./rtpTransceiver\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/router.ts\");\n\nexport class RtpRouter {\n ssrcTable: { [ssrc: number]: RTCRtpReceiver | RTCRtpSender } = {};\n ridTable: { [rid: string]: RTCRtpReceiver | RTCRtpSender } = {};\n extIdUriMap: { [id: number]: string } = {};\n\n constructor() {}\n\n registerRtpSender(sender: RTCRtpSender) {\n this.ssrcTable[sender.ssrc] = sender;\n }\n\n private registerRtpReceiver(receiver: RTCRtpReceiver, ssrc: number) {\n log(\"registerRtpReceiver\", ssrc);\n this.ssrcTable[ssrc] = receiver;\n }\n\n registerRtpReceiverBySsrc(\n transceiver: RTCRtpTransceiver,\n params: RTCRtpReceiveParameters,\n ) {\n log(\"registerRtpReceiverBySsrc\", params);\n\n params.encodings\n .filter((e) => e.ssrc != undefined) // todo fix\n .forEach((encode, i) => {\n this.registerRtpReceiver(transceiver.receiver, encode.ssrc);\n transceiver.addTrack(\n new MediaStreamTrack({\n ssrc: encode.ssrc,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec: params.codecs[i],\n }),\n );\n if (encode.rtx) {\n this.registerRtpReceiver(transceiver.receiver, encode.rtx.ssrc);\n }\n });\n\n params.headerExtensions.forEach((extension) => {\n this.extIdUriMap[extension.id] = extension.uri;\n });\n }\n\n registerRtpReceiverByRid(\n transceiver: RTCRtpTransceiver,\n param: RTCRtpSimulcastParameters,\n params: RTCRtpReceiveParameters,\n ) {\n // サイマルキャスト利用時のRTXをサポートしていないのでcodecs/encodingsは常に一つ\n const [codec] = params.codecs;\n\n log(\"registerRtpReceiverByRid\", param);\n transceiver.addTrack(\n new MediaStreamTrack({\n rid: param.rid,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec,\n }),\n );\n this.ridTable[param.rid] = transceiver.receiver;\n }\n\n routeRtp = (packet: RtpPacket) => {\n const extensions: Extensions = rtpHeaderExtensionsParser(\n packet.header.extensions,\n this.extIdUriMap,\n );\n\n let rtpReceiver: RTCRtpReceiver | undefined = this.ssrcTable[\n packet.header.ssrc\n ] as RTCRtpReceiver;\n\n const rid = extensions[RTP_EXTENSION_URI.sdesRTPStreamID];\n if (typeof rid === \"string\") {\n rtpReceiver = this.ridTable[rid] as RTCRtpReceiver;\n rtpReceiver.latestRid = rid;\n rtpReceiver.handleRtpByRid(packet, rid, extensions);\n } else if (rtpReceiver) {\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // simulcast after send receiver report\n rtpReceiver = Object.values(this.ridTable)\n .filter((r): r is RTCRtpReceiver => r instanceof RTCRtpReceiver)\n .find((r) => r.trackBySSRC[packet.header.ssrc]);\n if (rtpReceiver) {\n log(\"simulcast register receiver by ssrc\", packet.header.ssrc);\n this.registerRtpReceiver(rtpReceiver, packet.header.ssrc);\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // bug\n }\n }\n\n if (!rtpReceiver) {\n log(\"ssrcReceiver not found\");\n return;\n }\n\n const sdesMid = extensions[RTP_EXTENSION_URI.sdesMid];\n if (typeof sdesMid === \"string\") {\n rtpReceiver.sdesMid = sdesMid;\n }\n\n const repairedRid = extensions[\n RTP_EXTENSION_URI.repairedRtpStreamId\n ] as string;\n if (typeof repairedRid === \"string\") {\n rtpReceiver.latestRepairedRid = repairedRid;\n }\n };\n\n routeRtcp = (packet: RtcpPacket) => {\n const recipients: (RTCRtpReceiver | RTCRtpSender)[] = [];\n\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n packet = packet as RtcpSrPacket;\n recipients.push(this.ssrcTable[packet.ssrc]);\n }\n break;\n case RtcpRrPacket.type:\n {\n packet = packet as RtcpRrPacket;\n packet.reports.forEach((report) => {\n recipients.push(this.ssrcTable[report.ssrc]);\n });\n }\n break;\n case RtcpSourceDescriptionPacket.type:\n {\n const sdes = packet as RtcpSourceDescriptionPacket;\n // log(\"sdes\", JSON.stringify(sdes.chunks));\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const rtpfb = packet as RtcpTransportLayerFeedback;\n if (rtpfb.feedback) {\n recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const psfb = packet as RtcpPayloadSpecificFeedback;\n switch (psfb.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;\n recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);\n }\n break;\n default:\n recipients.push(\n this.ssrcTable[psfb.feedback.senderSsrc] ||\n this.ssrcTable[psfb.feedback.mediaSsrc],\n );\n }\n }\n break;\n }\n recipients\n .filter((v) => v) // todo simulcast\n .forEach((recipient) => recipient.handleRtcpPacket(packet));\n };\n}\n"]}
@@ -5,6 +5,7 @@ import type { RTCDtlsTransport } from "../transport/dtls";
5
5
  import type { Kind } from "../types/domain";
6
6
  import type { RTCRtpReceiveParameters } from "./parameters";
7
7
  import { ReceiverTWCC } from "./receiver/receiverTwcc";
8
+ import { type RTCStats } from "./stats";
8
9
  import { MediaStreamTrack } from "./track";
9
10
  export declare class RTCRtpReceiver {
10
11
  readonly config: PeerConfig;
@@ -61,8 +62,7 @@ export declare class RTCRtpReceiver {
61
62
  addTrack(track: MediaStreamTrack): boolean;
62
63
  stop(): void;
63
64
  runRtcp(): Promise<void>;
64
- /**todo impl */
65
- getStats(): void;
65
+ getStats(): Promise<RTCStats[]>;
66
66
  sendRtcpPLI(mediaSsrc: number): Promise<void>;
67
67
  handleRtcpPacket(packet: RtcpPacket): void;
68
68
  handleRtpBySsrc: (packet: RtpPacket, extensions: Extensions) => void;
@@ -11,6 +11,7 @@ const receiverTwcc_1 = require("./receiver/receiverTwcc");
11
11
  const statistics_1 = require("./receiver/statistics");
12
12
  const sdp_1 = require("../sdp");
13
13
  const rtcpFeedback_1 = require("./extension/rtcpFeedback");
14
+ const stats_1 = require("./stats");
14
15
  const track_1 = require("./track");
15
16
  const log = (0, rtp_1.debug)("werift:packages/webrtc/src/media/rtpReceiver.ts");
16
17
  class RTCRtpReceiver {
@@ -312,8 +313,56 @@ class RTCRtpReceiver {
312
313
  }
313
314
  catch (error) { }
314
315
  }
315
- /**todo impl */
316
- getStats() { }
316
+ async getStats() {
317
+ const timestamp = (0, stats_1.getStatsTimestamp)();
318
+ const stats = [];
319
+ if (!this.dtlsTransport) {
320
+ return stats;
321
+ }
322
+ const transportId = (0, stats_1.generateStatsId)("transport", this.dtlsTransport.id);
323
+ // Collect stats for each track
324
+ for (const track of this.tracks) {
325
+ if (!track.ssrc)
326
+ continue;
327
+ const streamStats = this.remoteStreams[track.ssrc];
328
+ if (!streamStats)
329
+ continue;
330
+ // Inbound RTP stats
331
+ const inboundRtpStats = {
332
+ type: "inbound-rtp",
333
+ id: (0, stats_1.generateStatsId)("inbound-rtp", track.ssrc),
334
+ timestamp,
335
+ ssrc: track.ssrc,
336
+ kind: this.kind,
337
+ transportId,
338
+ codecId: this.codecs[0]
339
+ ? (0, stats_1.generateStatsId)("codec", this.codecs[0].payloadType, transportId)
340
+ : undefined,
341
+ mid: this.sdesMid,
342
+ trackIdentifier: track.id,
343
+ packetsReceived: streamStats.packets_received,
344
+ packetsLost: streamStats.packets_lost,
345
+ jitter: streamStats.jitter,
346
+ };
347
+ stats.push(inboundRtpStats);
348
+ // Remote outbound RTP stats (if we have SR info)
349
+ if (this.lastSRtimestamp[track.ssrc]) {
350
+ const remoteOutboundStats = {
351
+ type: "remote-outbound-rtp",
352
+ id: (0, stats_1.generateStatsId)("remote-outbound-rtp", track.ssrc),
353
+ timestamp,
354
+ ssrc: track.ssrc,
355
+ kind: this.kind,
356
+ transportId,
357
+ codecId: inboundRtpStats.codecId,
358
+ localId: inboundRtpStats.id,
359
+ remoteTimestamp: this.receiveLastSRTimestamp[track.ssrc] * 1000, // Convert to ms
360
+ };
361
+ stats.push(remoteOutboundStats);
362
+ }
363
+ }
364
+ return stats;
365
+ }
317
366
  async sendRtcpPLI(mediaSsrc) {
318
367
  if (!this.pliEnabled) {
319
368
  log("pli not supported", { mediaSsrc });
@@ -1 +1 @@
1
- {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\nimport { Event, int } from \"../imports/common\";\n\nimport {\n type Extensions,\n PictureLossIndication,\n RTP_EXTENSION_URI,\n Red,\n RedHandler,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n type RtpPacket,\n type TransportWideCCPayload,\n debug,\n unwrapRtx,\n} from \"../imports/rtp\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport type { RTCDtlsTransport } from \"../transport/dtls\";\nimport type { Kind } from \"../types/domain\";\nimport { compactNtp, timestampSeconds } from \"../utils\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpReceiveParameters,\n} from \"./parameters\";\nimport { NackHandler } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { StreamStatistics } from \"./receiver/statistics\";\n\nimport { codecParametersFromString } from \"../sdp\";\nimport { usePLI, useTWCC } from \"./extension/rtcpFeedback\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private get codecArray() {\n return Object.values(this.codecs).sort(\n (a, b) => a.payloadType - b.payloadType,\n );\n }\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new NackHandler(this);\n private readonly audioRedHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n /**last sender Report Timestamp\n * compactNtp\n */\n readonly lastSRtimestamp: { [ssrc: number]: number } = {};\n /**seconds */\n readonly receiveLastSRTimestamp: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n dtlsTransport!: RTCDtlsTransport;\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(\n readonly config: PeerConfig,\n public kind: Kind,\n public rtcpSsrc: number,\n ) {}\n\n setDtlsTransport(dtls: RTCDtlsTransport) {\n this.dtlsTransport = dtls;\n }\n\n // todo fix\n get track() {\n return this.tracks[0] ?? new MediaStreamTrack({ kind: this.kind });\n }\n\n get nackEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === \"nack\");\n }\n\n get twccEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find(\n (f) => f.type === useTWCC().type,\n );\n }\n\n get pliEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find(\n (f) => f.type === usePLI().type,\n );\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc: number) {\n if (this.twccEnabled && !this.receiverTWCC) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc,\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) {\n return t.rid === track.rid;\n }\n if (t.ssrc) {\n return t.ssrc === track.ssrc;\n }\n });\n if (exist) {\n return false;\n }\n this.tracks.push(track);\n if (track.ssrc) {\n this.trackBySSRC[track.ssrc] = track;\n }\n if (track.rid) {\n this.trackByRID[track.rid] = track;\n }\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\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 reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lastSRtimestamp = 0,\n delaySinceLastSR = 0;\n if (this.lastSRtimestamp[ssrc]) {\n lastSRtimestamp = this.lastSRtimestamp[ssrc];\n const delaySeconds =\n timestampSeconds() - this.receiveLastSRTimestamp[ssrc];\n if (delaySeconds > 0 && delaySeconds < 65536) {\n delaySinceLastSR = int(delaySeconds * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr: lastSRtimestamp,\n dlsr: delaySinceLastSR,\n });\n },\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n if (this.config.debug.receiverReportDelay) {\n await setTimeout(this.config.debug.receiverReportDelay);\n }\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n /**todo impl */\n getStats() {}\n\n async sendRtcpPLI(mediaSsrc: number) {\n if (!this.pliEnabled) {\n log(\"pli not supported\", { mediaSsrc });\n return;\n }\n\n if (this.stopped) {\n return;\n }\n\n log(\"sendRtcpPLI\", { mediaSsrc });\n\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lastSRtimestamp[sr.ssrc] = compactNtp(\n sr.senderInfo.ntpTimestamp,\n );\n this.receiveLastSRTimestamp[sr.ssrc] = timestampSeconds();\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack,\n ) {\n if (this.stopped) {\n return;\n }\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n // log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as TransportWideCCPayload;\n\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.twccEnabled) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n const rtxCodec = this.codecs[codecParams[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n if (\n !Object.keys(this.codecs).includes(\n red.header.fields[0].blockPT.toString(),\n )\n ) {\n return;\n }\n }\n\n if (track?.kind === \"video\" && this.nackEnabled) {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n if (track.kind === \"audio\") {\n const payloads = this.audioRedHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone(), extensions);\n }\n } else {\n }\n } else {\n track.onReceiveRtp.execute(packet.clone(), extensions);\n }\n }\n\n this.runRtcp();\n }\n}\n"]}
1
+ {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\nimport { Event, int } from \"../imports/common\";\n\nimport {\n type Extensions,\n PictureLossIndication,\n RTP_EXTENSION_URI,\n Red,\n RedHandler,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n type RtpPacket,\n type TransportWideCCPayload,\n debug,\n unwrapRtx,\n} from \"../imports/rtp\";\nimport type { PeerConfig } from \"../peerConnection\";\nimport type { RTCDtlsTransport } from \"../transport/dtls\";\nimport type { Kind } from \"../types/domain\";\nimport { compactNtp, timestampSeconds } from \"../utils\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpReceiveParameters,\n} from \"./parameters\";\nimport { NackHandler } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { StreamStatistics } from \"./receiver/statistics\";\n\nimport { codecParametersFromString } from \"../sdp\";\nimport { usePLI, useTWCC } from \"./extension/rtcpFeedback\";\nimport {\n type RTCInboundRtpStreamStats,\n type RTCRemoteOutboundRtpStreamStats,\n type RTCStats,\n generateStatsId,\n getStatsTimestamp,\n} from \"./stats\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private get codecArray() {\n return Object.values(this.codecs).sort(\n (a, b) => a.payloadType - b.payloadType,\n );\n }\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new NackHandler(this);\n private readonly audioRedHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n /**last sender Report Timestamp\n * compactNtp\n */\n readonly lastSRtimestamp: { [ssrc: number]: number } = {};\n /**seconds */\n readonly receiveLastSRTimestamp: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n dtlsTransport!: RTCDtlsTransport;\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(\n readonly config: PeerConfig,\n public kind: Kind,\n public rtcpSsrc: number,\n ) {}\n\n setDtlsTransport(dtls: RTCDtlsTransport) {\n this.dtlsTransport = dtls;\n }\n\n // todo fix\n get track() {\n return this.tracks[0] ?? new MediaStreamTrack({ kind: this.kind });\n }\n\n get nackEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === \"nack\");\n }\n\n get twccEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find(\n (f) => f.type === useTWCC().type,\n );\n }\n\n get pliEnabled() {\n return this.codecArray[0]?.rtcpFeedback.find(\n (f) => f.type === usePLI().type,\n );\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc: number) {\n if (this.twccEnabled && !this.receiverTWCC) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc,\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) {\n return t.rid === track.rid;\n }\n if (t.ssrc) {\n return t.ssrc === track.ssrc;\n }\n });\n if (exist) {\n return false;\n }\n this.tracks.push(track);\n if (track.ssrc) {\n this.trackBySSRC[track.ssrc] = track;\n }\n if (track.rid) {\n this.trackByRID[track.rid] = track;\n }\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\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 reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lastSRtimestamp = 0,\n delaySinceLastSR = 0;\n if (this.lastSRtimestamp[ssrc]) {\n lastSRtimestamp = this.lastSRtimestamp[ssrc];\n const delaySeconds =\n timestampSeconds() - this.receiveLastSRTimestamp[ssrc];\n if (delaySeconds > 0 && delaySeconds < 65536) {\n delaySinceLastSR = int(delaySeconds * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr: lastSRtimestamp,\n dlsr: delaySinceLastSR,\n });\n },\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n if (this.config.debug.receiverReportDelay) {\n await setTimeout(this.config.debug.receiverReportDelay);\n }\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\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 // Collect stats for each track\n for (const track of this.tracks) {\n if (!track.ssrc) continue;\n\n const streamStats = this.remoteStreams[track.ssrc];\n if (!streamStats) continue;\n\n // Inbound RTP stats\n const inboundRtpStats: RTCInboundRtpStreamStats = {\n type: \"inbound-rtp\",\n id: generateStatsId(\"inbound-rtp\", track.ssrc),\n timestamp,\n ssrc: track.ssrc,\n kind: this.kind,\n transportId,\n codecId: this.codecs[0]\n ? generateStatsId(\"codec\", this.codecs[0].payloadType, transportId)\n : undefined,\n mid: this.sdesMid,\n trackIdentifier: track.id,\n packetsReceived: streamStats.packets_received,\n packetsLost: streamStats.packets_lost,\n jitter: streamStats.jitter,\n };\n stats.push(inboundRtpStats);\n\n // Remote outbound RTP stats (if we have SR info)\n if (this.lastSRtimestamp[track.ssrc]) {\n const remoteOutboundStats: RTCRemoteOutboundRtpStreamStats = {\n type: \"remote-outbound-rtp\",\n id: generateStatsId(\"remote-outbound-rtp\", track.ssrc),\n timestamp,\n ssrc: track.ssrc,\n kind: this.kind,\n transportId,\n codecId: inboundRtpStats.codecId,\n localId: inboundRtpStats.id,\n remoteTimestamp: this.receiveLastSRTimestamp[track.ssrc] * 1000, // Convert to ms\n };\n stats.push(remoteOutboundStats);\n }\n }\n\n return stats;\n }\n\n async sendRtcpPLI(mediaSsrc: number) {\n if (!this.pliEnabled) {\n log(\"pli not supported\", { mediaSsrc });\n return;\n }\n\n if (this.stopped) {\n return;\n }\n\n log(\"sendRtcpPLI\", { mediaSsrc });\n\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lastSRtimestamp[sr.ssrc] = compactNtp(\n sr.senderInfo.ntpTimestamp,\n );\n this.receiveLastSRTimestamp[sr.ssrc] = timestampSeconds();\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack,\n ) {\n if (this.stopped) {\n return;\n }\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n // log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as TransportWideCCPayload;\n\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.twccEnabled) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n const rtxCodec = this.codecs[codecParams[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n if (\n !Object.keys(this.codecs).includes(\n red.header.fields[0].blockPT.toString(),\n )\n ) {\n return;\n }\n }\n\n if (track?.kind === \"video\" && this.nackEnabled) {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n if (track.kind === \"audio\") {\n const payloads = this.audioRedHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone(), extensions);\n }\n } else {\n }\n } else {\n track.onReceiveRtp.execute(packet.clone(), extensions);\n }\n }\n\n this.runRtcp();\n }\n}\n"]}
@@ -25,6 +25,7 @@ import type { RTCDtlsTransport } from "../transport/dtls";
25
25
  import type { Kind } from "../types/domain";
26
26
  import type { RTCRtpCodecParameters, RTCRtpSendParameters } from "./parameters";
27
27
  import { SenderBandwidthEstimator } from "./sender/senderBWE";
28
+ import { type RTCStats } from "./stats";
28
29
  import type { MediaStreamTrack } from "./track";
29
30
  export declare class RTCRtpSender {
30
31
  trackOrKind: Kind | MediaStreamTrack;
@@ -82,4 +83,9 @@ export declare class RTCRtpSender {
82
83
  replaceRTP({ sequenceNumber, timestamp, }: Pick<RtpHeader, "sequenceNumber" | "timestamp">, discontinuity?: boolean): void;
83
84
  sendRtp(rtp: Buffer | RtpPacket): Promise<void>;
84
85
  handleRtcpPacket(rtcpPacket: RtcpPacket): void;
86
+ getParameters(): {
87
+ encodings: never[];
88
+ };
89
+ setParameters(params: any): void;
90
+ getStats(): Promise<RTCStats[]>;
85
91
  }
@@ -36,13 +36,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
36
36
  }) : function(o, v) {
37
37
  o["default"] = v;
38
38
  });
39
- var __importStar = (this && this.__importStar) || function (mod) {
40
- if (mod && mod.__esModule) return mod;
41
- var result = {};
42
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
- __setModuleDefault(result, mod);
44
- return result;
45
- };
39
+ var __importStar = (this && this.__importStar) || (function () {
40
+ var ownKeys = function(o) {
41
+ ownKeys = Object.getOwnPropertyNames || function (o) {
42
+ var ar = [];
43
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
44
+ return ar;
45
+ };
46
+ return ownKeys(o);
47
+ };
48
+ return function (mod) {
49
+ if (mod && mod.__esModule) return mod;
50
+ var result = {};
51
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
52
+ __setModuleDefault(result, mod);
53
+ return result;
54
+ };
55
+ })();
46
56
  Object.defineProperty(exports, "__esModule", { value: true });
47
57
  exports.RTCRtpSender = void 0;
48
58
  const crypto_1 = require("crypto");
@@ -54,6 +64,7 @@ const __1 = require("..");
54
64
  const rtp_1 = require("../imports/rtp");
55
65
  const utils_1 = require("../utils");
56
66
  const senderBWE_1 = require("./sender/senderBWE");
67
+ const stats_1 = require("./stats");
57
68
  const log = (0, rtp_1.debug)("werift:packages/webrtc/src/media/rtpSender.ts");
58
69
  const RTP_HISTORY_SIZE = 128;
59
70
  const RTT_ALPHA = 0.85;
@@ -634,6 +645,66 @@ class RTCRtpSender {
634
645
  }
635
646
  this.onRtcp.execute(rtcpPacket);
636
647
  }
648
+ // todo impl
649
+ getParameters() {
650
+ return {
651
+ encodings: [],
652
+ };
653
+ }
654
+ // todo impl
655
+ setParameters(params) { }
656
+ async getStats() {
657
+ const timestamp = (0, stats_1.getStatsTimestamp)();
658
+ const stats = [];
659
+ if (!this.dtlsTransport) {
660
+ return stats;
661
+ }
662
+ const transportId = (0, stats_1.generateStatsId)("transport", this.dtlsTransport.id);
663
+ // Outbound RTP stats
664
+ const outboundRtpStats = {
665
+ type: "outbound-rtp",
666
+ id: (0, stats_1.generateStatsId)("outbound-rtp", this.ssrc),
667
+ timestamp,
668
+ ssrc: this.ssrc,
669
+ kind: this.kind,
670
+ transportId,
671
+ codecId: this.codec
672
+ ? (0, stats_1.generateStatsId)("codec", this.codec.payloadType, transportId)
673
+ : undefined,
674
+ mid: this.mid,
675
+ packetsSent: this.packetCount,
676
+ bytesSent: this.octetCount,
677
+ rtxSsrc: this.rtxPayloadType ? this.rtxSsrc : undefined,
678
+ };
679
+ stats.push(outboundRtpStats);
680
+ // Media source stats
681
+ if (this.track) {
682
+ const mediaSourceStats = {
683
+ type: "media-source",
684
+ id: (0, stats_1.generateStatsId)("media-source", this.trackId),
685
+ timestamp,
686
+ trackIdentifier: this.trackId,
687
+ kind: this.kind,
688
+ };
689
+ stats.push(mediaSourceStats);
690
+ }
691
+ // Remote inbound RTP stats (if we have RTT)
692
+ if (this.rtt !== undefined) {
693
+ const remoteInboundStats = {
694
+ type: "remote-inbound-rtp",
695
+ id: (0, stats_1.generateStatsId)("remote-inbound-rtp", this.ssrc),
696
+ timestamp,
697
+ ssrc: this.ssrc,
698
+ kind: this.kind,
699
+ transportId,
700
+ codecId: outboundRtpStats.codecId,
701
+ localId: outboundRtpStats.id,
702
+ roundTripTime: this.rtt,
703
+ };
704
+ stats.push(remoteInboundStats);
705
+ }
706
+ return stats;
707
+ }
637
708
  }
638
709
  exports.RTCRtpSender = RTCRtpSender;
639
710
  //# 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 { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\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 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 = uuid.v4();\n readonly trackId = uuid.v4();\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"]}
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 { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\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 = uuid.v4();\n readonly trackId = uuid.v4();\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"]}