mediasoup 3.26.0 → 3.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/node/lib/DataConsumer.js +1 -1
  3. package/node/lib/Router.js +1 -1
  4. package/node/lib/Transport.js +15 -15
  5. package/node/lib/fbs/rtp-parameters/encoding-mapping.d.ts +2 -6
  6. package/node/lib/fbs/rtp-parameters/encoding-mapping.d.ts.map +1 -1
  7. package/node/lib/fbs/rtp-parameters/encoding-mapping.js +7 -19
  8. package/node/lib/fbs/rtp-parameters/rtp-encoding-parameters.d.ts +4 -4
  9. package/node/lib/fbs/rtp-parameters/rtp-encoding-parameters.js +2 -2
  10. package/node/lib/fbs/rtp-stream/bitrate-by-layer.d.ts +5 -5
  11. package/node/lib/fbs/rtp-stream/bitrate-by-layer.d.ts.map +1 -1
  12. package/node/lib/fbs/rtp-stream/bitrate-by-layer.js +3 -3
  13. package/node/lib/fbs/rtp-stream/recv-stats.d.ts +5 -5
  14. package/node/lib/fbs/rtp-stream/recv-stats.d.ts.map +1 -1
  15. package/node/lib/fbs/rtp-stream/recv-stats.js +3 -3
  16. package/node/lib/fbs/rtp-stream/send-stats.d.ts +5 -5
  17. package/node/lib/fbs/rtp-stream/send-stats.d.ts.map +1 -1
  18. package/node/lib/fbs/rtp-stream/send-stats.js +3 -3
  19. package/node/lib/fbs/transport/bwe-trace-info.d.ts +23 -23
  20. package/node/lib/fbs/transport/bwe-trace-info.d.ts.map +1 -1
  21. package/node/lib/fbs/transport/bwe-trace-info.js +15 -15
  22. package/node/lib/fbs/transport/options.d.ts +5 -5
  23. package/node/lib/fbs/transport/options.js +2 -2
  24. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.d.ts +5 -5
  25. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.d.ts.map +1 -1
  26. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.js +3 -3
  27. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.d.ts +5 -5
  28. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.d.ts.map +1 -1
  29. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.js +3 -3
  30. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.d.ts +5 -5
  31. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.d.ts.map +1 -1
  32. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.js +3 -3
  33. package/node/lib/fbs/transport/stats.d.ts +38 -38
  34. package/node/lib/fbs/transport/stats.d.ts.map +1 -1
  35. package/node/lib/fbs/transport/stats.js +25 -25
  36. package/node/lib/ortc.d.ts +0 -1
  37. package/node/lib/ortc.d.ts.map +1 -1
  38. package/node/lib/ortc.js +1 -2
  39. package/node/lib/rtpParametersFbsUtils.d.ts.map +1 -1
  40. package/node/lib/rtpParametersFbsUtils.js +2 -2
  41. package/package.json +9 -9
  42. package/worker/deps/libwebrtc/libwebrtc/call/rtp_transport_controller_send.cc +10 -10
  43. package/worker/deps/libwebrtc/libwebrtc/mediasoup_helpers.h +6 -6
  44. package/worker/deps/libwebrtc/libwebrtc/modules/congestion_controller/goog_cc/alr_detector.cc +1 -1
  45. package/worker/deps/libwebrtc/libwebrtc/modules/pacing/paced_sender.cc +7 -7
  46. package/worker/deps/libwebrtc/libwebrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h +1 -1
  47. package/worker/deps/libwebrtc/libwebrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc +1 -1
  48. package/worker/fbs/rtpParameters.fbs +1 -2
  49. package/worker/fbs/rtpStream.fbs +3 -3
  50. package/worker/fbs/transport.fbs +23 -23
  51. package/worker/fuzzer/include/RTC/FuzzerDtlsTransport.hpp +4 -1
  52. package/worker/fuzzer/src/FuzzerUtils.cpp +5 -3
  53. package/worker/fuzzer/src/RTC/FuzzerDtlsTransport.cpp +8 -5
  54. package/worker/fuzzer/src/RTC/FuzzerRateCalculator.cpp +3 -3
  55. package/worker/fuzzer/src/RTC/FuzzerTrendCalculator.cpp +6 -6
  56. package/worker/fuzzer/src/RTC/RTCP/FuzzerFeedbackRtpTransport.cpp +3 -3
  57. package/worker/fuzzer/src/RTC/RTP/FuzzerPacket.cpp +2 -2
  58. package/worker/fuzzer/src/RTC/RTP/FuzzerRetransmissionBuffer.cpp +5 -5
  59. package/worker/fuzzer/src/RTC/RTP/FuzzerRtpStreamSend.cpp +3 -3
  60. package/worker/fuzzer/src/fuzzer.cpp +4 -0
  61. package/worker/include/Channel/ChannelNotification.hpp +3 -3
  62. package/worker/include/Channel/ChannelRequest.hpp +1 -1
  63. package/worker/include/Channel/ChannelSocket.hpp +11 -0
  64. package/worker/include/DepLibUV.hpp +16 -33
  65. package/worker/include/RTC/ActiveSpeakerObserver.hpp +11 -11
  66. package/worker/include/RTC/AudioLevelObserver.hpp +4 -4
  67. package/worker/include/RTC/BWE/AcknowledgedBitrateEstimatorInterface.hpp +55 -0
  68. package/worker/include/RTC/BWE/AimdRateControl.hpp +190 -0
  69. package/worker/include/RTC/BWE/BweTypes.hpp +211 -0
  70. package/worker/include/RTC/BWE/DelayBasedBwe.hpp +173 -0
  71. package/worker/include/RTC/BWE/FeedbackAdapter.hpp +72 -0
  72. package/worker/include/RTC/BWE/InterArrivalDelta.hpp +106 -0
  73. package/worker/include/RTC/BWE/LinkCapacityEstimator.hpp +84 -0
  74. package/worker/include/RTC/BWE/RobustThroughputEstimator.hpp +94 -0
  75. package/worker/include/RTC/BWE/SendPacketHistory.hpp +137 -0
  76. package/worker/include/RTC/BWE/TrendlineEstimator.hpp +101 -0
  77. package/worker/include/RTC/Consts.hpp +6 -6
  78. package/worker/include/RTC/Consumer.hpp +14 -12
  79. package/worker/include/RTC/DataConsumer.hpp +3 -3
  80. package/worker/include/RTC/DataProducer.hpp +3 -3
  81. package/worker/include/RTC/DtlsTransport.hpp +5 -2
  82. package/worker/include/RTC/ICE/IceCandidate.hpp +2 -2
  83. package/worker/include/RTC/ICE/IceServer.hpp +3 -3
  84. package/worker/include/RTC/KeyFrameRequestManager.hpp +3 -3
  85. package/worker/include/RTC/NEW_RTCP/packet/Packet.hpp +1 -1
  86. package/worker/include/RTC/NackGenerator.hpp +12 -12
  87. package/worker/include/RTC/PipeProducerStreamManager.hpp +3 -4
  88. package/worker/include/RTC/PipeTransport.hpp +18 -5
  89. package/worker/include/RTC/PlainTransport.hpp +18 -5
  90. package/worker/include/RTC/PortManager.hpp +4 -4
  91. package/worker/include/RTC/Producer.hpp +21 -12
  92. package/worker/include/RTC/ProducerStreamManager.hpp +12 -6
  93. package/worker/include/RTC/RTCP/Bye.hpp +2 -2
  94. package/worker/include/RTC/RTCP/FeedbackPsRemb.hpp +4 -4
  95. package/worker/include/RTC/RTCP/FeedbackRtpTmmb.hpp +3 -3
  96. package/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +54 -39
  97. package/worker/include/RTC/RTCP/Packet.hpp +3 -3
  98. package/worker/include/RTC/RTCP/ReceiverReport.hpp +3 -3
  99. package/worker/include/RTC/RTCP/Sdes.hpp +2 -2
  100. package/worker/include/RTC/RTCP/XR.hpp +2 -2
  101. package/worker/include/RTC/RTCP/XrDelaySinceLastRr.hpp +1 -1
  102. package/worker/include/RTC/RTP/Codecs/H264.hpp +1 -1
  103. package/worker/include/RTC/RTP/Codecs/Opus.hpp +2 -2
  104. package/worker/include/RTC/RTP/Codecs/PayloadDescriptorHandler.hpp +3 -3
  105. package/worker/include/RTC/RTP/Codecs/VP8.hpp +2 -2
  106. package/worker/include/RTC/RTP/Codecs/VP9.hpp +2 -2
  107. package/worker/include/RTC/RTP/HeaderExtensionIds.hpp +12 -12
  108. package/worker/include/RTC/RTP/Packet.hpp +13 -13
  109. package/worker/include/RTC/RTP/ProbationGenerator.hpp +1 -1
  110. package/worker/include/RTC/RTP/RetransmissionBuffer.hpp +7 -7
  111. package/worker/include/RTC/RTP/RtpStream.hpp +37 -51
  112. package/worker/include/RTC/RTP/RtpStreamRecv.hpp +59 -41
  113. package/worker/include/RTC/RTP/RtpStreamSend.hpp +20 -14
  114. package/worker/include/RTC/RTP/RtxStream.hpp +12 -13
  115. package/worker/include/RTC/RateCalculator.hpp +50 -44
  116. package/worker/include/RTC/RemoteCaptureTimeEstimator.hpp +5 -4
  117. package/worker/include/RTC/RemoteClockOffsetEstimator.hpp +11 -11
  118. package/worker/include/RTC/Router.hpp +6 -0
  119. package/worker/include/RTC/RtcLogger.hpp +1 -1
  120. package/worker/include/RTC/RtpDictionaries.hpp +10 -10
  121. package/worker/include/RTC/SCTP/association/Association.hpp +56 -28
  122. package/worker/include/RTC/SCTP/association/HeartbeatHandler.hpp +4 -4
  123. package/worker/include/RTC/SCTP/association/StateCookie.hpp +14 -14
  124. package/worker/include/RTC/SCTP/association/StreamResetHandler.hpp +2 -2
  125. package/worker/include/RTC/SCTP/association/TransmissionControlBlock.hpp +12 -12
  126. package/worker/include/RTC/SCTP/association/TransmissionControlBlockContextInterface.hpp +4 -4
  127. package/worker/include/RTC/SCTP/packet/TLV.hpp +1 -1
  128. package/worker/include/RTC/SCTP/packet/parameters/StateCookieParameter.hpp +3 -3
  129. package/worker/include/RTC/SCTP/public/AssociationInterface.hpp +4 -1
  130. package/worker/include/RTC/SCTP/public/AssociationMetrics.hpp +1 -1
  131. package/worker/include/RTC/SCTP/public/SctpOptions.hpp +12 -12
  132. package/worker/include/RTC/SCTP/public/SctpTypes.hpp +1 -1
  133. package/worker/include/RTC/SCTP/tx/OutstandingData.hpp +15 -16
  134. package/worker/include/RTC/SCTP/tx/RetransmissionQueue.hpp +7 -8
  135. package/worker/include/RTC/SCTP/tx/RetransmissionTimeout.hpp +20 -16
  136. package/worker/include/RTC/SCTP/tx/RoundRobinSendQueue.hpp +5 -6
  137. package/worker/include/RTC/SCTP/tx/SendQueueInterface.hpp +2 -2
  138. package/worker/include/RTC/SCTP/tx/StreamScheduler.hpp +5 -5
  139. package/worker/include/RTC/SctpDictionaries.hpp +3 -3
  140. package/worker/include/RTC/Serializable.hpp +1 -1
  141. package/worker/include/RTC/SimpleProducerStreamManager.hpp +3 -4
  142. package/worker/include/RTC/SimulcastProducerStreamManager.hpp +6 -7
  143. package/worker/include/RTC/SvcProducerStreamManager.hpp +6 -5
  144. package/worker/include/RTC/TcpConnection.hpp +9 -3
  145. package/worker/include/RTC/TcpServer.hpp +3 -0
  146. package/worker/include/RTC/Transport.hpp +52 -45
  147. package/worker/include/RTC/TransportCongestionControlClient.hpp +30 -25
  148. package/worker/include/RTC/TransportCongestionControlServer.hpp +17 -17
  149. package/worker/include/RTC/TrendCalculator.hpp +5 -5
  150. package/worker/include/RTC/UdpSocket.hpp +11 -2
  151. package/worker/include/RTC/WebRtcServer.hpp +20 -5
  152. package/worker/include/RTC/WebRtcTransport.hpp +35 -10
  153. package/worker/include/Settings.hpp +4 -2
  154. package/worker/include/Shared.hpp +5 -20
  155. package/worker/include/SharedInterface.hpp +6 -28
  156. package/worker/include/Utils.hpp +40 -21
  157. package/worker/include/common.hpp +4 -0
  158. package/worker/include/handles/BackoffTimerHandle.hpp +4 -4
  159. package/worker/include/handles/BackoffTimerHandleInterface.hpp +5 -5
  160. package/worker/include/handles/TcpConnectionHandle.hpp +6 -6
  161. package/worker/include/handles/TcpServerHandle.hpp +1 -1
  162. package/worker/include/handles/TimerHandle.hpp +15 -9
  163. package/worker/include/handles/TimerHandleInterface.hpp +10 -4
  164. package/worker/include/handles/UdpSocketHandle.hpp +3 -3
  165. package/worker/include/handles/UnixStreamSocketHandle.hpp +2 -2
  166. package/worker/meson.build +81 -36
  167. package/worker/meson_options.txt +1 -0
  168. package/worker/mocks/include/MockShared.hpp +24 -23
  169. package/worker/mocks/include/RTC/SCTP/association/MockTransmissionControlBlockContext.hpp +51 -27
  170. package/worker/mocks/include/RTC/SCTP/tx/MockSendQueue.hpp +11 -11
  171. package/worker/mocks/include/handles/MockBackoffTimerHandle.hpp +10 -10
  172. package/worker/mocks/include/handles/MockTimerHandle.hpp +60 -22
  173. package/worker/mocks/src/MockShared.cpp +51 -5
  174. package/worker/mocks/src/handles/MockBackoffTimerHandle.cpp +29 -15
  175. package/worker/mocks/src/handles/MockTimerHandle.cpp +117 -0
  176. package/worker/scripts/clang-scripts.mjs +2 -2
  177. package/worker/src/Channel/ChannelNotification.cpp +5 -6
  178. package/worker/src/Channel/ChannelSocket.cpp +20 -2
  179. package/worker/src/DepLibUV.cpp +4 -5
  180. package/worker/src/RTC/ActiveSpeakerObserver.cpp +59 -47
  181. package/worker/src/RTC/AudioLevelObserver.cpp +7 -7
  182. package/worker/src/RTC/BWE/AimdRateControl.cpp +468 -0
  183. package/worker/src/RTC/BWE/BweTypes.cpp +61 -0
  184. package/worker/src/RTC/BWE/DelayBasedBwe.cpp +275 -0
  185. package/worker/src/RTC/BWE/FeedbackAdapter.cpp +148 -0
  186. package/worker/src/RTC/BWE/InterArrivalDelta.cpp +181 -0
  187. package/worker/src/RTC/BWE/LinkCapacityEstimator.cpp +133 -0
  188. package/worker/src/RTC/BWE/RobustThroughputEstimator.cpp +245 -0
  189. package/worker/src/RTC/BWE/SendPacketHistory.cpp +184 -0
  190. package/worker/src/RTC/BWE/TrendlineEstimator.cpp +233 -0
  191. package/worker/src/RTC/Consumer.cpp +48 -35
  192. package/worker/src/RTC/DataConsumer.cpp +4 -4
  193. package/worker/src/RTC/DataProducer.cpp +3 -3
  194. package/worker/src/RTC/DirectTransport.cpp +2 -2
  195. package/worker/src/RTC/DtlsTransport.cpp +14 -11
  196. package/worker/src/RTC/ICE/IceServer.cpp +2 -2
  197. package/worker/src/RTC/KeyFrameRequestManager.cpp +16 -12
  198. package/worker/src/RTC/NackGenerator.cpp +12 -12
  199. package/worker/src/RTC/PipeProducerStreamManager.cpp +6 -6
  200. package/worker/src/RTC/PipeTransport.cpp +16 -13
  201. package/worker/src/RTC/PlainTransport.cpp +25 -16
  202. package/worker/src/RTC/Producer.cpp +50 -36
  203. package/worker/src/RTC/RTCP/FeedbackPsRemb.cpp +13 -6
  204. package/worker/src/RTC/RTCP/FeedbackRtpTmmb.cpp +14 -5
  205. package/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +76 -50
  206. package/worker/src/RTC/RTP/Codecs/VP8.cpp +1 -1
  207. package/worker/src/RTC/RTP/Codecs/VP9.cpp +4 -4
  208. package/worker/src/RTC/RTP/Packet.cpp +9 -10
  209. package/worker/src/RTC/RTP/RetransmissionBuffer.cpp +6 -6
  210. package/worker/src/RTC/RTP/RtpStream.cpp +19 -19
  211. package/worker/src/RTC/RTP/RtpStreamRecv.cpp +146 -81
  212. package/worker/src/RTC/RTP/RtpStreamSend.cpp +49 -44
  213. package/worker/src/RTC/RTP/RtxStream.cpp +7 -10
  214. package/worker/src/RTC/RateCalculator.cpp +99 -136
  215. package/worker/src/RTC/RemoteCaptureTimeEstimator.cpp +13 -13
  216. package/worker/src/RTC/RemoteClockOffsetEstimator.cpp +18 -17
  217. package/worker/src/RTC/Router.cpp +18 -1
  218. package/worker/src/RTC/RtpDictionaries/RtpEncodingParameters.cpp +5 -2
  219. package/worker/src/RTC/SCTP/association/Association.cpp +131 -102
  220. package/worker/src/RTC/SCTP/association/AssociationListenerDeferrer.cpp +4 -4
  221. package/worker/src/RTC/SCTP/association/Capabilities.cpp +1 -1
  222. package/worker/src/RTC/SCTP/association/HeartbeatHandler.cpp +25 -18
  223. package/worker/src/RTC/SCTP/association/StateCookie.cpp +7 -6
  224. package/worker/src/RTC/SCTP/association/StreamResetHandler.cpp +16 -13
  225. package/worker/src/RTC/SCTP/association/TransmissionControlBlock.cpp +28 -26
  226. package/worker/src/RTC/SCTP/packet/chunks/SackChunk.cpp +0 -1
  227. package/worker/src/RTC/SCTP/packet/parameters/StateCookieParameter.cpp +2 -2
  228. package/worker/src/RTC/SCTP/public/AssociationMetrics.cpp +1 -1
  229. package/worker/src/RTC/SCTP/public/SctpOptions.cpp +13 -13
  230. package/worker/src/RTC/SCTP/rx/DataTracker.cpp +1 -1
  231. package/worker/src/RTC/SCTP/rx/ReassemblyQueue.cpp +5 -5
  232. package/worker/src/RTC/SCTP/tx/OutstandingData.cpp +15 -15
  233. package/worker/src/RTC/SCTP/tx/RetransmissionQueue.cpp +15 -15
  234. package/worker/src/RTC/SCTP/tx/RetransmissionTimeout.cpp +29 -26
  235. package/worker/src/RTC/SCTP/tx/RoundRobinSendQueue.cpp +12 -11
  236. package/worker/src/RTC/SCTP/tx/StreamScheduler.cpp +4 -4
  237. package/worker/src/RTC/SctpDictionaries/SctpStreamParameters.cpp +2 -2
  238. package/worker/src/RTC/SimpleProducerStreamManager.cpp +10 -10
  239. package/worker/src/RTC/SimulcastProducerStreamManager.cpp +39 -37
  240. package/worker/src/RTC/SvcProducerStreamManager.cpp +39 -25
  241. package/worker/src/RTC/TcpConnection.cpp +9 -3
  242. package/worker/src/RTC/TcpServer.cpp +7 -2
  243. package/worker/src/RTC/Transport.cpp +242 -302
  244. package/worker/src/RTC/TransportCongestionControlClient.cpp +78 -71
  245. package/worker/src/RTC/TransportCongestionControlServer.cpp +38 -40
  246. package/worker/src/RTC/TrendCalculator.cpp +3 -3
  247. package/worker/src/RTC/UdpSocket.cpp +14 -3
  248. package/worker/src/RTC/WebRtcServer.cpp +20 -14
  249. package/worker/src/RTC/WebRtcTransport.cpp +35 -30
  250. package/worker/src/Settings.cpp +10 -0
  251. package/worker/src/Shared.cpp +2 -2
  252. package/worker/src/Utils/Crypto.cpp +2 -2
  253. package/worker/src/Worker.cpp +5 -1
  254. package/worker/src/handles/BackoffTimerHandle.cpp +24 -11
  255. package/worker/src/handles/TimerHandle.cpp +74 -25
  256. package/worker/src/lib.cpp +6 -0
  257. package/worker/tasks.py +171 -44
  258. package/worker/test/include/RTC/BWE/helpers/LinkSimulator.hpp +117 -0
  259. package/worker/test/src/RTC/BWE/TestAimdRateControl.cpp +400 -0
  260. package/worker/test/src/RTC/BWE/TestDelayBasedBwe.cpp +568 -0
  261. package/worker/test/src/RTC/BWE/TestFeedbackAdapter.cpp +546 -0
  262. package/worker/test/src/RTC/BWE/TestInterArrivalDelta.cpp +301 -0
  263. package/worker/test/src/RTC/BWE/TestLinkCapacityEstimator.cpp +115 -0
  264. package/worker/test/src/RTC/BWE/TestRobustThroughputEstimator.cpp +433 -0
  265. package/worker/test/src/RTC/BWE/TestSendPacketHistory.cpp +259 -0
  266. package/worker/test/src/RTC/BWE/TestTrendlineEstimator.cpp +137 -0
  267. package/worker/test/src/RTC/BWE/helpers/LinkSimulator.cpp +171 -0
  268. package/worker/test/src/RTC/RTCP/TestFeedbackPsRemb.cpp +1 -1
  269. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTmmb.cpp +1 -1
  270. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTransport.cpp +246 -208
  271. package/worker/test/src/RTC/RTP/TestPacket.cpp +11 -11
  272. package/worker/test/src/RTC/RTP/TestRetransmissionBuffer.cpp +12 -12
  273. package/worker/test/src/RTC/RTP/TestRtpStreamRecv.cpp +23 -16
  274. package/worker/test/src/RTC/RTP/TestRtpStreamSend.cpp +13 -13
  275. package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +27 -22
  276. package/worker/test/src/RTC/SCTP/association/TestHeartbeatHandler.cpp +21 -15
  277. package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +6 -6
  278. package/worker/test/src/RTC/SCTP/association/TestStreamResetHandler.cpp +17 -13
  279. package/worker/test/src/RTC/SCTP/association/TestTransmissionControlBlock.cpp +3 -3
  280. package/worker/test/src/RTC/SCTP/packet/chunks/TestForwardTsnChunk.cpp +2 -2
  281. package/worker/test/src/RTC/SCTP/packet/chunks/TestIForwardTsnChunk.cpp +23 -23
  282. package/worker/test/src/RTC/SCTP/packet/chunks/TestInitChunk.cpp +1 -1
  283. package/worker/test/src/RTC/SCTP/packet/chunks/TestSackChunk.cpp +1 -1
  284. package/worker/test/src/RTC/SCTP/packet/parameters/TestIPv6AddressParameter.cpp +1 -1
  285. package/worker/test/src/RTC/SCTP/rx/TestDataTracker.cpp +37 -37
  286. package/worker/test/src/RTC/SCTP/rx/TestInterleavedReassemblyStreams.cpp +10 -10
  287. package/worker/test/src/RTC/SCTP/rx/TestReassemblyQueue.cpp +1 -1
  288. package/worker/test/src/RTC/SCTP/tx/TestOutstandingData.cpp +93 -93
  289. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionQueue.cpp +247 -247
  290. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionTimeout.cpp +100 -80
  291. package/worker/test/src/RTC/SCTP/tx/TestRoundRobinSendQueue.cpp +163 -163
  292. package/worker/test/src/RTC/SCTP/tx/TestStreamScheduler.cpp +76 -77
  293. package/worker/test/src/RTC/TestConsumer.cpp +8 -3
  294. package/worker/test/src/RTC/TestKeyFrameRequestManager.cpp +3 -3
  295. package/worker/test/src/RTC/TestNackGenerator.cpp +3 -3
  296. package/worker/test/src/RTC/TestPipeProducerStreamManager.cpp +5 -5
  297. package/worker/test/src/RTC/TestRateCalculator.cpp +110 -14
  298. package/worker/test/src/RTC/TestRemoteCaptureTimeEstimator.cpp +22 -17
  299. package/worker/test/src/RTC/TestRemoteClockOffsetEstimator.cpp +87 -85
  300. package/worker/test/src/RTC/TestSimpleProducerStreamManager.cpp +54 -47
  301. package/worker/test/src/RTC/TestSimulcastProducerStreamManager.cpp +83 -69
  302. package/worker/test/src/RTC/TestSvcProducerStreamManager.cpp +76 -65
  303. package/worker/test/src/RTC/TestTransportCongestionControlServer.cpp +72 -66
  304. package/worker/test/src/RTC/TestTransportTuple.cpp +19 -4
  305. package/worker/test/src/TestDepLibUV.cpp +19 -0
  306. package/worker/test/src/Utils/TestTime.cpp +57 -26
  307. package/worker/test/src/testHelpers.cpp +1 -1
  308. package/worker/test/src/tests.cpp +6 -0
  309. package/worker/include/RTC/SenderBandwidthEstimator.hpp +0 -118
  310. package/worker/src/RTC/SenderBandwidthEstimator.cpp +0 -269
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "common.hpp"
5
5
  #include "handles/TimerHandleInterface.hpp"
6
+ #include <limits>
6
7
 
7
8
  namespace mocks
8
9
  {
@@ -15,48 +16,49 @@ namespace mocks
15
16
  friend class mocks::MockShared;
16
17
 
17
18
  private:
18
- explicit MockTimerHandle() = default;
19
+ explicit MockTimerHandle(
20
+ TimerHandleInterface::Listener* listener,
21
+ std::string label,
22
+ std::function<int64_t()> getTimeMs,
23
+ std::function<void()> onDelete);
19
24
 
20
25
  public:
21
26
  MockTimerHandle& operator=(const MockTimerHandle&) = delete;
22
27
 
23
28
  MockTimerHandle(const MockTimerHandle&) = delete;
24
29
 
25
- ~MockTimerHandle() override = default;
26
-
27
- public:
28
- void Start(uint64_t timeout, uint64_t repeat = 0) override
30
+ ~MockTimerHandle() override
29
31
  {
30
- this->running = true;
31
- this->timeout = timeout;
32
- this->repeat = repeat;
32
+ this->onDelete();
33
33
  }
34
34
 
35
+ public:
36
+ void Dump(int indentation = 0) const;
37
+
38
+ void Start(int64_t timeoutMs, int64_t repeatMs = 0) override;
39
+
35
40
  void Stop() override
36
41
  {
37
- this->running = false;
42
+ this->running = false;
43
+ this->expiresAtMs = std::numeric_limits<int64_t>::max();
38
44
  }
39
45
 
40
46
  void Restart() override
41
47
  {
42
- this->running = true;
48
+ this->running = true;
49
+ this->expiresAtMs = this->getTimeMs() + this->timeoutMs;
43
50
  }
44
51
 
45
- void Restart(uint64_t timeout, uint64_t repeat = 0) override
46
- {
47
- this->running = true;
48
- this->timeout = timeout;
49
- this->repeat = repeat;
50
- }
52
+ void Restart(int64_t timeoutMs, int64_t repeatMs = 0) override;
51
53
 
52
- uint64_t GetTimeout() const override
54
+ int64_t GetTimeoutMs() const override
53
55
  {
54
- return this->timeout;
56
+ return this->timeoutMs;
55
57
  }
56
58
 
57
- uint64_t GetRepeat() const override
59
+ int64_t GetRepeatMs() const override
58
60
  {
59
- return this->repeat;
61
+ return this->repeatMs;
60
62
  }
61
63
 
62
64
  bool IsActive() const override
@@ -64,10 +66,46 @@ namespace mocks
64
66
  return this->running;
65
67
  }
66
68
 
69
+ const std::string GetLabel() const override
70
+ {
71
+ return this->label;
72
+ }
73
+
74
+ // Methods for testing.
75
+ public:
76
+ int64_t GetExpiresAtMs() const
77
+ {
78
+ return this->expiresAtMs;
79
+ }
80
+
81
+ bool EvaluateHasExpired()
82
+ {
83
+ if (this->getTimeMs() >= this->expiresAtMs)
84
+ {
85
+ TriggerExpire();
86
+
87
+ return true;
88
+ }
89
+ else
90
+ {
91
+ return false;
92
+ }
93
+ }
94
+
95
+ private:
96
+ void TriggerExpire();
97
+
67
98
  private:
99
+ // Passed by argument.
100
+ TimerHandleInterface::Listener* listener{ nullptr };
101
+ const std::string label;
102
+ std::function<int64_t()> getTimeMs;
103
+ const std::function<void()> onDelete;
104
+ // Others.
68
105
  bool running{ false };
69
- uint64_t timeout{ 0u };
70
- uint64_t repeat{ 0u };
106
+ int64_t timeoutMs{ 0 };
107
+ int64_t repeatMs{ 0 };
108
+ int64_t expiresAtMs{ std::numeric_limits<int64_t>::max() };
71
109
  };
72
110
  } // namespace mocks
73
111
 
@@ -3,24 +3,56 @@
3
3
 
4
4
  #include "mocks/include/MockShared.hpp"
5
5
  #include "Logger.hpp"
6
+ #include "MediaSoupErrors.hpp"
6
7
  #include "mocks/include/handles/MockTimerHandle.hpp"
7
8
 
8
9
  namespace mocks
9
10
  {
10
- MockShared::MockShared(std::function<uint64_t()> getTimeMs)
11
- : getTimeMs(std::move(getTimeMs)),
11
+ MockShared::MockShared(std::function<int64_t()> getTimeUs)
12
+ : getTimeUs(std::move(getTimeUs)),
12
13
  channelSocket(new ::Channel::ChannelSocket()),
13
14
  channelMessageRegistrator(new mocks::Channel::MockChannelMessageRegistrator()),
14
15
  channelNotifier(new ::Channel::ChannelNotifier(this->channelSocket.get()))
15
16
  {
16
17
  MS_TRACE();
18
+
19
+ // Give the Channel the Shared instance, which it needs to take the arrival
20
+ // time of received notifications.
21
+ this->channelSocket->SetShared(this);
17
22
  }
18
23
 
19
- TimerHandleInterface* MockShared::CreateTimer(TimerHandleInterface::Listener* /*listener*/)
24
+ TimerHandleInterface* MockShared::CreateTimer(
25
+ TimerHandleInterface::Listener* listener, std::string label)
20
26
  {
21
27
  MS_TRACE();
22
28
 
23
- return new MockTimerHandle();
29
+ // NOTE: Timers are indexed by label so that tests can retrieve them via
30
+ // GetTimer(). Two alive timers sharing a label would make that lookup
31
+ // ambiguous.
32
+ if (this->timers.find(label) != this->timers.end())
33
+ {
34
+ MS_THROW_ERROR("a timer with same label already exists [label:%s]", label.c_str());
35
+ }
36
+
37
+ auto* timer = new MockTimerHandle(
38
+ listener,
39
+ label,
40
+ // NOTE: The timer mocks take a milliseconds callback, being that the
41
+ // resolution of the libuv handles they mimic.
42
+ /*getTimeMs*/
43
+ [getTimeUs = this->getTimeUs]() -> int64_t
44
+ {
45
+ return getTimeUs() / 1000;
46
+ },
47
+ /*onDelete*/
48
+ [this, label]()
49
+ {
50
+ this->timers.erase(label);
51
+ });
52
+
53
+ this->timers[label] = timer;
54
+
55
+ return timer;
24
56
  }
25
57
 
26
58
  BackoffTimerHandleInterface* MockShared::CreateBackoffTimer(
@@ -30,9 +62,23 @@ namespace mocks
30
62
 
31
63
  const auto& label = options.label;
32
64
 
65
+ // NOTE: Backoff timers are indexed by label so that tests can retrieve them
66
+ // via GetBackoffTimer(). Two alive timers sharing a label would make that
67
+ // lookup ambiguous.
68
+ if (this->backoffTimers.find(label) != this->backoffTimers.end())
69
+ {
70
+ MS_THROW_ERROR("a backoff timer with same label already exists [label:%s]", label.c_str());
71
+ }
72
+
33
73
  auto* backoffTimer = new MockBackoffTimerHandle(
34
74
  options,
35
- /*getTimeMs*/ this->getTimeMs,
75
+ // NOTE: The timer mocks take a milliseconds callback, being that the
76
+ // resolution of the libuv handles they mimic.
77
+ /*getTimeMs*/
78
+ [getTimeUs = this->getTimeUs]() -> int64_t
79
+ {
80
+ return getTimeUs() / 1000;
81
+ },
36
82
  /*onDelete*/
37
83
  [this, label]()
38
84
  {
@@ -10,7 +10,7 @@ namespace mocks
10
10
  {
11
11
  MockBackoffTimerHandle::MockBackoffTimerHandle(
12
12
  BackoffTimerHandleOptions options,
13
- std::function<uint64_t()> getTimeMs,
13
+ std::function<int64_t()> getTimeMs,
14
14
  std::function<void()> onDelete)
15
15
  : listener(options.listener),
16
16
  label(std::move(options.label)),
@@ -25,7 +25,7 @@ namespace mocks
25
25
 
26
26
  if (!this->listener)
27
27
  {
28
- MS_THROW_TYPE_ERROR("options.listener must be given");
28
+ MS_THROW_TYPE_ERROR("[%s] options.listener must be given", this->label.c_str());
29
29
  }
30
30
 
31
31
  if (this->label.empty())
@@ -33,10 +33,18 @@ namespace mocks
33
33
  MS_THROW_TYPE_ERROR("options.label must be given");
34
34
  }
35
35
 
36
+ if (this->baseTimeoutMs < 0)
37
+ {
38
+ MS_THROW_TYPE_ERROR(
39
+ "[%s] options.baseTimeoutMs (%" PRIi64 " ms) cannot be negative",
40
+ this->label.c_str(),
41
+ this->baseTimeoutMs);
42
+ }
43
+
36
44
  if (this->baseTimeoutMs > BackoffTimerHandleInterface::MaxTimeoutMs)
37
45
  {
38
- MS_THROW_ERROR(
39
- "[%s] base timeout (%" PRIu64 " ms) cannot be greater than %" PRIu64 " ms",
46
+ MS_THROW_TYPE_ERROR(
47
+ "[%s] options.baseTimeoutMs (%" PRIi64 " ms) cannot be greater than %" PRIi64 " ms",
40
48
  this->label.c_str(),
41
49
  this->baseTimeoutMs,
42
50
  BackoffTimerHandleInterface::MaxTimeoutMs);
@@ -47,39 +55,45 @@ namespace mocks
47
55
  {
48
56
  MS_TRACE();
49
57
 
50
- const uint64_t nowMs = this->getTimeMs();
58
+ const int64_t nowMs = this->getTimeMs();
51
59
 
52
60
  MS_DUMP_CLEAN(indentation, "<mocks::MockBackoffTimerHandle>");
53
61
 
54
62
  MS_DUMP_CLEAN(indentation, " label: %s", this->label.c_str());
55
- MS_DUMP_CLEAN(indentation, " base timeout (ms): %" PRIu64, this->baseTimeoutMs);
63
+ MS_DUMP_CLEAN(indentation, " base timeout (ms): %" PRIi64, this->baseTimeoutMs);
56
64
  MS_DUMP_CLEAN(
57
65
  indentation,
58
66
  " max backoff timeout (ms): %s",
59
67
  this->maxBackoffTimeoutMs.has_value()
60
68
  ? std::to_string(this->maxBackoffTimeoutMs.value()).c_str()
61
- : "(unset)");
69
+ : "(unset)");
62
70
  MS_DUMP_CLEAN(
63
71
  indentation,
64
72
  " max restarts (ms): %s",
65
73
  this->maxRestarts.has_value() ? std::to_string(this->maxRestarts.value()).c_str() : "(unset)");
66
74
  MS_DUMP_CLEAN(indentation, " running: %s", this->running ? "yes" : "no");
67
75
  MS_DUMP_CLEAN(indentation, " expiration count: %zu", this->expirationCount);
68
- MS_DUMP_CLEAN(indentation, " now (ms): %" PRIu64, nowMs);
69
- MS_DUMP_CLEAN(indentation, " expires at (ms): %" PRIu64, this->expiresAtMs);
70
- MS_DUMP_CLEAN(indentation, " expires in (ms): %" PRIu64, this->expiresAtMs - nowMs);
76
+ MS_DUMP_CLEAN(indentation, " now (ms): %" PRIi64, nowMs);
77
+ MS_DUMP_CLEAN(indentation, " expires at (ms): %" PRIi64, this->expiresAtMs);
78
+ MS_DUMP_CLEAN(indentation, " expires in (ms): %" PRIi64, this->expiresAtMs - nowMs);
71
79
 
72
80
  MS_DUMP_CLEAN(indentation, "</mocks::MockBackoffTimerHandle>");
73
81
  }
74
82
 
75
- void MockBackoffTimerHandle::SetBaseTimeoutMs(uint64_t baseTimeoutMs)
83
+ void MockBackoffTimerHandle::SetBaseTimeoutMs(int64_t baseTimeoutMs)
76
84
  {
77
85
  MS_TRACE();
78
86
 
87
+ if (baseTimeoutMs < 0)
88
+ {
89
+ MS_THROW_TYPE_ERROR(
90
+ "[%s] baseTimeoutMs (%" PRIi64 " ms) cannot be negative", this->label.c_str(), baseTimeoutMs);
91
+ }
92
+
79
93
  if (baseTimeoutMs > BackoffTimerHandleInterface::MaxTimeoutMs)
80
94
  {
81
- MS_THROW_ERROR(
82
- "[%s] base timeout (%" PRIu64 " ms) cannot be greater than %" PRIu64 " ms",
95
+ MS_THROW_TYPE_ERROR(
96
+ "[%s] baseTimeoutMs (%" PRIi64 " ms) cannot be greater than %" PRIi64 " ms",
83
97
  this->label.c_str(),
84
98
  baseTimeoutMs,
85
99
  BackoffTimerHandleInterface::MaxTimeoutMs);
@@ -100,7 +114,7 @@ namespace mocks
100
114
  this->running =
101
115
  !this->maxRestarts.has_value() || this->expirationCount <= this->maxRestarts.value();
102
116
 
103
- uint64_t baseTimeoutMs{ this->baseTimeoutMs };
117
+ int64_t baseTimeoutMs{ this->baseTimeoutMs };
104
118
  bool stop{ false };
105
119
 
106
120
  // Call the listener by passing base timeout as reference so the parent has
@@ -128,7 +142,7 @@ namespace mocks
128
142
  // again. Mirror that here so a stopped timer doesn't keep expiring.
129
143
  else
130
144
  {
131
- this->expiresAtMs = std::numeric_limits<uint64_t>::max();
145
+ this->expiresAtMs = std::numeric_limits<int64_t>::max();
132
146
  }
133
147
  }
134
148
  } // namespace mocks
@@ -0,0 +1,117 @@
1
+ #define MS_CLASS "mocks::MockTimerHandle"
2
+ // #define MS_LOG_DEV_LEVEL 3
3
+
4
+ #include "mocks/include/handles/MockTimerHandle.hpp"
5
+ #include "Logger.hpp"
6
+ #include "MediaSoupErrors.hpp"
7
+
8
+ namespace mocks
9
+ {
10
+ MockTimerHandle::MockTimerHandle(
11
+ TimerHandleInterface::Listener* listener,
12
+ std::string label,
13
+ std::function<int64_t()> getTimeMs,
14
+ std::function<void()> onDelete)
15
+ : listener(listener),
16
+ label(std::move(label)),
17
+ getTimeMs(std::move(getTimeMs)),
18
+ onDelete(std::move(onDelete))
19
+ {
20
+ MS_TRACE();
21
+
22
+ if (!this->listener)
23
+ {
24
+ MS_THROW_TYPE_ERROR("[%s] listener must be given", this->label.c_str());
25
+ }
26
+
27
+ if (this->label.empty())
28
+ {
29
+ MS_THROW_TYPE_ERROR("label must be given");
30
+ }
31
+ }
32
+
33
+ void MockTimerHandle::Dump(int indentation) const
34
+ {
35
+ MS_TRACE();
36
+
37
+ const int64_t nowMs = this->getTimeMs();
38
+
39
+ MS_DUMP_CLEAN(indentation, "<mocks::MockTimerHandle>");
40
+
41
+ MS_DUMP_CLEAN(indentation, " label: %s", this->label.c_str());
42
+ MS_DUMP_CLEAN(indentation, " timeout (ms): %" PRIi64, this->timeoutMs);
43
+ MS_DUMP_CLEAN(indentation, " repeat (ms): %" PRIi64, this->repeatMs);
44
+ MS_DUMP_CLEAN(indentation, " running: %s", this->running ? "yes" : "no");
45
+ MS_DUMP_CLEAN(indentation, " now (ms): %" PRIi64, nowMs);
46
+ MS_DUMP_CLEAN(indentation, " expires at (ms): %" PRIi64, this->expiresAtMs);
47
+ MS_DUMP_CLEAN(indentation, " expires in (ms): %" PRIi64, this->expiresAtMs - nowMs);
48
+
49
+ MS_DUMP_CLEAN(indentation, "</mocks::MockTimerHandle>");
50
+ }
51
+
52
+ void MockTimerHandle::Start(int64_t timeoutMs, int64_t repeatMs)
53
+ {
54
+ MS_TRACE();
55
+
56
+ if (timeoutMs < 0)
57
+ {
58
+ MS_THROW_TYPE_ERROR(
59
+ "[%s] timeoutMs (%" PRIi64 " ms) cannot be negative", this->label.c_str(), timeoutMs);
60
+ }
61
+
62
+ if (repeatMs < 0)
63
+ {
64
+ MS_THROW_TYPE_ERROR(
65
+ "[%s] repeatMs (%" PRIi64 " ms) cannot be negative", this->label.c_str(), repeatMs);
66
+ }
67
+
68
+ this->timeoutMs = timeoutMs;
69
+ this->repeatMs = repeatMs;
70
+
71
+ this->running = true;
72
+ this->expiresAtMs = this->getTimeMs() + this->timeoutMs;
73
+ }
74
+
75
+ void MockTimerHandle::Restart(int64_t timeoutMs, int64_t repeatMs)
76
+ {
77
+ MS_TRACE();
78
+
79
+ if (timeoutMs < 0)
80
+ {
81
+ MS_THROW_TYPE_ERROR(
82
+ "[%s] timeoutMs (%" PRIi64 " ms) cannot be negative", this->label.c_str(), timeoutMs);
83
+ }
84
+
85
+ if (repeatMs < 0)
86
+ {
87
+ MS_THROW_TYPE_ERROR(
88
+ "[%s] repeatMs (%" PRIi64 " ms) cannot be negative", this->label.c_str(), repeatMs);
89
+ }
90
+
91
+ Start(timeoutMs, repeatMs);
92
+ }
93
+
94
+ void MockTimerHandle::TriggerExpire()
95
+ {
96
+ MS_TRACE();
97
+
98
+ // Schedule the next expiration, or deactivate the timer if it doesn't
99
+ // repeat, just like the real TimerHandle does. This is done before invoking
100
+ // the callback for two reasons: the listener may call Start(), Restart() or
101
+ // Stop() within it, which must win over this, and the listener may delete
102
+ // this instance within it, so nothing can be accessed afterwards.
103
+ if (this->repeatMs != 0)
104
+ {
105
+ this->running = true;
106
+ this->expiresAtMs = this->getTimeMs() + this->repeatMs;
107
+ }
108
+ else
109
+ {
110
+ this->running = false;
111
+ this->expiresAtMs = std::numeric_limits<int64_t>::max();
112
+ }
113
+
114
+ // Notify the listener.
115
+ this->listener->OnTimer(this);
116
+ }
117
+ } // namespace mocks
@@ -9,7 +9,7 @@ const PYTHON = getPython();
9
9
  const ROOT_DIR = getRootDir();
10
10
  const BUILD_DIR = getBuildDir();
11
11
  const NUM_CORES = getNumCores();
12
- const CLANG_FORMAT_VERSION = 22;
12
+ const CLANG_FORMAT_VERSION = 23;
13
13
  const CLANG_TIDY_VERSION = 21;
14
14
 
15
15
  const CLANG_FORMAT_PATHS = [
@@ -351,7 +351,7 @@ function getBuildDir() {
351
351
  const workerInstallDir =
352
352
  process.env.MEDIASOUP_INSTALL_DIR ??
353
353
  `${workerOutDir}/${mediasoupBuildtype}`;
354
- const buildDir = process.envBUILD_DIR ?? `${workerInstallDir}/build`;
354
+ const buildDir = process.env.BUILD_DIR ?? `${workerInstallDir}/build`;
355
355
 
356
356
  return buildDir;
357
357
  }
@@ -22,18 +22,17 @@ namespace Channel
22
22
 
23
23
  /* Instance methods. */
24
24
 
25
- ChannelNotification::ChannelNotification(const FBS::Notification::Notification* notification)
25
+ ChannelNotification::ChannelNotification(
26
+ const FBS::Notification::Notification* notification, int64_t receivedAtUs)
27
+ : data(notification), receivedAtUs(receivedAtUs)
26
28
  {
27
29
  MS_TRACE();
28
30
 
29
- this->data = notification;
30
- this->event = notification->event();
31
-
32
- auto eventCStrIt = Event2String.find(this->event);
31
+ auto eventCStrIt = Event2String.find(this->data->event());
33
32
 
34
33
  if (eventCStrIt == Event2String.end())
35
34
  {
36
- MS_THROW_ERROR("unknown event '%" PRIu8 "'", static_cast<uint8_t>(this->event));
35
+ MS_THROW_ERROR("unknown event '%" PRIu8 "'", static_cast<uint8_t>(this->data->event()));
37
36
  }
38
37
 
39
38
  this->eventCStr = eventCStrIt->second;
@@ -5,6 +5,7 @@
5
5
  #include "DepLibUV.hpp"
6
6
  #include "Logger.hpp"
7
7
  #include "MediaSoupErrors.hpp"
8
+ #include "SharedInterface.hpp"
8
9
  #include <cstring> // std::memcpy(), std::memmove()
9
10
 
10
11
  namespace Channel
@@ -134,6 +135,13 @@ namespace Channel
134
135
  this->listener = listener;
135
136
  }
136
137
 
138
+ void ChannelSocket::SetShared(SharedInterface* shared)
139
+ {
140
+ MS_TRACE_STD();
141
+
142
+ this->shared = shared;
143
+ }
144
+
137
145
  void ChannelSocket::Send(const uint8_t* data, uint32_t dataLen)
138
146
  {
139
147
  MS_TRACE_STD();
@@ -204,6 +212,10 @@ namespace Channel
204
212
  // and will need to be freed later.
205
213
  if (free)
206
214
  {
215
+ // NOTE: Take the arrival time before the message is parsed, so that it
216
+ // doesn't include the cost of processing it.
217
+ const int64_t receivedAtUs = this->shared->GetTimeUs();
218
+
207
219
  const auto* message = FBS::Message::GetMessage(msg);
208
220
 
209
221
  #if MS_LOG_DEV_LEVEL == 3
@@ -244,7 +256,8 @@ namespace Channel
244
256
 
245
257
  try
246
258
  {
247
- notification = new ChannelNotification(message->data_as<FBS::Notification::Notification>());
259
+ notification = new ChannelNotification(
260
+ message->data_as<FBS::Notification::Notification>(), receivedAtUs);
248
261
 
249
262
  // Notify the listener.
250
263
  this->listener->HandleNotification(notification);
@@ -289,6 +302,10 @@ namespace Channel
289
302
  {
290
303
  MS_TRACE();
291
304
 
305
+ // NOTE: Take the arrival time before the message is parsed, so that it
306
+ // doesn't include the cost of processing it.
307
+ const int64_t receivedAtUs = this->shared->GetTimeUs();
308
+
292
309
  const auto* message = FBS::Message::GetMessage(msg);
293
310
 
294
311
  #if MS_LOG_DEV_LEVEL == 3
@@ -329,7 +346,8 @@ namespace Channel
329
346
 
330
347
  try
331
348
  {
332
- notification = new ChannelNotification(message->data_as<FBS::Notification::Notification>());
349
+ notification =
350
+ new ChannelNotification(message->data_as<FBS::Notification::Notification>(), receivedAtUs);
333
351
 
334
352
  // Notify the listener.
335
353
  this->listener->HandleNotification(notification);
@@ -8,7 +8,7 @@
8
8
  /* Class variables. */
9
9
 
10
10
  thread_local uv_loop_t* DepLibUV::loop{ nullptr };
11
- thread_local uint64_t DepLibUV::ntpOffsetMs{ 0 };
11
+ thread_local int64_t DepLibUV::ntpOffsetUs{ 0 };
12
12
 
13
13
  /* Static methods for UV callbacks. */
14
14
 
@@ -60,11 +60,10 @@ void DepLibUV::ClassInit()
60
60
  MS_ABORT("uv_gettimeofday() failed");
61
61
  }
62
62
 
63
- const auto unixSec = static_cast<uint64_t>(timeval.tv_sec);
64
- const auto unixMs = (unixSec * 1000) + (static_cast<uint64_t>(timeval.tv_usec) / 1000);
65
- const auto ntpMs = unixMs + (static_cast<uint64_t>(Utils::Time::UnixNtpOffsetSec) * 1000);
63
+ const auto unixUs = (timeval.tv_sec * 1000000) + static_cast<int64_t>(timeval.tv_usec);
64
+ const auto ntpUs = unixUs + (static_cast<int64_t>(Utils::Time::UnixNtpOffsetSec) * 1000000);
66
65
 
67
- DepLibUV::ntpOffsetMs = ntpMs - DepLibUV::GetTimeMs();
66
+ DepLibUV::ntpOffsetUs = ntpUs - DepLibUV::GetTimeUs();
68
67
  }
69
68
 
70
69
  void DepLibUV::ClassDestroy()