@observertc/observer-js 1.0.0-beta.3 → 1.0.0-beta.5

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 (230) hide show
  1. package/README.md +790 -386
  2. package/dist/index.d.mts +2795 -0
  3. package/dist/index.d.ts +2795 -0
  4. package/dist/index.js +3765 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +3699 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +28 -15
  9. package/.eslintrc.json +0 -143
  10. package/.prettierignore +0 -5
  11. package/.prettierrc +0 -7
  12. package/jest.config.js +0 -9
  13. package/lib/ObservedCall.d.ts +0 -70
  14. package/lib/ObservedCall.d.ts.map +0 -1
  15. package/lib/ObservedCall.js +0 -196
  16. package/lib/ObservedCallEventMonitor.d.ts +0 -107
  17. package/lib/ObservedCallEventMonitor.d.ts.map +0 -1
  18. package/lib/ObservedCallEventMonitor.js +0 -321
  19. package/lib/ObservedCallSummary.d.ts +0 -18
  20. package/lib/ObservedCallSummary.d.ts.map +0 -1
  21. package/lib/ObservedCallSummary.js +0 -2
  22. package/lib/ObservedCertificate.d.ts +0 -19
  23. package/lib/ObservedCertificate.d.ts.map +0 -1
  24. package/lib/ObservedCertificate.js +0 -38
  25. package/lib/ObservedClient.d.ts +0 -115
  26. package/lib/ObservedClient.d.ts.map +0 -1
  27. package/lib/ObservedClient.js +0 -714
  28. package/lib/ObservedClientEventMonitor.d.ts +0 -91
  29. package/lib/ObservedClientEventMonitor.d.ts.map +0 -1
  30. package/lib/ObservedClientEventMonitor.js +0 -254
  31. package/lib/ObservedClientSummary.d.ts +0 -23
  32. package/lib/ObservedClientSummary.d.ts.map +0 -1
  33. package/lib/ObservedClientSummary.js +0 -2
  34. package/lib/ObservedCodec.d.ts +0 -22
  35. package/lib/ObservedCodec.d.ts.map +0 -1
  36. package/lib/ObservedCodec.js +0 -45
  37. package/lib/ObservedDataChannel.d.ts +0 -30
  38. package/lib/ObservedDataChannel.d.ts.map +0 -1
  39. package/lib/ObservedDataChannel.js +0 -75
  40. package/lib/ObservedIceCandidate.d.ts +0 -29
  41. package/lib/ObservedIceCandidate.d.ts.map +0 -1
  42. package/lib/ObservedIceCandidate.js +0 -59
  43. package/lib/ObservedIceCandidatePair.d.ts +0 -45
  44. package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
  45. package/lib/ObservedIceCandidatePair.js +0 -127
  46. package/lib/ObservedIceTransport.d.ts +0 -36
  47. package/lib/ObservedIceTransport.d.ts.map +0 -1
  48. package/lib/ObservedIceTransport.js +0 -93
  49. package/lib/ObservedInboundRtp.d.ts +0 -92
  50. package/lib/ObservedInboundRtp.d.ts.map +0 -1
  51. package/lib/ObservedInboundRtp.js +0 -193
  52. package/lib/ObservedInboundTrack.d.ts +0 -34
  53. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  54. package/lib/ObservedInboundTrack.js +0 -92
  55. package/lib/ObservedMediaPlayout.d.ts +0 -22
  56. package/lib/ObservedMediaPlayout.d.ts.map +0 -1
  57. package/lib/ObservedMediaPlayout.js +0 -42
  58. package/lib/ObservedMediaSource.d.ts +0 -28
  59. package/lib/ObservedMediaSource.d.ts.map +0 -1
  60. package/lib/ObservedMediaSource.js +0 -55
  61. package/lib/ObservedOutboundRtp.d.ts +0 -62
  62. package/lib/ObservedOutboundRtp.d.ts.map +0 -1
  63. package/lib/ObservedOutboundRtp.js +0 -144
  64. package/lib/ObservedOutboundTrack.d.ts +0 -34
  65. package/lib/ObservedOutboundTrack.d.ts.map +0 -1
  66. package/lib/ObservedOutboundTrack.js +0 -65
  67. package/lib/ObservedPeerConnection.d.ts +0 -207
  68. package/lib/ObservedPeerConnection.d.ts.map +0 -1
  69. package/lib/ObservedPeerConnection.js +0 -788
  70. package/lib/ObservedPeerConnectionTransport.d.ts +0 -17
  71. package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
  72. package/lib/ObservedPeerConnectionTransport.js +0 -34
  73. package/lib/ObservedRemoteInboundRtp.d.ts +0 -30
  74. package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
  75. package/lib/ObservedRemoteInboundRtp.js +0 -60
  76. package/lib/ObservedRemoteOutboundRtp.d.ts +0 -30
  77. package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
  78. package/lib/ObservedRemoteOutboundRtp.js +0 -60
  79. package/lib/ObservedTURN.d.ts +0 -31
  80. package/lib/ObservedTURN.d.ts.map +0 -1
  81. package/lib/ObservedTURN.js +0 -58
  82. package/lib/ObservedTurnServer.d.ts +0 -25
  83. package/lib/ObservedTurnServer.d.ts.map +0 -1
  84. package/lib/ObservedTurnServer.js +0 -59
  85. package/lib/Observer.d.ts +0 -62
  86. package/lib/Observer.d.ts.map +0 -1
  87. package/lib/Observer.js +0 -160
  88. package/lib/ObserverEventMonitor.d.ts +0 -141
  89. package/lib/ObserverEventMonitor.d.ts.map +0 -1
  90. package/lib/ObserverEventMonitor.js +0 -440
  91. package/lib/ObserverSummary.d.ts +0 -13
  92. package/lib/ObserverSummary.d.ts.map +0 -1
  93. package/lib/ObserverSummary.js +0 -2
  94. package/lib/Reports.d.ts +0 -85
  95. package/lib/Reports.d.ts.map +0 -1
  96. package/lib/Reports.js +0 -2
  97. package/lib/common/Middleware.d.ts +0 -17
  98. package/lib/common/Middleware.d.ts.map +0 -1
  99. package/lib/common/Middleware.js +0 -60
  100. package/lib/common/SingleExecutor.d.ts +0 -3
  101. package/lib/common/SingleExecutor.d.ts.map +0 -1
  102. package/lib/common/SingleExecutor.js +0 -31
  103. package/lib/common/logger.d.ts +0 -17
  104. package/lib/common/logger.d.ts.map +0 -1
  105. package/lib/common/logger.js +0 -50
  106. package/lib/common/types.d.ts +0 -3
  107. package/lib/common/types.d.ts.map +0 -1
  108. package/lib/common/types.js +0 -3
  109. package/lib/common/utils.d.ts +0 -11
  110. package/lib/common/utils.d.ts.map +0 -1
  111. package/lib/common/utils.js +0 -63
  112. package/lib/detectors/Detector.d.ts +0 -5
  113. package/lib/detectors/Detector.d.ts.map +0 -1
  114. package/lib/detectors/Detector.js +0 -3
  115. package/lib/detectors/Detectors.d.ts +0 -11
  116. package/lib/detectors/Detectors.d.ts.map +0 -1
  117. package/lib/detectors/Detectors.js +0 -34
  118. package/lib/index.d.ts +0 -29
  119. package/lib/index.d.ts.map +0 -1
  120. package/lib/index.js +0 -49
  121. package/lib/mediasoup/ObservedMediaRouter.d.ts +0 -10
  122. package/lib/mediasoup/ObservedMediaRouter.d.ts.map +0 -1
  123. package/lib/mediasoup/ObservedMediaRouter.js +0 -6
  124. package/lib/monitors/TurnUsageMonitor.d.ts +0 -1
  125. package/lib/monitors/TurnUsageMonitor.d.ts.map +0 -1
  126. package/lib/monitors/TurnUsageMonitor.js +0 -146
  127. package/lib/schema/ClientEventTypes.d.ts +0 -228
  128. package/lib/schema/ClientEventTypes.d.ts.map +0 -1
  129. package/lib/schema/ClientEventTypes.js +0 -41
  130. package/lib/schema/ClientMetaTypes.d.ts +0 -34
  131. package/lib/schema/ClientMetaTypes.d.ts.map +0 -1
  132. package/lib/schema/ClientMetaTypes.js +0 -16
  133. package/lib/schema/ClientSample.d.ts +0 -1333
  134. package/lib/schema/ClientSample.d.ts.map +0 -1
  135. package/lib/schema/ClientSample.js +0 -4
  136. package/lib/scores/CalculatedScore.d.ts +0 -6
  137. package/lib/scores/CalculatedScore.d.ts.map +0 -1
  138. package/lib/scores/CalculatedScore.js +0 -2
  139. package/lib/scores/DefaultCallScoreCalculator.d.ts +0 -7
  140. package/lib/scores/DefaultCallScoreCalculator.d.ts.map +0 -1
  141. package/lib/scores/DefaultCallScoreCalculator.js +0 -21
  142. package/lib/scores/ScoreCalculator.d.ts +0 -4
  143. package/lib/scores/ScoreCalculator.d.ts.map +0 -1
  144. package/lib/scores/ScoreCalculator.js +0 -2
  145. package/lib/updaters/CallUpdater.d.ts +0 -5
  146. package/lib/updaters/CallUpdater.d.ts.map +0 -1
  147. package/lib/updaters/CallUpdater.js +0 -2
  148. package/lib/updaters/ObserverUpdater.d.ts +0 -5
  149. package/lib/updaters/ObserverUpdater.d.ts.map +0 -1
  150. package/lib/updaters/ObserverUpdater.js +0 -2
  151. package/lib/updaters/OnAllCallObserverUpdater.d.ts +0 -15
  152. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +0 -1
  153. package/lib/updaters/OnAllCallObserverUpdater.js +0 -50
  154. package/lib/updaters/OnAllClientCallUpdater.d.ts +0 -15
  155. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +0 -1
  156. package/lib/updaters/OnAllClientCallUpdater.js +0 -53
  157. package/lib/updaters/OnAnyCallObserverUpdater.d.ts +0 -12
  158. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +0 -1
  159. package/lib/updaters/OnAnyCallObserverUpdater.js +0 -37
  160. package/lib/updaters/OnAnyClientCallUpdater.d.ts +0 -12
  161. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +0 -1
  162. package/lib/updaters/OnAnyClientCallUpdater.js +0 -36
  163. package/lib/updaters/OnIntervalUpdater.d.ts +0 -10
  164. package/lib/updaters/OnIntervalUpdater.d.ts.map +0 -1
  165. package/lib/updaters/OnIntervalUpdater.js +0 -17
  166. package/lib/updaters/Updater.d.ts +0 -6
  167. package/lib/updaters/Updater.d.ts.map +0 -1
  168. package/lib/updaters/Updater.js +0 -2
  169. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +0 -25
  170. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +0 -1
  171. package/lib/utils/MediasoupRemoteTrackResolver.js +0 -110
  172. package/lib/utils/RemoteTrackResolver.d.ts +0 -7
  173. package/lib/utils/RemoteTrackResolver.d.ts.map +0 -1
  174. package/lib/utils/RemoteTrackResolver.js +0 -2
  175. package/src/ObservedCall.ts +0 -308
  176. package/src/ObservedCallEventMonitor.ts +0 -402
  177. package/src/ObservedCallSummary.ts +0 -22
  178. package/src/ObservedCertificate.ts +0 -43
  179. package/src/ObservedClient.ts +0 -883
  180. package/src/ObservedClientEventMonitor.ts +0 -309
  181. package/src/ObservedClientSummary.ts +0 -24
  182. package/src/ObservedCodec.ts +0 -49
  183. package/src/ObservedDataChannel.ts +0 -85
  184. package/src/ObservedIceCandidate.ts +0 -64
  185. package/src/ObservedIceCandidatePair.ts +0 -134
  186. package/src/ObservedIceTransport.ts +0 -99
  187. package/src/ObservedInboundRtp.ts +0 -205
  188. package/src/ObservedInboundTrack.ts +0 -105
  189. package/src/ObservedMediaPlayout.ts +0 -49
  190. package/src/ObservedMediaSource.ts +0 -60
  191. package/src/ObservedOutboundRtp.ts +0 -156
  192. package/src/ObservedOutboundTrack.ts +0 -82
  193. package/src/ObservedPeerConnection.ts +0 -1104
  194. package/src/ObservedPeerConnectionTransport.ts +0 -38
  195. package/src/ObservedRemoteInboundRtp.ts +0 -64
  196. package/src/ObservedRemoteOutboundRtp.ts +0 -65
  197. package/src/ObservedTURN.ts +0 -86
  198. package/src/ObservedTurnServer.ts +0 -72
  199. package/src/Observer.ts +0 -248
  200. package/src/ObserverEventMonitor.ts +0 -561
  201. package/src/ObserverSummary.ts +0 -15
  202. package/src/Reports.ts +0 -87
  203. package/src/common/Middleware.ts +0 -84
  204. package/src/common/SingleExecutor.ts +0 -36
  205. package/src/common/logger.ts +0 -82
  206. package/src/common/types.ts +0 -4
  207. package/src/common/utils.ts +0 -69
  208. package/src/detectors/Detector.ts +0 -6
  209. package/src/detectors/Detectors.ts +0 -38
  210. package/src/index.ts +0 -32
  211. package/src/mediasoup/ObservedMediaRouter.ts +0 -10
  212. package/src/monitors/TurnUsageMonitor.ts +0 -187
  213. package/src/schema/ClientEventTypes.ts +0 -280
  214. package/src/schema/ClientMetaTypes.ts +0 -41
  215. package/src/schema/ClientSample.ts +0 -1682
  216. package/src/scores/CalculatedScore.ts +0 -6
  217. package/src/scores/DefaultCallScoreCalculator.ts +0 -23
  218. package/src/scores/ScoreCalculator.ts +0 -3
  219. package/src/updaters/CallUpdater.ts +0 -5
  220. package/src/updaters/ObserverUpdater.ts +0 -5
  221. package/src/updaters/OnAllCallObserverUpdater.ts +0 -59
  222. package/src/updaters/OnAllClientCallUpdater.ts +0 -61
  223. package/src/updaters/OnAnyCallObserverUpdater.ts +0 -41
  224. package/src/updaters/OnAnyClientCallUpdater.ts +0 -39
  225. package/src/updaters/OnIntervalUpdater.ts +0 -19
  226. package/src/updaters/Updater.ts +0 -5
  227. package/src/utils/MediasoupRemoteTrackResolver.ts +0 -155
  228. package/src/utils/RemoteTrackResolver.ts +0 -12
  229. package/tsconfig.json +0 -19
  230. package/tslint.json +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/common/logger.ts","../src/ObservedCall.ts","../src/ObservedClient.ts","../src/ObservedPeerConnection.ts","../src/ObservedInboundRtp.ts","../src/ObservedOutboundRtp.ts","../src/ObservedCertificate.ts","../src/ObservedCodec.ts","../src/ObservedDataChannel.ts","../src/ObservedIceCandidate.ts","../src/ObservedIceCandidatePair.ts","../src/ObservedIceTransport.ts","../src/ObservedMediaSource.ts","../src/ObservedPeerConnectionTransport.ts","../src/ObservedMediaPlayout.ts","../src/ObservedRemoteInboundRtp.ts","../src/ObservedRemoteOutboundRtp.ts","../src/ObservedInboundTrack.ts","../src/ObservedOutboundTrack.ts","../src/common/utils.ts","../src/schema/ClientEventTypes.ts","../src/schema/ClientMetaTypes.ts","../src/scores/DefaultCallScoreCalculator.ts","../src/updaters/OnAllClientCallUpdater.ts","../src/updaters/OnIntervalUpdater.ts","../src/updaters/OnAnyClientCallUpdater.ts","../src/detectors/Detectors.ts","../src/Observer.ts","../src/ObservedTURN.ts","../src/ObservedTurnServer.ts","../src/updaters/OnAllCallObserverUpdater.ts","../src/updaters/OnAnyCallObserverUpdater.ts","../src/utils/MediasoupRemoteTrackResolver.ts","../src/sinks/ClientSampleSink.ts","../src/sinks/JsonlFileSink.ts","../src/sinks/InMemorySink.ts"],"sourcesContent":["export type { ObserverEvents, SampleRejectedReason, AcceptContext, CallAppDataFactory, ClientAppDataFactory } from './Observer';\nexport type {\n\tObserverEventBase,\n\tObservedCallScope,\n\tObservedClientScope,\n\tObservedPeerConnectionScope,\n} from './ObserverEvents';\n\nexport { Observer } from './Observer';\nexport { ObservedCall } from './ObservedCall';\nexport { ObservedInboundTrack } from './ObservedInboundTrack';\nexport { ObservedOutboundTrack } from './ObservedOutboundTrack';\nexport { ObservedClient } from './ObservedClient';\nexport { ObservedPeerConnection } from './ObservedPeerConnection';\nexport { ObservedMediaSource } from './ObservedMediaSource';\nexport { ObservedMediaPlayout } from './ObservedMediaPlayout';\nexport { ObservedCodec } from './ObservedCodec';\nexport { ObservedCertificate } from './ObservedCertificate';\nexport { ObservedDataChannel } from './ObservedDataChannel';\nexport { ObservedInboundRtp } from './ObservedInboundRtp';\nexport { ObservedOutboundRtp } from './ObservedOutboundRtp';\nexport { ObservedRemoteInboundRtp } from './ObservedRemoteInboundRtp';\nexport { ObservedRemoteOutboundRtp } from './ObservedRemoteOutboundRtp';\nexport { ObservedIceCandidatePair } from './ObservedIceCandidatePair';\nexport { ObservedIceCandidate } from './ObservedIceCandidate';\nexport { ObservedIceTransport } from './ObservedIceTransport';\nexport { ObservedPeerConnectionTransport } from './ObservedPeerConnectionTransport';\nexport { ClientEventTypes } from './schema/ClientEventTypes';\nexport { ClientMetaTypes } from './schema/ClientMetaTypes';\nexport { ClientSample, ClientIssue, ClientEvent, ClientMetaData } from './schema/ClientSample';\nexport { ScoreCalculator } from './scores/ScoreCalculator';\nexport { Detectors } from './detectors/Detectors';\nexport type { Detector } from './detectors/Detector';\nexport { createLogger, setObserverLogger } from './common/logger';\nexport type { Logger, ObserverLogger } from './common/logger';\n// Per-client sample sinks. `ClientSampleSink` is the base class to subclass for a custom\n// destination; `JsonlFileSink` / `InMemorySink` are the built-ins.\nexport {\n\tClientSampleSink,\n\tJsonlFileSink,\n\tcreateJsonlFileSink,\n\tcreateJsonlFileSinkFactory,\n\tInMemorySink,\n\tcreateInMemorySink,\n} from './sinks';\nexport type {\n\tClientSampleSinkEvents,\n\tClientSampleSinkFactory,\n\tJsonlFileSinkOptions,\n\tJsonlFileSinkFactoryOptions,\n} from './sinks';\nexport { Middleware } from './common/Middleware';\nexport type {\n\tTrackReport,\n\tClientReport,\n} from './Reports';\n","export interface Logger {\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\ttrace(...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\tdebug(...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\tinfo(...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\twarn(...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\terror(...args: any[]): void;\n}\n\nexport interface ObserverLogger {\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\ttrace(module: string, ...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\tdebug(module: string, ...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\tinfo(module: string, ...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\twarn(module: string, ...args: any[]): void;\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\terror(module: string, ...args: any[]): void;\n}\n\nlet mainLogger: ObserverLogger = new class implements ObserverLogger {\n\ttrace = () => void 0;\n\t// trace(module: string, ...args: any[]) {\n\t// \t// eslint-disable-next-line no-console\n\t// \tconsole.log(`[TRACE] ${module}`, ...args);\n\t// }\n\n\tdebug(module: string, ...args: any[]) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.log(`[DEBUG] ${module}`, ...args);\n\t}\n\n\tinfo(module: string, ...args: any[]) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.info(`[INFO] ${module}`, ...args);\n\t}\n\n\twarn(module: string, ...args: any[]) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(`[WARN] ${module}`, ...args);\n\t}\n\n\terror(module: string, ...args: any[]) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(`[ERROR] ${module}`, ...args);\n\t}\n}();\n\nexport function createLogger(moduleName: string): Logger {\n\treturn new class implements Logger {\n\t\ttrace(...args: any[]) {\n\t\t\tmainLogger.trace(moduleName, ...args);\n\t\t}\n\n\t\tdebug(...args: any[]) {\n\t\t\tmainLogger.debug(moduleName, ...args);\n\t\t}\n\n\t\tinfo(...args: any[]) {\n\t\t\tmainLogger.info(moduleName, ...args);\n\t\t}\n\n\t\twarn(...args: any[]) {\n\t\t\tmainLogger.warn(moduleName, ...args);\n\t\t}\n\n\t\terror(...args: any[]) {\n\t\t\tmainLogger.error(moduleName, ...args);\n\t\t}\n\n\t}();\n}\n\nexport function setObserverLogger(logger: ObserverLogger) {\n\tmainLogger = logger;\n}\n","import { EventEmitter } from 'events';\nimport { createLogger } from './common/logger';\nimport { ObservedClient, ObservedClientSettings } from './ObservedClient';\nimport { Observer } from './Observer';\nimport { ScoreCalculator } from './scores/ScoreCalculator';\nimport { CalculatedScore } from './scores/CalculatedScore';\nimport { DefaultCallScoreCalculator } from './scores/DefaultCallScoreCalculator';\nimport { RemoteTrackResolver } from './utils/RemoteTrackResolver';\nimport { OnAllClientCallUpdater } from './updaters/OnAllClientCallUpdater';\nimport { Updater } from './updaters/Updater';\nimport { OnIntervalUpdater } from './updaters/OnIntervalUpdater';\nimport { OnAnyClientCallUpdater } from './updaters/OnAnyClientCallUpdater';\nimport { Detectors } from './detectors/Detectors';\nimport { ClientIssue } from './schema/ClientSample';\nimport type { AcceptContext } from './Observer';\nimport type { ObserverEvents, ObservedCallScope } from './ObserverEvents';\n\nconst logger = createLogger('ObservedCall');\n\n// `update-on-interval` requires an interval; the other policies do not use one.\ntype ObservedCallUpdateConfig =\n\t| {\n\t\tupdatePolicy: 'update-on-interval',\n\t\tupdateIntervalInMs: number,\n\t}\n\t| {\n\t\tupdatePolicy?: 'update-on-any-client-updated' | 'update-when-all-client-updated',\n\t\tupdateIntervalInMs?: number,\n\t};\n\nexport type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = ObservedCallUpdateConfig & {\n\tcallId: string;\n\tappData?: AppData;\n\tremoteTrackResolvePolicy?: 'p2p' | 'mediasoup-sfu' | 'none',\n\tcloseCallIfEmptyForMs?: number,\n};\n\nexport type ObservedCallEvents = {\n\tupdate: [],\n\tnewclient: [ObservedClient],\n\tempty: [],\n\t'not-empty': [],\n\tclose: [],\n}\n\nexport declare interface ObservedCall {\n\ton<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;\n\toff<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;\n\tonce<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;\n\temit<U extends keyof ObservedCallEvents>(event: U, ...args: ObservedCallEvents[U]): boolean;\n}\n\nexport class ObservedCall<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {\n\tpublic updater?: Updater;\n\tpublic scoreCalculator: ScoreCalculator;\n\tpublic readonly detectors: Detectors;\n\tpublic readonly callId: string;\n\tpublic readonly observedClients = new Map<string, ObservedClient>();\n\tpublic readonly clientsUsedTurn = new Set<string>();\n\tpublic readonly calculatedScore: CalculatedScore = {\n\t\tweight: 1,\n\t\tvalue: undefined,\n\t};\n\tpublic remoteTrackResolver?: RemoteTrackResolver;\n\n\tpublic totalAddedClients = 0;\n\tpublic totalRemovedClients = 0;\n\n\tpublic numberOfIssues = 0;\n\tpublic numberOfPeerConnections = 0;\n\tpublic numberOfInboundRtpStreams = 0;\n\tpublic numberOfOutboundRtpStreams = 0;\n\tpublic numberOfDataChannels = 0;\n\n\tpublic maxNumberOfClients = 0;\n\tpublic deltaNumberOfIssues = 0;\n\n\t// public deltaRttLt50Measurements = 0;\n\t// public deltaRttLt150Measurements = 0;\n\t// public deltaRttLt300Measurements = 0;\n\t// public deltaRttGtOrEq300Measurements = 0;\n\n\tpublic appData: AppData;\n\tpublic closed = false;\n\tpublic startedAt?: number;\n\tpublic endedAt?: number;\n\tpublic closedAt?: number;\n\n\tpublic readonly settings: Pick<ObservedCallSettings, 'closeCallIfEmptyForMs'>;\n\n\t/** Ancestry base shared by all Observer-bus events originating at this call. */\n\tpublic readonly eventScope: ObservedCallScope;\n\tprivate closeTimer?: ReturnType<typeof setTimeout>;\n\n\tpublic constructor(\n\t\tsettings: ObservedCallSettings<AppData>,\n\t\tpublic readonly observer: Observer,\n\t) {\n\t\tsuper();\n\t\tthis.setMaxListeners(Infinity);\n\n\t\tthis.eventScope = { observer: this.observer, observedCall: this };\n\t\tthis.callId = settings.callId;\n\t\tthis.appData = (settings.appData ?? {}) as AppData;\n\t\tthis.scoreCalculator = new DefaultCallScoreCalculator(this);\n\t\t// No built-in detectors ship yet. The registry is a server-side extension point:\n\t\t// add custom call-level Detectors via `call.detectors.add(...)` and surface findings\n\t\t// with `call.addIssue(...)` (emitted on the Observer bus as `call-issue`).\n\t\tthis.detectors = new Detectors();\n\n\t\tif (settings.updateIntervalInMs && settings.updatePolicy !== 'update-on-interval') {\n\t\t\tlogger.warn('updateIntervalInMs is ignored unless updatePolicy is \"update-on-interval\" (callId: %s)', settings.callId);\n\t\t}\n\t\tswitch (settings.updatePolicy) {\n\t\t\tcase 'update-on-any-client-updated':\n\t\t\t\tthis.updater = new OnAnyClientCallUpdater(this);\n\t\t\t\tbreak;\n\t\t\tcase 'update-when-all-client-updated':\n\t\t\t\tthis.updater = new OnAllClientCallUpdater(this);\n\t\t\t\tbreak;\n\t\t\tcase 'update-on-interval':\n\t\t\t\tif (!settings.updateIntervalInMs) {\n\t\t\t\t\tlogger.warn('updateIntervalInMs must be set when updatePolicy is \"update-on-interval\"; falling back to \"update-when-all-client-updated\" (callId: %s)', settings.callId);\n\t\t\t\t\tthis.updater = new OnAllClientCallUpdater(this);\n\t\t\t\t} else {\n\t\t\t\t\tthis.updater = new OnIntervalUpdater(\n\t\t\t\t\t\tsettings.updateIntervalInMs,\n\t\t\t\t\t\tthis.update.bind(this),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.settings = {\n\t\t\tcloseCallIfEmptyForMs: settings.closeCallIfEmptyForMs,\n\t\t};\n\t}\n\n\tpublic get numberOfClients() {\n\t\treturn this.observedClients.size;\n\t}\n\n\tpublic get score() {\n\t\treturn this.calculatedScore.value;\n\t}\n\n\t/** Raise a call-level (server-side) issue; surfaced on the Observer bus as `call-issue`. */\n\tpublic addIssue(issue: ClientIssue) {\n\t\tif (this.closed) return;\n\n\t\tthis._notify('call-issue', { ...this.eventScope, issue });\n\t}\n\n\tpublic close() {\n\t\tif (this.closed) return;\n\t\tthis.update(); // last update before closing\n\t\tthis.closed = true;\n\n\t\tthis.updater?.close();\n\n\t\tlet minSampleTimestamps: number | undefined;\n\t\tlet maxSampleTimestamps: number | undefined;\n\n\t\tfor (const client of this.observedClients.values()) {\n\t\t\tclient.close();\n\n\t\t\tif (client.joinedAt) minSampleTimestamps = Math.min(minSampleTimestamps ?? client.joinedAt, client.joinedAt);\n\t\t\tif (client.leftAt) maxSampleTimestamps = Math.max(maxSampleTimestamps ?? client.leftAt, client.leftAt);\n\t\t}\n\n\t\tif (this.startedAt === undefined) this.startedAt = minSampleTimestamps;\n\t\tif (this.endedAt === undefined) this.endedAt = maxSampleTimestamps;\n\n\t\tthis.closedAt = Date.now();\n\t\tthis.emit('close');\n\t\tthis._notify('call-closed', { ...this.eventScope });\n\t}\n\n\tpublic getObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(clientId: string): ObservedClient<ClientAppData> | undefined {\n\t\tif (this.closed || !this.observedClients.has(clientId)) return;\n\n\t\treturn this.observedClients.get(clientId) as ObservedClient<ClientAppData>;\n\t}\n\n\tpublic createObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedClientSettings<ClientAppData>): ObservedClient<ClientAppData> | undefined {\n\t\tif (this.closed) {\n\t\t\tlogger.warn('Attempted to create a client (clientId: %s) on a closed call %s', settings.clientId, this.callId);\n\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.observedClients.has(settings.clientId)) {\n\t\t\tlogger.warn('Client with id %s already exists in call %s; returning the existing instance', settings.clientId, this.callId);\n\n\t\t\treturn this.observedClients.get(settings.clientId) as ObservedClient<ClientAppData>;\n\t\t}\n\n\t\tif (!settings.closeClientIfIdleForMs) {\n\t\t\tsettings.closeClientIfIdleForMs = this.observer.config.closeClientIfIdleForMs;\n\t\t}\n\t\tif (settings.appData === undefined) {\n\t\t\tsettings.appData = this.observer.config.createClientAppData?.({ clientId: settings.clientId, observedCall: this }) as ClientAppData;\n\t\t}\n\n\t\tconst result = new ObservedClient<ClientAppData>(settings, this);\n\t\tconst wasEmpty = this.observedClients.size === 0;\n\t\tconst onUpdate = () => this._onClientUpdate(result);\n\t\tconst joined = () => this._clientJoined(result);\n\t\tconst left = () => this._clientLeft(result);\n\n\t\tresult.once('close', () => {\n\t\t\tresult.off('update', onUpdate);\n\t\t\tresult.off('joined', joined);\n\t\t\tresult.off('left', left);\n\t\t\tthis.observedClients.delete(settings.clientId);\n\n\t\t\tif (this.observedClients.size === 0) {\n\t\t\t\tthis.emit('empty');\n\t\t\t\tthis._notify('call-empty', { ...this.eventScope });\n\n\t\t\t\tif (this.settings.closeCallIfEmptyForMs) {\n\t\t\t\t\tthis.closeTimer = setTimeout(() => {\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t}, this.settings.closeCallIfEmptyForMs);\n\t\t\t\t}\n\t\t\t}\n\t\t\t++this.totalRemovedClients;\n\t\t});\n\t\tresult.on('update', onUpdate);\n\t\tresult.on('joined', joined);\n\t\tresult.on('left', left);\n\t\t++this.totalAddedClients;\n\n\t\tthis.observedClients.set(settings.clientId, result);\n\t\tthis.maxNumberOfClients = Math.max(this.maxNumberOfClients, this.observedClients.size);\n\n\t\tif (this.closeTimer) {\n\t\t\tclearTimeout(this.closeTimer);\n\t\t\tthis.closeTimer = undefined;\n\t\t}\n\n\t\tthis.emit('newclient', result);\n\t\tthis._notify('client-added', { ...this.eventScope, observedClient: result });\n\n\t\tif (result.sink) {\n\t\t\tthis._notify('client-sink-created', { ...this.eventScope, observedClient: result, sink: result.sink });\n\t\t}\n\n\t\tif (wasEmpty) {\n\t\t\tthis.emit('not-empty');\n\t\t\tthis._notify('call-not-empty', { ...this.eventScope });\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic getOrCreateObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(\n\t\tsettings: ObservedClientSettings<ClientAppData>\n\t): ObservedClient<ClientAppData> | undefined {\n\t\treturn this.getObservedClient<ClientAppData>(settings.clientId) ?? this.createObservedClient<ClientAppData>(settings);\n\t}\n\n\tpublic update(context?: AcceptContext) {\n\t\tif (this.closed) return;\n\n\t\tthis.numberOfInboundRtpStreams = 0;\n\t\tthis.numberOfOutboundRtpStreams = 0;\n\t\tthis.numberOfPeerConnections = 0;\n\t\tthis.numberOfDataChannels = 0;\n\n\t\tfor (const client of this.observedClients.values()) {\n\t\t\tthis.numberOfInboundRtpStreams += client.numberOfInboundRtpStreams;\n\t\t\tthis.numberOfOutboundRtpStreams += client.numberOfOutboundRtpStreams;\n\t\t\tthis.numberOfPeerConnections += client.numberOfPeerConnections;\n\t\t\tthis.numberOfDataChannels += client.numberOfDataChannels;\n\t\t}\n\n\t\tthis.scoreCalculator.update();\n\t\tthis.detectors.update();\n\n\t\tthis.emit('update');\n\t\tthis._notify('call-updated', { ...this.eventScope, context });\n\n\t\tthis.deltaNumberOfIssues = 0;\n\t}\n\n\tprivate _onClientUpdate(client: ObservedClient) {\n\t\tthis.deltaNumberOfIssues += client.deltaNumberOfIssues;\n\t\tthis.numberOfIssues += client.deltaNumberOfIssues;\n\n\t\tif (client.usingTURN) {\n\t\t\tthis.clientsUsedTurn.add(client.clientId);\n\t\t}\n\t}\n\n\tprivate _clientJoined(client: ObservedClient) {\n\t\tif (!client.joinedAt) return;\n\n\t\tthis.startedAt = Math.min(this.startedAt ?? client.joinedAt, client.joinedAt);\n\t}\n\n\tprivate _clientLeft(client: ObservedClient) {\n\t\tif (!client.leftAt) return;\n\n\t\tthis.endedAt = Math.max(this.endedAt ?? client.leftAt, client.leftAt);\n\t}\n\n\t/** Emit an Observer-bus event scoped to this call. */\n\tprivate _notify<K extends keyof ObserverEvents>(type: K, ...args: ObserverEvents[K]): void {\n\t\tthis.observer.emit(type, ...args);\n\t}\n}","import { EventEmitter } from 'events';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { createLogger } from './common/logger';\n// eslint-disable-next-line camelcase\nimport { ClientEvent, ClientMetaData, ClientSample, PeerConnectionSample, ClientIssue, ExtensionStat } from './schema/ClientSample';\nimport * as MetaData from './schema/ClientMetaTypes';\nimport { ClientEventTypes } from './schema/ClientEventTypes';\nimport { ObservedCall } from './ObservedCall';\nimport { ClientMetaTypes } from './schema/ClientMetaTypes';\nimport { parseJsonAs } from './common/utils';\nimport { CalculatedScore } from './scores/CalculatedScore';\nimport { ClientReport } from './Reports';\nimport { ObservedInboundTrack } from './ObservedInboundTrack';\nimport { ObservedOutboundTrack } from './ObservedOutboundTrack';\nimport type { AcceptContext } from './Observer';\nimport type { ObserverEvents, ObservedClientScope } from './ObserverEvents';\nimport type { ClientSampleSink } from './sinks/ClientSampleSink';\n\nconst logger = createLogger('ObservedClient');\n\nexport type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {\n\tclientId: string;\n\tappData?: AppData;\n\tcloseClientIfIdleForMs?: number;\n};\n\n// Local lifecycle/coordination events only. Everything worth subscribing to is\n// emitted on the Observer bus (see ObserverEvents). These remain local so the\n// parent ObservedCall and the updaters can wire to them for teardown/aggregation.\nexport type ObservedClientEvents = {\n\tupdate: [sample: ClientSample, elapsedTimeInMs: number, context?: AcceptContext];\n\tclose: [];\n\tjoined: [];\n\tleft: [];\n};\n\nexport declare interface ObservedClient {\n\ton<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;\n\toff<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;\n\tonce<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;\n\temit<U extends keyof ObservedClientEvents>(event: U, ...args: ObservedClientEvents[U]): boolean;\n}\n\nexport class ObservedClient<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {\n\tpublic readonly clientId: string;\n\tpublic readonly observedPeerConnections = new Map<string, ObservedPeerConnection>();\n\n\t/** Per-client sink (from `ObserverConfig.createClientSink`), if any. */\n\tpublic readonly sink?: ClientSampleSink;\n\n\t/** Ancestry base shared by all Observer-bus events originating at this client. */\n\tpublic readonly eventScope: ObservedClientScope;\n\tpublic readonly calculatedScore: CalculatedScore = {\n\t\tweight: 1,\n\t\tvalue: undefined,\n\t};\n\n\tpublic readonly settings: Pick<ObservedClientSettings, 'closeClientIfIdleForMs'>;\n\n\tpublic appData: AppData;\n\tpublic attachments?: Record<string, unknown>;\n\n\tpublic updated = Date.now();\n\tpublic acceptedSamples = 0;\n\tpublic closed = false;\n\n\tpublic joinedAt?: number;\n\tpublic leftAt?: number;\n\tpublic closedAt?: number;\n\tpublic lastSampleTimestamp?: number;\n\t// the timestamp of the CLIENT_JOINED event\n\tpublic operationSystem?: MetaData.OperationSystem;\n\tpublic engine?: MetaData.Engine;\n\tpublic platform?: MetaData.Platform;\n\tpublic browser?: MetaData.Browser;\n\tpublic mediaConstraints: string[] = [];\n\n\tpublic usingTURN = false;\n\tpublic usingTCP = false;\n\tpublic availableOutgoingBitrate = 0;\n\tpublic availableIncomingBitrate = 0;\n\n\tpublic deltaReceivedAudioBytes = 0;\n\tpublic deltaReceivedVideoBytes = 0;\n\tpublic deltaSentAudioBytes = 0;\n\tpublic deltaSentVideoBytes = 0;\n\tpublic deltaDataChannelBytesSent = 0;\n\tpublic deltaDataChannelBytesReceived = 0;\n\tpublic deltaDataChannelMessagesSent = 0;\n\tpublic deltaDataChannelMessagesReceived = 0;\n\tpublic deltaInboundPacketsLost = 0;\n\tpublic deltaInboundPacketsReceived = 0;\n\tpublic deltaOutboundPacketsSent = 0;\n\tpublic deltaTransportSentBytes = 0;\n\tpublic deltaTransportReceivedBytes = 0;\n\tpublic deltaRttLt50Measurements = 0;\n\tpublic deltaRttLt150Measurements = 0;\n\tpublic deltaRttLt300Measurements = 0;\n\tpublic deltaRttGtOrEq300Measurements = 0;\n\n\tpublic currentMaxRttInMs?: number;\n\tpublic currentMinRttInMs?: number;\n\tpublic currentAvgRttInMs?: number;\n\n\tpublic sendingAudioBitrate = 0;\n\tpublic sendingVideoBitrate = 0;\n\tpublic receivingAudioBitrate = 0;\n\tpublic receivingVideoBitrate = 0;\n\n\tpublic numberOfInboundRtpStreams = 0;\n\tpublic numberOfInbundTracks = 0;\n\tpublic numberOfOutboundRtpStreams = 0;\n\tpublic numberOfOutboundTracks = 0;\n\tpublic numberOfDataChannels = 0;\n\n\tpublic deltaNumberOfIssues = 0;\n\n\tpublic totalScoreSum = 0;\n\tpublic numberOfScoreMeasurements = 0;\n\t// public totalNumberOfIssues = 0;\n\n\tpublic readonly report: ClientReport;\n\n\tpublic readonly mediaDevices: MetaData.MediaDeviceInfo[] = [];\n\tpublic issues: ClientIssue[] = [];\n\n\tprivate _injections: Pick<ClientSample, 'clientEvents' | 'clientIssues' | 'extensionStats' | 'attachments' | 'clientMetaItems'> = {};\n\n\tprivate closeTimer?: ReturnType<typeof setTimeout>;\n\n\tpublic constructor(settings: ObservedClientSettings<AppData>, public readonly call: ObservedCall) {\n\t\tsuper();\n\t\tthis.setMaxListeners(Infinity);\n\n\t\tthis.eventScope = { observer: call.observer, observedCall: call, observedClient: this };\n\t\tthis.sink = call.observer.config.createClientSink?.({ clientId: settings.clientId, observedCall: call });\n\t\tthis.clientId = settings.clientId;\n\t\tthis.appData = (settings.appData ?? {}) as AppData;\n\n\t\tthis.settings = {\n\t\t\tcloseClientIfIdleForMs: settings.closeClientIfIdleForMs,\n\t\t};\n\n\t\tthis.report = {\n\t\t\tcallId: this.call.callId,\n\t\t\tclientId: this.clientId,\n\t\t\trttDistribution: {\n\t\t\t\tgtOrEq300ms: 0,\n\t\t\t\tlt50ms: 0,\n\t\t\t\tlt150ms: 0,\n\t\t\t\tlt300ms: 0,\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t},\n\t\t\tscoreDistribution: {\n\t\t\t\t'0': 0,\n\t\t\t\t'1': 0,\n\t\t\t\t'2': 0,\n\t\t\t\t'3': 0,\n\t\t\t\t'4': 0,\n\t\t\t\t'5': 0,\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t},\n\t\t\tissues: {},\n\t\t\ttotalAudioBytesReceived: 0,\n\t\t\ttotalVideoBytesReceived: 0,\n\t\t\ttotalAudioBytesSent: 0,\n\t\t\ttotalVideoBytesSent: 0,\n\t\t\ttotalDataChannelBytesReceived: 0,\n\t\t\ttotalDataChannelBytesSent: 0,\n\t\t\ttotalDataChannelMessagesReceived: 0,\n\t\t\ttotalDataChannelMessagesSent: 0,\n\t\t\ttotalInboundRtpBytesReceived: 0,\n\t\t\ttotalInboundRtpPacketsLost: 0,\n\t\t\ttotalInboundRtpPacketsReceived: 0,\n\t\t\ttotalOutboundRtpBytesSent: 0,\n\t\t\ttotalOutboundRtpPacketsSent: 0,\n\t\t\ttotalNumberOfIssues: 0,\n\t\t};\n\n\t\tif (this.sink) {\n\t\t\tconst onError = (err: Error) => logger.warn('ClientSampleSink error for client %s: %o', this.clientId, err);\n\n\t\t\tthis.sink.once('close', () => this.sink?.off('error', onError));\n\t\t\tthis.sink.on('error', onError);\n\t\t}\n\t}\n\n\tpublic get numberOfPeerConnections() {\n\t\treturn this.observedPeerConnections.size;\n\t}\n\n\tpublic get score() {\n\t\treturn this.calculatedScore.value;\n\t}\n\n\tpublic close() {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\n\t\tthis._injections.clientEvents?.forEach((clientEvent) => this._processClientEvent(clientEvent));\n\t\tthis._injections.clientIssues?.forEach((clientIssue) => this.addIssue(clientIssue));\n\t\tthis._injections.extensionStats?.forEach((extensionStat) => this.addExtensionStats(extensionStat));\n\t\tthis._injections.clientMetaItems?.forEach((clientMetaItem) => this.addMetadata(clientMetaItem));\n\n\t\tArray.from(this.observedPeerConnections.values()).forEach((peerConnection) => peerConnection.close());\n\t\tif (!this.leftAt) {\n\t\t\tthis.leftAt = this.lastSampleTimestamp;\n\n\t\t\tif (this.leftAt) {\n\t\t\t\tthis.emit('left');\n\t\t\t\tthis._notify('client-left', { ...this.eventScope });\n\t\t\t}\n\t\t}\n\t\tthis.closedAt = Date.now();\n\n\t\tthis.emit('close');\n\t\tthis._notify('client-closed', { ...this.eventScope });\n\n\t\ttry {\n\t\t\tthis.sink?.end();\n\t\t} catch (err) {\n\t\t\tlogger.warn('ClientSampleSink.end failed for client %s: %o', this.clientId, err);\n\t\t}\n\t}\n\n\tpublic accept(sample: ClientSample, context?: AcceptContext): void {\n\t\tif (this.closed) {\n\t\t\tlogger.warn('Attempted to accept a sample on a closed client %s', this.clientId);\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.sink?.write(sample);\n\n\t\tif (this.closeTimer) {\n\t\t\tclearTimeout(this.closeTimer);\n\t\t\tthis.closeTimer = undefined;\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst elapsedInMs = now - this.updated;\n\t\tconst elapsedInSeconds = elapsedInMs / 1000;\n\t\tlet sumOfRtts = 0;\n\t\tlet numberOfRttMeasurements = 0;\n\n\t\t++this.acceptedSamples;\n\n\t\tthis.availableIncomingBitrate = 0;\n\t\tthis.availableOutgoingBitrate = 0;\n\t\tthis.deltaDataChannelBytesReceived = 0;\n\t\tthis.deltaDataChannelBytesSent = 0;\n\t\tthis.deltaDataChannelMessagesReceived = 0;\n\t\tthis.deltaDataChannelMessagesSent = 0;\n\t\tthis.deltaInboundPacketsLost = 0;\n\t\tthis.deltaInboundPacketsReceived = 0;\n\t\tthis.deltaOutboundPacketsSent = 0;\n\t\tthis.deltaReceivedAudioBytes = 0;\n\t\tthis.deltaReceivedVideoBytes = 0;\n\t\tthis.deltaSentAudioBytes = 0;\n\t\tthis.deltaSentVideoBytes = 0;\n\t\tthis.deltaTransportReceivedBytes = 0;\n\t\tthis.deltaTransportSentBytes = 0;\n\t\tthis.deltaRttLt50Measurements = 0;\n\t\tthis.deltaRttLt150Measurements = 0;\n\t\tthis.deltaRttLt300Measurements = 0;\n\t\tthis.deltaRttGtOrEq300Measurements = 0;\n\t\tthis.deltaNumberOfIssues = 0;\n\n\t\tthis.numberOfDataChannels = 0;\n\t\tthis.numberOfInboundRtpStreams = 0;\n\t\tthis.numberOfInbundTracks = 0;\n\t\tthis.numberOfOutboundRtpStreams = 0;\n\t\tthis.numberOfOutboundTracks = 0;\n\t\tthis.usingTURN = false;\n\t\tthis.usingTCP = false;\n\t\tthis.currentMinRttInMs = undefined;\n\t\tthis.currentMaxRttInMs = undefined;\n\n\t\tthis._mergeInjections(sample);\n\n\t\tconst clientEventsPostBuffer: ClientEvent[] = [];\n\n\t\tfor (const clientEvent of sample.clientEvents ?? []) {\n\t\t\tthis._processClientEvent(clientEvent, clientEventsPostBuffer);\n\t\t}\n\n\t\tfor (const metaData of sample.clientMetaItems ?? []) {\n\t\t\tthis.addMetadata(metaData);\n\t\t}\n\n\t\tfor (const issue of sample.clientIssues ?? []) {\n\t\t\tthis.addIssue(issue);\n\n\t\t\t++this.deltaNumberOfIssues;\n\t\t}\n\n\t\tfor (const extensionStat of sample.extensionStats ?? []) {\n\t\t\tthis.addExtensionStats(extensionStat);\n\t\t}\n\n\t\tfor (const pcSample of sample.peerConnections ?? []) {\n\t\t\tconst observedPeerConnection = this._updatePeerConnection(pcSample, context);\n\n\t\t\tif (!observedPeerConnection) continue;\n\n\t\t\tthis.deltaDataChannelBytesReceived += observedPeerConnection.deltaDataChannelBytesReceived;\n\t\t\tthis.deltaDataChannelBytesSent += observedPeerConnection.deltaDataChannelBytesSent;\n\t\t\tthis.deltaDataChannelMessagesReceived += observedPeerConnection.deltaDataChannelMessagesReceived;\n\t\t\tthis.deltaDataChannelMessagesSent += observedPeerConnection.deltaDataChannelMessagesSent;\n\t\t\tthis.deltaInboundPacketsLost += observedPeerConnection.deltaInboundPacketsLost;\n\t\t\tthis.deltaInboundPacketsReceived += observedPeerConnection.deltaInboundPacketsReceived;\n\t\t\tthis.deltaOutboundPacketsSent += observedPeerConnection.deltaOutboundPacketsSent;\n\t\t\tthis.deltaReceivedAudioBytes += observedPeerConnection.deltaReceivedAudioBytes;\n\t\t\tthis.deltaReceivedVideoBytes += observedPeerConnection.deltaReceivedVideoBytes;\n\t\t\tthis.deltaSentAudioBytes += observedPeerConnection.deltaSentAudioBytes;\n\t\t\tthis.deltaSentVideoBytes += observedPeerConnection.deltaSentVideoBytes;\n\t\t\tthis.deltaTransportReceivedBytes += observedPeerConnection.deltaTransportReceivedBytes;\n\t\t\tthis.deltaTransportSentBytes += observedPeerConnection.deltaTransportSentBytes;\n\n\t\t\tthis.availableIncomingBitrate += observedPeerConnection.availableIncomingBitrate;\n\t\t\tthis.availableOutgoingBitrate += observedPeerConnection.availableOutgoingBitrate;\n\n\t\t\tthis.numberOfDataChannels += observedPeerConnection.observedDataChannels.size;\n\t\t\tthis.numberOfInbundTracks += observedPeerConnection.observedInboundTracks.size;\n\t\t\tthis.numberOfOutboundRtpStreams += observedPeerConnection.observedOutboundRtps.size;\n\t\t\tthis.numberOfOutboundTracks += observedPeerConnection.observedOutboundTracks.size;\n\t\t\tthis.numberOfInboundRtpStreams += observedPeerConnection.observedInboundRtps.size;\n\n\t\t\tif (observedPeerConnection.usingTURN) {\n\t\t\t\tthis.usingTURN = true;\n\t\t\t}\n\t\t\tif (observedPeerConnection.usingTCP) {\n\t\t\t\tthis.usingTCP = true;\n\t\t\t}\n\n\t\t\tif (observedPeerConnection.currentRttInMs) {\n\t\t\t\tif (this.currentMinRttInMs === undefined || observedPeerConnection.currentRttInMs < this.currentMinRttInMs) {\n\t\t\t\t\tthis.currentMinRttInMs = observedPeerConnection.currentRttInMs;\n\t\t\t\t}\n\t\t\t\tif (this.currentMaxRttInMs === undefined || observedPeerConnection.currentRttInMs > this.currentMaxRttInMs) {\n\t\t\t\t\tthis.currentMaxRttInMs = observedPeerConnection.currentRttInMs;\n\t\t\t\t}\n\t\t\t\tif (observedPeerConnection.currentRttInMs < 50) {\n\t\t\t\t\tthis.deltaRttLt50Measurements += 1;\n\t\t\t\t\tthis.report.rttDistribution.lt50ms += 1;\n\t\t\t\t} else if (observedPeerConnection.currentRttInMs < 150) {\n\t\t\t\t\tthis.deltaRttLt150Measurements += 1;\n\t\t\t\t\tthis.report.rttDistribution.lt150ms += 1;\n\t\t\t\t} else if (observedPeerConnection.currentRttInMs < 300) {\n\t\t\t\t\tthis.deltaRttLt300Measurements += 1;\n\t\t\t\t\tthis.report.rttDistribution.lt300ms += 1;\n\t\t\t\t} else if (300 <= observedPeerConnection.currentRttInMs) {\n\t\t\t\t\tthis.deltaRttGtOrEq300Measurements += 1;\n\t\t\t\t\tthis.report.rttDistribution.gtOrEq300ms += 1;\n\t\t\t\t}\n\t\t\t\tthis.report.rttDistribution.count += 1;\n\t\t\t\tthis.report.rttDistribution.sum += observedPeerConnection.currentRttInMs;\n\n\t\t\t\tsumOfRtts += observedPeerConnection.currentRttInMs;\n\t\t\t\t++numberOfRttMeasurements;\n\t\t\t}\n\t\t}\n\n\t\tfor (const clientEvent of clientEventsPostBuffer) {\n\t\t\tthis._processClientEvent(clientEvent);\n\t\t}\n\n\t\t// emit new attachments?\n\t\tthis.attachments = sample.attachments;\n\n\t\tthis.report.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;\n\t\tthis.report.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;\n\t\tthis.report.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;\n\t\tthis.report.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;\n\t\tthis.report.totalInboundRtpPacketsLost += this.deltaInboundPacketsLost;\n\t\tthis.report.totalInboundRtpPacketsReceived += this.deltaInboundPacketsReceived;\n\t\tthis.report.totalOutboundRtpPacketsSent += this.deltaOutboundPacketsSent;\n\t\tthis.report.totalAudioBytesReceived += this.deltaReceivedAudioBytes;\n\t\tthis.report.totalVideoBytesReceived += this.deltaReceivedVideoBytes;\n\t\tthis.report.totalAudioBytesSent += this.deltaSentAudioBytes;\n\t\tthis.report.totalVideoBytesSent += this.deltaSentVideoBytes;\n\t\tthis.report.totalInboundRtpBytesReceived += this.deltaTransportReceivedBytes;\n\t\tthis.report.totalOutboundRtpBytesSent += this.deltaTransportSentBytes;\n\t\tthis.report.totalNumberOfIssues += this.deltaNumberOfIssues;\n\n\t\tthis.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / (elapsedInSeconds);\n\t\tthis.receivingVideoBitrate = (this.deltaReceivedVideoBytes * 8) / (elapsedInSeconds);\n\t\tthis.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / (elapsedInSeconds);\n\t\tthis.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / (elapsedInSeconds);\n\t\tthis.currentAvgRttInMs = 0 < numberOfRttMeasurements ? sumOfRtts / numberOfRttMeasurements : undefined;\n\n\t\tthis.calculatedScore.value = sample.score;\n\n\t\tif (sample.score !== undefined) {\n\t\t\tconst bucket = Math.floor(sample.score).toString() as '0' | '1' | '2' | '3' | '4' | '5';\n\n\t\t\tthis.report.scoreDistribution[bucket] = (this.report.scoreDistribution[bucket] ?? 0) + 1;\n\t\t\tthis.report.scoreDistribution.count += 1;\n\t\t\tthis.report.scoreDistribution.sum += sample.score;\n\t\t}\n\n\t\tthis.lastSampleTimestamp = sample.timestamp;\n\t\t// emit update\n\t\tconst elapsedTimeInMs = now - this.updated;\n\n\t\tthis.emit('update', sample, elapsedTimeInMs, context);\n\t\tthis._notify('client-updated', { ...this.eventScope, sample, elapsedTimeInMs, context });\n\t\tthis.updated = now;\n\n\t\t// if result changed after update\n\t\tif (this.calculatedScore.value) {\n\t\t\tthis.totalScoreSum += this.calculatedScore.value;\n\t\t\t++this.numberOfScoreMeasurements;\n\t\t}\n\n\t\tif (this.settings.closeClientIfIdleForMs !== undefined) {\n\t\t\tthis.closeTimer = setTimeout(() => {\n\t\t\t\tthis.close();\n\t\t\t}, this.settings.closeClientIfIdleForMs);\n\t\t}\n\t}\n\n\tpublic injectMetaData(metaData: ClientMetaData) {\n\t\tif (this.closed) return;\n\n\t\tif (!this._injections.clientMetaItems) this._injections.clientMetaItems = [];\n\n\t\tthis._injections.clientMetaItems.push(metaData);\n\t}\n\n\tpublic injectEvent(event: ClientEvent) {\n\t\tif (this.closed) return;\n\n\t\tif (!this._injections.clientEvents) this._injections.clientEvents = [];\n\n\t\tthis._injections.clientEvents.push(event);\n\t}\n\n\tpublic injectIssue(issue: ClientIssue) {\n\t\tif (this.closed) return;\n\n\t\tif (!this._injections.clientIssues) this._injections.clientIssues = [];\n\n\t\tthis._injections.clientIssues.push(issue);\n\t}\n\n\tpublic injectExtensionStat(stat: ExtensionStat) {\n\t\tif (this.closed) return;\n\n\t\tif (!this._injections.extensionStats) this._injections.extensionStats = [];\n\n\t\tthis._injections.extensionStats.push(stat);\n\t}\n\n\tpublic injectAttachment(key: string, value: unknown) {\n\t\tif (this.closed) return;\n\n\t\tif (!this._injections.attachments) this._injections.attachments = {};\n\n\t\tthis._injections.attachments[key] = value;\n\t}\n\n\tpublic addMetadata(metadata: ClientMetaData) {\n\t\tif (this.closed) return;\n\n\t\tswitch (metadata.type) {\n\t\t\tcase ClientMetaTypes.BROWSER: {\n\t\t\t\tthis.browser = parseJsonAs(metadata.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientMetaTypes.ENGINE: {\n\t\t\t\tthis.engine = parseJsonAs(metadata.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientMetaTypes.PLATFORM: {\n\t\t\t\tthis.platform = parseJsonAs(metadata.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientMetaTypes.OPERATION_SYSTEM: {\n\t\t\t\tthis.operationSystem = parseJsonAs(metadata.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('client-metadata', { ...this.eventScope, metaData: metadata });\n\t}\n\n\tpublic addIssue(issue: ClientIssue) {\n\t\tif (this.closed) return;\n\n\t\tthis.report.issues[issue.type] = (this.report.issues[issue.type] ?? 0) + 1;\n\n\t\tthis._notify('client-issue', { ...this.eventScope, issue });\n\t}\n\n\tpublic addExtensionStats(stats: ExtensionStat) {\n\t\tthis._notify('client-extension-stats', { ...this.eventScope, extensionStats: stats });\n\t}\n\n\tprivate _processClientEvent(event: ClientEvent, postBuffer?: ClientEvent[]) {\n\t\t// eslint-disable-next-line no-console\n\t\t// console.warn('ClientEvent', event);\n\t\tswitch (event.type) {\n\t\t\tcase ClientEventTypes.CLIENT_JOINED: {\n\t\t\t\tif (event.timestamp) {\n\t\t\t\t\tif (!this.joinedAt) {\n\t\t\t\t\t\tthis.joinedAt = event.timestamp;\n\t\t\t\t\t\tthis.emit('joined');\n\t\t\t\t\t\tthis._notify('client-joined', { ...this.eventScope });\n\t\t\t\t\t} else if (this.joinedAt < event.timestamp) {\n\t\t\t\t\t\tthis._notify('client-rejoined', { ...this.eventScope, timestamp: event.timestamp });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.joinedAt = event.timestamp;\n\t\t\t\t\t\tlogger.warn(`Client ${this.clientId} joinedAt timestamp was updated to ${event.timestamp}. the joined event will not be emitted.`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlogger.debug('Client %s joined at %o', this.clientId, event);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.CLIENT_LEFT: {\n\t\t\t\tif (event.timestamp) {\n\t\t\t\t\tif (!this.leftAt) {\n\t\t\t\t\t\tthis.leftAt = event.timestamp;\n\t\t\t\t\t\tthis.emit('left');\n\t\t\t\t\t\tthis._notify('client-left', { ...this.eventScope });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn(`Client ${this.clientId} leftAt timestamp was already set`);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tlogger.debug('Client %s left at %o', this.clientId, event);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.PEER_CONNECTION_OPENED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tobservedPeerConnection.openedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received PEER_CONNECTION_OPENED event without a corresponding observedPeerConnection: %o', event);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.PEER_CONNECTION_CLOSED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tobservedPeerConnection.closedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received PEER_CONNECTION_CLOSED event without a corresponding observedPeerConnection: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.MEDIA_TRACK_ADDED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId) ?? observedPeerConnection?.observedOutboundTracks.get(payload.trackId);\n\n\t\t\t\t\tif (observedTrack) {\n\t\t\t\t\t\tobservedTrack.addedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received MEDIA_TRACK_ADDED event without a corresponding observedPeerConnection or observedTrack: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.MEDIA_TRACK_REMOVED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId) ?? observedPeerConnection?.observedOutboundTracks.get(payload.trackId);\n\n\t\t\t\t\tif (observedTrack) {\n\t\t\t\t\t\tobservedTrack.removedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received MEDIA_TRACK_REMOVED event without a corresponding observedPeerConnection or observedTrack: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.DATA_CHANNEL_OPEN: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.dataChannelId && typeof payload.dataChannelId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedDataChannel = observedPeerConnection?.observedDataChannels.get(payload.dataChannelId);\n\n\t\t\t\t\tif (observedDataChannel) {\n\t\t\t\t\t\tobservedDataChannel.addedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received DATA_CHANNEL_OPENED event without a corresponding observedPeerConnection or observedDataChannel: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.DATA_CHANNEL_CLOSED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.dataChannelId && typeof payload.dataChannelId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedDataChannel = observedPeerConnection?.observedDataChannels.get(payload.dataChannelId);\n\n\t\t\t\t\tif (observedDataChannel) {\n\t\t\t\t\t\tobservedDataChannel.removedAt = event.timestamp;\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received DATA_CHANNEL_CLOSE event without a corresponding observedPeerConnection or observedDataChannel: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.MEDIA_TRACK_MUTED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);\n\t\t\t\t\tconst observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tif (observedInboundTrack) {\n\t\t\t\t\t\t\tobservedInboundTrack.muted = true;\n\t\t\t\t\t\t\tthis._notify('inbound-track-muted', { ...this.eventScope, observedPeerConnection, observedInboundTrack });\n\t\t\t\t\t\t} else if (observedOutboundTrack) {\n\t\t\t\t\t\t\tobservedOutboundTrack.muted = true;\n\t\t\t\t\t\t\tthis._notify('outbound-track-muted', { ...this.eventScope, observedPeerConnection, observedOutboundTrack });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received MEDIA_TRACK_MUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.MEDIA_TRACK_UNMUTED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.trackId && typeof payload.trackId === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\t\t\t\t\tconst observedInboundTrack = observedPeerConnection?.observedInboundTracks.get(payload.trackId);\n\t\t\t\t\tconst observedOutboundTrack = observedPeerConnection?.observedOutboundTracks.get(payload.trackId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tif (observedInboundTrack) {\n\t\t\t\t\t\t\tobservedInboundTrack.muted = false;\n\t\t\t\t\t\t\tthis._notify('inbound-track-unmuted', { ...this.eventScope, observedPeerConnection, observedInboundTrack });\n\t\t\t\t\t\t} else if (observedOutboundTrack) {\n\t\t\t\t\t\t\tobservedOutboundTrack.muted = false;\n\t\t\t\t\t\t\tthis._notify('outbound-track-unmuted', { ...this.eventScope, observedPeerConnection, observedOutboundTrack });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received MEDIA_TRACK_UNMUTED event without a corresponding observedPeerConnection or observedTrack: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.ICE_CONNECTION_STATE_CHANGED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceConnectionState && typeof payload.iceConnectionState === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tobservedPeerConnection.iceConnectionState = payload.iceConnectionState as 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';\n\t\t\t\t\t\tthis._notify('ice-connection-state-changed', { ...this.eventScope, observedPeerConnection, state: payload.iceConnectionState });\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received ICE_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.ICE_GATHERING_STATE_CHANGED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.iceGatheringState && typeof payload.iceGatheringState === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tobservedPeerConnection.iceGatheringState = payload.iceGatheringState as 'new' | 'gathering' | 'complete';\n\t\t\t\t\t\tthis._notify('ice-gathering-state-changed', { ...this.eventScope, observedPeerConnection, state: payload.iceGatheringState });\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received ICE_GATHERING_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ClientEventTypes.PEER_CONNECTION_STATE_CHANGED: {\n\t\t\t\tconst payload = parseJsonAs<Record<string, unknown>>(event.payload);\n\n\t\t\t\tif (payload?.peerConnectionId && typeof payload.peerConnectionId === 'string' && payload?.peerConnectionState && typeof payload.peerConnectionState === 'string') {\n\t\t\t\t\tconst observedPeerConnection = this.observedPeerConnections.get(payload.peerConnectionId);\n\n\t\t\t\t\tif (observedPeerConnection) {\n\t\t\t\t\t\tobservedPeerConnection.connectionState = payload.peerConnectionState as 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';\n\t\t\t\t\t\tthis._notify('connection-state-changed', { ...this.eventScope, observedPeerConnection, state: payload.peerConnectionState });\n\t\t\t\t\t} else if (postBuffer) {\n\t\t\t\t\t\tpostBuffer.push(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.warn('Received PEER_CONNECTION_STATE_CHANGED event without a corresponding observedPeerConnection: %o', event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('client-event', { ...this.eventScope, event });\n\t}\n\n\tprivate _updatePeerConnection(sample: PeerConnectionSample, context?: AcceptContext): ObservedPeerConnection | undefined {\n\t\tlet observedPeerConnection = this.observedPeerConnections.get(sample.peerConnectionId);\n\n\t\tif (!observedPeerConnection) {\n\t\t\tif (!sample.peerConnectionId) {\n\t\t\t\treturn (logger.warn(\n\t\t\t\t\t`ObservedClient received an invalid PeerConnectionSample (missing peerConnectionId field). ClientId: ${this.clientId}, CallId: ${this.call.callId}`,\n\t\t\t\t\tsample\n\t\t\t\t), void 0);\n\t\t\t}\n\n\t\t\tconst newObservedPeerConnection = new ObservedPeerConnection(sample.peerConnectionId, this);\n\t\t\tconst onInboundTrackRemoved = (track: ObservedInboundTrack) => {\n\t\t\t\tthis._notify('client-track-report', {\n\t\t\t\t\t...this.eventScope,\n\t\t\t\t\treport: {\n\t\t\t\t\t\tdirection: 'inbound',\n\t\t\t\t\t\t...track.report,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t};\n\t\t\tconst onOutboundTrackRemoved = (track: ObservedOutboundTrack) => {\n\t\t\t\tthis._notify('client-track-report', {\n\t\t\t\t\t...this.eventScope,\n\t\t\t\t\treport: {\n\t\t\t\t\t\tdirection: 'outbound',\n\t\t\t\t\t\t...track.report,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tnewObservedPeerConnection.once('close', () => {\n\t\t\t\tnewObservedPeerConnection?.off('removed-inbound-track', onInboundTrackRemoved);\n\t\t\t\tnewObservedPeerConnection?.off('removed-outbound-track', onOutboundTrackRemoved);\n\t\t\t\tthis.observedPeerConnections.delete(sample.peerConnectionId);\n\t\t\t});\n\t\t\tnewObservedPeerConnection.on('removed-inbound-track', onInboundTrackRemoved);\n\t\t\tnewObservedPeerConnection.on('removed-outbound-track', onOutboundTrackRemoved);\n\t\t\tthis.observedPeerConnections.set(sample.peerConnectionId, newObservedPeerConnection);\n\n\t\t\tthis._notify('peer-connection-added', { ...this.eventScope, observedPeerConnection: newObservedPeerConnection });\n\n\t\t\tobservedPeerConnection = newObservedPeerConnection;\n\t\t}\n\n\t\tobservedPeerConnection.accept(sample, context);\n\n\t\treturn observedPeerConnection;\n\t}\n\n\tprivate _mergeInjections(sample: ClientSample): ClientSample {\n\t\tif (this.closed) return sample;\n\n\t\tif (this._injections.clientEvents) {\n\t\t\tif (!sample.clientEvents) sample.clientEvents = [];\n\t\t\tsample.clientEvents.push(...this._injections.clientEvents);\n\n\t\t\tthis._injections.clientEvents = undefined;\n\t\t}\n\n\t\tif (this._injections.clientIssues) {\n\t\t\tif (!sample.clientIssues) sample.clientIssues = [];\n\t\t\tsample.clientIssues.push(...this._injections.clientIssues);\n\n\t\t\tthis._injections.clientIssues = undefined;\n\t\t}\n\n\t\tif (this._injections.extensionStats) {\n\t\t\tif (!sample.extensionStats) sample.extensionStats = [];\n\t\t\tsample.extensionStats.push(...this._injections.extensionStats);\n\n\t\t\tthis._injections.extensionStats = undefined;\n\t\t}\n\n\t\tif (this._injections.attachments) {\n\t\t\tif (!sample.attachments) sample.attachments = {};\n\t\t\tObject.assign(sample.attachments, this._injections.attachments);\n\n\t\t\tthis._injections.attachments = undefined;\n\t\t}\n\n\t\tif (this._injections.clientMetaItems) {\n\t\t\tif (!sample.clientMetaItems) sample.clientMetaItems = [];\n\t\t\tsample.clientMetaItems.push(...this._injections.clientMetaItems);\n\n\t\t\tthis._injections.clientMetaItems = undefined;\n\t\t}\n\n\t\treturn sample;\n\t}\n\n\t/** Emit an Observer-bus event scoped to this client (or a peer connection under it). */\n\tprivate _notify<K extends keyof ObserverEvents>(type: K, ...args: ObserverEvents[K]): void {\n\t\tthis.call.observer.emit(type, ...args);\n\t}\n}\n","import { EventEmitter } from 'events';\nimport { ObservedClient } from './ObservedClient';\nimport { CertificateStats, CodecStats, DataChannelStats, IceCandidateStats, InboundRtpStats, InboundTrackSample, MediaPlayoutStats, MediaSourceStats, OutboundRtpStats, OutboundTrackSample, PeerConnectionSample, PeerConnectionTransportStats, RemoteInboundRtpStats, RemoteOutboundRtpStats } from './schema/ClientSample';\nimport { ObservedInboundRtp } from './ObservedInboundRtp';\nimport { createLogger } from './common/logger';\nimport { MediaKind } from './common/types';\nimport { ObservedOutboundRtp } from './ObservedOutboundRtp';\nimport { ObservedCertificate } from './ObservedCertificate';\nimport { ObservedCodec } from './ObservedCodec';\nimport { ObservedDataChannel } from './ObservedDataChannel';\nimport { ObservedIceCandidate } from './ObservedIceCandidate';\nimport { ObservedIceCandidatePair } from './ObservedIceCandidatePair';\nimport { ObservedIceTransport } from './ObservedIceTransport';\nimport { ObservedMediaSource } from './ObservedMediaSource';\nimport { ObservedPeerConnectionTransport } from './ObservedPeerConnectionTransport';\nimport { ObservedMediaPlayout } from './ObservedMediaPlayout';\nimport { ObservedRemoteInboundRtp } from './ObservedRemoteInboundRtp';\nimport { ObservedRemoteOutboundRtp } from './ObservedRemoteOutboundRtp';\nimport { ObservedInboundTrack } from './ObservedInboundTrack';\nimport { ObservedOutboundTrack } from './ObservedOutboundTrack';\nimport { CalculatedScore } from './scores/CalculatedScore';\nimport { ObservedTurnServer } from './ObservedTurnServer';\nimport { getMedian } from './common/utils';\nimport type { AcceptContext } from './Observer';\nimport type { ObserverEvents, ObservedPeerConnectionScope } from './ObserverEvents';\n\nconst logger = createLogger('ObservedPeerConnection');\n\n// Local lifecycle/coordination events only. All consumer-facing events are\n// emitted on the Observer bus (see ObserverEvents). `close` and the two track\n// `removed-*` events stay local because the parent ObservedClient wires to them\n// for teardown and track-report emission.\nexport type ObservedPeerConnectionEvents = {\n\t'removed-inbound-track': [ObservedInboundTrack];\n\t'removed-outbound-track': [ObservedOutboundTrack];\n\tclose: [];\n};\n\nexport declare interface ObservedPeerConnection {\n\ton<U extends keyof ObservedPeerConnectionEvents>(\n\t\tevent: U,\n\t\tlistener: (...args: ObservedPeerConnectionEvents[U]) => void\n\t): this;\n\toff<U extends keyof ObservedPeerConnectionEvents>(\n\t\tevent: U,\n\t\tlistener: (...args: ObservedPeerConnectionEvents[U]) => void\n\t): this;\n\tonce<U extends keyof ObservedPeerConnectionEvents>(\n\t\tevent: U,\n\t\tlistener: (...args: ObservedPeerConnectionEvents[U]) => void\n\t): this;\n\temit<U extends keyof ObservedPeerConnectionEvents>(event: U, ...args: ObservedPeerConnectionEvents[U]): boolean;\n}\n\nexport class ObservedPeerConnection extends EventEmitter {\n\tprivate _visited = true;\n\n\tpublic appData?: Record<string, unknown>;\n\tpublic readonly calculatedScore: CalculatedScore = {\n\t\tweight: 1,\n\t\tvalue: undefined,\n\t};\n\n\tpublic closed = false;\n\t// timestamp of the PEER_CONNECTION_OPENED event\n\tpublic openedAt?: number;\n\t// timestamp of the PEER_CONNECTION_CLOSED event\n\tpublic closedAt?: number;\n\tpublic updated = Date.now();\n\n\tpublic connectionState?: 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';\n\tpublic iceConnectionState?: 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';\n\tpublic iceGatheringState?: 'new' | 'gathering' | 'complete';\n\n\tpublic availableIncomingBitrate = 0;\n\tpublic availableOutgoingBitrate = 0;\n\tpublic totalInboundPacketsLost = 0;\n\tpublic totalInboundPacketsReceived = 0;\n\tpublic totalOutboundPacketsSent = 0;\n\tpublic totalDataChannelBytesSent = 0;\n\tpublic totalDataChannelBytesReceived = 0;\n\tpublic totalDataChannelMessagesSent = 0;\n\tpublic totalDataChannelMessagesReceived = 0;\n\n\tpublic totalSentAudioBytes = 0;\n\tpublic totalSentVideoBytes = 0;\n\tpublic totalSentAudioPackets = 0;\n\tpublic totalSentVideoPackets = 0;\n\tpublic totalReceivedAudioPacktes = 0;\n\tpublic totalReceivedVideoPackets = 0;\n\tpublic totalReceivedAudioBytes = 0;\n\tpublic totalReceivedVideoBytes = 0;\n\n\tpublic deltaInboundPacketsLost = 0;\n\tpublic deltaInboundPacketsReceived = 0;\n\tpublic deltaOutboundPacketsSent = 0;\n\tpublic deltaDataChannelBytesSent = 0;\n\tpublic deltaDataChannelBytesReceived = 0;\n\tpublic deltaDataChannelMessagesSent = 0;\n\tpublic deltaDataChannelMessagesReceived = 0;\n\tpublic deltaInboundReceivedBytes = 0;\n\tpublic deltaOutboundSentBytes = 0;\n\n\tpublic deltaReceivedAudioBytes = 0;\n\tpublic deltaReceivedVideoBytes = 0;\n\tpublic deltaReceivedAudioPackets = 0;\n\tpublic deltaReceivedVideoPackets = 0;\n\tpublic deltaSentAudioBytes = 0;\n\tpublic deltaSentVideoBytes = 0;\n\tpublic deltaSentAudioPackets = 0;\n\tpublic deltaSentVideoPackets = 0;\n\tpublic deltaTransportSentBytes = 0;\n\tpublic deltaTransportReceivedBytes = 0;\n\n\tpublic receivingPacketsPerSecond = 0;\n\tpublic sendingPacketsPerSecond = 0;\n\tpublic sendingAudioBitrate = 0;\n\tpublic sendingVideoBitrate = 0;\n\tpublic receivingAudioBitrate = 0;\n\tpublic receivingVideoBitrate = 0;\n\n\tpublic currentRttInMs?: number;\n\tpublic currentJitter?: number;\n\n\tpublic usingTCP = false;\n\tpublic usingTURN = false;\n\n\tpublic observedTurnServer?: ObservedTurnServer;\n\tpublic readonly observedCertificates = new Map<string, ObservedCertificate>();\n\tpublic readonly observedCodecs = new Map<string, ObservedCodec>();\n\tpublic readonly observedDataChannels = new Map<string, ObservedDataChannel>();\n\tpublic readonly observedIceCandidates = new Map<string, ObservedIceCandidate>();\n\tpublic readonly observedIceCandidatesPair = new Map<string, ObservedIceCandidatePair>();\n\tpublic readonly observedIceTransports = new Map<string, ObservedIceTransport>();\n\tpublic readonly observedInboundRtps = new Map<number, ObservedInboundRtp>();\n\tpublic readonly observedInboundTracks = new Map<string, ObservedInboundTrack>();\n\tpublic readonly observedMediaPlayouts = new Map<string, ObservedMediaPlayout>();\n\tpublic readonly observedMediaSources = new Map<string, ObservedMediaSource>();\n\tpublic readonly observedOutboundRtps = new Map<number, ObservedOutboundRtp>();\n\tpublic readonly observedOutboundTracks = new Map<string, ObservedOutboundTrack>();\n\tpublic readonly observedPeerConnectionTransports = new Map<string, ObservedPeerConnectionTransport>();\n\tpublic readonly observedRemoteInboundRtps = new Map<number, ObservedRemoteInboundRtp>();\n\tpublic readonly observedRemoteOutboundRtps = new Map<number, ObservedRemoteOutboundRtp>();\n\n\tprivate readonly eventScope: ObservedPeerConnectionScope;\n\n\tpublic constructor(public readonly peerConnectionId: string, public readonly client: ObservedClient) {\n\t\tsuper();\n\t\tthis.setMaxListeners(Infinity);\n\t\tthis.eventScope = {\n\t\t\tobserver: client.call.observer,\n\t\t\tobservedCall: client.call,\n\t\t\tobservedClient: client,\n\t\t\tobservedPeerConnection: this,\n\t\t};\n\t}\n\n\tpublic get score() {\n\t\treturn this.calculatedScore.value;\n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic get codecs() {\n\t\treturn [ ...this.observedCodecs.values() ];\n\t}\n\n\tpublic get inboundRtps() {\n\t\treturn [ ...this.observedInboundRtps.values() ];\n\t}\n\n\tpublic get remoteOutboundRtps() {\n\t\treturn [ ...this.observedRemoteOutboundRtps.values() ];\n\t}\n\n\tpublic get outboundRtps() {\n\t\treturn [ ...this.observedOutboundRtps.values() ];\n\t}\n\n\tpublic get remoteInboundRtps() {\n\t\treturn [ ...this.observedRemoteInboundRtps.values() ];\n\t}\n\n\tpublic get mediaSources() {\n\t\treturn [ ...this.observedMediaSources.values() ];\n\t}\n\n\tpublic get mediaPlayouts() {\n\t\treturn [ ...this.observedMediaPlayouts.values() ];\n\t}\n\n\tpublic get dataChannels() {\n\t\treturn [ ...this.observedDataChannels.values() ];\n\t}\n\n\tpublic get peerConnectionTransports() {\n\t\treturn [ ...this.observedPeerConnectionTransports.values() ];\n\t}\n\n\tpublic get iceTransports() {\n\t\treturn [ ...this.observedIceTransports.values() ];\n\t}\n\n\tpublic get iceCandidates() {\n\t\treturn [ ...this.observedIceCandidates.values() ];\n\t}\n\n\tpublic get iceCandidatePairs() {\n\t\treturn [ ...this.observedIceCandidatesPair.values() ];\n\t}\n\n\tpublic get certificates() {\n\t\treturn [ ...this.observedCertificates.values() ];\n\t}\n\n\tpublic get selectedIceCandidatePairs() {\n\t\treturn this.iceTransports.map((iceTransport) => iceTransport.getSelectedCandidatePair())\n\t\t\t.filter((pair) => pair !== undefined) as ObservedIceCandidatePair[];\n\t}\n\n\tpublic get selectedIceCandiadtePairForTurn() {\n\t\treturn this.selectedIceCandidatePairs\n\t\t\t.filter((pair) =>\n\t\t\t\tpair.getLocalCandidate()?.candidateType === 'relay' &&\n\t\t\t\tpair.getRemoteCandidate()?.url?.startsWith('turn:')\n\t\t\t);\n\t}\n\n\tpublic close() {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\n\t\tthis.observedCertificates.forEach((observedCertificate) => this._notify('certificate-removed', { ...this.eventScope, observedCertificate }));\n\t\tthis.observedCodecs.forEach((observedCodec) => this._notify('codec-removed', { ...this.eventScope, observedCodec }));\n\t\tthis.observedDataChannels.forEach((observedDataChannel) => this._notify('data-channel-removed', { ...this.eventScope, observedDataChannel }));\n\t\tthis.observedIceCandidates.forEach((observedIceCandidate) => this._notify('ice-candidate-removed', { ...this.eventScope, observedIceCandidate }));\n\t\tthis.observedIceCandidatesPair.forEach((pair) => this._notify('ice-candidate-pair-removed', { ...this.eventScope, observedIceCandidatePair: pair }));\n\t\tthis.observedIceTransports.forEach((transport) => this._notify('ice-transport-removed', { ...this.eventScope, observedIceTransport: transport }));\n\t\tthis.observedInboundRtps.forEach((rtp) => this._notify('inbound-rtp-removed', { ...this.eventScope, observedInboundRtp: rtp }));\n\t\tthis.observedInboundTracks.forEach((track) => { this.emit('removed-inbound-track', track); this._notify('inbound-track-removed', { ...this.eventScope, observedInboundTrack: track }); });\n\t\tthis.observedMediaPlayouts.forEach((playout) => this._notify('media-playout-removed', { ...this.eventScope, observedMediaPlayout: playout }));\n\t\tthis.observedMediaSources.forEach((source) => this._notify('media-source-removed', { ...this.eventScope, observedMediaSource: source }));\n\t\tthis.observedOutboundRtps.forEach((rtp) => this._notify('outbound-rtp-removed', { ...this.eventScope, observedOutboundRtp: rtp }));\n\t\tthis.observedOutboundTracks.forEach((track) => { this.emit('removed-outbound-track', track); this._notify('outbound-track-removed', { ...this.eventScope, observedOutboundTrack: track }); });\n\t\tthis.observedPeerConnectionTransports.forEach((transport) => this._notify('peer-connection-transport-removed', { ...this.eventScope, observedPeerConnectionTransport: transport }));\n\t\tthis.observedRemoteInboundRtps.forEach((rtp) => this._notify('remote-inbound-rtp-removed', { ...this.eventScope, observedRemoteInboundRtp: rtp }));\n\t\tthis.observedRemoteOutboundRtps.forEach((rtp) => this._notify('remote-outbound-rtp-removed', { ...this.eventScope, observedRemoteOutboundRtp: rtp }));\n\n\t\tthis.observedCertificates.clear();\n\t\tthis.observedCodecs.clear();\n\t\tthis.observedDataChannels.clear();\n\t\tthis.observedIceCandidates.clear();\n\t\tthis.observedIceCandidatesPair.clear();\n\t\tthis.observedIceTransports.clear();\n\t\tthis.observedInboundRtps.clear();\n\t\tthis.observedInboundTracks.clear();\n\t\tthis.observedMediaPlayouts.clear();\n\t\tthis.observedMediaSources.clear();\n\t\tthis.observedOutboundRtps.clear();\n\t\tthis.observedOutboundTracks.clear();\n\t\tthis.observedPeerConnectionTransports.clear();\n\t\tthis.observedRemoteInboundRtps.clear();\n\t\tthis.observedRemoteOutboundRtps.clear();\n\n\t\tthis.client.call.observer.observedTURN.removePeerConnection(this);\n\n\t\tif (!this.closedAt) this.closedAt = Date.now();\n\n\t\tthis.emit('close');\n\t\tthis._notify('peer-connection-closed', { ...this.eventScope });\n\t}\n\n\tpublic accept(sample: PeerConnectionSample, context?: AcceptContext) {\n\t\tif (this.closed) return;\n\t\tthis._visited = true;\n\n\t\tif (context) this.appData = { ...this.appData, ...context };\n\n\t\tthis.availableIncomingBitrate = 0;\n\t\tthis.availableOutgoingBitrate = 0;\n\t\tthis.deltaInboundPacketsLost = 0;\n\t\tthis.deltaInboundPacketsReceived = 0;\n\t\tthis.deltaOutboundPacketsSent = 0;\n\t\tthis.deltaDataChannelBytesSent = 0;\n\t\tthis.deltaDataChannelBytesReceived = 0;\n\t\tthis.deltaInboundReceivedBytes = 0;\n\t\tthis.deltaOutboundSentBytes = 0;\n\t\tthis.deltaReceivedAudioBytes = 0;\n\t\tthis.deltaReceivedVideoBytes = 0;\n\t\tthis.deltaReceivedAudioPackets = 0;\n\t\tthis.deltaReceivedVideoPackets = 0;\n\t\tthis.deltaSentAudioBytes = 0;\n\t\tthis.deltaSentVideoBytes = 0;\n\t\tthis.deltaSentAudioPackets = 0;\n\t\tthis.deltaSentVideoPackets = 0;\n\t\tthis.deltaTransportReceivedBytes = 0;\n\t\tthis.deltaTransportSentBytes = 0;\n\n\t\tthis.sendingAudioBitrate = 0;\n\t\tthis.sendingVideoBitrate = 0;\n\t\tthis.receivingAudioBitrate = 0;\n\t\tthis.receivingVideoBitrate = 0;\n\n\t\tconst now = Date.now();\n\t\tconst elapsedTimeInMs = now - this.updated;\n\t\tconst elapsedTimeInSec = elapsedTimeInMs / 1000;\n\t\tconst rttMeasurementsInSec: number[] = [];\n\t\tconst jitterMeasurements: number[] = [];\n\n\t\tif (sample.certificates) {\n\t\t\tfor (const certificate of sample.certificates) {\n\t\t\t\tthis._updateCertificateStats(certificate);\n\t\t\t}\n\t\t}\n\t\tif (sample.codecs) {\n\t\t\tfor (const codec of sample.codecs) {\n\t\t\t\tthis._updateCodecStats(codec);\n\t\t\t}\n\t\t}\n\t\tif (sample.dataChannels) {\n\t\t\tfor (const dataChannel of sample.dataChannels) {\n\t\t\t\tconst observedDataChannel = this._updateDataChannelStats(dataChannel);\n\n\t\t\t\tif (!observedDataChannel) continue;\n\n\t\t\t\tthis.deltaDataChannelBytesSent += observedDataChannel.deltaBytesSent;\n\t\t\t\tthis.deltaDataChannelBytesReceived += observedDataChannel.deltaBytesReceived;\n\t\t\t\tthis.deltaDataChannelMessagesSent += observedDataChannel.deltaMessagesSent;\n\t\t\t\tthis.deltaDataChannelMessagesReceived += observedDataChannel.deltaMessagesReceived;\n\t\t\t}\n\t\t}\n\t\tif (sample.iceCandidates) {\n\t\t\tfor (const iceCandidate of sample.iceCandidates) {\n\t\t\t\tthis._updateIceCandidateStats(iceCandidate);\n\t\t\t}\n\t\t}\n\t\tif (sample.iceCandidatePairs) {\n\t\t\tfor (const iceCandidatePair of sample.iceCandidatePairs) {\n\t\t\t\tconst observedCandidatePair = this._updateIceCandidatePairStats(iceCandidatePair);\n\n\t\t\t\tif (!observedCandidatePair) continue;\n\n\t\t\t\tif (observedCandidatePair.currentRoundTripTime) {\n\t\t\t\t\trttMeasurementsInSec.push(observedCandidatePair.currentRoundTripTime);\n\t\t\t\t}\n\t\t\t\tif (observedCandidatePair.availableIncomingBitrate) {\n\t\t\t\t\tthis.availableIncomingBitrate += observedCandidatePair.availableIncomingBitrate;\n\t\t\t\t}\n\t\t\t\tif (observedCandidatePair.availableOutgoingBitrate) {\n\t\t\t\t\tthis.availableOutgoingBitrate += observedCandidatePair.availableOutgoingBitrate;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (sample.iceTransports) {\n\t\t\tfor (const iceTransport of sample.iceTransports) {\n\t\t\t\tconst observedIceTransport = this._updateIceTransportStats(iceTransport);\n\n\t\t\t\tif (!observedIceTransport) continue;\n\t\t\t}\n\t\t}\n\t\tif (sample.inboundRtps) {\n\t\t\tfor (const inboundRtp of sample.inboundRtps) {\n\t\t\t\tconst observedInboundRtp = this._updateInboundRtpStats(inboundRtp);\n\n\t\t\t\tif (!observedInboundRtp) continue;\n\n\t\t\t\tthis.deltaInboundPacketsLost += observedInboundRtp.deltaLostPackets;\n\t\t\t\tthis.deltaInboundPacketsReceived += observedInboundRtp.deltaReceivedPackets;\n\t\t\t\tthis.deltaInboundReceivedBytes += observedInboundRtp.deltaBytesReceived;\n\n\t\t\t\tswitch (inboundRtp.kind) {\n\t\t\t\t\tcase 'audio':\n\t\t\t\t\t\tthis.deltaReceivedAudioBytes += observedInboundRtp.deltaBytesReceived;\n\t\t\t\t\t\tthis.deltaReceivedAudioPackets += observedInboundRtp.deltaReceivedPackets;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'video':\n\t\t\t\t\t\tthis.deltaReceivedVideoBytes += observedInboundRtp.deltaBytesReceived;\n\t\t\t\t\t\tthis.deltaReceivedVideoPackets += observedInboundRtp.deltaReceivedPackets;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (observedInboundRtp.jitter) {\n\t\t\t\t\tjitterMeasurements.push(observedInboundRtp.jitter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (sample.mediaPlayouts) {\n\t\t\tfor (const mediaPlayout of sample.mediaPlayouts) {\n\t\t\t\tthis._updateMediaPlayoutStats(mediaPlayout);\n\t\t\t}\n\t\t}\n\t\tif (sample.mediaSources) {\n\t\t\tfor (const mediaSource of sample.mediaSources) {\n\t\t\t\tthis._updateMediaSourceStats(mediaSource);\n\t\t\t}\n\t\t}\n\t\tif (sample.outboundRtps) {\n\t\t\tfor (const outboundRtp of sample.outboundRtps) {\n\t\t\t\tconst observedOutboundRtp = this._updateOutboundRtpStats(outboundRtp);\n\n\t\t\t\tif (!observedOutboundRtp) continue;\n\n\t\t\t\tthis.deltaOutboundPacketsSent += observedOutboundRtp.deltaPacketsSent ?? 0;\n\t\t\t\tthis.deltaOutboundSentBytes += observedOutboundRtp.deltaBytesSent ?? 0;\n\n\t\t\t\tswitch (outboundRtp.kind) {\n\t\t\t\t\tcase 'audio':\n\t\t\t\t\t\tthis.deltaSentAudioBytes += observedOutboundRtp.deltaBytesSent;\n\t\t\t\t\t\tthis.deltaSentAudioPackets += observedOutboundRtp.deltaPacketsSent;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'video':\n\t\t\t\t\t\tthis.deltaSentVideoBytes += observedOutboundRtp.deltaBytesSent;\n\t\t\t\t\t\tthis.deltaSentVideoPackets += observedOutboundRtp.deltaPacketsSent;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tif (sample.peerConnectionTransports) {\n\t\t\tfor (const peerConnectionTransport of sample.peerConnectionTransports) {\n\t\t\t\tconst observedTransport = this._updatePeerConnectionTransportStats(peerConnectionTransport);\n\n\t\t\t\tif (!observedTransport) continue;\n\n\t\t\t}\n\t\t}\n\t\tif (sample.remoteInboundRtps) {\n\t\t\tfor (const remoteInboundRtp of sample.remoteInboundRtps) {\n\t\t\t\tconst observedRemoteInboundRtp = this._updateRemoteInboundRtpStats(remoteInboundRtp);\n\n\t\t\t\tif (!observedRemoteInboundRtp) continue;\n\n\t\t\t\tif (observedRemoteInboundRtp.roundTripTime) {\n\t\t\t\t\trttMeasurementsInSec.push(observedRemoteInboundRtp.roundTripTime);\n\t\t\t\t}\n\n\t\t\t\t// Surface receiver-report-derived metrics on the corresponding local outbound-rtp.\n\t\t\t\tconst observedOutboundRtp = observedRemoteInboundRtp.getOutboundRtp();\n\n\t\t\t\tif (observedOutboundRtp) {\n\t\t\t\t\tif (observedRemoteInboundRtp.roundTripTime !== undefined) {\n\t\t\t\t\t\tobservedOutboundRtp.remoteRttInMs = observedRemoteInboundRtp.roundTripTime * 1000;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteInboundRtp.fractionLost !== undefined) {\n\t\t\t\t\t\tobservedOutboundRtp.remoteFractionLost = observedRemoteInboundRtp.fractionLost;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteInboundRtp.jitter !== undefined) {\n\t\t\t\t\t\tobservedOutboundRtp.remoteJitter = observedRemoteInboundRtp.jitter;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteInboundRtp.packetsLost !== undefined) {\n\t\t\t\t\t\tobservedOutboundRtp.remotePacketsLost = observedRemoteInboundRtp.packetsLost;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (sample.remoteOutboundRtps) {\n\t\t\tfor (const remoteOutboundRtp of sample.remoteOutboundRtps) {\n\t\t\t\tconst observedRemoteOutboundRtp = this._updateRemoteOutboundRtpStats(remoteOutboundRtp);\n\n\t\t\t\tif (!observedRemoteOutboundRtp) continue;\n\n\t\t\t\t// Surface sender-report-derived metrics on the corresponding local inbound-rtp.\n\t\t\t\tconst observedInboundRtp = observedRemoteOutboundRtp.getInboundRtp();\n\n\t\t\t\tif (observedInboundRtp) {\n\t\t\t\t\tif (observedRemoteOutboundRtp.roundTripTime !== undefined) {\n\t\t\t\t\t\tobservedInboundRtp.remoteRttInMs = observedRemoteOutboundRtp.roundTripTime * 1000;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteOutboundRtp.bytesSent !== undefined) {\n\t\t\t\t\t\tobservedInboundRtp.remoteBytesSent = observedRemoteOutboundRtp.bytesSent;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteOutboundRtp.packetsSent !== undefined) {\n\t\t\t\t\t\tobservedInboundRtp.remotePacketsSent = observedRemoteOutboundRtp.packetsSent;\n\t\t\t\t\t}\n\t\t\t\t\tif (observedRemoteOutboundRtp.remoteTimestamp !== undefined) {\n\t\t\t\t\t\tobservedInboundRtp.remoteTimestamp = observedRemoteOutboundRtp.remoteTimestamp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// tracks should be updated last as they are derived stats\n\t\t// and depends on base stats but they all received in the sample sample\n\t\tif (sample.inboundTracks) {\n\t\t\tfor (const inboundTrack of sample.inboundTracks) {\n\t\t\t\tthis._updateInboundTrackSample(inboundTrack);\n\t\t\t}\n\t\t}\n\t\tif (sample.outboundTracks) {\n\t\t\tfor (const outboundTrack of sample.outboundTracks) {\n\t\t\t\tthis._updateOutboundTrackSample(outboundTrack);\n\t\t\t}\n\t\t}\n\n\t\tthis.totalInboundPacketsLost += this.deltaInboundPacketsLost;\n\t\tthis.totalInboundPacketsReceived += this.deltaInboundPacketsReceived;\n\t\tthis.totalOutboundPacketsSent += this.deltaOutboundPacketsSent;\n\t\tthis.totalDataChannelBytesSent += this.deltaDataChannelBytesSent;\n\t\tthis.totalDataChannelBytesReceived += this.deltaDataChannelBytesReceived;\n\t\tthis.totalDataChannelMessagesSent += this.deltaDataChannelMessagesSent;\n\t\tthis.totalDataChannelMessagesReceived += this.deltaDataChannelMessagesReceived;\n\t\tthis.totalReceivedAudioBytes += this.deltaReceivedAudioBytes;\n\t\tthis.totalReceivedVideoBytes += this.deltaReceivedVideoBytes;\n\t\tthis.totalSentAudioBytes += this.deltaSentAudioBytes;\n\t\tthis.totalSentVideoBytes += this.deltaSentVideoBytes;\n\t\tthis.totalReceivedAudioPacktes += this.deltaReceivedAudioPackets;\n\t\tthis.totalReceivedVideoPackets += this.deltaReceivedVideoPackets;\n\t\tthis.totalSentAudioPackets += this.deltaSentAudioPackets;\n\t\tthis.totalSentVideoPackets += this.deltaSentVideoPackets;\n\n\t\tthis.receivingPacketsPerSecond = this.deltaInboundPacketsReceived / elapsedTimeInSec;\n\t\tthis.sendingPacketsPerSecond = this.deltaOutboundPacketsSent / elapsedTimeInSec;\n\t\tthis.sendingAudioBitrate = (this.deltaSentAudioBytes * 8) / elapsedTimeInSec;\n\t\tthis.sendingVideoBitrate = (this.deltaSentVideoBytes * 8) / elapsedTimeInSec;\n\t\tthis.receivingAudioBitrate = (this.deltaReceivedAudioBytes * 8) / elapsedTimeInSec;\n\t\tthis.receivingVideoBitrate = (this.deltaReceivedVideoBytes * 8) / elapsedTimeInSec;\n\n\t\tif (rttMeasurementsInSec.length > 0) {\n\t\t\tthis.currentRttInMs = getMedian(rttMeasurementsInSec, false) * 1000;\n\t\t} else {\n\t\t\tthis.currentRttInMs = undefined;\n\t\t}\n\t\tif (jitterMeasurements.length > 0) {\n\t\t\tthis.currentJitter = getMedian(jitterMeasurements, false);\n\t\t} else {\n\t\t\tthis.currentJitter = undefined;\n\t\t}\n\t\tconst wasUsingTURN = this.usingTURN;\n\t\tconst selectedIceCandidatePairs = this.selectedIceCandidatePairs;\n\t\tconst selectedCandidatePairForTurn: ObservedIceCandidatePair[] = [];\n\n\t\tthis.usingTCP = false;\n\t\tthis.usingTURN = false;\n\n\t\tfor (const selectedCandidatePair of selectedIceCandidatePairs) {\n\t\t\tif (selectedCandidatePair.getLocalCandidate()?.protocol === 'tcp') {\n\t\t\t\tthis.usingTCP = true;\n\t\t\t}\n\t\t\tif (selectedCandidatePair.getLocalCandidate()?.candidateType === 'relay' && selectedCandidatePair.getRemoteCandidate()?.url?.startsWith('turn:')) {\n\t\t\t\tselectedCandidatePairForTurn.push(selectedCandidatePair);\n\t\t\t\tthis.usingTURN = true;\n\t\t\t}\n\t\t\tthis.deltaTransportReceivedBytes += selectedCandidatePair.deltaBytesReceived;\n\t\t\tthis.deltaTransportSentBytes += selectedCandidatePair.deltaBytesSent;\n\t\t}\n\n\t\tif (this.usingTURN) {\n\t\t\tif (!this.observedTurnServer) {\n\t\t\t\tthis.observedTurnServer = this.client.call.observer.observedTURN.addPeerConnection(this);\n\t\t\t}\n\t\t\tthis.observedTurnServer?.updateTurnUsage(...selectedCandidatePairForTurn);\n\t\t} else if (wasUsingTURN) {\n\t\t\tif (!this.usingTURN) {\n\t\t\t\tthis.client.call.observer.observedTURN.removePeerConnection(this);\n\t\t\t}\n\t\t}\n\t\tthis.calculatedScore.value = sample.score;\n\t\tthis.updated = now;\n\t\tthis._checkVisited();\n\n\t\tthis._notify('peer-connection-updated', { ...this.eventScope, context });\n\t}\n\n\tprivate _checkVisited() {\n\t\tfor (const certificate of [ ...this.observedCertificates.values() ]) {\n\t\t\tif (certificate.visited) continue;\n\n\t\t\tthis.observedCertificates.delete(certificate.id);\n\t\t}\n\t\tfor (const observedCodec of [ ...this.observedCodecs.values() ]) {\n\t\t\tif (observedCodec.visited) continue;\n\n\t\t\tthis.observedCodecs.delete(observedCodec.id);\n\t\t\tthis._notify('codec-removed', { ...this.eventScope, observedCodec });\n\t\t}\n\t\tfor (const observedDataChannel of [ ...this.observedDataChannels.values() ]) {\n\t\t\tif (observedDataChannel.visited) continue;\n\n\t\t\tthis.observedDataChannels.delete(observedDataChannel.id);\n\t\t\tthis._notify('data-channel-removed', { ...this.eventScope, observedDataChannel });\n\t\t}\n\t\tfor (const observedIceCandidate of [ ...this.observedIceCandidates.values() ]) {\n\t\t\tif (observedIceCandidate.visited) continue;\n\n\t\t\tthis.observedIceCandidates.delete(observedIceCandidate.id);\n\t\t\tthis._notify('ice-candidate-removed', { ...this.eventScope, observedIceCandidate });\n\t\t}\n\t\tfor (const observedIceCandidatePair of [ ...this.observedIceCandidatesPair.values() ]) {\n\t\t\tif (observedIceCandidatePair.visited) continue;\n\n\t\t\tthis.observedIceCandidatesPair.delete(observedIceCandidatePair.id);\n\t\t\tthis._notify('ice-candidate-pair-removed', { ...this.eventScope, observedIceCandidatePair });\n\t\t}\n\t\tfor (const observedIceTransport of [ ...this.observedIceTransports.values() ]) {\n\t\t\tif (observedIceTransport.visited) continue;\n\n\t\t\tthis.observedIceTransports.delete(observedIceTransport.id);\n\t\t\tthis._notify('ice-transport-removed', { ...this.eventScope, observedIceTransport });\n\t\t}\n\t\tfor (const observedInboundRtp of [ ...this.observedInboundRtps.values() ]) {\n\t\t\tif (observedInboundRtp.visited) continue;\n\n\t\t\tthis.observedInboundRtps.delete(observedInboundRtp.ssrc);\n\t\t\tthis._notify('inbound-rtp-removed', { ...this.eventScope, observedInboundRtp });\n\t\t}\n\t\tfor (const observedInboundTrack of [ ...this.observedInboundTracks.values() ]) {\n\t\t\tif (observedInboundTrack.visited) continue;\n\n\t\t\tthis.observedInboundTracks.delete(observedInboundTrack.id);\n\t\t\tthis.emit('removed-inbound-track', observedInboundTrack);\n\t\t\tthis._notify('inbound-track-removed', { ...this.eventScope, observedInboundTrack });\n\t\t}\n\t\tfor (const observedMediaPlayout of [ ...this.observedMediaPlayouts.values() ]) {\n\t\t\tif (observedMediaPlayout.visited) continue;\n\n\t\t\tthis.observedMediaPlayouts.delete(observedMediaPlayout.id);\n\t\t\tthis._notify('media-playout-removed', { ...this.eventScope, observedMediaPlayout });\n\t\t}\n\t\tfor (const observedMediaSource of [ ...this.observedMediaSources.values() ]) {\n\t\t\tif (observedMediaSource.visited) continue;\n\n\t\t\tthis.observedMediaSources.delete(observedMediaSource.id);\n\t\t\tthis._notify('media-source-removed', { ...this.eventScope, observedMediaSource });\n\t\t}\n\t\tfor (const observedOutboundRtp of [ ...this.observedOutboundRtps.values() ]) {\n\t\t\tif (observedOutboundRtp.visited) continue;\n\n\t\t\tthis.observedOutboundRtps.delete(observedOutboundRtp.ssrc);\n\t\t\tthis._notify('outbound-rtp-removed', { ...this.eventScope, observedOutboundRtp });\n\t\t}\n\t\tfor (const observedOutboundTrack of [ ...this.observedOutboundTracks.values() ]) {\n\t\t\tif (observedOutboundTrack.visited) continue;\n\n\t\t\tthis.observedOutboundTracks.delete(observedOutboundTrack.id);\n\t\t\tthis.emit('removed-outbound-track', observedOutboundTrack);\n\t\t\tthis._notify('outbound-track-removed', { ...this.eventScope, observedOutboundTrack });\n\t\t}\n\t\tfor (const observedPeerConnectionTransport of [ ...this.observedPeerConnectionTransports.values() ]) {\n\t\t\tif (observedPeerConnectionTransport.visited) continue;\n\n\t\t\tthis.observedPeerConnectionTransports.delete(observedPeerConnectionTransport.id);\n\t\t\tthis._notify('peer-connection-transport-removed', { ...this.eventScope, observedPeerConnectionTransport });\n\t\t}\n\t\tfor (const observedRemoteInboundRtp of [ ...this.observedRemoteInboundRtps.values() ]) {\n\t\t\tif (observedRemoteInboundRtp.visited) continue;\n\n\t\t\tthis.observedRemoteInboundRtps.delete(observedRemoteInboundRtp.ssrc);\n\t\t\tthis._notify('remote-inbound-rtp-removed', { ...this.eventScope, observedRemoteInboundRtp });\n\t\t}\n\t\tfor (const observedRemoteOutboundRtp of [ ...this.observedRemoteOutboundRtps.values() ]) {\n\t\t\tif (observedRemoteOutboundRtp.visited) continue;\n\n\t\t\tthis.observedRemoteOutboundRtps.delete(observedRemoteOutboundRtp.ssrc);\n\t\t\tthis._notify('remote-outbound-rtp-removed', { ...this.eventScope, observedRemoteOutboundRtp });\n\t\t}\n\t}\n\n\tprivate _updateCertificateStats(stats: CertificateStats) {\n\t\tlet observedCertificate = this.observedCertificates.get(stats.id);\n\n\t\tif (!observedCertificate) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.fingerprint) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid CertificateStats (missing timestamp OR id OR fingerprint field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedCertificate = new ObservedCertificate(stats.timestamp, stats.id, this);\n\n\t\t\tobservedCertificate.update(stats);\n\n\t\t\tthis.observedCertificates.set(stats.id, observedCertificate);\n\t\t\tthis._notify('certificate-added', { ...this.eventScope, observedCertificate });\n\t\t} else {\n\t\t\tobservedCertificate.update(stats);\n\t\t\tthis._notify('certificate-updated', { ...this.eventScope, observedCertificate });\n\t\t}\n\n\t\treturn observedCertificate;\n\t}\n\n\tprivate _updateCodecStats(stats: CodecStats) {\n\t\tlet observedCodec = this.observedCodecs.get(stats.id);\n\n\t\tif (!observedCodec) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.mimeType) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid CodecStats (missing timestamp OR id OR mimeType field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedCodec = new ObservedCodec(stats.timestamp, stats.id, stats.mimeType, this);\n\n\t\t\tobservedCodec.update(stats);\n\n\t\t\tthis.observedCodecs.set(stats.id, observedCodec);\n\t\t\tthis._notify('codec-added', { ...this.eventScope, observedCodec });\n\t\t} else {\n\t\t\tobservedCodec.update(stats);\n\t\t}\n\t\tthis._notify('codec-updated', { ...this.eventScope, observedCodec });\n\n\t\treturn observedCodec;\n\t}\n\n\tprivate _updateDataChannelStats(stats: DataChannelStats) {\n\t\tlet observedDataChannel = this.observedDataChannels.get(stats.id);\n\n\t\tif (!observedDataChannel) {\n\t\t\tif (!stats.timestamp || !stats.id) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid DataChannelStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedDataChannel = new ObservedDataChannel(stats.timestamp, stats.id, this);\n\n\t\t\tobservedDataChannel.update(stats);\n\n\t\t\tthis.observedDataChannels.set(stats.id, observedDataChannel);\n\t\t\tthis._notify('data-channel-added', { ...this.eventScope, observedDataChannel });\n\t\t} else {\n\t\t\tobservedDataChannel.update(stats);\n\t\t}\n\t\tthis._notify('data-channel-updated', { ...this.eventScope, observedDataChannel });\n\n\t\treturn observedDataChannel;\n\t}\n\n\tprivate _updateIceCandidateStats(stats: IceCandidateStats) {\n\t\tlet observedIceCandidate = this.observedIceCandidates.get(stats.id);\n\n\t\tif (!observedIceCandidate) {\n\t\t\tif (!stats.timestamp || !stats.id) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedIceCandidate = new ObservedIceCandidate(stats.timestamp, stats.id, this);\n\n\t\t\tobservedIceCandidate.update(stats);\n\n\t\t\tthis.observedIceCandidates.set(stats.id, observedIceCandidate);\n\t\t\tthis._notify('ice-candidate-added', { ...this.eventScope, observedIceCandidate });\n\t\t} else {\n\t\t\tobservedIceCandidate.update(stats);\n\t\t}\n\t\tthis._notify('ice-candidate-updated', { ...this.eventScope, observedIceCandidate });\n\n\t\treturn observedIceCandidate;\n\t}\n\n\tprivate _updateIceCandidatePairStats(stats: IceCandidateStats) {\n\t\tlet observedIceCandidatePair = this.observedIceCandidatesPair.get(stats.id);\n\n\t\tif (!observedIceCandidatePair) {\n\t\t\tif (!stats.timestamp || !stats.id) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedIceCandidatePair = new ObservedIceCandidatePair(stats.timestamp, stats.id, this);\n\n\t\t\tobservedIceCandidatePair.update(stats);\n\n\t\t\tthis.observedIceCandidatesPair.set(stats.id, observedIceCandidatePair);\n\t\t\tthis._notify('ice-candidate-pair-added', { ...this.eventScope, observedIceCandidatePair });\n\t\t} else {\n\t\t\tobservedIceCandidatePair.update(stats);\n\t\t}\n\t\tthis._notify('ice-candidate-pair-updated', { ...this.eventScope, observedIceCandidatePair });\n\n\t\treturn observedIceCandidatePair;\n\t}\n\n\tprivate _updateIceTransportStats(stats: IceCandidateStats) {\n\t\tlet observedIceTransport = this.observedIceTransports.get(stats.id);\n\n\t\tif (!observedIceTransport) {\n\t\t\tif (!stats.timestamp || !stats.id) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid IceCandidateStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedIceTransport = new ObservedIceTransport(stats.timestamp, stats.id, this);\n\n\t\t\tobservedIceTransport.update(stats);\n\n\t\t\tthis.observedIceTransports.set(stats.id, observedIceTransport);\n\t\t\tthis._notify('ice-transport-added', { ...this.eventScope, observedIceTransport });\n\t\t} else {\n\t\t\tobservedIceTransport.update(stats);\n\t\t}\n\t\tthis._notify('ice-transport-updated', { ...this.eventScope, observedIceTransport });\n\n\t\treturn observedIceTransport;\n\t}\n\n\tprivate _updateInboundRtpStats(stats: InboundRtpStats) {\n\t\tlet observedInboundRtp = this.observedInboundRtps.get(stats.ssrc);\n\n\t\tif (!observedInboundRtp) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.ssrc || !stats.kind || !stats.trackIdentifier) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR ssrc OR kind OR trackIdentifier field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedInboundRtp = new ObservedInboundRtp(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.ssrc,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tstats.trackIdentifier,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedInboundRtp.update(stats);\n\n\t\t\tthis.observedInboundRtps.set(stats.ssrc, observedInboundRtp);\n\t\t\tthis._notify('inbound-rtp-added', { ...this.eventScope, observedInboundRtp });\n\t\t} else {\n\t\t\tobservedInboundRtp.update(stats);\n\t\t}\n\t\tthis._notify('inbound-rtp-updated', { ...this.eventScope, observedInboundRtp });\n\n\t\treturn observedInboundRtp;\n\t}\n\n\tprivate _updateInboundTrackSample(stats: InboundTrackSample) {\n\t\tlet observedInboundTrack = this.observedInboundTracks.get(stats.id);\n\n\t\tif (!observedInboundTrack) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid InboundTrackSample (missing timestamp OR id OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst inboundRtp = [ ...this.observedInboundRtps.values() ].find((inbRtp) => inbRtp.trackIdentifier === stats.id);\n\t\t\tconst mediaPlayout = inboundRtp ?\n\t\t\t\t[ ...this.observedMediaPlayouts.values() ].find((mp) => mp.id === inboundRtp.playoutId) : undefined;\n\n\t\t\tobservedInboundTrack = new ObservedInboundTrack(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis,\n\t\t\t\tinboundRtp,\n\t\t\t\tmediaPlayout,\n\t\t\t);\n\n\t\t\tobservedInboundTrack.update(stats);\n\n\t\t\tthis.observedInboundTracks.set(stats.id, observedInboundTrack);\n\t\t\tthis._notify('inbound-track-added', { ...this.eventScope, observedInboundTrack });\n\t\t} else {\n\t\t\tobservedInboundTrack.update(stats);\n\t\t}\n\t\tthis._notify('inbound-track-updated', { ...this.eventScope, observedInboundTrack });\n\n\t\treturn observedInboundTrack;\n\t}\n\n\tprivate _updateMediaPlayoutStats(stats: MediaPlayoutStats) {\n\t\tlet observedMediaPlayout = this.observedMediaPlayouts.get(stats.id);\n\n\t\tif (!observedMediaPlayout) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR kind OR trackIdentifier field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedMediaPlayout = new ObservedMediaPlayout(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedMediaPlayout.update(stats);\n\n\t\t\tthis.observedMediaPlayouts.set(stats.id, observedMediaPlayout);\n\t\t\tthis._notify('media-playout-added', { ...this.eventScope, observedMediaPlayout });\n\t\t} else {\n\t\t\tobservedMediaPlayout.update(stats);\n\t\t}\n\t\tthis._notify('media-playout-updated', { ...this.eventScope, observedMediaPlayout });\n\n\t\treturn observedMediaPlayout;\n\t}\n\n\tprivate _updateMediaSourceStats(stats: MediaSourceStats) {\n\t\tlet observedMediaSource = this.observedMediaSources.get(stats.id);\n\n\t\tif (!observedMediaSource) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid InboundRtpStats (missing timestamp OR id OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedMediaSource = new ObservedMediaSource(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedMediaSource.update(stats);\n\n\t\t\tthis.observedMediaSources.set(stats.id, observedMediaSource);\n\t\t\tthis._notify('media-source-added', { ...this.eventScope, observedMediaSource });\n\t\t} else {\n\t\t\tobservedMediaSource.update(stats);\n\t\t}\n\t\tthis._notify('media-source-updated', { ...this.eventScope, observedMediaSource });\n\n\t\treturn observedMediaSource;\n\t}\n\n\tprivate _updateOutboundRtpStats(stats: OutboundRtpStats) {\n\t\tlet observedOutboundRtp = this.observedOutboundRtps.get(stats.ssrc);\n\n\t\tif (!observedOutboundRtp) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.ssrc || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid OutboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedOutboundRtp = new ObservedOutboundRtp(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.ssrc,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedOutboundRtp.update(stats);\n\n\t\t\tthis.observedOutboundRtps.set(stats.ssrc, observedOutboundRtp);\n\t\t\tthis._notify('outbound-rtp-added', { ...this.eventScope, observedOutboundRtp });\n\t\t} else {\n\t\t\tobservedOutboundRtp.update(stats);\n\t\t}\n\t\tthis._notify('outbound-rtp-updated', { ...this.eventScope, observedOutboundRtp });\n\n\t\treturn observedOutboundRtp;\n\t}\n\n\tprivate _updateOutboundTrackSample(stats: OutboundTrackSample) {\n\t\tlet observedOutboundTrack = this.observedOutboundTracks.get(stats.id);\n\n\t\tif (!observedOutboundTrack) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid OutboundTrackSample (missing timestamp OR id OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst observedMediaSource = [ ...this.observedMediaSources.values() ].find((mediaSource) => mediaSource.trackIdentifier === stats.id);\n\t\t\tconst outboundRtps = observedMediaSource\n\t\t\t\t? [ ...this.observedOutboundRtps.values() ].filter((outboundRtp) => outboundRtp.mediaSourceId === observedMediaSource?.id) : undefined;\n\n\t\t\tobservedOutboundTrack = new ObservedOutboundTrack(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis,\n\t\t\t\toutboundRtps,\n\t\t\t\tobservedMediaSource,\n\t\t\t);\n\n\t\t\tobservedOutboundTrack.update(stats);\n\n\t\t\tthis.observedOutboundTracks.set(stats.id, observedOutboundTrack);\n\t\t\tthis._notify('outbound-track-added', { ...this.eventScope, observedOutboundTrack });\n\t\t} else {\n\t\t\tobservedOutboundTrack.update(stats);\n\t\t}\n\t\tthis._notify('outbound-track-updated', { ...this.eventScope, observedOutboundTrack });\n\n\t\treturn observedOutboundTrack;\n\t}\n\n\tprivate _updatePeerConnectionTransportStats(stats: PeerConnectionTransportStats) {\n\t\tlet observedPeerConnectionTransport = this.observedPeerConnectionTransports.get(stats.id);\n\n\t\tif (!observedPeerConnectionTransport) {\n\t\t\tif (!stats.timestamp || !stats.id) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid PeerConnectionTransportStats (missing timestamp OR id field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedPeerConnectionTransport = new ObservedPeerConnectionTransport(stats.timestamp, stats.id, this);\n\n\t\t\tobservedPeerConnectionTransport.update(stats);\n\n\t\t\tthis.observedPeerConnectionTransports.set(stats.id, observedPeerConnectionTransport);\n\t\t\tthis._notify('peer-connection-transport-added', { ...this.eventScope, observedPeerConnectionTransport });\n\t\t} else {\n\t\t\tobservedPeerConnectionTransport.update(stats);\n\t\t}\n\t\tthis._notify('peer-connection-transport-updated', { ...this.eventScope, observedPeerConnectionTransport });\n\n\t\treturn observedPeerConnectionTransport;\n\t}\n\n\tprivate _updateRemoteInboundRtpStats(stats: RemoteInboundRtpStats) {\n\t\tlet observedRemoteInboundRtp = this.observedRemoteInboundRtps.get(stats.ssrc);\n\n\t\tif (!observedRemoteInboundRtp) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.ssrc || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid RemoteInboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedRemoteInboundRtp = new ObservedRemoteInboundRtp(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.ssrc,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedRemoteInboundRtp.update(stats);\n\n\t\t\tthis.observedRemoteInboundRtps.set(stats.ssrc, observedRemoteInboundRtp);\n\t\t\tthis._notify('remote-inbound-rtp-added', { ...this.eventScope, observedRemoteInboundRtp });\n\t\t} else {\n\t\t\tobservedRemoteInboundRtp.update(stats);\n\t\t}\n\t\tthis._notify('remote-inbound-rtp-updated', { ...this.eventScope, observedRemoteInboundRtp });\n\n\t\treturn observedRemoteInboundRtp;\n\t}\n\n\tprivate _updateRemoteOutboundRtpStats(stats: RemoteOutboundRtpStats) {\n\t\tlet observedRemoteOutboundRtp = this.observedRemoteOutboundRtps.get(stats.ssrc);\n\n\t\tif (!observedRemoteOutboundRtp) {\n\t\t\tif (!stats.timestamp || !stats.id || !stats.ssrc || !stats.kind) {\n\t\t\t\treturn logger.warn(\n\t\t\t\t\t`ObservedPeerConnection received an invalid RemoteOutboundRtpStats (missing timestamp OR id OR ssrc OR kind field). PeerConnectionId: ${this.peerConnectionId} ClientId: ${this.client.clientId}, CallId: ${this.client.call.callId}`,\n\t\t\t\t\tstats\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tobservedRemoteOutboundRtp = new ObservedRemoteOutboundRtp(\n\t\t\t\tstats.timestamp,\n\t\t\t\tstats.id,\n\t\t\t\tstats.ssrc,\n\t\t\t\tstats.kind as MediaKind,\n\t\t\t\tthis\n\t\t\t);\n\n\t\t\tobservedRemoteOutboundRtp.update(stats);\n\n\t\t\tthis.observedRemoteOutboundRtps.set(stats.ssrc, observedRemoteOutboundRtp);\n\t\t\tthis._notify('remote-outbound-rtp-added', { ...this.eventScope, observedRemoteOutboundRtp });\n\t\t} else {\n\t\t\tobservedRemoteOutboundRtp.update(stats);\n\t\t}\n\t\tthis._notify('remote-outbound-rtp-updated', { ...this.eventScope, observedRemoteOutboundRtp });\n\n\t\treturn observedRemoteOutboundRtp;\n\t}\n\n\t/** Emit an Observer-bus event scoped to this peer connection. */\n\tprivate _notify<K extends keyof ObserverEvents>(type: K, ...args: ObserverEvents[K]): void {\n\t\tthis.client.call.observer.emit(type, ...args);\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { InboundRtpStats } from './schema/ClientSample';\n\nexport class ObservedInboundRtp implements InboundRtpStats {\n\tpublic appData?: Record<string, unknown>;\n\n\tprivate _visited = false;\n\n\ttransportId?: string | undefined;\n\tcodecId?: string | undefined;\n\tpacketsReceived?: number | undefined;\n\tpacketsLost?: number | undefined;\n\tmid?: string | undefined;\n\tremoteId?: string | undefined;\n\tframesDecoded?: number | undefined;\n\tkeyFramesDecoded?: number | undefined;\n\tframesRendered?: number | undefined;\n\tframesDropped?: number | undefined;\n\tframeWidth?: number | undefined;\n\tframeHeight?: number | undefined;\n\tframesPerSecond?: number | undefined;\n\tqpSum?: number | undefined;\n\ttotalDecodeTime?: number | undefined;\n\ttotalInterFrameDelay?: number | undefined;\n\ttotalSquaredInterFrameDelay?: number | undefined;\n\tpauseCount?: number | undefined;\n\ttotalPausesDuration?: number | undefined;\n\tfreezeCount?: number | undefined;\n\ttotalFreezesDuration?: number | undefined;\n\tlastPacketReceivedTimestamp?: number | undefined;\n\theaderBytesReceived?: number | undefined;\n\tpacketsDiscarded?: number | undefined;\n\tfecBytesReceived?: number | undefined;\n\tfecPacketsReceived?: number | undefined;\n\tfecPacketsDiscarded?: number | undefined;\n\tbytesReceived?: number | undefined;\n\tnackCount?: number | undefined;\n\tfirCount?: number | undefined;\n\tpliCount?: number | undefined;\n\ttotalProcessingDelay?: number | undefined;\n\testimatedPlayoutTimestamp?: number | undefined;\n\tjitterBufferDelay?: number | undefined;\n\tjitterBufferTargetDelay?: number | undefined;\n\tjitterBufferEmittedCount?: number | undefined;\n\tjitterBufferMinimumDelay?: number | undefined;\n\ttotalSamplesReceived?: number | undefined;\n\tconcealedSamples?: number | undefined;\n\tsilentConcealedSamples?: number | undefined;\n\tconcealmentEvents?: number | undefined;\n\tinsertedSamplesForDeceleration?: number | undefined;\n\tremovedSamplesForAcceleration?: number | undefined;\n\taudioLevel?: number | undefined;\n\ttotalAudioEnergy?: number | undefined;\n\ttotalSamplesDuration?: number | undefined;\n\tframesReceived?: number | undefined;\n\tdecoderImplementation?: string | undefined;\n\tplayoutId?: string | undefined;\n\tpowerEfficientDecoder?: boolean | undefined;\n\tframesAssembledFromMultiplePackets?: number | undefined;\n\ttotalAssemblyTime?: number | undefined;\n\tretransmittedPacketsReceived?: number | undefined;\n\tretransmittedBytesReceived?: number | undefined;\n\trtxSsrc?: number | undefined;\n\tfecSsrc?: number | undefined;\n\ttotalCorruptionProbability?: number | undefined;\n\ttotalSquaredCorruptionProbability?: number | undefined;\n\tcorruptionMeasurements?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\tjitter?: number | undefined;\n\t\n\tpublic bitrate = 0;\n\tpublic fractionLost?: number;\n\tpublic bitPerPixel = 0;\n\n\tpublic deltaLostPackets = 0;\n\tpublic deltaReceivedPackets = 0;\n\tpublic deltaBytesReceived = 0;\n\tpublic deltaReceivedSamples = 0;\n\tpublic deltaSilentConcealedSamples = 0;\n\n\t// Derived from the corresponding remote-outbound-rtp (sender report), when present.\n\tpublic remoteRttInMs?: number;\n\tpublic remoteBytesSent?: number;\n\tpublic remotePacketsSent?: number;\n\tpublic remoteTimestamp?: number;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic ssrc: number,\n\t\tpublic kind: MediaKind,\n\t\tpublic trackIdentifier: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getRemoteOutboundRtp() {\n\t\treturn this._peerConnection.observedRemoteOutboundRtps.get(this.ssrc);\n\t}\n\n\tpublic getIceTransport() {\n\t\treturn this._peerConnection.observedIceTransports.get(this.transportId ?? '');\n\t}\n\n\tpublic getCodec() {\n\t\treturn this._peerConnection.observedCodecs.get(this.codecId ?? '');\n\t}\n\n\tpublic getMediaPlayout() {\n\t\treturn this._peerConnection.observedMediaPlayouts.get(this.playoutId ?? '');\n\t}\n\n\tpublic getTrack() {\n\t\treturn this._peerConnection.observedInboundTracks.get(this.trackIdentifier);\n\t}\n\n\tpublic update(stats: InboundRtpStats) {\n\t\tthis._visited = true;\n\t\tthis.deltaBytesReceived = 0;\n\t\tthis.deltaLostPackets = 0;\n\t\tthis.deltaReceivedPackets = 0;\n\t\tthis.deltaReceivedSamples = 0;\n\t\tthis.deltaSilentConcealedSamples = 0;\n\t\tthis.remoteRttInMs = undefined;\n\t\tthis.remoteBytesSent = undefined;\n\t\tthis.remotePacketsSent = undefined;\n\t\tthis.remoteTimestamp = undefined;\n\t\tthis.bitrate = 0;\n\t\tthis.jitter = undefined;\n\t\tthis.fractionLost = undefined;\n\t\tthis.bitPerPixel = 0;\n\n\t\tconst elapsedTimeInMs = stats.timestamp - this.timestamp;\n\n\t\tif (elapsedTimeInMs) {\n\t\t\t// update metrics here\n\t\t\tif (this.bytesReceived && stats.bytesReceived && this.bytesReceived < stats.bytesReceived) {\n\t\t\t\tthis.bitrate = ((stats.bytesReceived - (this.bytesReceived ?? 0)) * 8) / elapsedTimeInMs;\n\t\t\t}\n\t\t\tif (this.packetsLost && stats.packetsLost && this.packetsLost < stats.packetsLost) {\n\t\t\t\tthis.deltaLostPackets = stats.packetsLost - this.packetsLost;\n\t\t\t}\n\t\t\tif (this.packetsReceived && stats.packetsReceived && this.packetsReceived < stats.packetsReceived) {\n\t\t\t\tthis.deltaReceivedPackets = stats.packetsReceived - this.packetsReceived;\n\t\t\t}\n\t\t\tif (this.totalSamplesReceived && stats.totalSamplesReceived && this.totalSamplesReceived < stats.totalSamplesReceived) {\n\t\t\t\tthis.deltaReceivedSamples = stats.totalSamplesReceived - this.totalSamplesReceived;\n\t\t\t}\n\t\t\tif (this.silentConcealedSamples && stats.silentConcealedSamples && this.silentConcealedSamples < stats.silentConcealedSamples) {\n\t\t\t\tthis.deltaSilentConcealedSamples = stats.silentConcealedSamples - this.silentConcealedSamples;\n\t\t\t}\n\t\t\tif (stats.bytesReceived && this.framesReceived && stats.framesReceived && this.framesReceived < stats.framesReceived) {\n\t\t\t\tthis.bitPerPixel = (stats.bytesReceived - (this.bytesReceived ?? 0)) / (stats.framesReceived - this.framesReceived);\n\t\t\t}\n\t\t\tif (this.deltaLostPackets && this.deltaReceivedPackets) {\n\t\t\t\tthis.fractionLost = this.deltaLostPackets / (this.deltaLostPackets + this.deltaReceivedPackets);\n\t\t\t}\n\t\t}\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.codecId = stats.codecId;\n\t\tthis.packetsReceived = stats.packetsReceived;\n\t\tthis.packetsLost = stats.packetsLost;\n\t\tthis.mid = stats.mid;\n\t\tthis.remoteId = stats.remoteId;\n\t\tthis.framesDecoded = stats.framesDecoded;\n\t\tthis.keyFramesDecoded = stats.keyFramesDecoded;\n\t\tthis.framesRendered = stats.framesRendered;\n\t\tthis.framesDropped = stats.framesDropped;\n\t\tthis.frameWidth = stats.frameWidth;\n\t\tthis.frameHeight = stats.frameHeight;\n\t\tthis.framesPerSecond = stats.framesPerSecond;\n\t\tthis.qpSum = stats.qpSum;\n\t\tthis.totalDecodeTime = stats.totalDecodeTime;\n\t\tthis.totalInterFrameDelay = stats.totalInterFrameDelay;\n\t\tthis.totalSquaredInterFrameDelay = stats.totalSquaredInterFrameDelay;\n\t\tthis.pauseCount = stats.pauseCount;\n\t\tthis.totalPausesDuration = stats.totalPausesDuration;\n\t\tthis.freezeCount = stats.freezeCount;\n\t\tthis.totalFreezesDuration = stats.totalFreezesDuration;\n\t\tthis.lastPacketReceivedTimestamp = stats.lastPacketReceivedTimestamp;\n\t\tthis.headerBytesReceived = stats.headerBytesReceived;\n\t\tthis.packetsDiscarded = stats.packetsDiscarded;\n\t\tthis.fecBytesReceived = stats.fecBytesReceived;\n\t\tthis.fecPacketsReceived = stats.fecPacketsReceived;\n\t\tthis.fecPacketsDiscarded = stats.fecPacketsDiscarded;\n\t\tthis.bytesReceived = stats.bytesReceived;\n\t\tthis.nackCount = stats.nackCount;\n\t\tthis.firCount = stats.firCount;\n\t\tthis.pliCount = stats.pliCount;\n\t\tthis.totalProcessingDelay = stats.totalProcessingDelay;\n\t\tthis.estimatedPlayoutTimestamp = stats.estimatedPlayoutTimestamp;\n\t\tthis.jitterBufferDelay = stats.jitterBufferDelay;\n\t\tthis.jitterBufferTargetDelay = stats.jitterBufferTargetDelay;\n\t\tthis.jitterBufferEmittedCount = stats.jitterBufferEmittedCount;\n\t\tthis.jitterBufferMinimumDelay = stats.jitterBufferMinimumDelay;\n\t\tthis.totalSamplesReceived = stats.totalSamplesReceived;\n\t\tthis.concealedSamples = stats.concealedSamples;\n\t\tthis.silentConcealedSamples = stats.silentConcealedSamples;\n\t\tthis.concealmentEvents = stats.concealmentEvents;\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { OutboundRtpStats, QualityLimitationDurations } from './schema/ClientSample';\n\nexport class ObservedOutboundRtp implements OutboundRtpStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\ttransportId?: string | undefined;\n\tcodecId?: string | undefined;\n\tpacketsSent?: number | undefined;\n\tbytesSent?: number | undefined;\n\tmid?: string | undefined;\n\tmediaSourceId?: string | undefined;\n\tremoteId?: string | undefined;\n\trid?: string | undefined;\n\theaderBytesSent?: number | undefined;\n\tretransmittedPacketsSent?: number | undefined;\n\tretransmittedBytesSent?: number | undefined;\n\trtxSsrc?: number | undefined;\n\ttargetBitrate?: number | undefined;\n\ttotalEncodedBytesTarget?: number | undefined;\n\tframeWidth?: number | undefined;\n\tframeHeight?: number | undefined;\n\tframesPerSecond?: number | undefined;\n\tframesSent?: number | undefined;\n\thugeFramesSent?: number | undefined;\n\tframesEncoded?: number | undefined;\n\tkeyFramesEncoded?: number | undefined;\n\tqpSum?: number | undefined;\n\ttotalEncodeTime?: number | undefined;\n\ttotalPacketSendDelay?: number | undefined;\n\tqualityLimitationReason?: string | undefined;\n\tqualityLimitationResolutionChanges?: number | undefined;\n\tnackCount?: number | undefined;\n\tfirCount?: number | undefined;\n\tpliCount?: number | undefined;\n\tencoderImplementation?: string | undefined;\n\tpowerEfficientEncoder?: boolean | undefined;\n\tactive?: boolean | undefined;\n\tscalabilityMode?: string | undefined;\n\tqualityLimitationDurations?: QualityLimitationDurations | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\t// derived fields\n\tpublic bitrate = 0;\n\tpublic payloadBitrate = 0;\n\tpublic packetRate = 0;\n\tpublic bitPerPixel = 0;\n\t\n\tpublic deltaPacketsSent = 0;\n\tpublic deltaBytesSent = 0;\n\n\t// Derived from the corresponding remote-inbound-rtp (receiver report), when present.\n\tpublic remoteRttInMs?: number;\n\tpublic remoteFractionLost?: number;\n\tpublic remoteJitter?: number;\n\tpublic remotePacketsLost?: number;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic ssrc: number,\n\t\tpublic kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection,\n\t) {\n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\t\n\t\tthis._visited = false;\n\t\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getRemoteInboundRtp() {\n\t\treturn this._peerConnection.observedRemoteInboundRtps.get(this.ssrc);\n\t}\n\n\tpublic getCodec() {\n\t\treturn this._peerConnection.observedCodecs.get(this.codecId ?? '');\n\t}\n\n\tpublic getMediaSource() {\n\t\treturn this._peerConnection.observedMediaSources.get(this.mediaSourceId ?? '');\n\t}\n\n\tpublic getTrack() {\n\t\treturn this.getMediaSource()?.getTrack();\n\t}\n\n\tpublic update(stats: OutboundRtpStats) {\n\t\tthis._visited = true;\n\t\tthis.bitPerPixel = 0;\n\t\tthis.bitrate = 0;\n\t\tthis.payloadBitrate = 0;\n\t\tthis.packetRate = 0;\n\t\tthis.deltaPacketsSent = 0;\n\t\tthis.deltaBytesSent = 0;\n\t\tthis.remoteRttInMs = undefined;\n\t\tthis.remoteFractionLost = undefined;\n\t\tthis.remoteJitter = undefined;\n\t\tthis.remotePacketsLost = undefined;\n\n\t\tconst elapsedTimeInMs = stats.timestamp - this.timestamp;\n\n\t\tif (elapsedTimeInMs) {\n\t\t\t// Guard against counter resets / SSRC reuse: only accept a non-negative delta.\n\t\t\tif (stats.packetsSent !== undefined && this.packetsSent !== undefined && stats.packetsSent >= this.packetsSent) {\n\t\t\t\tthis.deltaPacketsSent = stats.packetsSent - this.packetsSent;\n\t\t\t\tthis.packetRate = this.deltaPacketsSent / (elapsedTimeInMs / 1000);\n\t\t\t}\n\t\t\tif (stats.bytesSent !== undefined && this.bytesSent !== undefined && stats.bytesSent >= this.bytesSent) {\n\t\t\t\tthis.deltaBytesSent = stats.bytesSent - this.bytesSent;\n\t\t\t\tthis.bitrate = (this.deltaBytesSent * 8) / (elapsedTimeInMs / 1000);\n\t\t\t}\n\t\t\tif (stats.headerBytesSent !== undefined && this.headerBytesSent !== undefined) {\n\t\t\t\tthis.payloadBitrate = ((this.deltaBytesSent ?? 0 - (stats.headerBytesSent - this.headerBytesSent)) * 8) / (elapsedTimeInMs / 1000);\n\t\t\t}\n\t\t\tif (this.framesSent !== undefined && stats.framesSent !== undefined) {\n\t\t\t\tthis.bitPerPixel = this.deltaBytesSent ? (this.deltaBytesSent * 8) / (this.framesSent - stats.framesSent) : 0;\n\t\t\t}\n\t\t}\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.codecId = stats.codecId;\n\t\tthis.packetsSent = stats.packetsSent;\n\t\tthis.bytesSent = stats.bytesSent;\n\t\tthis.mid = stats.mid;\n\t\tthis.mediaSourceId = stats.mediaSourceId;\n\t\tthis.remoteId = stats.remoteId;\n\t\tthis.rid = stats.rid;\n\t\tthis.headerBytesSent = stats.headerBytesSent;\n\t\tthis.retransmittedPacketsSent = stats.retransmittedPacketsSent;\n\t\tthis.retransmittedBytesSent = stats.retransmittedBytesSent;\n\t\tthis.rtxSsrc = stats.rtxSsrc;\n\t\tthis.targetBitrate = stats.targetBitrate;\n\t\tthis.totalEncodedBytesTarget = stats.totalEncodedBytesTarget;\n\t\tthis.frameWidth = stats.frameWidth;\n\t\tthis.frameHeight = stats.frameHeight;\n\t\tthis.framesPerSecond = stats.framesPerSecond;\n\t\tthis.framesSent = stats.framesSent;\n\t\tthis.hugeFramesSent = stats.hugeFramesSent;\n\t\tthis.framesEncoded = stats.framesEncoded;\n\t\tthis.keyFramesEncoded = stats.keyFramesEncoded;\n\t\tthis.qpSum = stats.qpSum;\n\t\tthis.totalEncodeTime = stats.totalEncodeTime;\n\t\tthis.totalPacketSendDelay = stats.totalPacketSendDelay;\n\t\tthis.qualityLimitationReason = stats.qualityLimitationReason;\n\t\tthis.qualityLimitationResolutionChanges = stats.qualityLimitationResolutionChanges;\n\t\tthis.nackCount = stats.nackCount;\n\t\tthis.firCount = stats.firCount;\n\t\tthis.pliCount = stats.pliCount;\n\t\tthis.encoderImplementation = stats.encoderImplementation;\n\t\tthis.powerEfficientEncoder = stats.powerEfficientEncoder;\n\t\tthis.active = stats.active;\n\t\tthis.scalabilityMode = stats.scalabilityMode;\n\t\tthis.qualityLimitationDurations = stats.qualityLimitationDurations;\n\t\tthis.attachments = stats.attachments;\n\t}\n}","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { CertificateStats } from './schema/ClientSample';\n\nexport class ObservedCertificate implements CertificateStats {\n\tpublic appData?: Record<string, unknown>;\n\n\tprivate _visited = false;\n\n\tfingerprint?: string;\n\tfingerprintAlgorithm?: string;\n\tbase64Certificate?: string;\n\tissuerCertificateId?: string;\n\tattachments?: Record<string, unknown>;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic update(stats: CertificateStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.fingerprint = stats.fingerprint;\n\t\tthis.fingerprintAlgorithm = stats.fingerprintAlgorithm;\n\t\tthis.base64Certificate = stats.base64Certificate;\n\t\tthis.issuerCertificateId = stats.issuerCertificateId;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { CodecStats } from './schema/ClientSample';\n\nexport class ObservedCodec implements CodecStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\tpayloadType?: number | undefined;\n\ttransportId?: string | undefined;\n\tclockRate?: number | undefined;\n\tchannels?: number | undefined;\n\tsdpFmtpLine?: string | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic mimeType: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getIceTransport() {\n\t\treturn this._peerConnection.observedIceTransports.get(this.transportId ?? '');\n\t}\n\n\tpublic update(stats: CodecStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.payloadType = stats.payloadType;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.clockRate = stats.clockRate;\n\t\tthis.channels = stats.channels;\n\t\tthis.sdpFmtpLine = stats.sdpFmtpLine;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { DataChannelStats } from './schema/ClientSample';\n\nexport type ObservedDataChannelState = 'connecting' | 'open' | 'closing' | 'closed';\n\nexport class ObservedDataChannel implements DataChannelStats\t{\n\tprivate _visited = false;\n\t\n\tlabel?: string | undefined;\n\tprotocol?: string | undefined;\n\tdataChannelIdentifier?: number | undefined;\n\tstate?: string | undefined;\n\tmessagesSent?: number | undefined;\n\tbytesSent?: number | undefined;\n\tmessagesReceived?: number | undefined;\n\tbytesReceived?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic addedAt?: number | undefined;\n\tpublic removedAt?: number | undefined;\n\t\n\tpublic deltaBytesSent = 0;\n\tpublic deltaBytesReceived = 0;\n\tpublic deltaMessagesSent = 0;\n\tpublic deltaMessagesReceived = 0;\n\n\tpublic appData?: Record<string, unknown>;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection,\n\t) {\n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\t\n\t\tthis._visited = false;\n\t\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic update(stats: DataChannelStats) {\n\t\tthis._visited = true;\n\n\t\tif (this.messagesSent && stats.messagesSent && stats.messagesSent >= this.messagesSent) {\n\t\t\tthis.deltaMessagesSent = stats.messagesSent - this.messagesSent;\n\t\t} else {\n\t\t\tthis.deltaMessagesSent = 0;\n\t\t}\n\n\t\tif (this.messagesReceived && stats.messagesReceived && stats.messagesReceived >= this.messagesReceived) {\n\t\t\tthis.deltaMessagesReceived = stats.messagesReceived - this.messagesReceived;\n\t\t} else {\n\t\t\tthis.deltaMessagesReceived = 0;\n\t\t}\n\n\t\tif (this.bytesSent && stats.bytesSent && stats.bytesSent >= this.bytesSent) {\n\t\t\tthis.deltaBytesSent = stats.bytesSent - this.bytesSent;\n\t\t} else {\n\t\t\tthis.deltaBytesSent = 0;\n\t\t}\n\n\t\tif (this.bytesReceived && stats.bytesReceived && stats.bytesReceived >= this.bytesReceived) {\n\t\t\tthis.deltaBytesReceived = stats.bytesReceived - this.bytesReceived;\n\t\t} else {\n\t\t\tthis.deltaBytesReceived = 0;\n\t\t}\n\n\t\tthis.label = stats.label;\n\t\tthis.protocol = stats.protocol;\n\t\tthis.dataChannelIdentifier = stats.dataChannelIdentifier;\n\t\tthis.state = stats.state;\n\t\tthis.messagesSent = stats.messagesSent;\n\t\tthis.bytesSent = stats.bytesSent;\n\t\tthis.messagesReceived = stats.messagesReceived;\n\t\tthis.bytesReceived = stats.bytesReceived;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { IceCandidateStats } from './schema/ClientSample';\n\nexport class ObservedIceCandidate implements IceCandidateStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\ttransportId?: string | undefined;\n\taddress?: string | undefined;\n\tport?: number | undefined;\n\tprotocol?: string | undefined;\n\tcandidateType?: string | undefined;\n\tpriority?: number | undefined;\n\turl?: string | undefined;\n\trelayProtocol?: string | undefined;\n\tfoundation?: string | undefined;\n\trelatedAddress?: string | undefined;\n\trelatedPort?: number | undefined;\n\tusernameFragment?: string | undefined;\n\ttcpType?: string | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getIceTransport() {\n\t\treturn this._peerConnection.observedIceTransports.get(this.transportId ?? '');\n\t}\n\n\tpublic update(stats: IceCandidateStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.address = stats.address;\n\t\tthis.port = stats.port;\n\t\tthis.protocol = stats.protocol;\n\t\tthis.candidateType = stats.candidateType;\n\t\tthis.priority = stats.priority;\n\t\tthis.url = stats.url;\n\t\tthis.relayProtocol = stats.relayProtocol;\n\t\tthis.foundation = stats.foundation;\n\t\tthis.relatedAddress = stats.relatedAddress;\n\t\tthis.relatedPort = stats.relatedPort;\n\t\tthis.usernameFragment = stats.usernameFragment;\n\t\tthis.tcpType = stats.tcpType;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { IceCandidatePairStats } from './schema/ClientSample';\n\nexport class ObservedIceCandidatePair implements IceCandidatePairStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\ttransportId?: string | undefined;\n\tlocalCandidateId?: string | undefined;\n\tremoteCandidateId?: string | undefined;\n\tstate?: 'new' | 'in-progress' | 'waiting' | 'failed' | 'succeeded' | undefined;\n\tnominated?: boolean | undefined;\n\tpacketsSent?: number | undefined;\n\tpacketsReceived?: number | undefined;\n\tbytesSent?: number | undefined;\n\tbytesReceived?: number | undefined;\n\tlastPacketSentTimestamp?: number | undefined;\n\tlastPacketReceivedTimestamp?: number | undefined;\n\ttotalRoundTripTime?: number | undefined;\n\tcurrentRoundTripTime?: number | undefined;\n\tavailableOutgoingBitrate?: number | undefined;\n\tavailableIncomingBitrate?: number | undefined;\n\trequestsReceived?: number | undefined;\n\trequestsSent?: number | undefined;\n\tresponsesReceived?: number | undefined;\n\tresponsesSent?: number | undefined;\n\tconsentRequestsSent?: number | undefined;\n\tpacketsDiscardedOnSend?: number | undefined;\n\tbytesDiscardedOnSend?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic deltaBytesSent = 0;\n\tpublic deltaBytesReceived = 0;\n\tpublic deltaPacketsSent = 0;\n\tpublic deltaPacketsReceived = 0;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection,\n\t) {\n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\t\n\t\tthis._visited = false;\n\t\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getIceTransport() {\n\t\treturn this._peerConnection.observedIceTransports.get(this.transportId ?? '');\n\t}\n\n\tpublic getLocalCandidate() {\n\t\treturn this._peerConnection.observedIceCandidates.get(this.localCandidateId ?? '');\n\t}\n\n\tpublic getRemoteCandidate() {\n\t\treturn this._peerConnection.observedIceCandidates.get(this.remoteCandidateId ?? '');\n\t}\n\n\tpublic update(stats: IceCandidatePairStats) {\n\t\tthis._visited = true;\n\n\t\tif (this.packetsSent && stats.packetsSent && stats.packetsSent >= this.packetsSent) {\n\t\t\tthis.deltaPacketsSent = stats.packetsSent - this.packetsSent;\n\t\t} else {\n\t\t\tthis.deltaPacketsSent = 0;\n\t\t}\n\t\tif (this.packetsReceived && stats.packetsReceived && stats.packetsReceived >= this.packetsReceived) {\n\t\t\tthis.deltaPacketsReceived = stats.packetsReceived - this.packetsReceived;\n\t\t} else {\n\t\t\tthis.deltaPacketsReceived = 0;\n\t\t}\n\t\tif (this.bytesSent && stats.bytesSent && stats.bytesSent >= this.bytesSent) {\n\t\t\tthis.deltaBytesSent = stats.bytesSent - this.bytesSent;\n\t\t} else {\n\t\t\tthis.deltaBytesSent = 0;\n\t\t}\n\t\tif (this.bytesReceived && stats.bytesReceived && stats.bytesReceived >= this.bytesReceived) {\n\t\t\tthis.deltaBytesReceived = stats.bytesReceived - this.bytesReceived;\n\t\t} else {\n\t\t\tthis.deltaBytesReceived = 0;\n\t\t}\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.localCandidateId = stats.localCandidateId;\n\t\tthis.remoteCandidateId = stats.remoteCandidateId;\n\t\tthis.state = this._convertState(stats.state);\n\t\tthis.nominated = stats.nominated;\n\t\tthis.packetsSent = stats.packetsSent;\n\t\tthis.packetsReceived = stats.packetsReceived;\n\t\tthis.bytesSent = stats.bytesSent;\n\t\tthis.bytesReceived = stats.bytesReceived;\n\t\tthis.lastPacketSentTimestamp = stats.lastPacketSentTimestamp;\n\t\tthis.lastPacketReceivedTimestamp = stats.lastPacketReceivedTimestamp;\n\t\tthis.totalRoundTripTime = stats.totalRoundTripTime;\n\t\tthis.currentRoundTripTime = stats.currentRoundTripTime;\n\t\tthis.availableOutgoingBitrate = stats.availableOutgoingBitrate;\n\t\tthis.availableIncomingBitrate = stats.availableIncomingBitrate;\n\t\tthis.requestsReceived = stats.requestsReceived;\n\t\tthis.requestsSent = stats.requestsSent;\n\t\tthis.responsesReceived = stats.responsesReceived;\n\t\tthis.responsesSent = stats.responsesSent;\n\t\tthis.consentRequestsSent = stats.consentRequestsSent;\n\t\tthis.packetsDiscardedOnSend = stats.packetsDiscardedOnSend;\n\t\tthis.bytesDiscardedOnSend = stats.bytesDiscardedOnSend;\n\t\tthis.attachments = stats.attachments;\n\t}\n\n\tprivate _convertState(state: string | undefined) {\n\t\tswitch (state) {\n\t\t\tcase 'new':\n\t\t\tcase 'in-progress':\n\t\t\tcase 'waiting':\n\t\t\tcase 'failed':\n\t\t\tcase 'succeeded':\n\t\t\t\treturn state;\n\t\t\tcase 'cancelled':\n\t\t\t\treturn 'failed';\n\t\t\tcase 'inprogress':\n\t\t\t\treturn 'in-progress';\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n}","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { IceTransportStats } from './schema/ClientSample';\n\nexport class ObservedIceTransport implements IceTransportStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\tpacketsSent?: number | undefined;\n\tpacketsReceived?: number | undefined;\n\tbytesSent?: number | undefined;\n\tbytesReceived?: number | undefined;\n\ticeRole?: string | undefined;\n\ticeLocalUsernameFragment?: string | undefined;\n\tdtlsState?: string | undefined;\n\ticeState?: string | undefined;\n\tselectedCandidatePairId?: string | undefined;\n\tlocalCertificateId?: string | undefined;\n\tremoteCertificateId?: string | undefined;\n\ttlsVersion?: string | undefined;\n\tdtlsCipher?: string | undefined;\n\tdtlsRole?: string | undefined;\n\tsrtpCipher?: string | undefined;\n\tselectedCandidatePairChanges?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic deltaPacketsReceived = 0;\n\tpublic deltaPacketsSent = 0;\n\tpublic deltaBytesReceived = 0;\n\tpublic deltaBytesSent = 0;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getSelectedCandidatePair() {\n\t\treturn this._peerConnection.observedIceCandidatesPair.get(this.selectedCandidatePairId ?? '');\n\t}\n\n\tpublic update(stats: IceTransportStats) {\n\t\tthis._visited = true;\n\n\t\tif (this.bytesReceived !== undefined && stats.bytesReceived !== undefined && this.bytesReceived <= stats.bytesReceived) {\n\t\t\tthis.deltaBytesReceived = stats.bytesReceived - this.bytesReceived;\n\t\t} else {\n\t\t\tthis.deltaBytesReceived = 0;\n\t\t}\n\t\t\n\t\tif (this.bytesSent !== undefined && stats.bytesSent !== undefined && this.bytesSent <= stats.bytesSent) {\n\t\t\tthis.deltaBytesSent = stats.bytesSent - this.bytesSent;\n\t\t} else {\n\t\t\tthis.deltaBytesSent = 0;\n\t\t}\n\n\t\tif (this.packetsReceived !== undefined && stats.packetsReceived !== undefined && this.packetsReceived <= stats.packetsReceived) {\n\t\t\tthis.deltaPacketsReceived = stats.packetsReceived - this.packetsReceived;\n\t\t} else {\n\t\t\tthis.deltaPacketsReceived = 0;\n\t\t}\n\t\t\n\t\tif (this.packetsSent !== undefined && stats.packetsSent !== undefined && this.packetsSent <= stats.packetsSent) {\n\t\t\tthis.deltaPacketsSent = stats.packetsSent - this.packetsSent;\n\t\t} else {\n\t\t\tthis.deltaPacketsSent = 0;\n\t\t}\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.packetsSent = stats.packetsSent;\n\t\tthis.packetsReceived = stats.packetsReceived;\n\t\tthis.bytesSent = stats.bytesSent;\n\t\tthis.bytesReceived = stats.bytesReceived;\n\t\tthis.iceRole = stats.iceRole;\n\t\tthis.iceLocalUsernameFragment = stats.iceLocalUsernameFragment;\n\t\tthis.dtlsState = stats.dtlsState;\n\t\tthis.iceState = stats.iceState;\n\t\tthis.selectedCandidatePairId = stats.selectedCandidatePairId;\n\t\tthis.localCertificateId = stats.localCertificateId;\n\t\tthis.remoteCertificateId = stats.remoteCertificateId;\n\t\tthis.tlsVersion = stats.tlsVersion;\n\t\tthis.dtlsCipher = stats.dtlsCipher;\n\t\tthis.dtlsRole = stats.dtlsRole;\n\t\tthis.srtpCipher = stats.srtpCipher;\n\t\tthis.selectedCandidatePairChanges = stats.selectedCandidatePairChanges;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { MediaSourceStats } from './schema/ClientSample';\n\nexport class ObservedMediaSource implements MediaSourceStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\ttrackIdentifier?: string | undefined;\n\taudioLevel?: number | undefined;\n\ttotalAudioEnergy?: number | undefined;\n\ttotalSamplesDuration?: number | undefined;\n\techoReturnLoss?: number | undefined;\n\techoReturnLossEnhancement?: number | undefined;\n\twidth?: number | undefined;\n\theight?: number | undefined;\n\tframes?: number | undefined;\n\tframesPerSecond?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getTrack() {\n\t\treturn this._peerConnection.observedOutboundTracks.get(this.trackIdentifier ?? '');\n\t}\n\n\tpublic update(stats: MediaSourceStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.trackIdentifier = stats.trackIdentifier;\n\t\tthis.audioLevel = stats.audioLevel;\n\t\tthis.totalAudioEnergy = stats.totalAudioEnergy;\n\t\tthis.totalSamplesDuration = stats.totalSamplesDuration;\n\t\tthis.echoReturnLoss = stats.echoReturnLoss;\n\t\tthis.echoReturnLossEnhancement = stats.echoReturnLossEnhancement;\n\t\tthis.width = stats.width;\n\t\tthis.height = stats.height;\n\t\tthis.frames = stats.frames;\n\t\tthis.framesPerSecond = stats.framesPerSecond;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { PeerConnectionTransportStats } from './schema/ClientSample';\n\nexport class ObservedPeerConnectionTransport implements PeerConnectionTransportStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\tdataChannelsOpened?: number | undefined;\n\tdataChannelsClosed?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic update(stats: PeerConnectionTransportStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.dataChannelsOpened = stats.dataChannelsOpened;\n\t\tthis.dataChannelsClosed = stats.dataChannelsClosed;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { MediaPlayoutStats } from './schema/ClientSample';\n\nexport class ObservedMediaPlayout implements MediaPlayoutStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\tsynthesizedSamplesDuration?: number | undefined;\n\tsynthesizedSamplesEvents?: number | undefined;\n\ttotalSamplesDuration?: number | undefined;\n\ttotalPlayoutDelay?: number | undefined;\n\ttotalSamplesCount?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic update(stats: MediaPlayoutStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.synthesizedSamplesDuration = stats.synthesizedSamplesDuration;\n\t\tthis.synthesizedSamplesEvents = stats.synthesizedSamplesEvents;\n\t\tthis.totalSamplesDuration = stats.totalSamplesDuration;\n\t\tthis.totalPlayoutDelay = stats.totalPlayoutDelay;\n\t\tthis.totalSamplesCount = stats.totalSamplesCount;\n\t\tthis.attachments = stats.attachments;\n\t\t\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { RemoteInboundRtpStats } from './schema/ClientSample';\n\nexport class ObservedRemoteInboundRtp implements RemoteInboundRtpStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\ttransportId?: string | undefined;\n\tcodecId?: string | undefined;\n\tpacketsReceived?: number | undefined;\n\tpacketsLost?: number | undefined;\n\tjitter?: number | undefined;\n\tlocalId?: string | undefined;\n\troundTripTime?: number | undefined;\n\ttotalRoundTripTime?: number | undefined;\n\tfractionLost?: number | undefined;\n\troundTripTimeMeasurements?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic ssrc: number,\n\t\tpublic kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getOutboundRtp() {\n\t\treturn this._peerConnection.observedOutboundRtps.get(this.ssrc);\n\t}\n\n\tpublic getCodec() {\n\t\treturn this._peerConnection.observedCodecs.get(this.codecId ?? '');\n\t}\n\n\tpublic update(stats: RemoteInboundRtpStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.codecId = stats.codecId;\n\t\tthis.packetsReceived = stats.packetsReceived;\n\t\tthis.packetsLost = stats.packetsLost;\n\t\tthis.jitter = stats.jitter;\n\t\tthis.localId = stats.localId;\n\t\tthis.roundTripTime = stats.roundTripTime;\n\t\tthis.totalRoundTripTime = stats.totalRoundTripTime;\n\t\tthis.fractionLost = stats.fractionLost;\n\t\tthis.roundTripTimeMeasurements = stats.roundTripTimeMeasurements;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { MediaKind } from './common/types';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { RemoteOutboundRtpStats } from './schema/ClientSample';\n\nexport class ObservedRemoteOutboundRtp implements RemoteOutboundRtpStats {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\n\ttransportId?: string | undefined;\n\tcodecId?: string | undefined;\n\tpacketsSent?: number | undefined;\n\tbytesSent?: number | undefined;\n\tlocalId?: string | undefined;\n\tremoteTimestamp?: number | undefined;\n\treportsSent?: number | undefined;\n\troundTripTime?: number | undefined;\n\ttotalRoundTripTime?: number | undefined;\n\troundTripTimeMeasurements?: number | undefined;\n\tattachments?: Record<string, unknown> | undefined;\n\n\tpublic constructor(\n\t\tpublic timestamp: number,\n\t\tpublic id: string,\n\t\tpublic ssrc: number,\n\t\tpublic kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection\n\t) {}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getInboundRtp() {\n\t\treturn this._peerConnection.observedInboundRtps.get(this.ssrc);\n\t}\n\n\tpublic getCodec() {\n\t\treturn this._peerConnection.observedCodecs.get(this.codecId ?? '');\n\t}\n\n\tpublic update(stats: RemoteOutboundRtpStats) {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.transportId = stats.transportId;\n\t\tthis.codecId = stats.codecId;\n\t\tthis.packetsSent = stats.packetsSent;\n\t\tthis.bytesSent = stats.bytesSent;\n\t\tthis.localId = stats.localId;\n\t\tthis.remoteTimestamp = stats.remoteTimestamp;\n\t\tthis.reportsSent = stats.reportsSent;\n\t\tthis.roundTripTime = stats.roundTripTime;\n\t\tthis.totalRoundTripTime = stats.totalRoundTripTime;\n\t\tthis.roundTripTimeMeasurements = stats.roundTripTimeMeasurements;\n\t\tthis.attachments = stats.attachments;\n\t}\n}\n","import { CalculatedScore } from './scores/CalculatedScore';\nimport { MediaKind } from './common/types';\nimport { InboundTrackSample } from './schema/ClientSample';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { ObservedInboundRtp } from './ObservedInboundRtp';\nimport { ObservedMediaPlayout } from './ObservedMediaPlayout';\nimport { InboundTrackReport } from './Reports';\n\nexport class ObservedInboundTrack implements InboundTrackSample {\n\tpublic readonly calculatedScore: CalculatedScore = {\n\t\tweight: 1,\n\t\tvalue: undefined,\n\t};\n\tpublic appData?: Record<string, unknown>;\n\tpublic report: InboundTrackReport;\n\n\tprivate _visited = false;\n\n\tpublic addedAt?: number | undefined;\n\tpublic removedAt?: number | undefined;\n\n\tpublic muted?: boolean;\n\t\n\tattachments?: Record<string, unknown> | undefined;\n\n\tconstructor(\n\t\tpublic timestamp: number,\n\t\tpublic readonly id: string,\n\t\tpublic readonly kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection,\n\t\tprivate readonly _inboundRtp?: ObservedInboundRtp,\n\t\tprivate readonly _mediaPlayout?: ObservedMediaPlayout,\n\t) {\n\t\tthis.report = {\n\t\t\ttrackId: this.id,\n\t\t\tkind: this.kind,\n\t\t\tfractionLostDistribution: {\n\t\t\t\tgtOrEq050: 0,\n\t\t\t\tlt001: 0,\n\t\t\t\tlt005: 0,\n\t\t\t\tlt010: 0,\n\t\t\t\tlt020: 0,\n\t\t\t\tlt050: 0,\n\t\t\t\tcount: 0,\n\t\t\t\tsum: 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tpublic get score() { \n\t\treturn this.calculatedScore.value; \n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getInboundRtp() {\n\t\treturn this._inboundRtp;\n\t}\n\n\tpublic getMediaPlayout() {\n\t\treturn this._mediaPlayout;\n\t}\n\n\tpublic getRemoteOutboundTrack() {\n\t\treturn this._peerConnection.client.call.remoteTrackResolver?.resolveRemoteOutboundTrack(this);\n\t}\n\n\tpublic update(stats: InboundTrackSample): void {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.calculatedScore.value = stats.score;\n\t\tthis.attachments = stats.attachments;\n\n\t\tconst fl = this._inboundRtp?.fractionLost;\n\n\t\tif (fl !== undefined) {\n\t\t\tif (fl < 0.01) this.report.fractionLostDistribution.lt001 += 1;\n\t\t\telse if (fl < 0.05) this.report.fractionLostDistribution.lt005 += 1;\n\t\t\telse if (fl < 0.1) this.report.fractionLostDistribution.lt010 += 1;\n\t\t\telse if (fl < 0.2) this.report.fractionLostDistribution.lt020 += 1;\n\t\t\telse if (fl < 0.5) this.report.fractionLostDistribution.lt050 += 1;\n\t\t\telse this.report.fractionLostDistribution.gtOrEq050 += 1;\n\n\t\t\tthis.report.fractionLostDistribution.count += 1;\n\t\t\tthis.report.fractionLostDistribution.sum += fl;\n\t\t}\n\t}\n}","import { CalculatedScore } from './scores/CalculatedScore';\nimport { MediaKind } from './common/types';\nimport { OutboundTrackSample } from './schema/ClientSample';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { ObservedOutboundRtp } from './ObservedOutboundRtp';\nimport { ObservedMediaSource } from './ObservedMediaSource';\nimport { OutboundTrackReport } from './Reports';\n\nexport class ObservedOutboundTrack implements OutboundTrackSample {\n\tprivate _visited = false;\n\tpublic appData?: Record<string, unknown>;\n\tpublic readonly report: OutboundTrackReport;\n\n\tpublic readonly calculatedScore: CalculatedScore = {\n\t\tweight: 1,\n\t\tvalue: undefined,\n\t};\n\n\tpublic addedAt?: number | undefined;\n\tpublic removedAt?: number | undefined;\n\n\tpublic muted?: boolean;\n\n\tattachments?: Record<string, unknown> | undefined;\n\n\tconstructor(\n\t\tpublic timestamp: number,\n\t\tpublic readonly id: string,\n\t\tpublic readonly kind: MediaKind,\n\t\tprivate readonly _peerConnection: ObservedPeerConnection,\n\t\tprivate readonly _outboundRtps?: ObservedOutboundRtp[],\n\t\tprivate readonly _mediaSource?: ObservedMediaSource,\n\t) {\n\t\tthis.report = {\n\t\t\ttrackId: this.id,\n\t\t\tkind: this.kind as 'audio' | 'video',\n\t\t};\n\t}\n\n\tpublic get score() { \n\t\treturn this.calculatedScore.value; \n\t}\n\n\tpublic get visited() {\n\t\tconst visited = this._visited;\n\n\t\tthis._visited = false;\n\n\t\treturn visited;\n\t}\n\n\tpublic getPeerConnection() {\n\t\treturn this._peerConnection;\n\t}\n\n\tpublic getOutboundRtps() {\n\t\treturn this._outboundRtps;\n\t}\n\n\tpublic getMediaSource() {\n\t\treturn this._mediaSource;\n\t}\n\n\tpublic getRemoteInboundTracks() {\n\t\treturn this._peerConnection.client.call.remoteTrackResolver?.resolveRemoteInboundTracks(this);\n\t}\n\n\tpublic update(stats: OutboundTrackSample): void {\n\t\tthis._visited = true;\n\n\t\tthis.timestamp = stats.timestamp;\n\t\tthis.calculatedScore.value = stats.score;\n\t\tthis.attachments = stats.attachments;\n\t}\n}","export type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\nexport type Writable<T> = T extends object ? { -readonly [K in keyof T]: Writable<T[K]> } : T;\n\nexport function iteratorConverter<T>(generator: Generator<T, void, undefined>): IterableIterator<T> {\n\treturn {\n\t\t[Symbol.iterator](): IterableIterator<T> {\n\t\t\treturn this;\n\t\t},\n\t\tnext(): IteratorResult<T> {\n\t\t\treturn generator.next();\n\t\t},\n\t};\n}\n\nexport function asyncIteratorConverter<T>(generator: AsyncGenerator<T, void, undefined>): AsyncIterableIterator<T> {\n\treturn {\n\t\t[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n\t\t\treturn this;\n\t\t},\n\t\tnext(): Promise<IteratorResult<T>> {\n\t\t\treturn generator.next();\n\t\t},\n\t};\n}\n\nexport function isValidUuid(str: string): boolean {\n\tconst regexp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n\treturn regexp.test(str);\n}\n\nexport function getAverage(arr: number[], defaultAvgIfArrLengthIs0 = 0): number {\n\tif (arr.length === 0) return defaultAvgIfArrLengthIs0;\n\t\n\treturn arr.reduce((a, b) => a + b, 0) / arr.length;\n}\n\nexport function getMedian(arr: number[], copyArrayForSorting = true): number {\n\t// Sort the array in ascending order\n\tconst sortedArr = copyArrayForSorting \n\t\t? arr.slice().sort((a, b) => a - b)\n\t\t: arr.sort((a, b) => a-b)\n\n\t;\n\n\t// Calculate the middle index\n\tconst mid = Math.floor(sortedArr.length / 2);\n\n\t// If the array length is odd, return the middle element\n\tif (sortedArr.length % 2 !== 0) {\n\t\treturn sortedArr[mid];\n\t}\n\n\t// If the array length is even, return the average of the two middle elements\n\treturn (sortedArr[mid - 1] + sortedArr[mid]) / 2;\n}\n\nexport function parseJsonAs<T>(json?: string): T | undefined {\n\tif (!json) {\n\t\treturn undefined;\n\t}\n\t\n\ttry {\n\t\treturn JSON.parse(json) as T;\n\t} catch (error) {\n\t\treturn undefined;\n\t}\n}","/* eslint-disable no-shadow */\n\nexport enum ClientEventTypes {\n\tCLIENT_JOINED = 'CLIENT_JOINED',\n\tCLIENT_LEFT = 'CLIENT_LEFT',\n\tPEER_CONNECTION_OPENED = 'PEER_CONNECTION_OPENED',\n\tPEER_CONNECTION_CLOSED = 'PEER_CONNECTION_CLOSED',\n\tMEDIA_TRACK_ADDED = 'MEDIA_TRACK_ADDED',\n\tMEDIA_TRACK_REMOVED = 'MEDIA_TRACK_REMOVED',\n\tMEDIA_TRACK_RESUMED = 'MEDIA_TRACK_RESUMED',\n\tMEDIA_TRACK_MUTED = 'MEDIA_TRACK_MUTED',\n\tMEDIA_TRACK_UNMUTED = 'MEDIA_TRACK_UNMUTED',\n\tICE_GATHERING_STATE_CHANGED = 'ICE_GATHERING_STATE_CHANGED',\n\tPEER_CONNECTION_STATE_CHANGED = 'PEER_CONNECTION_STATE_CHANGED',\n\tICE_CONNECTION_STATE_CHANGED = 'ICE_CONNECTION_STATE_CHANGED',\n\tDATA_CHANNEL_OPEN = 'DATA_CHANNEL_OPEN',\n\tDATA_CHANNEL_CLOSED = 'DATA_CHANNEL_CLOSED',\n\tDATA_CHANNEL_ERROR = 'DATA_CHANNEL_ERROR',\n\tNEGOTIATION_NEEDED = 'NEGOTIATION_NEEDED',\n\tSIGNALING_STATE_CHANGE = 'SIGNALING_STATE_CHANGE',\n\t// ICE_GATHERING_STATE_CHANGE = 'ICE_GATHERING_STATE_CHANGE',\n\t// ICE_CONNECTION_STATE_CHANGE = 'ICE_CONNECTION_STATE_CHANGE',\n\tICE_CANDIDATE = 'ICE_CANDIDATE',\n\tICE_CANDIDATE_ERROR = 'ICE_CANDIDATE_ERROR',\n\t\n\t// mediasoup events\n\tPRODUCER_ADDED = 'PRODUCER_ADDED',\n\tPRODUCER_REMOVED = 'PRODUCER_REMOVED',\n\tPRODUCER_PAUSED = 'PRODUCER_PAUSED',\n\tPRODUCER_RESUMED = 'PRODUCER_RESUMED',\n\tCONSUMER_ADDED = 'CONSUMER_ADDED',\n\tCONSUMER_REMOVED = 'CONSUMER_REMOVED',\n\tCONSUMER_PAUSED = 'CONSUMER_PAUSED',\n\tCONSUMER_RESUMED = 'CONSUMER_RESUMED',\n\tDATA_PRODUCER_CREATED = 'DATA_PRODUCER_CREATED',\n\tDATA_PRODUCER_CLOSED = 'DATA_PRODUCER_CLOSED',\n\tDATA_CONSUMER_CREATED = 'DATA_CONSUMER_CREATED',\n\tDATA_CONSUMER_CLOSED = 'DATA_CONSUMER_CLOSED',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ClientJoinedEventPayload extends Record<string, unknown> {\n\t// empty\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ClientLeftEventPayload extends Record<string, unknown> {\n}\n\nexport interface PeerConnectionOpenedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ticeConnectionState?: string;\n\ticeGatheringState?: string;\n\tsignalingState?: string;\n}\n\nexport interface PeerConnectionClosedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ticeConnectionState?: string;\n\ticeGatheringState?: string;\n\tsignalingState?: string;\n}\n\nexport interface MediaTrackAddedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ttrackId: string;\n\tkind: 'audio' | 'video';\n\tlabel?: string;\n\tmuted: boolean;\n\tenabled: boolean;\n\treadyState: string;\n\tcontentHint?: string;\n\tconstraints: MediaTrackConstraints,\n\tcapabilities: MediaTrackCapabilities,\n\tsettings: MediaTrackSettings,\n}\n\nexport interface MediaTrackRemovedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ttrackId: string;\n\tkind: 'audio' | 'video';\n\tlabel?: string;\n\tmuted: boolean;\n\tenabled: boolean;\n\treadyState: string;\n\tcontentHint?: string;\n}\n\nexport interface MediaTrackMutedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ttrackId: string;\n\tkind: 'audio' | 'video';\n\tlabel?: string;\n\tmuted: boolean;\n\tenabled: boolean;\n\treadyState: string;\n\tcontentHint?: string;\n}\n\nexport interface MediaTrackUnmutedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ttrackId: string;\n\tkind: 'audio' | 'video';\n\tlabel?: string;\n\tmuted: boolean;\n\tenabled: boolean;\n\treadyState: string;\n\tcontentHint?: string;\n}\n\nexport interface IceGatheringStateChangedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ticeGatheringState: string;\n}\n\nexport interface PeerConnectionStateChangedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tconnectionState: string;\n}\n\nexport interface IceConnectionStateChangedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\ticeConnectionState: string;\n}\n\nexport interface DataChannelErrorEventPayload extends Record<string, unknown> {\n\tlabel: string;\n\tpeerConnectionId: string;\n\treadyState: string;\n\tdataChannelId: string | number | null,\n\terror: string | null,\n}\n\nexport interface DataChannelOpenEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tlabel: string;\n\treadyState: string;\n\tdataChannelId: string | number | null,\n}\n\nexport interface DataChannelClosedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tlabel: string;\n\treadyState: string;\n\tdataChannelId: string | number | null,\n}\n\nexport interface NegotiationNeededEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n}\n\nexport interface IceCandidateEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/address) */\n\taddress?: string | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/candidate) */\n\tcandidate?: string;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/component) */\n\tcomponent?: RTCIceComponent | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/foundation) */\n\tfoundation?: string | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/port) */\n\tport?: number | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/priority) */\n\tpriority?: number | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/protocol) */\n\tprotocol?: RTCIceProtocol | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/relatedAddress) */\n\trelatedAddress?: string | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/relatedPort) */\n\trelatedPort?: number | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/sdpMLineIndex) */\n\tsdpMLineIndex?: number | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/sdpMid) */\n\tsdpMid?: string | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/tcpType) */\n\ttcpType?: RTCIceTcpCandidateType | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/type) */\n\ttype?: RTCIceCandidateType | null;\n\n\t/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/RTCIceCandidate/usernameFragment) */\n\tusernameFragment?: string | null;\n}\n\nexport interface IceCandidateErrorEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\terrorCode?: number;\n\terrorText?: string;\n\taddress?: string | null;\n\tport?: number | null;\n\turl?: string | null;\n}\n\nexport interface SignalingStateChangedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tsignalingState: string;\n}\n\nexport interface ProducerAddedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n}\n\nexport interface ProducerRemovedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n}\n\nexport interface ProducerPausedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n}\n\nexport interface ProducerResumedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n}\n\nexport interface ConsumerAddedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n\tconsumerId: string;\n\ttrackId: string;\n}\n\nexport interface ConsumerRemovedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n\tconsumerId: string;\n\ttrackId: string;\n}\n\nexport interface ConsumerPausedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n\tconsumerId: string;\n\ttrackId: string;\n}\n\nexport interface ConsumerResumedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tproducerId: string;\n\tconsumerId: string;\n\ttrackId: string;\n}\n\nexport interface DataProducerCreatedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tdataProducerId: string;\n}\n\nexport interface DataProducerClosedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tdataProducerId: string;\n}\n\nexport interface DataConsumerCreatedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tdataProducerId: string;\n\tdataConsumerId: string;\n}\n\nexport interface DataConsumerClosedEventPayload extends Record<string, unknown> {\n\tpeerConnectionId: string;\n\tdataProducerId: string;\n\tdataConsumerId: string;\n}","/* eslint-disable no-shadow */\n\nexport enum ClientMetaTypes {\n\tMEDIA_CONSTRAINT = 'MEDIA_CONSTRAINT',\n\tMEDIA_DEVICE = 'MEDIA_DEVICE',\n\tMEDIA_DEVICES_SUPPORTED_CONSTRAINTS = 'MEDIA_DEVICES_SUPPORTED_CONSTRAINTS',\n\tUSER_MEDIA_ERROR = 'USER_MEDIA_ERROR',\n\tLOCAL_SDP = 'LOCAL_SDP',\n\n\tOPERATION_SYSTEM = 'OPERATION_SYSTEM',\n\tENGINE = 'ENGINE',\n\tPLATFORM = 'PLATFORM',\n\tBROWSER = 'BROWSER',\n}\n\nexport type MediaDeviceInfo = {\n\tdeviceId: string;\n\tlabel: string;\n\tkind: string;\n\tgroupId: string;\n}\n\nexport type Browser = {\n\tname: string;\n\tversion: string;\n}\n\nexport type Platform = {\n\tname: string;\n\tversion: string;\n}\n\nexport type Engine = {\n\tname: string;\n\tversion: string;\n}\n\nexport type OperationSystem = {\n\tname: string;\n\tversion: string;\n}","import { ObservedCall } from '../ObservedCall';\n\nexport class DefaultCallScoreCalculator {\n\n\tpublic constructor(\n\t\tpublic readonly observedCall: ObservedCall,\n\t) {\n\t}\n\n\tpublic update() {\n\t\tlet totalScore = 0;\n\t\tlet totalWeight = 0;\n\n\t\tfor (const client of this.observedCall.observedClients.values()) {\n\t\t\tif (client.score === undefined) continue;\n\n\t\t\ttotalScore += client.score * client.calculatedScore.weight;\n\t\t\ttotalWeight += client.calculatedScore.weight;\n\t\t}\n\n\t\tthis.observedCall.calculatedScore.value = totalWeight ? totalScore / totalWeight : undefined;\n\t}\n}","import { ObservedCall } from '../ObservedCall';\nimport { ObservedClient, ObservedClientEvents } from '../ObservedClient';\nimport type { AcceptContext } from '../Observer';\nimport { Updater } from './Updater';\n \nexport class OnAllClientCallUpdater implements Updater {\n\treadonly name = 'OnAllClientCallUpdater';\n\treadonly description = 'Call the update() method of the ObservedCall once all client has been updated';\n\n\tprivate readonly _updatedClients = new Set<string>();\n\tpublic closed = false;\n\n\tpublic constructor(\n\t\tprivate _observedCall: ObservedCall\n\t) {\n\t\tthis._onNewObservedClient = this._onNewObservedClient.bind(this);\n\n\t\tthis._observedCall.once('close', () => {\n\t\t\tthis._observedCall.off('newclient', this._onNewObservedClient);\n\t\t});\n\t\tthis._observedCall.on('newclient', this._onNewObservedClient);\n\t}\n\t\n\tpublic close(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\t// do nothing, as close once emitted unsubscription happened\n\t\tthis._updatedClients.clear();\n\t}\n\n\tprivate _onNewObservedClient(observedClient: ObservedClient) {\n\t\tif (this.closed) return;\n\t\t\n\t\tconst onUpdate = (...args: ObservedClientEvents['update']) => this._onClientUpdate(observedClient, args[2]);\n\n\t\tobservedClient.once('close', () => {\n\t\t\tobservedClient.off('update', onUpdate);\n\t\t\tthis._updatedClients.delete(observedClient.clientId);\n\t\t\tthis._updateIfEveryClientUpdated();\n\t\t});\n\t\tobservedClient.on('update', onUpdate);\n\t}\n\n\tprivate _onClientUpdate(observedClient: ObservedClient, context?: AcceptContext) {\n\t\tif (observedClient.closed) return;\n\n\t\tthis._updatedClients.add(observedClient.clientId);\n\t\tthis._updateIfEveryClientUpdated(context);\n\t}\n\n\tprivate _updateIfEveryClientUpdated(context?: AcceptContext) {\n\t\tif (this._updatedClients.size < this._observedCall.observedClients.size) {\n\t\t\treturn;\n\t\t} else if (this.closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._updatedClients.clear();\n\t\tthis._observedCall.update(context);\n\t}\n\n}\t","import { Updater } from './Updater';\n\nexport class OnIntervalUpdater implements Updater {\n\treadonly name = 'OnIntervalUpdater';\n\treadonly description = 'Call the update() method given in the constructor once the interval elapsed';\n\n\tpublic timer: ReturnType<typeof setInterval>;\n\n\tpublic constructor(\n\t\tintervalInMs: number,\n\t\tprivate readonly _update: () => void,\n\t) {\n\t\tthis.timer = setInterval(() => this._update(), intervalInMs);\n\t}\n\t\n\tpublic close(): void {\n\t\tclearInterval(this.timer);\n\t}\n}","import { ObservedCall } from '../ObservedCall';\nimport { ObservedClient, ObservedClientEvents } from '../ObservedClient';\nimport { Updater } from './Updater';\n \nexport class OnAnyClientCallUpdater implements Updater {\n\treadonly name = 'OnAnyClientCallUpdater';\n\treadonly description = 'Call the update() method of the ObservedCall when any of the client has been updated';\n\tpublic closed = false;\n\n\tpublic constructor(\n\t\tprivate _observedCall: ObservedCall\n\t) {\n\t\tthis._onNewObservedClient = this._onNewObservedClient.bind(this);\n\n\t\tthis._observedCall.once('close', () => {\n\t\t\tthis._observedCall.off('newclient', this._onNewObservedClient);\n\t\t});\n\t\tthis._observedCall.on('newclient', this._onNewObservedClient);\n\t}\n\t\n\tpublic close(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t}\n\n\tprivate _onNewObservedClient(observedClient: ObservedClient) {\n\t\tif (this.closed) return;\n\t\t\n\t\tconst onUpdate = (...args: ObservedClientEvents['update']) => {\n\t\t\tif (this.closed) return;\n\t\t\tthis._observedCall.update(args[2]);\n\t\t};\n\n\t\tobservedClient.once('close', () => {\n\t\t\tobservedClient.off('update', onUpdate);\n\t\t});\n\t\tobservedClient.on('update', onUpdate);\n\t}\n}","import { createLogger } from '../common/logger';\nimport { Detector } from './Detector';\n\nconst logger = createLogger('Detectors');\n\nexport class Detectors {\n\tprivate _detectors: Detector[];\n\n\tpublic constructor(...detectors: Detector[]) {\n\t\tthis._detectors = detectors;\n\t}\n\n\tpublic get listOfNames() {\n\t\treturn this._detectors.map((d) => d.name);\n\t}\n\n\tpublic add(detector: Detector) {\n\t\tthis._detectors.push(detector);\n\t}\n\n\tpublic remove(detector: Detector) {\n\t\tthis._detectors = this._detectors.filter((d) => d !== detector);\n\t}\n\n\tpublic update() {\n\t\tfor (const detector of this._detectors) {\n\t\t\ttry {\n\t\t\t\tdetector.update();\n\t\t\t} catch (err) {\n\t\t\t\tlogger.warn(`Error updating detector ${detector?.name}`, err);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic clear() {\n\t\tthis._detectors = [];\n\t}\n}\n","import { createLogger } from './common/logger';\nimport { ObservedCall, ObservedCallSettings } from './ObservedCall';\nimport { EventEmitter } from 'events';\nimport { ClientSample } from './schema/ClientSample';\nimport { ObservedTURN } from './ObservedTURN';\nimport { Updater } from './updaters/Updater';\nimport { OnIntervalUpdater } from './updaters/OnIntervalUpdater';\nimport { OnAllCallObserverUpdater } from './updaters/OnAllCallObserverUpdater';\nimport { OnAnyCallObserverUpdater } from './updaters/OnAnyCallObserverUpdater';\nimport { MediasoupRemoteTrackResolver } from './utils/MediasoupRemoteTrackResolver';\nimport type { ObserverEvents, ObserverEventBase } from './ObserverEvents';\nimport type { ClientSampleSinkFactory } from './sinks/ClientSampleSink';\n\nconst logger = createLogger('Observer');\n\nexport type SampleRejectedReason = 'observer-closed' | 'missing-callId' | 'missing-clientId';\n\nexport type { ObserverEvents } from './ObserverEvents';\n\n/**\n * Optional, free-form context supplied to `accept()`. A single context object is\n * threaded down the accept chain (Observer -> Client -> PeerConnection) and is\n * merged into the `appData` of entities created during the accept pass.\n */\nexport type AcceptContext = Record<string, unknown>;\n\n// `update-on-interval` requires an interval; the other policies do not use one.\n// This makes the illegal combination a compile-time error instead of a runtime throw.\ntype ObserverUpdateConfig =\n\t| {\n\t\tupdatePolicy: 'update-on-interval',\n\t\tupdateIntervalInMs: number,\n\t}\n\t| {\n\t\tupdatePolicy?: 'update-on-any-call-updated' | 'update-when-all-call-updated',\n\t\tupdateIntervalInMs?: number,\n\t};\n\n/** Produces the initial `appData` for a call created without an explicit `appData`. */\nexport type CallAppDataFactory = (params: { callId: string, observer: Observer }) => Record<string, unknown>;\n\n/** Produces the initial `appData` for a client created without an explicit `appData`. */\nexport type ClientAppDataFactory = (params: { clientId: string, observedCall: ObservedCall }) => Record<string, unknown>;\n\nexport type ObserverConfig<AppData extends Record<string, unknown> = Record<string, unknown>> = ObserverUpdateConfig & {\n\tdefaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'],\n\tdefaultCallUpdateIntervalInMs?: number,\n\tappData?: AppData,\n\tcloseClientIfIdleForMs?: number,\n\tcloseCallIfEmptyForMs?: number,\n\n\t/**\n\t * Optional factory invoked when a call is created without an explicit `appData`\n\t * (e.g. lazily by `accept()`), so apps can enrich appData without pre-creating the\n\t * entity. `appData` is application-owned; it is never modified by the `accept()` context.\n\t */\n\tcreateCallAppData?: CallAppDataFactory,\n\n\t/** Same as `createCallAppData`, for clients. Receives the (already-created) parent call. */\n\tcreateClientAppData?: ClientAppDataFactory,\n\n\t/**\n\t * Optional factory invoked when a client is created, producing a per-client sink that\n\t * receives every sample the client accepts (or `undefined` for no sink). The destination\n\t * can be derived from `callId` / `clientId`.\n\t */\n\tcreateClientSink?: ClientSampleSinkFactory,\n}\n\nexport declare interface Observer {\n\ton<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;\n\toff<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;\n\tonce<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;\n\temit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;\n}\n\nexport class Observer<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {\n\tpublic readonly observedTURN = new ObservedTURN();\n\tpublic readonly observedCalls = new Map<string, ObservedCall>();\n\tpublic updater?: Updater;\n\n\t/** Ancestry base shared by all Observer-bus events originating at the observer. */\n\tpublic readonly eventScope: ObserverEventBase = { observer: this };\n\n\tpublic closed = false;\n\n\tpublic totalAddedCall = 0;\n\tpublic totalRemovedCall = 0;\n\n\tpublic numberOfClientsUsingTurn = 0;\n\tpublic numberOfClients = 0;\n\tpublic numberOfInboundRtpStreams = 0;\n\tpublic numberOfOutboundRtpStreams = 0;\n\tpublic numberOfDataChannels = 0;\n\tpublic numberOfPeerConnections = 0;\n\n\tprivate _timer?: ReturnType<typeof setInterval>;\n\n\tpublic constructor(public readonly config: ObserverConfig<AppData> = {\n\t\tupdatePolicy: 'update-when-all-call-updated',\n\t\tappData: {} as AppData,\n\t}) {\n\t\tsuper();\n\t\tthis.setMaxListeners(Infinity);\n\t\tthis.update = this.update.bind(this);\n\n\t\tconst currentUpdatePolicy = (config?.updatePolicy) ?? 'update-when-all-call-updated';\n\n\t\tswitch (currentUpdatePolicy) {\n\t\t\tcase 'update-on-any-call-updated':\n\t\t\t\tthis.updater = new OnAnyCallObserverUpdater(this);\n\t\t\t\tbreak;\n\t\t\tcase 'update-when-all-call-updated':\n\t\t\t\tthis.updater = new OnAllCallObserverUpdater(this);\n\t\t\t\tbreak;\n\t\t\tcase 'update-on-interval': {\n\t\t\t\tconst interval = config?.updateIntervalInMs;\n\n\t\t\t\tif (!interval) {\n\t\t\t\t\tlogger.warn('updateIntervalInMs must be set when updatePolicy is \"update-on-interval\"; falling back to \"update-when-all-call-updated\"');\n\t\t\t\t\tthis.updater = new OnAllCallObserverUpdater(this);\n\t\t\t\t} else {\n\t\t\t\t\tthis.updater = new OnIntervalUpdater(\n\t\t\t\t\t\tinterval,\n\t\t\t\t\t\tthis.update.bind(this),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic get numberOfCalls() {\n\t\treturn this.observedCalls.size;\n\t}\n\n\tpublic get appData() {\n\t\treturn this.config.appData;\n\t}\n\n\tpublic getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined {\n\t\tif (this.closed || !this.observedCalls.has(callId)) return;\n\n\t\treturn this.observedCalls.get(callId) as ObservedCall<T>;\n\t}\n\n\tpublic createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(\n\t\tsettings: ObservedCallSettings<T>\n\t): ObservedCall<T> | undefined {\n\t\tif (this.closed) {\n\t\t\tlogger.warn('Attempted to create a call (callId: %s) on a closed observer', settings.callId);\n\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.observedCalls.has(settings.callId)) {\n\t\t\tlogger.warn('Observed Call with id %s already exists; returning the existing instance', settings.callId);\n\n\t\t\treturn this.observedCalls.get(settings.callId) as ObservedCall<T>;\n\t\t}\n\n\t\t// Apply observer-level defaults without mutating the caller's (discriminated-union) settings object.\n\t\tconst callSettings = {\n\t\t\t...settings,\n\t\t\tupdatePolicy: settings.updatePolicy ?? this.config.defaultCallUpdatePolicy,\n\t\t\tupdateIntervalInMs: settings.updateIntervalInMs ?? this.config.defaultCallUpdateIntervalInMs,\n\t\t\tcloseCallIfEmptyForMs: settings.closeCallIfEmptyForMs ?? this.config.closeCallIfEmptyForMs,\n\t\t\tappData: settings.appData ?? this.config.createCallAppData?.({ callId: settings.callId, observer: this }),\n\t\t} as ObservedCallSettings<T>;\n\n\t\tconst observedCall = new ObservedCall(callSettings, this);\n\n\t\tif (callSettings.remoteTrackResolvePolicy === 'mediasoup-sfu') {\n\t\t\tobservedCall.remoteTrackResolver = new MediasoupRemoteTrackResolver(observedCall);\n\t\t}\n\t\t// 'p2p' is reserved for future use; 'none'/undefined => no resolver.\n\n\t\tobservedCall.once('close', () => {\n\t\t\tthis.observedCalls.delete(observedCall.callId);\n\t\t\t++this.totalRemovedCall;\n\t\t});\n\n\t\tthis.observedCalls.set(observedCall.callId, observedCall);\n\t\t++this.totalAddedCall;\n\n\t\tthis._notify('call-added', { ...this.eventScope, observedCall });\n\n\t\treturn observedCall;\n\t}\n\n\tpublic getOrCreateObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(\n\t\tsettings: ObservedCallSettings<T>\n\t): ObservedCall<T> | undefined {\n\t\treturn this.getObservedCall<T>(settings.callId) ?? this.createObservedCall<T>(settings);\n\t}\n\n\tpublic close() {\n\t\tif (this.closed) {\n\t\t\treturn logger.debug('Attempted to close twice');\n\t\t}\n\t\tthis.closed = true;\n\t\tclearInterval(this._timer);\n\t\tthis._timer = undefined;\n\n\t\tthis.observedCalls.forEach((call) => call.close());\n\n\t\tthis._notify('observer-closed', { ...this.eventScope });\n\t}\n\n\tpublic accept(sample: ClientSample, context?: AcceptContext) {\n\t\tif (this.closed) {\n\t\t\tthis._notify('sample-rejected', { ...this.eventScope, reason: 'observer-closed', sample });\n\n\t\t\treturn;\n\t\t}\n\t\tif (!sample.callId) {\n\t\t\tthis._notify('sample-rejected', { ...this.eventScope, reason: 'missing-callId', sample });\n\n\t\t\treturn;\n\t\t}\n\t\tif (!sample.clientId) {\n\t\t\tthis._notify('sample-rejected', { ...this.eventScope, reason: 'missing-clientId', sample });\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Lazily create the call/client. appData for new entities comes only from the\n\t\t// configured factory (createCallAppData / createClientAppData) applied in their\n\t\t// constructors — never from the accept `context`. The context is transient and is\n\t\t// only carried through to the `*-updated` events.\n\t\tlet call = this.getObservedCall(sample.callId);\n\n\t\tif (!call) {\n\t\t\tcall = this.createObservedCall({\n\t\t\t\tcallId: sample.callId,\n\t\t\t\tappData: this.config.createCallAppData?.({ callId: sample.callId, observer: this }),\n\t\t\t});\n\t\t}\n\t\tif (!call) return;\n\n\t\tlet client = call.getObservedClient(sample.clientId);\n\n\t\tif (!client) {\n\t\t\tclient = call.createObservedClient({\n\t\t\t\tclientId: sample.clientId,\n\t\t\t\tappData: this.config.createClientAppData?.({ clientId: sample.clientId, observedCall: call }),\n\t\t\t});\n\t\t}\n\t\tif (!client) return;\n\n\t\tclient.accept(sample, context);\n\t}\n\n\tpublic update() {\n\t\tif (this.closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.numberOfInboundRtpStreams = 0;\n\t\tthis.numberOfOutboundRtpStreams = 0;\n\t\tthis.numberOfPeerConnections = 0;\n\t\tthis.numberOfDataChannels = 0;\n\t\tthis.numberOfClients = 0;\n\t\tthis.numberOfClientsUsingTurn = 0;\n\n\t\tfor (const call of this.observedCalls.values()) {\n\t\t\tthis.numberOfInboundRtpStreams += call.numberOfInboundRtpStreams;\n\t\t\tthis.numberOfOutboundRtpStreams += call.numberOfOutboundRtpStreams;\n\t\t\tthis.numberOfPeerConnections += call.numberOfPeerConnections;\n\t\t\tthis.numberOfDataChannels += call.numberOfDataChannels;\n\t\t\tthis.numberOfClients += call.numberOfClients;\n\t\t\tthis.numberOfClientsUsingTurn += call.clientsUsedTurn.size;\n\t\t}\n\n\t\tthis.observedTURN.update();\n\n\t\tthis._notify('observer-updated', { ...this.eventScope });\n\t}\n\n\t/** Emit an Observer-bus event. */\n\tprivate _notify<K extends keyof ObserverEvents>(type: K, ...args: ObserverEvents[K]): void {\n\t\tthis.emit(type, ...args);\n\t}\n}\n","import { EventEmitter } from 'events';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { ObservedTurnServer } from './ObservedTurnServer';\nimport { createLogger } from './common/logger';\n\nconst logger = createLogger('ObservedTURN');\n\nexport type ObservedTURNEventMap = {\n\t'update': [ObservedTURN];\n\t'close': [];\n}\n\nexport declare interface ObservedTURN {\n\ton<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;\n\toff<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;\n\tonce<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;\n\temit<U extends keyof ObservedTURNEventMap>(event: U, ...args: ObservedTURNEventMap[U]): boolean;\n}\n\nexport class ObservedTURN extends EventEmitter {\n\tpublic totalBytesSent = 0;\n\tpublic totalBytesReceived = 0;\n\tpublic totalPacketsSent = 0;\n\tpublic totalPacketsReceived = 0;\n\n\tpublic packetsSentPerSecond = 0;\n\tpublic packetsReceivedPerSecond = 0;\n\tpublic outboundBitrate = 0;\n\tpublic inboundBitrate = 0;\n\tpublic numberOfClients = 0;\n \n\tpublic readonly servers = new Map<string, ObservedTurnServer>();\n\n\tpublic constructor(\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic update() {\n\t\tconst clientIds = new Set<string>();\n \n\t\tthis.packetsReceivedPerSecond = 0;\n\t\tthis.packetsSentPerSecond = 0;\n\t\tthis.outboundBitrate = 0;\n\t\tthis.inboundBitrate = 0;\n\n\t\tfor (const server of this.servers.values()) {\n\t\t\tserver.update();\n\t\t\tserver.observedPeerConnections.forEach((pc) => clientIds.add(pc.client.clientId));\n\t\t}\n\n\t\tthis.numberOfClients = clientIds.size;\n\t}\n\n\tpublic addPeerConnection(peerConnection: ObservedPeerConnection) {\n\t\tconst turnPairs = peerConnection.selectedIceCandidatePairs.filter((pair) => pair.getLocalCandidate()?.candidateType === 'relay' && pair.getRemoteCandidate()?.url?.startsWith('turn:'));\n\n\t\tif (turnPairs.length !== 1) {\n\t\t\treturn (logger.warn(`Expected exactly one TURN pair, but found for peerconnection ${peerConnection.peerConnectionId}`, turnPairs.length), undefined);\n\t\t}\n\n\t\tconst candidatePair = turnPairs[0];\n\t\tconst rawUrl = candidatePair.getRemoteCandidate()?.url;\n\n\t\tif (!rawUrl) {\n\t\t\treturn (logger.warn(`No remote candidate URL found for peerconnection ${peerConnection.peerConnectionId}`), undefined);\n\t\t}\n\n\t\tconst turnUrl = new URL(rawUrl);\n\t\tconst turnServerUrl = `${turnUrl.protocol}//${turnUrl.hostname}:${turnUrl.port}`;\n\t\tlet turnServer = this.servers.get(turnServerUrl);\n \n\t\tif (!turnServer) {\n\t\t\tturnServer = new ObservedTurnServer(turnServerUrl, this);\n\t\t}\n\n\t\treturn turnServer;\n\t}\n\n\tpublic removePeerConnection(peerConnection: ObservedPeerConnection) {\n\t\tfor (const turnServer of this.servers.values()) {\n\t\t\tturnServer.observedPeerConnections.delete(peerConnection.peerConnectionId);\n\t\t}\n\t}\n\n}","import { ObservedIceCandidatePair } from './ObservedIceCandidatePair';\nimport { ObservedPeerConnection } from './ObservedPeerConnection';\nimport { ObservedTURN } from './ObservedTURN';\n\nexport class ObservedTurnServer {\n\tpublic totalBytesSent = 0;\n\tpublic totalBytesReceived = 0;\n\tpublic totalPacketsSent = 0;\n\tpublic totalPacketsReceived = 0;\n\n\tpublic packetsSentPerSecond = 0;\n\tpublic packetsReceivedPerSecond = 0;\n\tpublic outboundBitrate = 0;\n\tpublic inboundBitrate = 0;\n\n\tpublic deltaBytesSent = 0;\n\tpublic deltaBytesReceived = 0;\n\tpublic deltaPacketsSent = 0;\n\tpublic deltaPacketsReceived = 0;\n \n\tpublic readonly observedPeerConnections = new Map<string, ObservedPeerConnection>(); \n\n\tpublic updated = Date.now();\n\n\tpublic constructor(\n\t\tpublic readonly url: string,\n\t\tpublic readonly observedTURN: ObservedTURN,\n\t) {\n\n\t}\n\n\tpublic updateTurnUsage(...selectedcandidatepairs: ObservedIceCandidatePair[]) {\n\t\tfor (const selectedcandidatepair of selectedcandidatepairs) {\n\t\t\tthis.deltaBytesReceived += selectedcandidatepair.deltaBytesReceived;\n\t\t\tthis.deltaBytesSent += selectedcandidatepair.deltaBytesSent;\n\t\t\tthis.deltaPacketsReceived += selectedcandidatepair.deltaPacketsReceived;\n\t\t\tthis.deltaPacketsSent += selectedcandidatepair.deltaPacketsSent;\n\t\t}\n\t}\n\n\tpublic update() {\n\t\tconst now = Date.now();\n\t\tconst deltaInS = (now - this.updated) / 1000;\n \n\t\tthis.packetsSentPerSecond = this.deltaPacketsSent / deltaInS;\n\t\tthis.packetsReceivedPerSecond = this.deltaPacketsReceived / deltaInS; \n\t\tthis.outboundBitrate = (this.deltaBytesReceived * 8) / deltaInS;\n\t\tthis.inboundBitrate = (this.deltaBytesSent * 8) / deltaInS;\n \n\t\tthis.totalBytesSent += this.deltaBytesSent;\n\t\tthis.totalBytesReceived += this.deltaBytesReceived;\n\t\tthis.totalPacketsSent += this.deltaPacketsSent;\n\t\tthis.totalPacketsReceived += this.deltaPacketsReceived;\n\t\t\n\t\tthis.observedTURN.totalBytesSent += this.deltaBytesSent;\n\t\tthis.observedTURN.totalBytesReceived += this.deltaBytesReceived;\n\t\tthis.observedTURN.totalPacketsSent += this.deltaPacketsSent;\n\t\tthis.observedTURN.totalPacketsReceived += this.deltaPacketsReceived;\n \n\t\tthis.observedTURN.inboundBitrate += this.inboundBitrate;\n\t\tthis.observedTURN.outboundBitrate += this.outboundBitrate;\n\t\tthis.observedTURN.packetsReceivedPerSecond += this.packetsReceivedPerSecond;\n\t\tthis.observedTURN.packetsSentPerSecond += this.packetsSentPerSecond;\n \n\t\tthis.deltaBytesSent = 0;\n\t\tthis.deltaBytesReceived = 0;\n\t\tthis.deltaPacketsSent = 0;\n\t\tthis.deltaPacketsReceived = 0;\n\n\t\tthis.updated = now;\n\t}\n}","import { ObservedCall } from '../ObservedCall';\nimport { Observer } from '../Observer';\nimport type { ObservedCallScope } from '../ObserverEvents';\nimport { Updater } from './Updater';\n\nexport class OnAllCallObserverUpdater implements Updater {\n\tpublic readonly name = 'OnAllCallObserverUpdater';\n\tpublic readonly description = 'Call Observer\\'s update() method when all of the ObservedCalls are updated';\n\t\n\tprivate readonly _updatedCalls = new Set<string>();\n\tpublic closed = false;\n\n\tpublic constructor(\n\t\tprivate observer: Observer\n\t) {\n\t\tthis._onNewObservedCall = this._onNewObservedCall.bind(this);\n\n\t\tthis.observer.once('observer-closed', () => {\n\t\t\tthis.observer.off('call-added', this._onNewObservedCall);\n\t\t});\n\t\tthis.observer.on('call-added', this._onNewObservedCall);\n\t}\n\n\tclose(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\n\t\tthis._updatedCalls.clear();\n\t}\n\n\tprivate _onNewObservedCall({ observedCall }: ObservedCallScope) {\n\t\tif (this.closed) return;\n\n\t\tconst onUpdate = () => this._onObservedCallUpdated(observedCall);\n\n\t\tobservedCall.once('close', () => {\n\t\t\tobservedCall.off('update', onUpdate);\n\t\t\tthis._updatedCalls.delete(observedCall.callId);\n\n\t\t\tthis._updateIfEveryCallUpdated();\n\t\t});\n\t\tobservedCall.on('update', onUpdate);\n\t}\n\n\tprivate _onObservedCallUpdated(observedCall: ObservedCall) {\n\t\tif (observedCall.closed) return;\n\n\t\tthis._updatedCalls.add(observedCall.callId);\n\n\t\tthis._updateIfEveryCallUpdated();\n\t}\n\n\tprivate _updateIfEveryCallUpdated() {\n\t\tif (this._updatedCalls.size < this.observer.observedCalls.size) return;\n\t\telse if (this.closed) return;\n\n\t\tthis._updatedCalls.clear();\n\t\tthis.observer.update();\n\t}\n}","import { Observer } from '../Observer';\nimport type { ObservedCallScope } from '../ObserverEvents';\nimport { Updater } from './Updater';\n\nexport class OnAnyCallObserverUpdater implements Updater {\n\tpublic readonly name = 'OnAnyCallObserverUpdater';\n\tpublic readonly description = 'Call Observer\\'s update() method on any of the ObservedCall is updated';\n\tpublic closed = false;\n\n\tpublic constructor(\n\t\tprivate observver: Observer\n\t) {\n\t\tthis._onNewObservedCall = this._onNewObservedCall.bind(this);\n\n\t\tthis.observver.once('observer-closed', () => {\n\t\t\tthis.observver.off('call-added', this._onNewObservedCall);\n\t\t});\n\t\tthis.observver.on('call-added', this._onNewObservedCall);\n\t}\n\n\tpublic close(): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\t// do nothing, because we unsubscribe once close is emitted from observer\n\t}\n\n\tprivate _onNewObservedCall({ observedCall }: ObservedCallScope) {\n\t\tif (this.closed) return;\n\n\t\tconst onUpdate = () => {\n\t\t\tif (this.closed) return;\n\n\t\t\tthis.observver.update();\n\t\t};\n\n\t\tobservedCall.once('close', () => {\n\t\t\tobservedCall.off('update', onUpdate);\n\t\t});\n\t\tobservedCall.on('update', onUpdate);\n\t}\n}","import { ObservedCall } from '../ObservedCall';\nimport { ObservedInboundTrack } from '../ObservedInboundTrack';\nimport { ObservedOutboundTrack } from '../ObservedOutboundTrack';\nimport { RemoteTrackResolver } from './RemoteTrackResolver';\nimport type { ObserverEvents } from '../ObserverEvents';\n\nexport class MediasoupRemoteTrackResolver implements RemoteTrackResolver {\n\tprivate _consumerIdToProducerId = new Map<string, string>();\n\tprivate _producerIdToOutboundTrack = new Map<string, ObservedOutboundTrack>();\n\tprivate _consumerIdToInboundTrack = new Map<string, ObservedInboundTrack>();\n\t// private _producerIdToOutboundTrack = new Map<string, ObservedOutboundTrack>();\n\n\tprivate _inboundTrackToConsumerId = new Map<string, string>();\n\tprivate _producerIdToConsumerIds = new Map<string, string[]>();\n\tprivate _outboundTrackToProducerId = new Map<string, string>();\n\n\tpublic constructor(\n\t\tpublic readonly observedCall: ObservedCall\n\t) {\n\t\tconst observer = observedCall.observer;\n\n\t\t// Subscribe to the central Observer bus, filtering to this call's tracks.\n\t\tconst onInboundAdded = (p: ObserverEvents['inbound-track-added'][0]) => {\n\t\t\tif (p.observedCall === this.observedCall) this._addInboundTrack(p.observedInboundTrack);\n\t\t};\n\t\tconst onInboundRemoved = (p: ObserverEvents['inbound-track-removed'][0]) => {\n\t\t\tif (p.observedCall === this.observedCall) this._removeInboundTrack(p.observedInboundTrack);\n\t\t};\n\t\tconst onOutboundAdded = (p: ObserverEvents['outbound-track-added'][0]) => {\n\t\t\tif (p.observedCall === this.observedCall) this._addOutboundTrack(p.observedOutboundTrack);\n\t\t};\n\t\tconst onOutboundRemoved = (p: ObserverEvents['outbound-track-removed'][0]) => {\n\t\t\tif (p.observedCall === this.observedCall) this._removeOutboundTrack(p.observedOutboundTrack);\n\t\t};\n\n\t\tobserver.on('inbound-track-added', onInboundAdded);\n\t\tobserver.on('inbound-track-removed', onInboundRemoved);\n\t\tobserver.on('outbound-track-added', onOutboundAdded);\n\t\tobserver.on('outbound-track-removed', onOutboundRemoved);\n\n\t\tobservedCall.once('close', () => {\n\t\t\tobserver.off('inbound-track-added', onInboundAdded);\n\t\t\tobserver.off('inbound-track-removed', onInboundRemoved);\n\t\t\tobserver.off('outbound-track-added', onOutboundAdded);\n\t\t\tobserver.off('outbound-track-removed', onOutboundRemoved);\n\t\t});\n\t}\n\n\tpublic resolveRemoteOutboundTrack(inboundTrack: ObservedInboundTrack): ObservedOutboundTrack | undefined {\n\t\tconst consumerId = this._inboundTrackToConsumerId.get(inboundTrack.id);\n\n\t\tif (!consumerId) return;\n \n\t\tconst producerId = this._consumerIdToProducerId.get(consumerId);\n\n\t\tif (!producerId) return;\n\n\t\treturn this._producerIdToOutboundTrack.get(producerId);\n\t}\n\n\tpublic resolveRemoteInboundTracks(outboundTrack: ObservedOutboundTrack): ObservedInboundTrack[] | undefined {\n\t\tconst producerId = this._outboundTrackToProducerId.get(outboundTrack.id);\n\n\t\tif (!producerId) return;\n\n\t\tconst consumerIds = this._producerIdToConsumerIds.get(producerId);\n\n\t\tif (!consumerIds) return;\n\t\t\n\t\treturn consumerIds\n\t\t\t.map((consumerId) => this._consumerIdToInboundTrack.get(consumerId))\n\t\t\t.filter((inboundTrack) => Boolean(inboundTrack)) as ObservedInboundTrack[]\n\t\t; \n\t}\n\n\tprivate _addInboundTrack(inboundTrack: ObservedInboundTrack) {\n\t\tconst attachments = this._getInboundTrackAttachments(inboundTrack);\n\n\t\tif (!attachments) return;\n\n\t\tconst {\n\t\t\tproducerId,\n\t\t\tconsumerId\n\t\t} = attachments;\n\n\t\tthis._inboundTrackToConsumerId.set(inboundTrack.id, consumerId);\n\t\tthis._consumerIdToProducerId.set(consumerId, producerId);\n\t\tthis._consumerIdToInboundTrack.set(consumerId, inboundTrack);\n\n\t\tlet producerConsumers = this._producerIdToConsumerIds.get(producerId);\n\n\t\tif (!producerConsumers) {\n\t\t\tproducerConsumers = [];\n\t\t\tthis._producerIdToConsumerIds.set(producerId, producerConsumers);\n\t\t}\n\t\tproducerConsumers.push(consumerId);\n\t}\n\n\tprivate _removeInboundTrack(inboundTrack: ObservedInboundTrack) {\n\t\tconst consumerId = this._inboundTrackToConsumerId.get(inboundTrack.id);\n\n\t\tif (!consumerId) return;\n\n\t\tthis._inboundTrackToConsumerId.delete(inboundTrack.id);\n\t\tthis._consumerIdToProducerId.delete(consumerId);\n\t\tthis._consumerIdToInboundTrack.delete(consumerId);\n \n\t\tconst producerConsumers = this._producerIdToConsumerIds.get(consumerId);\n\n\t\tif (!producerConsumers) return;\n\n\t\tconst filteredProducerConsumers = producerConsumers.filter((id) => id !== consumerId);\n\n\t\tif (filteredProducerConsumers.length === 0) {\n\t\t\tthis._producerIdToConsumerIds.delete(consumerId);\n\t\t} else {\n\t\t\tthis._producerIdToConsumerIds.set(consumerId, filteredProducerConsumers);\n\t\t}\n\t}\n\n\tprivate _addOutboundTrack(outboundTrack: ObservedOutboundTrack) {\n\t\tconst attachments = this._getOutboundTrackAttachments(outboundTrack);\n\n\t\tif (!attachments) return;\n\n\t\tconst {\n\t\t\tproducerId,\n\t\t} = attachments;\n\n\t\tthis._producerIdToOutboundTrack.set(producerId, outboundTrack);\n\t\tthis._outboundTrackToProducerId.set(outboundTrack.id, producerId);\n\t}\n\n\tprivate _removeOutboundTrack(outboundTrack: ObservedOutboundTrack) {\n\t\tconst producerId = this._outboundTrackToProducerId.get(outboundTrack.id);\n\n\t\tif (!producerId) return;\n\n\t\tthis._producerIdToOutboundTrack.delete(producerId);\n\t\tthis._outboundTrackToProducerId.delete(outboundTrack.id);\n\t}\n\n\tprivate _getInboundTrackAttachments(inboundTrack: ObservedInboundTrack) {\n\t\tconst {\n\t\t\tproducerId,\n\t\t\tconsumerId\n\t\t} = inboundTrack.attachments ?? {};\n\n\t\tif (!producerId || !consumerId || typeof producerId !== 'string' || typeof consumerId !== 'string') return;\n\n\t\treturn {\n\t\t\tproducerId,\n\t\t\tconsumerId\n\t\t};\n\t}\n\n\tprivate _getOutboundTrackAttachments(outboundTrack: ObservedOutboundTrack) {\n\t\tconst {\n\t\t\tproducerId,\n\t\t} = outboundTrack.attachments ?? {};\n\n\t\tif (!producerId || typeof producerId !== 'string') return;\n\n\t\treturn {\n\t\t\tproducerId,\n\t\t};\n\t}\n}","import { EventEmitter } from 'events';\nimport type { ClientSample } from '../schema/ClientSample';\nimport type { ObservedCall } from '../ObservedCall';\n\n/** The lifecycle events a sink may emit (a subset of Node's writable-stream events). */\nexport type ClientSampleSinkEvents = {\n\n\t/** The destination is fully written and closed (e.g. a file flushed and its fd closed). */\n\tclose: [];\n\n\t/** The destination failed. */\n\terror: [Error];\n\n\t/** `end()` was processed and all queued data was flushed (before `close`). */\n\tfinish: [];\n\n\t/** The buffer drained after backpressure; safe to write more. */\n\tdrain: [];\n};\n\nexport declare interface ClientSampleSink {\n\ton<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;\n\tonce<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;\n\toff<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;\n\temit<E extends keyof ClientSampleSinkEvents>(event: E, ...args: ClientSampleSinkEvents[E]): boolean;\n}\n\n/**\n * A per-client destination for accepted samples — a typed `EventEmitter` base class. One sink is\n * created per `ObservedClient` (via `ObserverConfig.createClientSink`). It is **object-mode**:\n * `write` receives the `ClientSample` itself, so each sink decides how to serialize it (JSON\n * line, protobuf, msgpack, a remote payload, …).\n *\n * The library calls `write(sample)` synchronously per accepted sample (not awaited), `end()`s the\n * sink when the client closes, and attaches an `error` listener so a failing sink can't crash the\n * process. The application — which created the sink — listens for `close` (destination ready,\n * e.g. a file flushed and its fd closed) and `error`.\n *\n * Subclass this and implement `write`/`end` (and `emit` your lifecycle events). Built-in sinks\n * (`JsonlFileSink`, `InMemorySink`) and their factories are exported from the package root.\n */\nexport abstract class ClientSampleSink extends EventEmitter {\n\t/** Accept one sample; the sink serializes it however it likes. `false` signals backpressure. */\n\tpublic abstract write(sample: ClientSample): boolean;\n\n\t/** Finish writing; the sink flushes and (if applicable) emits `close`. */\n\tpublic abstract end(): void;\n}\n\n/**\n * Produces a sink for a newly-created client, or `undefined` for no sink. Receives the\n * client id and its (already-created) parent call, so the destination can be derived\n * from `callId` / `clientId`.\n */\nexport type ClientSampleSinkFactory = (params: {\n\tclientId: string,\n\tobservedCall: ObservedCall,\n}) => ClientSampleSink | undefined;\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { ClientSampleSink, ClientSampleSinkFactory } from './ClientSampleSink';\nimport type { ClientSample } from '../schema/ClientSample';\n\nexport type JsonlFileSinkOptions = {\n\n\t/** Absolute or relative file path to append JSONL lines to. */\n\tpath: string,\n\n\t/** Optional custom serializer; defaults to `JSON.stringify`. */\n\tserializeSample?: (sample: ClientSample) => string,\n};\n\n/**\n * A sink that serializes each sample to a JSON line and appends it to a file. It wraps an\n * `fs.WriteStream` and re-emits its lifecycle events, so `close` fires once the file is flushed\n * and its descriptor is closed (file ready) and `error` surfaces file errors.\n */\nexport class JsonlFileSink extends ClientSampleSink {\n\t/** The file this sink writes to. Read it (e.g. in a `close` handler) to upload/move the file. */\n\tpublic readonly path: string;\n\n\tprivate readonly _stream: fs.WriteStream;\n\tprivate readonly _serializeSample: (sample: ClientSample) => string;\n\n\tpublic constructor(options: JsonlFileSinkOptions) {\n\t\tsuper();\n\t\tthis.path = options.path;\n\t\tthis._stream = fs.createWriteStream(this.path, { flags: 'a' });\n\n\t\tthis._stream.on('close', () => this.emit('close'));\n\t\tthis._stream.on('finish', () => this.emit('finish'));\n\t\tthis._stream.on('drain', () => this.emit('drain'));\n\t\tthis._stream.on('error', (err) => this.emit('error', err));\n\n\t\tthis._serializeSample = options.serializeSample ?? ((sample) => JSON.stringify(sample));\n\t}\n\n\tpublic write(sample: ClientSample): boolean {\n\t\treturn this._stream.write(`${this._serializeSample(sample)}\\n`);\n\t}\n\n\tpublic end(): void {\n\t\tthis._stream.end();\n\t}\n}\n\n/** Build a JSONL file sink for a single path. */\nexport function createJsonlFileSink(options: JsonlFileSinkOptions): ClientSampleSink {\n\treturn new JsonlFileSink(options);\n}\n\nexport type JsonlFileSinkFactoryOptions = {\n\n\t/** Directory the per-client files are written into (must exists). */\n\tdirectory: string,\n\n\t/** Builds the file name from the call/client ids. Defaults to `${callId}__${clientId}.jsonl`. */\n\tgetFileName?: (params: { callId: string, clientId: string }) => string,\n\n\t/** Optional custom serializer; defaults to `JSON.stringify`. */\n\tserializeSample?: (sample: ClientSample) => string,\n};\n\n/**\n * Convenience factory that writes one JSONL file per client, with the path derived from\n * `callId` / `clientId`. Plug into `ObserverConfig.createClientSink`.\n */\nexport function createJsonlFileSinkFactory(options: JsonlFileSinkFactoryOptions): ClientSampleSinkFactory {\n\n\treturn ({ clientId, observedCall }) => {\n\t\tconst filename = options.getFileName?.({ callId: observedCall.callId, clientId }) ?? `${observedCall.callId}__${clientId}.jsonl`;\n\n\t\treturn createJsonlFileSink({\n\t\t\tpath: path.join(options.directory, filename),\n\t\t\tserializeSample: options.serializeSample,\n\t\t});\n\t};\n}\n","import { ClientSampleSink } from './ClientSampleSink';\nimport type { ClientSample } from '../schema/ClientSample';\n\n/**\n * A `ClientSampleSink` that collects the accepted sample objects into an array. Useful for\n * tests and offline replay. Emits `close` on `end()`.\n */\nexport class InMemorySink extends ClientSampleSink {\n\tpublic constructor(public readonly samples: ClientSample[] = []) {\n\t\tsuper();\n\t}\n\n\tpublic write(sample: ClientSample): boolean {\n\t\tthis.samples.push(sample);\n\n\t\treturn true;\n\t}\n\n\tpublic end(): void {\n\t\tthis.emit('close');\n\t}\n}\n\nexport function createInMemorySink(samples?: ClientSample[]): InMemorySink {\n\treturn new InMemorySink(samples);\n}\n"],"mappings":"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","names":["module","logger","import_events","import_events","ClientEventTypes","ClientMetaTypes","logger","logger","logger","import_events","import_events","logger","logger","import_events"]}