werift 0.20.0 → 0.20.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 (139) hide show
  1. package/lib/common/src/event.d.ts +45 -0
  2. package/lib/common/src/event.js +232 -0
  3. package/lib/common/src/event.js.map +1 -0
  4. package/lib/common/src/index.d.ts +1 -0
  5. package/lib/common/src/index.js +1 -0
  6. package/lib/common/src/index.js.map +1 -1
  7. package/lib/dtls/src/flight/client/flight5.js +6 -1
  8. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  9. package/lib/dtls/src/imports/common.d.ts +1 -0
  10. package/lib/dtls/src/imports/common.js +18 -0
  11. package/lib/dtls/src/imports/common.js.map +1 -0
  12. package/lib/dtls/src/socket.d.ts +1 -1
  13. package/lib/dtls/src/socket.js +5 -5
  14. package/lib/dtls/src/socket.js.map +1 -1
  15. package/lib/ice/src/candidate.d.ts +1 -1
  16. package/lib/ice/src/candidate.js +2 -1
  17. package/lib/ice/src/candidate.js.map +1 -1
  18. package/lib/ice/src/helper.js +2 -2
  19. package/lib/ice/src/helper.js.map +1 -1
  20. package/lib/ice/src/ice.d.ts +10 -5
  21. package/lib/ice/src/ice.js +46 -16
  22. package/lib/ice/src/ice.js.map +1 -1
  23. package/lib/ice/src/imports/common.d.ts +1 -0
  24. package/lib/ice/src/imports/common.js +18 -0
  25. package/lib/ice/src/imports/common.js.map +1 -0
  26. package/lib/ice/src/index.d.ts +4 -0
  27. package/lib/ice/src/index.js +4 -0
  28. package/lib/ice/src/index.js.map +1 -1
  29. package/lib/ice/src/stun/message.d.ts +1 -0
  30. package/lib/ice/src/stun/message.js +16 -6
  31. package/lib/ice/src/stun/message.js.map +1 -1
  32. package/lib/ice/src/stun/protocol.d.ts +3 -2
  33. package/lib/ice/src/stun/protocol.js +13 -7
  34. package/lib/ice/src/stun/protocol.js.map +1 -1
  35. package/lib/ice/src/stun/transaction.js +4 -3
  36. package/lib/ice/src/stun/transaction.js.map +1 -1
  37. package/lib/ice/src/transport.d.ts +21 -4
  38. package/lib/ice/src/transport.js +115 -7
  39. package/lib/ice/src/transport.js.map +1 -1
  40. package/lib/ice/src/turn/protocol.d.ts +52 -36
  41. package/lib/ice/src/turn/protocol.js +183 -76
  42. package/lib/ice/src/turn/protocol.js.map +1 -1
  43. package/lib/ice/src/types/model.d.ts +5 -5
  44. package/lib/ice/src/types/model.js.map +1 -1
  45. package/lib/ice/src/utils.d.ts +1 -0
  46. package/lib/ice/src/utils.js +15 -16
  47. package/lib/ice/src/utils.js.map +1 -1
  48. package/lib/rtp/src/extra/container/mp4/container.d.ts +1 -1
  49. package/lib/rtp/src/extra/container/mp4/container.js +2 -5
  50. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  51. package/lib/rtp/src/extra/processor/depacketizer.d.ts +1 -1
  52. package/lib/rtp/src/extra/processor/depacketizer.js +2 -2
  53. package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
  54. package/lib/rtp/src/extra/processor/mp4.d.ts +1 -1
  55. package/lib/rtp/src/extra/processor/mp4.js +2 -5
  56. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  57. package/lib/rtp/src/extra/processor/nack.d.ts +1 -1
  58. package/lib/rtp/src/extra/processor/nack.js +3 -3
  59. package/lib/rtp/src/extra/processor/nack.js.map +1 -1
  60. package/lib/rtp/src/extra/processor/rtcpCallback.d.ts +1 -1
  61. package/lib/rtp/src/extra/processor/rtcpCallback.js +2 -5
  62. package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
  63. package/lib/rtp/src/extra/processor/rtpCallback.d.ts +1 -1
  64. package/lib/rtp/src/extra/processor/rtpCallback.js +2 -5
  65. package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
  66. package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
  67. package/lib/rtp/src/extra/processor/webm.js +2 -5
  68. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  69. package/lib/rtp/src/imports/common.d.ts +1 -0
  70. package/lib/rtp/src/imports/common.js +18 -0
  71. package/lib/rtp/src/imports/common.js.map +1 -0
  72. package/lib/sctp/src/helper.js +2 -5
  73. package/lib/sctp/src/helper.js.map +1 -1
  74. package/lib/sctp/src/imports/common.d.ts +1 -0
  75. package/lib/sctp/src/imports/common.js +18 -0
  76. package/lib/sctp/src/imports/common.js.map +1 -0
  77. package/lib/sctp/src/sctp.d.ts +1 -1
  78. package/lib/sctp/src/sctp.js +3 -3
  79. package/lib/sctp/src/sctp.js.map +1 -1
  80. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  81. package/lib/webrtc/src/dataChannel.js +5 -5
  82. package/lib/webrtc/src/dataChannel.js.map +1 -1
  83. package/lib/webrtc/src/imports/common.d.ts +1 -0
  84. package/lib/webrtc/src/imports/common.js +18 -0
  85. package/lib/webrtc/src/imports/common.js.map +1 -0
  86. package/lib/webrtc/src/media/receiver/nack.d.ts +1 -1
  87. package/lib/webrtc/src/media/receiver/nack.js +2 -2
  88. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  89. package/lib/webrtc/src/media/rtpReceiver.d.ts +2 -2
  90. package/lib/webrtc/src/media/rtpReceiver.js +2 -5
  91. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  92. package/lib/webrtc/src/media/rtpSender.d.ts +1 -1
  93. package/lib/webrtc/src/media/rtpSender.js +5 -5
  94. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  95. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  96. package/lib/webrtc/src/media/rtpTransceiver.js +2 -5
  97. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  98. package/lib/webrtc/src/media/sender/senderBWE.d.ts +1 -1
  99. package/lib/webrtc/src/media/sender/senderBWE.js +4 -7
  100. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  101. package/lib/webrtc/src/media/track.d.ts +1 -1
  102. package/lib/webrtc/src/media/track.js +4 -7
  103. package/lib/webrtc/src/media/track.js.map +1 -1
  104. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +2 -1
  105. package/lib/webrtc/src/nonstandard/recorder/index.js +2 -5
  106. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  107. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  108. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  109. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +1 -1
  110. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -2
  111. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  112. package/lib/webrtc/src/peerConnection.d.ts +3 -2
  113. package/lib/webrtc/src/peerConnection.js +13 -11
  114. package/lib/webrtc/src/peerConnection.js.map +1 -1
  115. package/lib/webrtc/src/transport/dtls.d.ts +1 -1
  116. package/lib/webrtc/src/transport/dtls.js +12 -8
  117. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  118. package/lib/webrtc/src/transport/ice.d.ts +2 -2
  119. package/lib/webrtc/src/transport/ice.js +10 -7
  120. package/lib/webrtc/src/transport/ice.js.map +1 -1
  121. package/lib/webrtc/src/transport/sctp.d.ts +1 -1
  122. package/lib/webrtc/src/transport/sctp.js +2 -2
  123. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  124. package/package.json +1 -1
  125. package/src/dataChannel.ts +1 -1
  126. package/src/imports/common.ts +1 -0
  127. package/src/media/receiver/nack.ts +1 -1
  128. package/src/media/rtpReceiver.ts +1 -1
  129. package/src/media/rtpSender.ts +1 -1
  130. package/src/media/rtpTransceiver.ts +1 -1
  131. package/src/media/sender/senderBWE.ts +1 -1
  132. package/src/media/track.ts +1 -1
  133. package/src/nonstandard/recorder/index.ts +3 -1
  134. package/src/nonstandard/recorder/writer/index.ts +1 -1
  135. package/src/nonstandard/recorder/writer/webm.ts +1 -1
  136. package/src/peerConnection.ts +4 -1
  137. package/src/transport/dtls.ts +11 -5
  138. package/src/transport/ice.ts +9 -4
  139. package/src/transport/sctp.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug } from \"debug\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n type PeerConfig,\n codecParametersFromString,\n usePLI,\n useTWCC,\n} from \"..\";\nimport { int } from \"../../../common/src\";\nimport {\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 unwrapRtx,\n} from \"../../../rtp/src\";\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\";\nimport type { Extensions } from \"./router\";\nimport type { 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];\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());\n }\n } else {\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n"]}
1
+ {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAC9B,8CAA6C;AAC7C,+BAAkC;AAClC,8CAA0C;AAE1C,0BAKY;AACZ,6CAA0C;AAC1C,0CAa0B;AAG1B,oCAAwD;AAKxD,0CAA8C;AAC9C,0DAAuD;AACvD,sDAAyD;AAIzD,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,cAAc;IAEzB,IAAY,UAAU;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CACxC,CAAC;IACJ,CAAC;IAiCD,YACW,MAAkB,EACpB,IAAU,EACV,QAAgB;QAFvB;;;;mBAAS,MAAM;WAAY;QAC3B;;;;mBAAO,IAAI;WAAM;QACjB;;;;mBAAO,QAAQ;WAAQ;QAzCR;;;;mBAAkD,EAAE;WAAC;QAMrD;;;;mBAA2C,EAAE;WAAC;QAC9C;;;;mBAAO,IAAI,kBAAW,CAAC,IAAI,CAAC;WAAC;QAC7B;;;;mBAAkB,IAAI,gBAAU,EAAE;WAAC;QAE3C;;;;mBAAO,UAAU;WAAC;QAClB;;;;mBAAO,IAAA,SAAI,GAAE;WAAC;QACd;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAAoD,EAAE;WAAC;QACvD;;;;mBAAkD,EAAE;WAAC;QAC9D;;WAEG;QACM;;;;mBAA8C,EAAE;WAAC;QAC1D,aAAa;QACJ;;;;mBAAqD,EAAE;WAAC;QACxD;;;;mBAAe,IAAI,CAAC,IAAI,CAAC,YAAY;WAAC;QACtC;;;;mBAAS,IAAI,cAAK,EAAgB;WAAC;QAE5C;;;;;WAAiC;QACjC;;;;;WAAiB;QACjB;;;;;WAAmB;QACnB;;;;;WAA2B;QAE3B;;;;;WAA4B;QAC5B;;;;mBAAU,KAAK;WAAC;QAChB;;;;;WAAwB;QACxB;;;;;WAAuB;QAEvB;;;;mBAAc,KAAK;WAAC;QACZ;;;;mBAAa,IAAI,eAAe,EAAE;WAAC;QACnC;;;;mBAAsD,EAAE;WAAC;QA0LjE;;;;mBAAkB,CAAC,MAAiB,EAAE,UAAsB,EAAE,EAAE;gBAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAEnD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;WAAC;QAEF;;;;mBAAiB,CAAC,MAAiB,EAAE,GAAW,EAAE,UAAsB,EAAE,EAAE;gBAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAC/C,CAAC;gBAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC5C,CAAC;WAAC;IAjMC,CAAC;IAEJ,gBAAgB,CAAC,IAAsB;QACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,WAAW;IACX,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAA,WAAO,GAAE,CAAC,IAAI,CACjC,CAAC;IACJ,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAA,UAAM,GAAE,CAAC,IAAI,CAChC,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAA+B;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACV,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,eAAuB;QAC/B,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,CAClC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EACb,eAAe,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAuB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE;oBACtD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CACpD,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;oBACjB,IAAI,eAAe,GAAG,CAAC,EACrB,gBAAgB,GAAG,CAAC,CAAC;oBACvB,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/B,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;wBAC7C,MAAM,YAAY,GAChB,IAAA,wBAAgB,GAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;wBACzD,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;4BAC7C,gBAAgB,GAAG,IAAA,SAAG,EAAC,YAAY,GAAG,KAAK,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;oBAED,OAAO,IAAI,sBAAgB,CAAC;wBAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;wBAClB,YAAY,EAAE,MAAM,CAAC,aAAa;wBAClC,WAAW,EAAE,MAAM,CAAC,YAAY;wBAChC,eAAe,EAAE,MAAM,CAAC,OAAO;wBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG,EAAE,eAAe;wBACpB,IAAI,EAAE,gBAAgB;qBACvB,CAAC,CAAC;gBACL,CAAC,CACF,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAI,kBAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAElE,IAAI,CAAC;oBACH,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;wBAC1C,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBAC1D,CAAC;oBACD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBAC9B,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;IACpB,CAAC;IAED,eAAe;IACf,QAAQ,KAAI,CAAC;IAEb,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,GAAG,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,GAAG,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,iCAA2B,CAAC;YAC7C,QAAQ,EAAE,IAAI,2BAAqB,CAAC;gBAClC,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,SAAS;aACV,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,MAAkB;QACjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,kBAAY,CAAC,IAAI;gBACpB,CAAC;oBACC,MAAM,EAAE,GAAG,MAAsB,CAAC;oBAClC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAA,kBAAU,EACxC,EAAE,CAAC,UAAU,CAAC,YAAY,CAC3B,CAAC;oBACF,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAA,wBAAgB,GAAE,CAAC;oBAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;gBACD,MAAM;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAiBO,SAAS,CACf,MAAiB,EACjB,UAAsB,EACtB,KAAwB;QAExB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,qDAAqD;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACtC,IAAI,6BAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,uBAAuB,GAAG,UAAU,CACxC,uBAAiB,CAAC,eAAe,CACR,CAAC;YAE5B,IAAI,CAAC,uBAAuB,IAAI,SAAS,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAA,6BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAEtC,MAAM,GAAG,IAAA,eAAS,EAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/D,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,GAAoB,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACvC,GAAG,GAAG,SAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,IACE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAChC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CACxC,EACD,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBACxD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;wBAC9B,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;qBAAM,CAAC;gBACR,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF;AA1TD,wCA0TC","sourcesContent":["import { debug } from \"debug\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport {\n type PeerConfig,\n codecParametersFromString,\n usePLI,\n useTWCC,\n} from \"..\";\nimport { int } from \"../../../common/src\";\nimport {\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 unwrapRtx,\n} from \"../../../rtp/src\";\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\";\nimport type { Extensions } from \"./router\";\nimport type { 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];\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());\n }\n } else {\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n"]}
@@ -19,7 +19,7 @@
19
19
 
20
20
  Figure 2: Example for round-trip time computation
21
21
  */
22
- import Event from "rx.mini";
22
+ import { Event } from "../imports/common";
23
23
  import { GenericNack, RedEncoder, type RtcpPacket, type RtpHeader, RtpPacket } from "../../../rtp/src";
24
24
  import type { RTCDtlsTransport } from "../transport/dtls";
25
25
  import type { Kind } from "../types/domain";
@@ -51,9 +51,9 @@ exports.RTCRtpSender = void 0;
51
51
  const crypto_1 = require("crypto");
52
52
  const jspack_1 = require("@shinyoshiaki/jspack");
53
53
  const debug_1 = __importDefault(require("debug"));
54
- const rx_mini_1 = __importDefault(require("rx.mini"));
55
54
  const promises_1 = require("timers/promises");
56
55
  const uuid = __importStar(require("uuid"));
56
+ const common_1 = require("../imports/common");
57
57
  const __1 = require("..");
58
58
  const src_1 = require("../../../common/src");
59
59
  const src_2 = require("../../../rtp/src");
@@ -110,25 +110,25 @@ class RTCRtpSender {
110
110
  enumerable: true,
111
111
  configurable: true,
112
112
  writable: true,
113
- value: new rx_mini_1.default()
113
+ value: new common_1.Event()
114
114
  });
115
115
  Object.defineProperty(this, "onRtcp", {
116
116
  enumerable: true,
117
117
  configurable: true,
118
118
  writable: true,
119
- value: new rx_mini_1.default()
119
+ value: new common_1.Event()
120
120
  });
121
121
  Object.defineProperty(this, "onPictureLossIndication", {
122
122
  enumerable: true,
123
123
  configurable: true,
124
124
  writable: true,
125
- value: new rx_mini_1.default()
125
+ value: new common_1.Event()
126
126
  });
127
127
  Object.defineProperty(this, "onGenericNack", {
128
128
  enumerable: true,
129
129
  configurable: true,
130
130
  writable: true,
131
- value: new rx_mini_1.default()
131
+ value: new common_1.Event()
132
132
  });
133
133
  Object.defineProperty(this, "senderBWE", {
134
134
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,mCAAqC;AACrC,iDAA8C;AAC9C,kDAA0B;AAC1B,sDAA4B;AAC5B,8CAA6C;AAC7C,2CAA6B;AAE7B,0BAA+C;AAC/C,6CAAqE;AACrE,0CAyB0B;AAG1B,oCAA4E;AAM5E,kDAA6E;AAG7E,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,+CAA+C,CAAC,CAAC;AAEnE,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAa,YAAY;IAkDvB,YAAmB,WAAoC;QAA3C;;;;mBAAO,WAAW;WAAyB;QAjD9C;;;;mBAAO,QAAQ;WAAC;QAChB;;;;;WAAW;QACX;;;;mBAAO,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;WAAC;QAC9C;;;;mBAAU,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;WAAC;QAC1D;;;;mBAAW,IAAI,CAAC,EAAE,EAAE;WAAC;QACZ;;;;mBAAU,IAAI,CAAC,EAAE,EAAE;WAAC;QACpB;;;;mBAAU,IAAI,iBAAK,EAAE;WAAC;QACtB;;;;mBAAS,IAAI,iBAAK,EAAgB;WAAC;QACnC;;;;mBAA0B,IAAI,iBAAK,EAAM;WAAC;QAC1C;;;;mBAAgB,IAAI,iBAAK,EAAiB;WAAC;QAC3C;;;;mBAAY,IAAI,oCAAwB,EAAE;WAAC;QAE5C;;;;;WAAe;QACf;;;;;WAAa;QACb;;;;;WAAqB;QACrB;;;;;WAA6B;QAC7B;;;;;WAAwB;QACxB;;;;mBAAoB,IAAA,cAAQ,GAAE;WAAC;QACvC;;;;;WAAiC;QACzB;;;;mBAAe,CAAC;WAAC;QACzB;;;;mBAAa,IAAI,gBAAU,CAAC,IAAI,CAAC,YAAY,CAAC;WAAC;QACvC;;;;mBAAsD,EAAE;WAAC;QACzD;;;;;WAA0B;QAElC,UAAU;QACF;;;;;WAAyB;QACzB;;;;;WAA6B;QAC7B;;;;mBAAe,EAAE;WAAC;QAClB;;;;mBAAe,CAAC;WAAC;QACjB;;;;mBAAa,CAAC;WAAC;QACf;;;;mBAAc,CAAC;WAAC;QAChB;;;;;WAAa;QACrB;;;;mBAA8B,EAAE;WAAC;QAEjC,MAAM;QACE;;;;;WAAwB;QACxB;;;;;WAAmB;QACnB;;;;mBAAkB,CAAC;WAAC;QACpB;;;;mBAAY,CAAC;WAAC;QACd;;;;mBAAwB,EAAE;WAAC;QACnC;;;;;WAA8B;QACvB;;;;;WAAiC;QAChC;;;;mBAA+B,EAAE;WAAC;QAE1C;;;;;WAAyB;QACzB;;;;mBAAU,KAAK;WAAC;QAChB;;;;mBAAc,KAAK;WAAC;QACZ;;;;mBAAa,IAAI,eAAe,EAAE;WAAC;QAGzC,IAAI,CAAC,IAAI;YACP,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;gBAClC,CAAC,CAAC,IAAI,CAAC,WAAW;gBAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC5B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,aAA+B;QAC9C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG;YAClB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBACnD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC,CAAC,WAAW;SACf,CAAC;IACJ,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,CAAS;QACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,MAA4B;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAEtD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,WAAW,GAAG,IAAA,6BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACtE,IACE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK;gBAClC,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,WAAW,EAC9C,CAAC;gBACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACvC,IAAI,CAAC,uBAAuB,GAAG,MAAM,CACnC,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACvC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,KAAuB;QACnC,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAExB,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACjE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAEhC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAA8B;QAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,YAAY;YACZ,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEnE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE;oBACtD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAiB;oBAC5B,IAAI,kBAAY,CAAC;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,IAAI,oBAAc,CAAC;4BAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;yBAC5B,CAAC;qBACH,CAAC;iBACH,CAAC;gBACF,IAAI,CAAC,eAAe,GAAG,IAAA,kBAAU,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrD,IAAI,CAAC,mBAAmB,GAAG,IAAA,wBAAgB,GAAE,CAAC;gBAE9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CACV,IAAI,iCAA2B,CAAC;wBAC9B,MAAM,EAAE;4BACN,IAAI,4BAAsB,CAAC;gCACzB,MAAM,EAAE,IAAI,CAAC,IAAI;gCACjB,KAAK,EAAE;oCACL,IAAI,2BAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;iCACzD;6BACF,CAAC;yBACH;qBACF,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBAC9B,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;IACpB,CAAC;IAED,UAAU,CACR,EACE,cAAc,EACd,SAAS,GACuC,EAClD,aAAa,GAAG,KAAK;QAErB,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC;YACjE,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,eAAe,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,eAAe,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAuB;QACnC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE9D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAChC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACrE,MAAM,CAAC,cAAc,GAAG,IAAA,eAAS,EAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5C,MAAM,YAAY,GAAG,IAAA,eAAO,GAAE,CAAC;QAE/B,MAAM,wBAAwB,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB;aACtC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;gBACpB,QAAQ,SAAS,CAAC,GAAG,EAAE,CAAC;oBACtB,KAAK,uBAAiB,CAAC,OAAO;wBAC5B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;4BACb,OAAO,IAAA,sBAAgB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACpC,CAAC;wBACD,OAAO;oBACT,0CAA0C;oBAC1C,KAAK,uBAAiB,CAAC,eAAe;wBACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;4BACrB,OAAO,IAAA,8BAAwB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBACpD,CAAC;wBACD,OAAO;oBACT,0CAA0C;oBAC1C,KAAK,uBAAiB,CAAC,mBAAmB;wBACxC,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BAC7B,OAAO,IAAA,kCAA4B,EAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;wBAChE,CAAC;wBACD,OAAO;oBACT,KAAK,uBAAiB,CAAC,eAAe;wBACpC,IAAI,CAAC,aAAa,CAAC,uBAAuB,GAAG,IAAA,eAAS,EACpD,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAC1C,CAAC,CACF,CAAC;wBACF,OAAO,IAAA,8BAAwB,EAC7B,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAC3C,CAAC;oBACJ,KAAK,uBAAiB,CAAC,WAAW;wBAChC,OAAO,IAAA,0BAAoB,EAAC,YAAY,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;QACpD,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAgB,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,wBAAwB,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAElE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,GAAG,gBAAgB,CAAC,GAAG,GAAG,CAAC;QAE9D,IAAI,UAAU,GAAG,OAAO,CAAC;QAEzB,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,IAAI,CAAC,uBAAuB;aACtC,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACpC,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,IAAA,iBAAS,GAAE,CAAC;QAC9B,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,uBAAuB;YACnD,IAAI;YACJ,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,SAAS;SACpB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,UAAsB;QACrC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,kBAAY,CAAC,IAAI,CAAC;YACvB,KAAK,kBAAY,CAAC,IAAI;gBACpB,CAAC;oBACC,MAAM,MAAM,GAAG,UAAyC,CAAC;oBACzD,MAAM,CAAC,OAAO;yBACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;yBAC7C,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBAClB,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BACvD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gCAC7B,MAAM,GAAG,GACP,IAAA,wBAAgB,GAAE;oCAClB,IAAI,CAAC,mBAAmB;oCACxB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;gCACtB,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oCAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gCACjB,CAAC;qCAAM,CAAC;oCACN,IAAI,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;gCAC1D,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAC;gBACP,CAAC;gBACD,MAAM;YACR,KAAK,gCAA0B,CAAC,IAAI;gBAClC,CAAC;oBACC,MAAM,MAAM,GAAG,UAAwC,CAAC;oBACxD,QAAQ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAC9B,KAAK,qBAAe,CAAC,KAAK;4BACxB,CAAC;gCACC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA2B,CAAC;gCACpD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;4BACvC,CAAC;4BACD,MAAM;wBACR,KAAK,iBAAW,CAAC,KAAK;4BACpB,CAAC;gCACC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAuB,CAAC;gCAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;oCACrC,IAAI,MAAM,GACR,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;oCAC3C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;wCACtD,MAAM,GAAG,SAAS,CAAC;oCACrB,CAAC;oCACD,IAAI,MAAM,EAAE,CAAC;wCACX,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE,CAAC;4CACrC,MAAM,GAAG,IAAA,aAAO,EACd,MAAM,EACN,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,OAAO,CACb,CAAC;4CACF,IAAI,CAAC,iBAAiB,GAAG,IAAA,eAAS,EAChC,IAAI,CAAC,iBAAiB,EACtB,CAAC,CACF,CAAC;wCACJ,CAAC;wCACD,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAC9B,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,CACd,CAAC;oCACJ,CAAC;gCACH,CAAC,CAAC,CAAC;gCACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;4BACvC,CAAC;4BACD,MAAM;oBACV,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,KAAK,iCAA2B,CAAC,IAAI;gBACnC,CAAC;oBACC,MAAM,MAAM,GAAG,UAAyC,CAAC;oBACzD,QAAQ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAC9B,KAAK,iCAA2B,CAAC,KAAK;4BACpC,CAAC;gCACC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAuC,CAAC;gCAChE,IAAI,CAAC,2BAA2B,GAAG,QAAQ,CAAC,OAAO,CAAC;4BACtD,CAAC;4BACD,MAAM;wBACR,KAAK,2BAAqB,CAAC,KAAK;4BAC9B,CAAC;gCACC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;4BACzC,CAAC;4BACD,MAAM;oBACV,CAAC;gBACH,CAAC;gBACD,MAAM;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;CACF;AA1aD,oCA0aC","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\";\nimport debug from \"debug\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\n\nimport { codecParametersFromString } from \"..\";\nimport { random16, uint16Add, uint32Add } from \"../../../common/src\";\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 serializeAbsSendTime,\n serializeRepairedRtpStreamId,\n serializeSdesMid,\n serializeSdesRTPStreamID,\n serializeTransportWideCC,\n wrapRtx,\n} from \"../../../rtp/src\";\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\";\nimport debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport { codecParametersFromString } from \"..\";\nimport { random16, uint16Add, uint32Add } from \"../../../common/src\";\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 serializeAbsSendTime,\n serializeRepairedRtpStreamId,\n serializeSdesMid,\n serializeSdesRTPStreamID,\n serializeTransportWideCC,\n wrapRtx,\n} from \"../../../rtp/src\";\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,4 +1,4 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../imports/common";
2
2
  import type { RTCDtlsTransport } from "..";
3
3
  import type { Kind } from "../types/domain";
4
4
  import type { RTCRtpCodecParameters, RTCRtpHeaderExtensionParameters } from "./parameters";
@@ -22,13 +22,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  exports.Directions = exports.Sendrecv = exports.Recvonly = exports.Sendonly = exports.Inactive = exports.RTCRtpTransceiver = void 0;
30
- const rx_mini_1 = __importDefault(require("rx.mini"));
31
27
  const uuid = __importStar(require("uuid"));
28
+ const common_1 = require("../imports/common");
32
29
  const const_1 = require("../const");
33
30
  class RTCRtpTransceiver {
34
31
  set codecs(codecs) {
@@ -74,7 +71,7 @@ class RTCRtpTransceiver {
74
71
  enumerable: true,
75
72
  configurable: true,
76
73
  writable: true,
77
- value: new rx_mini_1.default()
74
+ value: new common_1.Event()
78
75
  });
79
76
  Object.defineProperty(this, "mid", {
80
77
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"rtpTransceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpTransceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\nimport * as uuid from \"uuid\";\n\nimport type { RTCDtlsTransport } from \"..\";\nimport { SenderDirections } from \"../const\";\nimport type { Kind } from \"../types/domain\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n} from \"./parameters\";\nimport type { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { MediaStreamTrack } from \"./track\";\n\nexport class RTCRtpTransceiver {\n readonly id = uuid.v4();\n readonly onTrack = new Event<[MediaStreamTrack, RTCRtpTransceiver]>();\n mid?: string;\n mLineIndex?: number;\n /**should not be reused because it has been used for sending before. */\n usedForSender = false;\n private _currentDirection?: Direction;\n offerDirection!: Direction;\n _codecs: RTCRtpCodecParameters[] = [];\n set codecs(codecs: RTCRtpCodecParameters[]) {\n this._codecs = codecs;\n }\n get codecs() {\n return this._codecs;\n }\n headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n options: Partial<TransceiverOptions> = {};\n stopping = false;\n stopped = false;\n\n constructor(\n public readonly kind: Kind,\n dtlsTransport: RTCDtlsTransport,\n public receiver: RTCRtpReceiver,\n public sender: RTCRtpSender,\n /**RFC 8829 4.2.4. direction the transceiver was initialized with */\n private _direction: Direction,\n ) {\n this.setDtlsTransport(dtlsTransport);\n }\n\n get dtlsTransport() {\n return this.receiver.dtlsTransport;\n }\n\n /**RFC 8829 4.2.4. setDirectionに渡された最後の値を示します */\n get direction() {\n return this._direction;\n }\n\n setDirection(direction: Direction) {\n this._direction = direction;\n if (SenderDirections.includes(this._currentDirection ?? \"\")) {\n this.usedForSender = true;\n }\n }\n\n /**RFC 8829 4.2.5. last negotiated direction */\n get currentDirection(): Direction | undefined {\n return this._currentDirection;\n }\n\n setCurrentDirection(direction: Direction | undefined) {\n this._currentDirection = direction;\n }\n\n setDtlsTransport(dtls: RTCDtlsTransport) {\n this.receiver.setDtlsTransport(dtls);\n this.sender.setDtlsTransport(dtls);\n }\n\n get msid() {\n return `${this.sender.streamId} ${this.sender.trackId}`;\n }\n\n addTrack(track: MediaStreamTrack) {\n const res = this.receiver.addTrack(track);\n if (res) {\n this.onTrack.execute(track, this);\n }\n }\n\n // todo impl\n // https://www.w3.org/TR/webrtc/#methods-8\n stop() {\n if (this.stopping) {\n return;\n }\n\n // todo Stop sending and receiving with transceiver.\n\n this.stopping = true;\n }\n\n getPayloadType(mimeType: string) {\n return this.codecs.find((codec) =>\n codec.mimeType.toLowerCase().includes(mimeType.toLowerCase()),\n )?.payloadType;\n }\n}\n\nexport const Inactive = \"inactive\";\nexport const Sendonly = \"sendonly\";\nexport const Recvonly = \"recvonly\";\nexport const Sendrecv = \"sendrecv\";\n\nexport const Directions = [Inactive, Sendonly, Recvonly, Sendrecv] as const;\n\nexport type Direction = (typeof Directions)[number];\n\ntype SimulcastDirection = \"send\" | \"recv\";\n\nexport interface TransceiverOptions {\n direction: Direction;\n simulcast: { direction: SimulcastDirection; rid: string }[];\n}\n"]}
1
+ {"version":3,"file":"rtpTransceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpTransceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import * as uuid from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport type { RTCDtlsTransport } from \"..\";\nimport { SenderDirections } from \"../const\";\nimport type { Kind } from \"../types/domain\";\nimport type {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n} from \"./parameters\";\nimport type { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { MediaStreamTrack } from \"./track\";\n\nexport class RTCRtpTransceiver {\n readonly id = uuid.v4();\n readonly onTrack = new Event<[MediaStreamTrack, RTCRtpTransceiver]>();\n mid?: string;\n mLineIndex?: number;\n /**should not be reused because it has been used for sending before. */\n usedForSender = false;\n private _currentDirection?: Direction;\n offerDirection!: Direction;\n _codecs: RTCRtpCodecParameters[] = [];\n set codecs(codecs: RTCRtpCodecParameters[]) {\n this._codecs = codecs;\n }\n get codecs() {\n return this._codecs;\n }\n headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n options: Partial<TransceiverOptions> = {};\n stopping = false;\n stopped = false;\n\n constructor(\n public readonly kind: Kind,\n dtlsTransport: RTCDtlsTransport,\n public receiver: RTCRtpReceiver,\n public sender: RTCRtpSender,\n /**RFC 8829 4.2.4. direction the transceiver was initialized with */\n private _direction: Direction,\n ) {\n this.setDtlsTransport(dtlsTransport);\n }\n\n get dtlsTransport() {\n return this.receiver.dtlsTransport;\n }\n\n /**RFC 8829 4.2.4. setDirectionに渡された最後の値を示します */\n get direction() {\n return this._direction;\n }\n\n setDirection(direction: Direction) {\n this._direction = direction;\n if (SenderDirections.includes(this._currentDirection ?? \"\")) {\n this.usedForSender = true;\n }\n }\n\n /**RFC 8829 4.2.5. last negotiated direction */\n get currentDirection(): Direction | undefined {\n return this._currentDirection;\n }\n\n setCurrentDirection(direction: Direction | undefined) {\n this._currentDirection = direction;\n }\n\n setDtlsTransport(dtls: RTCDtlsTransport) {\n this.receiver.setDtlsTransport(dtls);\n this.sender.setDtlsTransport(dtls);\n }\n\n get msid() {\n return `${this.sender.streamId} ${this.sender.trackId}`;\n }\n\n addTrack(track: MediaStreamTrack) {\n const res = this.receiver.addTrack(track);\n if (res) {\n this.onTrack.execute(track, this);\n }\n }\n\n // todo impl\n // https://www.w3.org/TR/webrtc/#methods-8\n stop() {\n if (this.stopping) {\n return;\n }\n\n // todo Stop sending and receiving with transceiver.\n\n this.stopping = true;\n }\n\n getPayloadType(mimeType: string) {\n return this.codecs.find((codec) =>\n codec.mimeType.toLowerCase().includes(mimeType.toLowerCase()),\n )?.payloadType;\n }\n}\n\nexport const Inactive = \"inactive\";\nexport const Sendonly = \"sendonly\";\nexport const Recvonly = \"recvonly\";\nexport const Sendrecv = \"sendrecv\";\n\nexport const Directions = [Inactive, Sendonly, Recvonly, Sendrecv] as const;\n\nexport type Direction = (typeof Directions)[number];\n\ntype SimulcastDirection = \"send\" | \"recv\";\n\nexport interface TransceiverOptions {\n direction: Direction;\n simulcast: { direction: SimulcastDirection; rid: string }[];\n}\n"]}
@@ -1,4 +1,4 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../../imports/common";
2
2
  import type { TransportWideCC } from "../../../../rtp/src";
3
3
  export declare class SenderBandwidthEstimator {
4
4
  congestion: boolean;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.SenderBandwidthEstimator = void 0;
7
- const rx_mini_1 = __importDefault(require("rx.mini"));
4
+ const common_1 = require("../../imports/common");
8
5
  const helper_1 = require("../../../../rtp/src/helper");
9
6
  const utils_1 = require("../../utils");
10
7
  const cumulativeResult_1 = require("./cumulativeResult");
@@ -37,20 +34,20 @@ class SenderBandwidthEstimator {
37
34
  enumerable: true,
38
35
  configurable: true,
39
36
  writable: true,
40
- value: new rx_mini_1.default()
37
+ value: new common_1.Event()
41
38
  });
42
39
  /**congestion occur or not */
43
40
  Object.defineProperty(this, "onCongestion", {
44
41
  enumerable: true,
45
42
  configurable: true,
46
43
  writable: true,
47
- value: new rx_mini_1.default()
44
+ value: new common_1.Event()
48
45
  });
49
46
  Object.defineProperty(this, "onCongestionScore", {
50
47
  enumerable: true,
51
48
  configurable: true,
52
49
  writable: true,
53
- value: new rx_mini_1.default()
50
+ value: new common_1.Event()
54
51
  });
55
52
  Object.defineProperty(this, "congestionCounter", {
56
53
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"senderBWE.js","sourceRoot":"","sources":["../../../../../src/media/sender/senderBWE.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAG5B,uDAAiD;AACjD,uCAAwC;AACxC,yDAAsD;AAEtD,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAa,wBAAwB;IAYnC,sBAAsB;IACtB,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,IAAI,eAAe,CAAC,CAAS;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,IAAI,gBAAgB,CAAC,CAAS;QAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;QA5BA;;;;mBAAa,KAAK;WAAC;QAEV;;;;mBAAqB,IAAI,iBAAK,EAAY;WAAC;QACpD,6BAA6B;QACpB;;;;mBAAe,IAAI,iBAAK,EAAa;WAAC;QACtC;;;;mBAAoB,IAAI,iBAAK,EAAY;WAAC;QAE3C;;;;mBAAoB,CAAC;WAAC;QACtB;;;;mBAAmB,IAAI,mCAAgB,EAAE;WAAC;QAC1C;;;;mBAAyC,EAAE;WAAC;QAC5C;;;;mBAAmB,CAAC;WAAC;QASrB;;;;mBAA4B,CAAC;WAAC;IASvB,CAAC;IAEhB,WAAW,CAAC,QAAyB;QACnC,MAAM,KAAK,GAAG,IAAA,iBAAS,GAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;QACpE,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAE9B,+BAA+B;YAE/B,IAAI,IAAI,CAAC,iBAAiB,GAAG,WAAW,EAAE,CAAC;gBACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;iBAAM,IAAI,IAAI,CAAC,eAAe,GAAG,SAAS,EAAE,CAAC;gBAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,SAAS;YAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,MAAM,CAAC,YAAY;gBAAE,SAAS;YAEnC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,YAAY,CACpB,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YAC/D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC9B,IAAI,CAAC,gBAAgB,CAAC,WAAW,EACjC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CACrC,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,IAAA,YAAG,EAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,IAAA,YAAG,EAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,KAAK,GACT,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;gBAEjE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC1D,CAAC;YAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3C,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa,CAAC,QAAkB;QAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;aAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACrB,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;aACvC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;IAC9C,CAAC;CACF;AA3GD,4DA2GC","sourcesContent":["import Event from \"rx.mini\";\n\nimport type { TransportWideCC } from \"../../../../rtp/src\";\nimport { Int } from \"../../../../rtp/src/helper\";\nimport { milliTime } from \"../../utils\";\nimport { CumulativeResult } from \"./cumulativeResult\";\n\nconst COUNTER_MAX = 20;\nconst SCORE_MAX = 10;\n\nexport class SenderBandwidthEstimator {\n congestion = false;\n\n readonly onAvailableBitrate = new Event<[number]>();\n /**congestion occur or not */\n readonly onCongestion = new Event<[boolean]>();\n readonly onCongestionScore = new Event<[number]>();\n\n private congestionCounter = 0;\n private cumulativeResult = new CumulativeResult();\n private sentInfos: { [key: number]: SentInfo } = {};\n private _congestionScore = 1;\n /**1~10 big is worth*/\n get congestionScore() {\n return this._congestionScore;\n }\n set congestionScore(v: number) {\n this._congestionScore = v;\n this.onCongestionScore.execute(v);\n }\n private _availableBitrate: number = 0;\n get availableBitrate() {\n return this._availableBitrate;\n }\n set availableBitrate(v: number) {\n this._availableBitrate = v;\n this.onAvailableBitrate.execute(v);\n }\n\n constructor() {}\n\n receiveTWCC(feedback: TransportWideCC) {\n const nowMs = milliTime();\n const elapsedMs = nowMs - this.cumulativeResult.firstPacketSentAtMs;\n if (elapsedMs > 1000) {\n this.cumulativeResult.reset();\n\n // Congestion may be occurring.\n\n if (this.congestionCounter < COUNTER_MAX) {\n this.congestionCounter++;\n } else if (this.congestionScore < SCORE_MAX) {\n this.congestionScore++;\n }\n\n if (this.congestionCounter >= COUNTER_MAX && !this.congestion) {\n this.congestion = true;\n this.onCongestion.execute(this.congestion);\n }\n }\n\n for (const result of feedback.packetResults) {\n if (!result.received) continue;\n\n const wideSeq = result.sequenceNumber;\n const info = this.sentInfos[wideSeq];\n if (!info) continue;\n if (!result.receivedAtMs) continue;\n\n this.cumulativeResult.addPacket(\n info.size,\n info.sendingAtMs,\n result.receivedAtMs,\n );\n }\n\n if (elapsedMs >= 100 && this.cumulativeResult.numPackets >= 20) {\n this.availableBitrate = Math.min(\n this.cumulativeResult.sendBitrate,\n this.cumulativeResult.receiveBitrate,\n );\n this.cumulativeResult.reset();\n\n if (this.congestionCounter > -COUNTER_MAX) {\n const maxBonus = Int(COUNTER_MAX / 2) + 1;\n const minBonus = Int(COUNTER_MAX / 4) + 1;\n const bonus =\n maxBonus - ((maxBonus - minBonus) / 10) * this.congestionScore;\n\n this.congestionCounter = this.congestionCounter - bonus;\n }\n\n if (this.congestionCounter <= -COUNTER_MAX) {\n if (this.congestionScore > 1) {\n this.congestionScore--;\n this.onCongestion.execute(false);\n }\n this.congestionCounter = 0;\n }\n\n if (this.congestionCounter <= 0 && this.congestion) {\n this.congestion = false;\n this.onCongestion.execute(this.congestion);\n }\n }\n }\n\n rtpPacketSent(sentInfo: SentInfo) {\n Object.keys(sentInfo)\n .map((v) => Number(v))\n .sort()\n .filter((seq) => seq < sentInfo.wideSeq)\n .forEach((seq) => {\n delete this.sentInfos[seq];\n });\n this.sentInfos[sentInfo.wideSeq] = sentInfo;\n }\n}\n\nexport interface SentInfo {\n wideSeq: number;\n /**\n * byte\n */\n size: number;\n isProbation?: boolean;\n sendingAtMs: number;\n sentAtMs: number;\n}\n"]}
1
+ {"version":3,"file":"senderBWE.js","sourceRoot":"","sources":["../../../../../src/media/sender/senderBWE.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport type { TransportWideCC } from \"../../../../rtp/src\";\nimport { Int } from \"../../../../rtp/src/helper\";\nimport { milliTime } from \"../../utils\";\nimport { CumulativeResult } from \"./cumulativeResult\";\n\nconst COUNTER_MAX = 20;\nconst SCORE_MAX = 10;\n\nexport class SenderBandwidthEstimator {\n congestion = false;\n\n readonly onAvailableBitrate = new Event<[number]>();\n /**congestion occur or not */\n readonly onCongestion = new Event<[boolean]>();\n readonly onCongestionScore = new Event<[number]>();\n\n private congestionCounter = 0;\n private cumulativeResult = new CumulativeResult();\n private sentInfos: { [key: number]: SentInfo } = {};\n private _congestionScore = 1;\n /**1~10 big is worth*/\n get congestionScore() {\n return this._congestionScore;\n }\n set congestionScore(v: number) {\n this._congestionScore = v;\n this.onCongestionScore.execute(v);\n }\n private _availableBitrate: number = 0;\n get availableBitrate() {\n return this._availableBitrate;\n }\n set availableBitrate(v: number) {\n this._availableBitrate = v;\n this.onAvailableBitrate.execute(v);\n }\n\n constructor() {}\n\n receiveTWCC(feedback: TransportWideCC) {\n const nowMs = milliTime();\n const elapsedMs = nowMs - this.cumulativeResult.firstPacketSentAtMs;\n if (elapsedMs > 1000) {\n this.cumulativeResult.reset();\n\n // Congestion may be occurring.\n\n if (this.congestionCounter < COUNTER_MAX) {\n this.congestionCounter++;\n } else if (this.congestionScore < SCORE_MAX) {\n this.congestionScore++;\n }\n\n if (this.congestionCounter >= COUNTER_MAX && !this.congestion) {\n this.congestion = true;\n this.onCongestion.execute(this.congestion);\n }\n }\n\n for (const result of feedback.packetResults) {\n if (!result.received) continue;\n\n const wideSeq = result.sequenceNumber;\n const info = this.sentInfos[wideSeq];\n if (!info) continue;\n if (!result.receivedAtMs) continue;\n\n this.cumulativeResult.addPacket(\n info.size,\n info.sendingAtMs,\n result.receivedAtMs,\n );\n }\n\n if (elapsedMs >= 100 && this.cumulativeResult.numPackets >= 20) {\n this.availableBitrate = Math.min(\n this.cumulativeResult.sendBitrate,\n this.cumulativeResult.receiveBitrate,\n );\n this.cumulativeResult.reset();\n\n if (this.congestionCounter > -COUNTER_MAX) {\n const maxBonus = Int(COUNTER_MAX / 2) + 1;\n const minBonus = Int(COUNTER_MAX / 4) + 1;\n const bonus =\n maxBonus - ((maxBonus - minBonus) / 10) * this.congestionScore;\n\n this.congestionCounter = this.congestionCounter - bonus;\n }\n\n if (this.congestionCounter <= -COUNTER_MAX) {\n if (this.congestionScore > 1) {\n this.congestionScore--;\n this.onCongestion.execute(false);\n }\n this.congestionCounter = 0;\n }\n\n if (this.congestionCounter <= 0 && this.congestion) {\n this.congestion = false;\n this.onCongestion.execute(this.congestion);\n }\n }\n }\n\n rtpPacketSent(sentInfo: SentInfo) {\n Object.keys(sentInfo)\n .map((v) => Number(v))\n .sort()\n .filter((seq) => seq < sentInfo.wideSeq)\n .forEach((seq) => {\n delete this.sentInfos[seq];\n });\n this.sentInfos[sentInfo.wideSeq] = sentInfo;\n }\n}\n\nexport interface SentInfo {\n wideSeq: number;\n /**\n * byte\n */\n size: number;\n isProbation?: boolean;\n sendingAtMs: number;\n sentAtMs: number;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../imports/common";
2
2
  import { type RtcpPacket, type RtpHeader, RtpPacket } from "../../../rtp/src";
3
3
  import { EventTarget } from "../helper";
4
4
  import type { Kind } from "../types/domain";
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.MediaStream = exports.MediaStreamTrack = void 0;
7
- const rx_mini_1 = __importDefault(require("rx.mini"));
8
4
  const uuid_1 = require("uuid");
5
+ const common_1 = require("../imports/common");
9
6
  const src_1 = require("../../../rtp/src");
10
7
  const helper_1 = require("../helper");
11
8
  class MediaStreamTrack extends helper_1.EventTarget {
@@ -84,19 +81,19 @@ class MediaStreamTrack extends helper_1.EventTarget {
84
81
  enumerable: true,
85
82
  configurable: true,
86
83
  writable: true,
87
- value: new rx_mini_1.default()
84
+ value: new common_1.Event()
88
85
  });
89
86
  Object.defineProperty(this, "onReceiveRtcp", {
90
87
  enumerable: true,
91
88
  configurable: true,
92
89
  writable: true,
93
- value: new rx_mini_1.default()
90
+ value: new common_1.Event()
94
91
  });
95
92
  Object.defineProperty(this, "onSourceChanged", {
96
93
  enumerable: true,
97
94
  configurable: true,
98
95
  writable: true,
99
- value: new rx_mini_1.default()
96
+ value: new common_1.Event()
100
97
  });
101
98
  Object.defineProperty(this, "stopped", {
102
99
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"track.js","sourceRoot":"","sources":["../../../../src/media/track.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { type RtcpPacket, type RtpHeader, RtpPacket } from \"../../../rtp/src\";\nimport { EventTarget } from \"../helper\";\nimport type { Kind } from \"../types/domain\";\nimport type { RTCRtpCodecParameters } from \"./parameters\";\n\nexport class MediaStreamTrack extends EventTarget {\n readonly uuid = v4();\n /**MediaStream ID*/\n streamId?: string;\n remote = false;\n label: string;\n kind!: Kind;\n id?: string;\n /**mediaSsrc */\n ssrc?: number;\n rid?: string;\n header?: RtpHeader;\n codec?: RTCRtpCodecParameters;\n /**todo impl */\n enabled = true;\n\n readonly onReceiveRtp = new Event<[RtpPacket]>();\n readonly onReceiveRtcp = new Event<[RtcpPacket]>();\n readonly onSourceChanged = new Event<\n [Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">]\n >();\n\n stopped = false;\n muted = true;\n\n constructor(\n props: Partial<MediaStreamTrack> & Pick<MediaStreamTrack, \"kind\">,\n ) {\n super();\n Object.assign(this, props);\n\n this.onReceiveRtp.subscribe((rtp) => {\n this.muted = false;\n this.header = rtp.header;\n });\n\n this.label = `${this.remote ? \"remote\" : \"local\"} ${this.kind}`;\n }\n\n stop = () => {\n this.stopped = true;\n this.muted = true;\n this.onReceiveRtp.complete();\n this.emit(\"ended\");\n };\n\n writeRtp = (rtp: RtpPacket | Buffer) => {\n if (this.remote) {\n throw new Error(\"this is remoteTrack\");\n }\n if (this.stopped) {\n return;\n }\n\n const packet = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n packet.header.payloadType =\n this.codec?.payloadType ?? packet.header.payloadType;\n this.onReceiveRtp.execute(packet);\n };\n}\n\nexport class MediaStream {\n id!: string;\n tracks: MediaStreamTrack[] = [];\n\n constructor(props: Partial<MediaStream> | MediaStreamTrack[]) {\n if (Array.isArray(props)) {\n this.tracks = props;\n } else {\n Object.assign(this, props);\n }\n this.id ??= v4();\n }\n\n addTrack(track: MediaStreamTrack) {\n track.streamId = this.id;\n this.tracks.push(track);\n }\n\n getTracks() {\n return this.tracks;\n }\n\n getAudioTracks() {\n return this.tracks.filter((track) => track.kind === \"audio\");\n }\n\n getVideoTracks() {\n return this.tracks.filter((track) => track.kind === \"video\");\n }\n}\n"]}
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../../../src/media/track.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 } from \"uuid\";\nimport { Event } from \"../imports/common\";\n\nimport { type RtcpPacket, type RtpHeader, RtpPacket } from \"../../../rtp/src\";\nimport { EventTarget } from \"../helper\";\nimport type { Kind } from \"../types/domain\";\nimport type { RTCRtpCodecParameters } from \"./parameters\";\n\nexport class MediaStreamTrack extends EventTarget {\n readonly uuid = v4();\n /**MediaStream ID*/\n streamId?: string;\n remote = false;\n label: string;\n kind!: Kind;\n id?: string;\n /**mediaSsrc */\n ssrc?: number;\n rid?: string;\n header?: RtpHeader;\n codec?: RTCRtpCodecParameters;\n /**todo impl */\n enabled = true;\n\n readonly onReceiveRtp = new Event<[RtpPacket]>();\n readonly onReceiveRtcp = new Event<[RtcpPacket]>();\n readonly onSourceChanged = new Event<\n [Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">]\n >();\n\n stopped = false;\n muted = true;\n\n constructor(\n props: Partial<MediaStreamTrack> & Pick<MediaStreamTrack, \"kind\">,\n ) {\n super();\n Object.assign(this, props);\n\n this.onReceiveRtp.subscribe((rtp) => {\n this.muted = false;\n this.header = rtp.header;\n });\n\n this.label = `${this.remote ? \"remote\" : \"local\"} ${this.kind}`;\n }\n\n stop = () => {\n this.stopped = true;\n this.muted = true;\n this.onReceiveRtp.complete();\n this.emit(\"ended\");\n };\n\n writeRtp = (rtp: RtpPacket | Buffer) => {\n if (this.remote) {\n throw new Error(\"this is remoteTrack\");\n }\n if (this.stopped) {\n return;\n }\n\n const packet = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n packet.header.payloadType =\n this.codec?.payloadType ?? packet.header.payloadType;\n this.onReceiveRtp.execute(packet);\n };\n}\n\nexport class MediaStream {\n id!: string;\n tracks: MediaStreamTrack[] = [];\n\n constructor(props: Partial<MediaStream> | MediaStreamTrack[]) {\n if (Array.isArray(props)) {\n this.tracks = props;\n } else {\n Object.assign(this, props);\n }\n this.id ??= v4();\n }\n\n addTrack(track: MediaStreamTrack) {\n track.streamId = this.id;\n this.tracks.push(track);\n }\n\n getTracks() {\n return this.tracks;\n }\n\n getAudioTracks() {\n return this.tracks.filter((track) => track.kind === \"audio\");\n }\n\n getVideoTracks() {\n return this.tracks.filter((track) => track.kind === \"video\");\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
- import Event from "rx.mini";
1
+ import { Event } from "../../imports/common";
2
2
  import type { MediaStreamTrack } from "../../media/track";
3
3
  import type { MediaWriter, StreamEvent } from "./writer";
4
+ export type { StreamEvent };
4
5
  export declare class MediaRecorder {
5
6
  props: Partial<MediaRecorderOptions> & ({
6
7
  numOfTracks: number;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.MediaRecorder = void 0;
7
- const rx_mini_1 = __importDefault(require("rx.mini"));
4
+ const common_1 = require("../../imports/common");
8
5
  const webm_1 = require("./writer/webm");
9
6
  class MediaRecorder {
10
7
  constructor(props) {
@@ -42,7 +39,7 @@ class MediaRecorder {
42
39
  enumerable: true,
43
40
  configurable: true,
44
41
  writable: true,
45
- value: new rx_mini_1.default()
42
+ value: new common_1.Event()
46
43
  });
47
44
  this.tracks = props.tracks ?? this.tracks;
48
45
  const { path, stream } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/nonstandard/recorder/index.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAG5B,wCAA4C;AAE5C,MAAa,aAAa;IAOxB,YACS,KAoBJ;QApBH;;;;mBAAO,KAAK;WAoBT;QA3BL;;;;;WAAoB;QACpB;;;;;WAAa;QACb;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAAU,KAAK;WAAC;QAChB;;;;mBAAU,IAAI,iBAAK,EAAW;WAAC;QAyB7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAE1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAE/B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE;gBAClB,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;oBACjB,KAAK,MAAM;wBACT,OAAO,IAAI,kBAAW,CAAC;4BACrB,GAAG,KAAK;4BACR,IAAI,EAAE,IAAK;4BACX,MAAM,EAAE,MAAO;yBAChB,CAAC,CAAC;oBACL;wBACE,MAAM,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAW,CAAC;gBAC5B,GAAG,KAAK;gBACR,IAAI,EAAE,IAAK;gBACX,MAAM,EAAE,MAAO;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAuB;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IACE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW;YAC7C,IAAI,CAAC,OAAO,KAAK,KAAK,EACtB,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF;AAlFD,sCAkFC","sourcesContent":["import Event from \"rx.mini\";\nimport type { MediaStreamTrack } from \"../../media/track\";\nimport type { MediaWriter, StreamEvent } from \"./writer\";\nimport { WebmFactory } from \"./writer/webm\";\n\nexport class MediaRecorder {\n writer: MediaWriter;\n ext?: string;\n tracks: MediaStreamTrack[] = [];\n started = false;\n onError = new Event<[Error]>();\n\n constructor(\n public props: Partial<MediaRecorderOptions> &\n (\n | {\n numOfTracks: number;\n tracks?: MediaStreamTrack[];\n }\n | {\n numOfTracks?: number;\n tracks: MediaStreamTrack[];\n }\n ) &\n (\n | {\n path: string;\n stream?: StreamEvent;\n }\n | {\n path?: string;\n stream: StreamEvent;\n }\n ),\n ) {\n this.tracks = props.tracks ?? this.tracks;\n\n const { path, stream } = props;\n\n if (path) {\n this.ext = path.split(\".\").slice(-1)[0];\n this.writer = (() => {\n switch (this.ext) {\n case \"webm\":\n return new WebmFactory({\n ...props,\n path: path!,\n stream: stream!,\n });\n default:\n throw new Error();\n }\n })();\n } else {\n this.writer = new WebmFactory({\n ...props,\n path: path!,\n stream: stream!,\n });\n }\n\n if (this.tracks.length > 0) {\n this.props.numOfTracks = this.tracks.length;\n this.start().catch((error) => {\n this.onError.execute(error);\n });\n }\n }\n\n async addTrack(track: MediaStreamTrack) {\n this.tracks.push(track);\n await this.start();\n }\n\n private async start() {\n if (\n this.tracks.length === this.props.numOfTracks &&\n this.started === false\n ) {\n this.started = true;\n await this.writer.start(this.tracks);\n }\n }\n\n async stop() {\n await this.writer.stop();\n }\n}\n\nexport interface MediaRecorderOptions {\n width: number;\n height: number;\n jitterBufferLatency: number;\n jitterBufferSize: number;\n disableLipSync: boolean;\n waitForKeyframe: boolean;\n defaultDuration: number;\n tracks: MediaStreamTrack[];\n disableNtp: boolean;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/nonstandard/recorder/index.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAG7C,wCAA4C;AAI5C,MAAa,aAAa;IAOxB,YACS,KAoBJ;QApBH;;;;mBAAO,KAAK;WAoBT;QA3BL;;;;;WAAoB;QACpB;;;;;WAAa;QACb;;;;mBAA6B,EAAE;WAAC;QAChC;;;;mBAAU,KAAK;WAAC;QAChB;;;;mBAAU,IAAI,cAAK,EAAW;WAAC;QAyB7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAE1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAE/B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE;gBAClB,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;oBACjB,KAAK,MAAM;wBACT,OAAO,IAAI,kBAAW,CAAC;4BACrB,GAAG,KAAK;4BACR,IAAI,EAAE,IAAK;4BACX,MAAM,EAAE,MAAO;yBAChB,CAAC,CAAC;oBACL;wBACE,MAAM,IAAI,KAAK,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAW,CAAC;gBAC5B,GAAG,KAAK;gBACR,IAAI,EAAE,IAAK;gBACX,MAAM,EAAE,MAAO;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAuB;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IACE,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW;YAC7C,IAAI,CAAC,OAAO,KAAK,KAAK,EACtB,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF;AAlFD,sCAkFC","sourcesContent":["import { Event } from \"../../imports/common\";\nimport type { MediaStreamTrack } from \"../../media/track\";\nimport type { MediaWriter, StreamEvent } from \"./writer\";\nimport { WebmFactory } from \"./writer/webm\";\n\nexport type { StreamEvent };\n\nexport class MediaRecorder {\n writer: MediaWriter;\n ext?: string;\n tracks: MediaStreamTrack[] = [];\n started = false;\n onError = new Event<[Error]>();\n\n constructor(\n public props: Partial<MediaRecorderOptions> &\n (\n | {\n numOfTracks: number;\n tracks?: MediaStreamTrack[];\n }\n | {\n numOfTracks?: number;\n tracks: MediaStreamTrack[];\n }\n ) &\n (\n | {\n path: string;\n stream?: StreamEvent;\n }\n | {\n path?: string;\n stream: StreamEvent;\n }\n ),\n ) {\n this.tracks = props.tracks ?? this.tracks;\n\n const { path, stream } = props;\n\n if (path) {\n this.ext = path.split(\".\").slice(-1)[0];\n this.writer = (() => {\n switch (this.ext) {\n case \"webm\":\n return new WebmFactory({\n ...props,\n path: path!,\n stream: stream!,\n });\n default:\n throw new Error();\n }\n })();\n } else {\n this.writer = new WebmFactory({\n ...props,\n path: path!,\n stream: stream!,\n });\n }\n\n if (this.tracks.length > 0) {\n this.props.numOfTracks = this.tracks.length;\n this.start().catch((error) => {\n this.onError.execute(error);\n });\n }\n }\n\n async addTrack(track: MediaStreamTrack) {\n this.tracks.push(track);\n await this.start();\n }\n\n private async start() {\n if (\n this.tracks.length === this.props.numOfTracks &&\n this.started === false\n ) {\n this.started = true;\n await this.writer.start(this.tracks);\n }\n }\n\n async stop() {\n await this.writer.stop();\n }\n}\n\nexport interface MediaRecorderOptions {\n width: number;\n height: number;\n jitterBufferLatency: number;\n jitterBufferSize: number;\n disableLipSync: boolean;\n waitForKeyframe: boolean;\n defaultDuration: number;\n tracks: MediaStreamTrack[];\n disableNtp: boolean;\n}\n"]}
@@ -1,7 +1,7 @@
1
- import type { Event } from "rx.mini";
2
1
  import type { MediaRecorderOptions } from "..";
3
2
  import type { MediaStreamTrack } from "../../..";
4
3
  import type { WebmOutput } from "../../../../../rtp/src/extra";
4
+ import type { Event } from "../../../imports/common";
5
5
  export declare abstract class MediaWriter {
6
6
  protected props: Partial<MediaRecorderOptions> & {
7
7
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/index.ts"],"names":[],"mappings":";;;AAKA,MAAsB,WAAW;IAC/B,YACY,KAGgC;QAH1C;;;;mBAAU,KAAK;WAG2B;IACzC,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,MAA0B,IAAG,CAAC;IAE1C,KAAK,CAAC,IAAI,KAAI,CAAC;CAChB;AAXD,kCAWC","sourcesContent":["import type { Event } from \"rx.mini\";\nimport type { MediaRecorderOptions } from \"..\";\nimport type { MediaStreamTrack } from \"../../..\";\nimport type { WebmOutput } from \"../../../../../rtp/src/extra\";\n\nexport abstract class MediaWriter {\n constructor(\n protected props: Partial<MediaRecorderOptions> & {\n path: string;\n stream?: StreamEvent;\n } & { path?: string; stream: StreamEvent },\n ) {}\n\n async start(tracks: MediaStreamTrack[]) {}\n\n async stop() {}\n}\n\nexport type StreamEvent = Event<[WebmOutput]>;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/index.ts"],"names":[],"mappings":";;;AAKA,MAAsB,WAAW;IAC/B,YACY,KAGgC;QAH1C;;;;mBAAU,KAAK;WAG2B;IACzC,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,MAA0B,IAAG,CAAC;IAE1C,KAAK,CAAC,IAAI,KAAI,CAAC;CAChB;AAXD,kCAWC","sourcesContent":["import type { MediaRecorderOptions } from \"..\";\nimport type { MediaStreamTrack } from \"../../..\";\nimport type { WebmOutput } from \"../../../../../rtp/src/extra\";\nimport type { Event } from \"../../../imports/common\";\n\nexport abstract class MediaWriter {\n constructor(\n protected props: Partial<MediaRecorderOptions> & {\n path: string;\n stream?: StreamEvent;\n } & { path?: string; stream: StreamEvent },\n ) {}\n\n async start(tracks: MediaStreamTrack[]) {}\n\n async stop() {}\n}\n\nexport type StreamEvent = Event<[WebmOutput]>;\n"]}
@@ -1,4 +1,4 @@
1
- import { EventDisposer } from "rx.mini";
1
+ import { EventDisposer } from "../../../imports/common";
2
2
  import { MediaWriter } from ".";
3
3
  import { type MediaStreamTrack } from "../../..";
4
4
  import { RtpSourceCallback } from "../../../../../rtp/src/extra";
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WebmFactory = void 0;
4
4
  const promises_1 = require("fs/promises");
5
- const rx_mini_1 = require("rx.mini");
5
+ const common_1 = require("../../../imports/common");
6
6
  const _1 = require(".");
7
7
  const __1 = require("../../..");
8
8
  const extra_1 = require("../../../../../rtp/src/extra");
@@ -20,7 +20,7 @@ class WebmFactory extends _1.MediaWriter {
20
20
  enumerable: true,
21
21
  configurable: true,
22
22
  writable: true,
23
- value: new rx_mini_1.EventDisposer()
23
+ value: new common_1.EventDisposer()
24
24
  });
25
25
  }
26
26
  async start(tracks) {