@observertc/observer-js 1.0.0-beta.1 → 1.0.0-beta.10

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 (227) hide show
  1. package/README.md +972 -383
  2. package/dist/index.d.mts +2952 -0
  3. package/dist/index.d.ts +2952 -0
  4. package/dist/index.js +4040 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +3970 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/llms-full.txt +1536 -0
  9. package/package.json +32 -16
  10. package/.eslintrc.json +0 -143
  11. package/.prettierignore +0 -5
  12. package/.prettierrc +0 -7
  13. package/jest.config.js +0 -9
  14. package/lib/ObservedCall.d.ts +0 -85
  15. package/lib/ObservedCall.d.ts.map +0 -1
  16. package/lib/ObservedCall.js +0 -219
  17. package/lib/ObservedCallEventMonitor.d.ts +0 -104
  18. package/lib/ObservedCallEventMonitor.d.ts.map +0 -1
  19. package/lib/ObservedCallEventMonitor.js +0 -314
  20. package/lib/ObservedCallSummary.d.ts +0 -18
  21. package/lib/ObservedCallSummary.d.ts.map +0 -1
  22. package/lib/ObservedCallSummary.js +0 -2
  23. package/lib/ObservedCertificate.d.ts +0 -19
  24. package/lib/ObservedCertificate.d.ts.map +0 -1
  25. package/lib/ObservedCertificate.js +0 -38
  26. package/lib/ObservedClient.d.ts +0 -127
  27. package/lib/ObservedClient.d.ts.map +0 -1
  28. package/lib/ObservedClient.js +0 -636
  29. package/lib/ObservedClientEventMonitor.d.ts +0 -91
  30. package/lib/ObservedClientEventMonitor.d.ts.map +0 -1
  31. package/lib/ObservedClientEventMonitor.js +0 -254
  32. package/lib/ObservedClientSummary.d.ts +0 -23
  33. package/lib/ObservedClientSummary.d.ts.map +0 -1
  34. package/lib/ObservedClientSummary.js +0 -2
  35. package/lib/ObservedCodec.d.ts +0 -22
  36. package/lib/ObservedCodec.d.ts.map +0 -1
  37. package/lib/ObservedCodec.js +0 -45
  38. package/lib/ObservedDataChannel.d.ts +0 -30
  39. package/lib/ObservedDataChannel.d.ts.map +0 -1
  40. package/lib/ObservedDataChannel.js +0 -75
  41. package/lib/ObservedIceCandidate.d.ts +0 -29
  42. package/lib/ObservedIceCandidate.d.ts.map +0 -1
  43. package/lib/ObservedIceCandidate.js +0 -59
  44. package/lib/ObservedIceCandidatePair.d.ts +0 -45
  45. package/lib/ObservedIceCandidatePair.d.ts.map +0 -1
  46. package/lib/ObservedIceCandidatePair.js +0 -127
  47. package/lib/ObservedIceTransport.d.ts +0 -36
  48. package/lib/ObservedIceTransport.d.ts.map +0 -1
  49. package/lib/ObservedIceTransport.js +0 -93
  50. package/lib/ObservedInboundRtp.d.ts +0 -92
  51. package/lib/ObservedInboundRtp.d.ts.map +0 -1
  52. package/lib/ObservedInboundRtp.js +0 -193
  53. package/lib/ObservedInboundTrack.d.ts +0 -32
  54. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  55. package/lib/ObservedInboundTrack.js +0 -60
  56. package/lib/ObservedMediaPlayout.d.ts +0 -22
  57. package/lib/ObservedMediaPlayout.d.ts.map +0 -1
  58. package/lib/ObservedMediaPlayout.js +0 -42
  59. package/lib/ObservedMediaSource.d.ts +0 -28
  60. package/lib/ObservedMediaSource.d.ts.map +0 -1
  61. package/lib/ObservedMediaSource.js +0 -55
  62. package/lib/ObservedOutboundRtp.d.ts +0 -62
  63. package/lib/ObservedOutboundRtp.d.ts.map +0 -1
  64. package/lib/ObservedOutboundRtp.js +0 -144
  65. package/lib/ObservedOutboundTrack.d.ts +0 -32
  66. package/lib/ObservedOutboundTrack.d.ts.map +0 -1
  67. package/lib/ObservedOutboundTrack.js +0 -60
  68. package/lib/ObservedPeerConnection.d.ts +0 -207
  69. package/lib/ObservedPeerConnection.d.ts.map +0 -1
  70. package/lib/ObservedPeerConnection.js +0 -773
  71. package/lib/ObservedPeerConnectionTransport.d.ts +0 -17
  72. package/lib/ObservedPeerConnectionTransport.d.ts.map +0 -1
  73. package/lib/ObservedPeerConnectionTransport.js +0 -34
  74. package/lib/ObservedRemoteInboundRtp.d.ts +0 -30
  75. package/lib/ObservedRemoteInboundRtp.d.ts.map +0 -1
  76. package/lib/ObservedRemoteInboundRtp.js +0 -60
  77. package/lib/ObservedRemoteOutboundRtp.d.ts +0 -30
  78. package/lib/ObservedRemoteOutboundRtp.d.ts.map +0 -1
  79. package/lib/ObservedRemoteOutboundRtp.js +0 -60
  80. package/lib/ObservedTURN.d.ts +0 -31
  81. package/lib/ObservedTURN.d.ts.map +0 -1
  82. package/lib/ObservedTURN.js +0 -58
  83. package/lib/ObservedTurnServer.d.ts +0 -25
  84. package/lib/ObservedTurnServer.d.ts.map +0 -1
  85. package/lib/ObservedTurnServer.js +0 -59
  86. package/lib/Observer.d.ts +0 -65
  87. package/lib/Observer.d.ts.map +0 -1
  88. package/lib/Observer.js +0 -160
  89. package/lib/ObserverEventMonitor.d.ts +0 -138
  90. package/lib/ObserverEventMonitor.d.ts.map +0 -1
  91. package/lib/ObserverEventMonitor.js +0 -433
  92. package/lib/ObserverSummary.d.ts +0 -13
  93. package/lib/ObserverSummary.d.ts.map +0 -1
  94. package/lib/ObserverSummary.js +0 -2
  95. package/lib/common/Middleware.d.ts +0 -17
  96. package/lib/common/Middleware.d.ts.map +0 -1
  97. package/lib/common/Middleware.js +0 -60
  98. package/lib/common/SingleExecutor.d.ts +0 -3
  99. package/lib/common/SingleExecutor.d.ts.map +0 -1
  100. package/lib/common/SingleExecutor.js +0 -31
  101. package/lib/common/logger.d.ts +0 -17
  102. package/lib/common/logger.d.ts.map +0 -1
  103. package/lib/common/logger.js +0 -50
  104. package/lib/common/types.d.ts +0 -3
  105. package/lib/common/types.d.ts.map +0 -1
  106. package/lib/common/types.js +0 -3
  107. package/lib/common/utils.d.ts +0 -11
  108. package/lib/common/utils.d.ts.map +0 -1
  109. package/lib/common/utils.js +0 -63
  110. package/lib/detectors/Detector.d.ts +0 -5
  111. package/lib/detectors/Detector.d.ts.map +0 -1
  112. package/lib/detectors/Detector.js +0 -3
  113. package/lib/detectors/Detectors.d.ts +0 -11
  114. package/lib/detectors/Detectors.d.ts.map +0 -1
  115. package/lib/detectors/Detectors.js +0 -34
  116. package/lib/index.d.ts +0 -28
  117. package/lib/index.d.ts.map +0 -1
  118. package/lib/index.js +0 -49
  119. package/lib/mediasoup/ObservedMediaRouter.d.ts +0 -10
  120. package/lib/mediasoup/ObservedMediaRouter.d.ts.map +0 -1
  121. package/lib/mediasoup/ObservedMediaRouter.js +0 -6
  122. package/lib/monitors/TurnUsageMonitor.d.ts +0 -1
  123. package/lib/monitors/TurnUsageMonitor.d.ts.map +0 -1
  124. package/lib/monitors/TurnUsageMonitor.js +0 -146
  125. package/lib/schema/ClientEventTypes.d.ts +0 -228
  126. package/lib/schema/ClientEventTypes.d.ts.map +0 -1
  127. package/lib/schema/ClientEventTypes.js +0 -41
  128. package/lib/schema/ClientMetaTypes.d.ts +0 -34
  129. package/lib/schema/ClientMetaTypes.d.ts.map +0 -1
  130. package/lib/schema/ClientMetaTypes.js +0 -16
  131. package/lib/schema/ClientSample.d.ts +0 -1333
  132. package/lib/schema/ClientSample.d.ts.map +0 -1
  133. package/lib/schema/ClientSample.js +0 -4
  134. package/lib/scores/CalculatedScore.d.ts +0 -6
  135. package/lib/scores/CalculatedScore.d.ts.map +0 -1
  136. package/lib/scores/CalculatedScore.js +0 -2
  137. package/lib/scores/DefaultCallScoreCalculator.d.ts +0 -7
  138. package/lib/scores/DefaultCallScoreCalculator.d.ts.map +0 -1
  139. package/lib/scores/DefaultCallScoreCalculator.js +0 -21
  140. package/lib/scores/ScoreCalculator.d.ts +0 -4
  141. package/lib/scores/ScoreCalculator.d.ts.map +0 -1
  142. package/lib/scores/ScoreCalculator.js +0 -2
  143. package/lib/updaters/CallUpdater.d.ts +0 -5
  144. package/lib/updaters/CallUpdater.d.ts.map +0 -1
  145. package/lib/updaters/CallUpdater.js +0 -2
  146. package/lib/updaters/ObserverUpdater.d.ts +0 -5
  147. package/lib/updaters/ObserverUpdater.d.ts.map +0 -1
  148. package/lib/updaters/ObserverUpdater.js +0 -2
  149. package/lib/updaters/OnAllCallObserverUpdater.d.ts +0 -15
  150. package/lib/updaters/OnAllCallObserverUpdater.d.ts.map +0 -1
  151. package/lib/updaters/OnAllCallObserverUpdater.js +0 -50
  152. package/lib/updaters/OnAllClientCallUpdater.d.ts +0 -15
  153. package/lib/updaters/OnAllClientCallUpdater.d.ts.map +0 -1
  154. package/lib/updaters/OnAllClientCallUpdater.js +0 -53
  155. package/lib/updaters/OnAnyCallObserverUpdater.d.ts +0 -12
  156. package/lib/updaters/OnAnyCallObserverUpdater.d.ts.map +0 -1
  157. package/lib/updaters/OnAnyCallObserverUpdater.js +0 -37
  158. package/lib/updaters/OnAnyClientCallUpdater.d.ts +0 -12
  159. package/lib/updaters/OnAnyClientCallUpdater.d.ts.map +0 -1
  160. package/lib/updaters/OnAnyClientCallUpdater.js +0 -36
  161. package/lib/updaters/OnIntervalUpdater.d.ts +0 -10
  162. package/lib/updaters/OnIntervalUpdater.d.ts.map +0 -1
  163. package/lib/updaters/OnIntervalUpdater.js +0 -17
  164. package/lib/updaters/Updater.d.ts +0 -6
  165. package/lib/updaters/Updater.d.ts.map +0 -1
  166. package/lib/updaters/Updater.js +0 -2
  167. package/lib/utils/MediasoupRemoteTrackResolver.d.ts +0 -25
  168. package/lib/utils/MediasoupRemoteTrackResolver.d.ts.map +0 -1
  169. package/lib/utils/MediasoupRemoteTrackResolver.js +0 -110
  170. package/lib/utils/RemoteTrackResolver.d.ts +0 -7
  171. package/lib/utils/RemoteTrackResolver.d.ts.map +0 -1
  172. package/lib/utils/RemoteTrackResolver.js +0 -2
  173. package/src/ObservedCall.ts +0 -338
  174. package/src/ObservedCallEventMonitor.ts +0 -392
  175. package/src/ObservedCallSummary.ts +0 -22
  176. package/src/ObservedCertificate.ts +0 -43
  177. package/src/ObservedClient.ts +0 -788
  178. package/src/ObservedClientEventMonitor.ts +0 -309
  179. package/src/ObservedClientSummary.ts +0 -24
  180. package/src/ObservedCodec.ts +0 -49
  181. package/src/ObservedDataChannel.ts +0 -85
  182. package/src/ObservedIceCandidate.ts +0 -64
  183. package/src/ObservedIceCandidatePair.ts +0 -134
  184. package/src/ObservedIceTransport.ts +0 -99
  185. package/src/ObservedInboundRtp.ts +0 -205
  186. package/src/ObservedInboundTrack.ts +0 -75
  187. package/src/ObservedMediaPlayout.ts +0 -49
  188. package/src/ObservedMediaSource.ts +0 -60
  189. package/src/ObservedOutboundRtp.ts +0 -156
  190. package/src/ObservedOutboundTrack.ts +0 -74
  191. package/src/ObservedPeerConnection.ts +0 -1088
  192. package/src/ObservedPeerConnectionTransport.ts +0 -38
  193. package/src/ObservedRemoteInboundRtp.ts +0 -64
  194. package/src/ObservedRemoteOutboundRtp.ts +0 -65
  195. package/src/ObservedTURN.ts +0 -86
  196. package/src/ObservedTurnServer.ts +0 -72
  197. package/src/Observer.ts +0 -247
  198. package/src/ObserverEventMonitor.ts +0 -551
  199. package/src/ObserverSummary.ts +0 -15
  200. package/src/common/Middleware.ts +0 -84
  201. package/src/common/SingleExecutor.ts +0 -36
  202. package/src/common/logger.ts +0 -82
  203. package/src/common/types.ts +0 -4
  204. package/src/common/utils.ts +0 -69
  205. package/src/detectors/Detector.ts +0 -6
  206. package/src/detectors/Detectors.ts +0 -38
  207. package/src/index.ts +0 -28
  208. package/src/mediasoup/ObservedMediaRouter.ts +0 -10
  209. package/src/monitors/TurnUsageMonitor.ts +0 -187
  210. package/src/schema/ClientEventTypes.ts +0 -280
  211. package/src/schema/ClientMetaTypes.ts +0 -41
  212. package/src/schema/ClientSample.ts +0 -1682
  213. package/src/scores/CalculatedScore.ts +0 -6
  214. package/src/scores/DefaultCallScoreCalculator.ts +0 -23
  215. package/src/scores/ScoreCalculator.ts +0 -3
  216. package/src/updaters/CallUpdater.ts +0 -5
  217. package/src/updaters/ObserverUpdater.ts +0 -5
  218. package/src/updaters/OnAllCallObserverUpdater.ts +0 -59
  219. package/src/updaters/OnAllClientCallUpdater.ts +0 -61
  220. package/src/updaters/OnAnyCallObserverUpdater.ts +0 -41
  221. package/src/updaters/OnAnyClientCallUpdater.ts +0 -39
  222. package/src/updaters/OnIntervalUpdater.ts +0 -19
  223. package/src/updaters/Updater.ts +0 -5
  224. package/src/utils/MediasoupRemoteTrackResolver.ts +0 -155
  225. package/src/utils/RemoteTrackResolver.ts +0 -12
  226. package/tsconfig.json +0 -19
  227. package/tslint.json +0 -6
@@ -0,0 +1,2952 @@
1
+ import { EventEmitter } from 'events';
2
+ import { types } from 'mediasoup';
3
+
4
+ /**
5
+ * The WebRTC app provided custom stats payload
6
+ */
7
+ type ExtensionStat = {
8
+ /**
9
+ * The type of the extension stats the custom app provides
10
+ */
11
+ type: string;
12
+ /**
13
+ * The payload of the extension stats the custom app provides
14
+ */
15
+ payload?: string;
16
+ };
17
+ /**
18
+ * A list of additional client events.
19
+ */
20
+ type ClientMetaData = {
21
+ /**
22
+ * The name of the event used as an identifier (e.g., MEDIA_TRACK_MUTED, USER_REJOINED, etc.).
23
+ */
24
+ type: string;
25
+ /**
26
+ * The value associated with the event, if applicable.
27
+ */
28
+ payload?: string;
29
+ /**
30
+ * The unique identifier of the peer connection for which the event was generated.
31
+ */
32
+ peerConnectionId?: string;
33
+ /**
34
+ * The identifier of the media track related to the event, if applicable.
35
+ */
36
+ trackId?: string;
37
+ /**
38
+ * The SSRC (Synchronization Source) identifier associated with the event, if applicable.
39
+ */
40
+ ssrc?: number;
41
+ /**
42
+ * The timestamp in epoch format when the event was generated.
43
+ */
44
+ timestamp?: number;
45
+ };
46
+ /**
47
+ * A list of client issues.
48
+ */
49
+ type ClientIssue = {
50
+ /**
51
+ * The name of the issue
52
+ */
53
+ type: string;
54
+ /**
55
+ * The value associated with the event, if applicable.
56
+ */
57
+ payload?: string;
58
+ /**
59
+ * The timestamp in epoch format when the event was generated.
60
+ */
61
+ timestamp?: number;
62
+ };
63
+ /**
64
+ * A list of client events.
65
+ */
66
+ type ClientEvent = {
67
+ /**
68
+ * The name of the event used as an identifier (e.g., MEDIA_TRACK_MUTED, USER_REJOINED, etc.).
69
+ */
70
+ type: string;
71
+ /**
72
+ * The value associated with the event, if applicable.
73
+ */
74
+ payload?: string;
75
+ /**
76
+ * The timestamp in epoch format when the event was generated.
77
+ */
78
+ timestamp?: number;
79
+ };
80
+ /**
81
+ * Certificates
82
+ */
83
+ type CertificateStats = {
84
+ /**
85
+ * The timestamp of the stat.
86
+ */
87
+ timestamp: number;
88
+ /**
89
+ * A unique identifier for the stat.
90
+ */
91
+ id: string;
92
+ /**
93
+ * The fingerprint of the certificate.
94
+ */
95
+ fingerprint?: string;
96
+ /**
97
+ * The algorithm used for the fingerprint (e.g., 'SHA-256').
98
+ */
99
+ fingerprintAlgorithm?: string;
100
+ /**
101
+ * The certificate encoded in base64 format.
102
+ */
103
+ base64Certificate?: string;
104
+ /**
105
+ * The certificate ID of the issuer (nullable).
106
+ */
107
+ issuerCertificateId?: string;
108
+ /**
109
+ * Additional information attached to this stats
110
+ */
111
+ attachments?: Record<string, unknown>;
112
+ };
113
+ /**
114
+ * ICE Candidate Pair Stats
115
+ */
116
+ type IceCandidatePairStats = {
117
+ /**
118
+ * The unique identifier for this RTCStats object.
119
+ */
120
+ id: string;
121
+ /**
122
+ * The timestamp of when the stats were recorded, in seconds.
123
+ */
124
+ timestamp: number;
125
+ /**
126
+ * The transport id of the connection this candidate pair belongs to.
127
+ */
128
+ transportId?: string;
129
+ /**
130
+ * The ID of the local ICE candidate in this pair.
131
+ */
132
+ localCandidateId?: string;
133
+ /**
134
+ * The ID of the remote ICE candidate in this pair.
135
+ */
136
+ remoteCandidateId?: string;
137
+ state?: 'new' | 'in-progress' | 'waiting' | 'failed' | 'succeeded' | 'cancelled' | 'inprogress';
138
+ /**
139
+ * Whether this candidate pair has been nominated.
140
+ */
141
+ nominated?: boolean;
142
+ /**
143
+ * The number of packets sent using this candidate pair.
144
+ */
145
+ packetsSent?: number;
146
+ /**
147
+ * The number of packets received using this candidate pair.
148
+ */
149
+ packetsReceived?: number;
150
+ /**
151
+ * The total number of bytes sent using this candidate pair.
152
+ */
153
+ bytesSent?: number;
154
+ /**
155
+ * The total number of bytes received using this candidate pair.
156
+ */
157
+ bytesReceived?: number;
158
+ /**
159
+ * The timestamp of the last packet sent using this candidate pair.
160
+ */
161
+ lastPacketSentTimestamp?: number;
162
+ /**
163
+ * The timestamp of the last packet received using this candidate pair.
164
+ */
165
+ lastPacketReceivedTimestamp?: number;
166
+ /**
167
+ * The total round trip time (RTT) for this candidate pair in seconds.
168
+ */
169
+ totalRoundTripTime?: number;
170
+ /**
171
+ * The current round trip time (RTT) for this candidate pair in seconds.
172
+ */
173
+ currentRoundTripTime?: number;
174
+ /**
175
+ * The available outgoing bitrate (in bits per second) for this candidate pair.
176
+ */
177
+ availableOutgoingBitrate?: number;
178
+ /**
179
+ * The available incoming bitrate (in bits per second) for this candidate pair.
180
+ */
181
+ availableIncomingBitrate?: number;
182
+ /**
183
+ * The number of ICE connection requests received by this candidate pair.
184
+ */
185
+ requestsReceived?: number;
186
+ /**
187
+ * The number of ICE connection requests sent by this candidate pair.
188
+ */
189
+ requestsSent?: number;
190
+ /**
191
+ * The number of ICE connection responses received by this candidate pair.
192
+ */
193
+ responsesReceived?: number;
194
+ /**
195
+ * The number of ICE connection responses sent by this candidate pair.
196
+ */
197
+ responsesSent?: number;
198
+ /**
199
+ * The number of ICE connection consent requests sent by this candidate pair.
200
+ */
201
+ consentRequestsSent?: number;
202
+ /**
203
+ * The number of packets discarded while attempting to send via this candidate pair.
204
+ */
205
+ packetsDiscardedOnSend?: number;
206
+ /**
207
+ * The total number of bytes discarded while attempting to send via this candidate pair.
208
+ */
209
+ bytesDiscardedOnSend?: number;
210
+ /**
211
+ * Additional information attached to this stats
212
+ */
213
+ attachments?: Record<string, unknown>;
214
+ };
215
+ /**
216
+ * ICE Candidate Stats
217
+ */
218
+ type IceCandidateStats = {
219
+ /**
220
+ * The timestamp of the stat.
221
+ */
222
+ timestamp: number;
223
+ /**
224
+ * A unique identifier for the stat.
225
+ */
226
+ id: string;
227
+ /**
228
+ * The transport ID associated with the ICE candidate.
229
+ */
230
+ transportId?: string;
231
+ /**
232
+ * The IP address of the ICE candidate (nullable).
233
+ */
234
+ address?: string;
235
+ /**
236
+ * The port number of the ICE candidate.
237
+ */
238
+ port?: number;
239
+ /**
240
+ * The transport protocol used by the candidate (e.g., 'udp', 'tcp').
241
+ */
242
+ protocol?: string;
243
+ /**
244
+ * The type of the ICE candidate (e.g., 'host', 'srflx', 'relay').
245
+ */
246
+ candidateType?: string;
247
+ /**
248
+ * The priority of the ICE candidate.
249
+ */
250
+ priority?: number;
251
+ /**
252
+ * The URL of the ICE candidate.
253
+ */
254
+ url?: string;
255
+ /**
256
+ * The protocol used for the relay (e.g., 'tcp', 'udp').
257
+ */
258
+ relayProtocol?: string;
259
+ /**
260
+ * A string representing the foundation for the ICE candidate.
261
+ */
262
+ foundation?: string;
263
+ /**
264
+ * The related address for the ICE candidate (if any).
265
+ */
266
+ relatedAddress?: string;
267
+ /**
268
+ * The related port for the ICE candidate (if any).
269
+ */
270
+ relatedPort?: number;
271
+ /**
272
+ * The username fragment for the ICE candidate.
273
+ */
274
+ usernameFragment?: string;
275
+ /**
276
+ * The TCP type of the ICE candidate (e.g., 'active', 'passive').
277
+ */
278
+ tcpType?: string;
279
+ /**
280
+ * Additional information attached to this stats
281
+ */
282
+ attachments?: Record<string, unknown>;
283
+ };
284
+ /**
285
+ * ICE Transport Stats
286
+ */
287
+ type IceTransportStats = {
288
+ /**
289
+ * The timestamp of the stat.
290
+ */
291
+ timestamp: number;
292
+ /**
293
+ * A unique identifier for the stat.
294
+ */
295
+ id: string;
296
+ /**
297
+ * The number of packets sent.
298
+ */
299
+ packetsSent?: number;
300
+ /**
301
+ * The number of packets received.
302
+ */
303
+ packetsReceived?: number;
304
+ /**
305
+ * The number of bytes sent.
306
+ */
307
+ bytesSent?: number;
308
+ /**
309
+ * The number of bytes received.
310
+ */
311
+ bytesReceived?: number;
312
+ /**
313
+ * The ICE role (e.g., 'controlling', 'controlled').
314
+ */
315
+ iceRole?: string;
316
+ /**
317
+ * The local username fragment for ICE.
318
+ */
319
+ iceLocalUsernameFragment?: string;
320
+ /**
321
+ * The DTLS transport state (e.g., 'new', 'connecting', 'connected').
322
+ */
323
+ dtlsState?: string;
324
+ /**
325
+ * The ICE transport state (e.g., 'new', 'checking', 'connected').
326
+ */
327
+ iceState?: string;
328
+ /**
329
+ * The ID of the selected ICE candidate pair.
330
+ */
331
+ selectedCandidatePairId?: string;
332
+ /**
333
+ * The ID of the local certificate.
334
+ */
335
+ localCertificateId?: string;
336
+ /**
337
+ * The ID of the remote certificate.
338
+ */
339
+ remoteCertificateId?: string;
340
+ /**
341
+ * The TLS version used for encryption.
342
+ */
343
+ tlsVersion?: string;
344
+ /**
345
+ * The DTLS cipher suite used.
346
+ */
347
+ dtlsCipher?: string;
348
+ /**
349
+ * The role in the DTLS handshake (e.g., 'client', 'server').
350
+ */
351
+ dtlsRole?: string;
352
+ /**
353
+ * The SRTP cipher used for encryption.
354
+ */
355
+ srtpCipher?: string;
356
+ /**
357
+ * The number of changes to the selected ICE candidate pair.
358
+ */
359
+ selectedCandidatePairChanges?: number;
360
+ /**
361
+ * Additional information attached to this stats
362
+ */
363
+ attachments?: Record<string, unknown>;
364
+ };
365
+ /**
366
+ * Data Channels Stats
367
+ */
368
+ type DataChannelStats = {
369
+ /**
370
+ * The timestamp of the stat.
371
+ */
372
+ timestamp: number;
373
+ /**
374
+ * A unique identifier for the stat.
375
+ */
376
+ id: string;
377
+ /**
378
+ * The label of the data channel.
379
+ */
380
+ label?: string;
381
+ /**
382
+ * The protocol of the data channel.
383
+ */
384
+ protocol?: string;
385
+ /**
386
+ * The identifier for the data channel.
387
+ */
388
+ dataChannelIdentifier?: number;
389
+ /**
390
+ * The state of the data channel (e.g., 'open', 'closed').
391
+ */
392
+ state?: string;
393
+ /**
394
+ * The number of messages sent on the data channel.
395
+ */
396
+ messagesSent?: number;
397
+ /**
398
+ * The number of bytes sent on the data channel.
399
+ */
400
+ bytesSent?: number;
401
+ /**
402
+ * The number of messages received on the data channel.
403
+ */
404
+ messagesReceived?: number;
405
+ /**
406
+ * The number of bytes received on the data channel.
407
+ */
408
+ bytesReceived?: number;
409
+ /**
410
+ * Additional information attached to this stats
411
+ */
412
+ attachments?: Record<string, unknown>;
413
+ };
414
+ /**
415
+ * PeerConnection Transport Stats
416
+ */
417
+ type PeerConnectionTransportStats = {
418
+ /**
419
+ * The timestamp of the stat.
420
+ */
421
+ timestamp: number;
422
+ /**
423
+ * A unique identifier for the stat.
424
+ */
425
+ id: string;
426
+ /**
427
+ * The number of data channels opened.
428
+ */
429
+ dataChannelsOpened?: number;
430
+ /**
431
+ * The number of data channels closed.
432
+ */
433
+ dataChannelsClosed?: number;
434
+ /**
435
+ * Additional information attached to this stats
436
+ */
437
+ attachments?: Record<string, unknown>;
438
+ };
439
+ /**
440
+ * Media Playout Stats
441
+ */
442
+ type MediaPlayoutStats = {
443
+ /**
444
+ * The timestamp of the stat.
445
+ */
446
+ timestamp: number;
447
+ /**
448
+ * A unique identifier for the stat.
449
+ */
450
+ id: string;
451
+ /**
452
+ * The kind of media (audio/video).
453
+ */
454
+ kind: string;
455
+ /**
456
+ * The duration of synthesized audio samples.
457
+ */
458
+ synthesizedSamplesDuration?: number;
459
+ /**
460
+ * The number of synthesized audio samples events.
461
+ */
462
+ synthesizedSamplesEvents?: number;
463
+ /**
464
+ * The total duration of all audio samples.
465
+ */
466
+ totalSamplesDuration?: number;
467
+ /**
468
+ * The total delay experienced during audio playout.
469
+ */
470
+ totalPlayoutDelay?: number;
471
+ /**
472
+ * The total count of audio samples.
473
+ */
474
+ totalSamplesCount?: number;
475
+ /**
476
+ * Additional information attached to this stats
477
+ */
478
+ attachments?: Record<string, unknown>;
479
+ };
480
+ /**
481
+ * Audio Source Stats
482
+ */
483
+ type MediaSourceStats = {
484
+ /**
485
+ * The timestamp of the stat.
486
+ */
487
+ timestamp: number;
488
+ /**
489
+ * A unique identifier for the stat.
490
+ */
491
+ id: string;
492
+ /**
493
+ * The type of media ('audio' or 'video').
494
+ */
495
+ kind: string;
496
+ /**
497
+ * The identifier of the media track.
498
+ */
499
+ trackIdentifier?: string;
500
+ /**
501
+ * The current audio level.
502
+ */
503
+ audioLevel?: number;
504
+ /**
505
+ * The total audio energy.
506
+ */
507
+ totalAudioEnergy?: number;
508
+ /**
509
+ * The total duration of audio samples.
510
+ */
511
+ totalSamplesDuration?: number;
512
+ /**
513
+ * The echo return loss.
514
+ */
515
+ echoReturnLoss?: number;
516
+ /**
517
+ * The enhancement of echo return loss.
518
+ */
519
+ echoReturnLossEnhancement?: number;
520
+ /**
521
+ * The width of the video.
522
+ */
523
+ width?: number;
524
+ /**
525
+ * The height of the video.
526
+ */
527
+ height?: number;
528
+ /**
529
+ * The total number of frames.
530
+ */
531
+ frames?: number;
532
+ /**
533
+ * The frames per second of the video.
534
+ */
535
+ framesPerSecond?: number;
536
+ /**
537
+ * Additional information attached to this stats
538
+ */
539
+ attachments?: Record<string, unknown>;
540
+ };
541
+ /**
542
+ * Remote Outbound RTPs
543
+ */
544
+ type RemoteOutboundRtpStats = {
545
+ /**
546
+ * The timestamp for this stats object in DOMHighResTimeStamp format.
547
+ */
548
+ timestamp: number;
549
+ /**
550
+ * The unique identifier for this stats object.
551
+ */
552
+ id: string;
553
+ /**
554
+ * The SSRC identifier of the RTP stream.
555
+ */
556
+ ssrc: number;
557
+ /**
558
+ * The type of media ('audio' or 'video').
559
+ */
560
+ kind: string;
561
+ /**
562
+ * The ID of the transport used for this stream.
563
+ */
564
+ transportId?: string;
565
+ /**
566
+ * The ID of the codec used for this stream.
567
+ */
568
+ codecId?: string;
569
+ /**
570
+ * The total number of packets sent on this stream.
571
+ */
572
+ packetsSent?: number;
573
+ /**
574
+ * The total number of bytes sent on this stream.
575
+ */
576
+ bytesSent?: number;
577
+ /**
578
+ * The ID of the local object corresponding to this stream.
579
+ */
580
+ localId?: string;
581
+ /**
582
+ * The remote timestamp for this stats object in DOMHighResTimeStamp format.
583
+ */
584
+ remoteTimestamp?: number;
585
+ /**
586
+ * The total number of reports sent on this stream.
587
+ */
588
+ reportsSent?: number;
589
+ /**
590
+ * The current estimated round-trip time for this stream in seconds.
591
+ */
592
+ roundTripTime?: number;
593
+ /**
594
+ * The total round-trip time for this stream in seconds.
595
+ */
596
+ totalRoundTripTime?: number;
597
+ /**
598
+ * The total number of round-trip time measurements for this stream.
599
+ */
600
+ roundTripTimeMeasurements?: number;
601
+ /**
602
+ * Additional information attached to this stats
603
+ */
604
+ attachments?: Record<string, unknown>;
605
+ };
606
+ /**
607
+ * The duration of quality limitation reasons categorized by type.
608
+ */
609
+ type QualityLimitationDurations = {
610
+ /**
611
+ * Duration of no quality limitation in seconds.
612
+ */
613
+ none: number;
614
+ /**
615
+ * Duration of CPU-based quality limitation in seconds.
616
+ */
617
+ cpu: number;
618
+ /**
619
+ * Duration of bandwidth-based quality limitation in seconds.
620
+ */
621
+ bandwidth: number;
622
+ /**
623
+ * Duration of other quality limitation reasons in seconds.
624
+ */
625
+ other: number;
626
+ };
627
+ /**
628
+ * Outbound RTPs
629
+ */
630
+ type OutboundRtpStats = {
631
+ /**
632
+ * The timestamp for this stats object in DOMHighResTimeStamp format.
633
+ */
634
+ timestamp: number;
635
+ /**
636
+ * The unique identifier for this stats object.
637
+ */
638
+ id: string;
639
+ /**
640
+ * The SSRC identifier of the RTP stream.
641
+ */
642
+ ssrc: number;
643
+ /**
644
+ * The type of media ('audio' or 'video').
645
+ */
646
+ kind: string;
647
+ /**
648
+ * The ID of the transport used for this stream.
649
+ */
650
+ transportId?: string;
651
+ /**
652
+ * The ID of the codec used for this stream.
653
+ */
654
+ codecId?: string;
655
+ /**
656
+ * The total number of packets sent on this stream.
657
+ */
658
+ packetsSent?: number;
659
+ /**
660
+ * The total number of bytes sent on this stream.
661
+ */
662
+ bytesSent?: number;
663
+ /**
664
+ * The media ID associated with this RTP stream.
665
+ */
666
+ mid?: string;
667
+ /**
668
+ * The ID of the media source associated with this stream.
669
+ */
670
+ mediaSourceId?: string;
671
+ /**
672
+ * The ID of the remote object corresponding to this stream.
673
+ */
674
+ remoteId?: string;
675
+ /**
676
+ * The RID value of the RTP stream.
677
+ */
678
+ rid?: string;
679
+ /**
680
+ * The total number of header bytes sent on this stream.
681
+ */
682
+ headerBytesSent?: number;
683
+ /**
684
+ * The number of retransmitted packets sent on this stream.
685
+ */
686
+ retransmittedPacketsSent?: number;
687
+ /**
688
+ * The number of retransmitted bytes sent on this stream.
689
+ */
690
+ retransmittedBytesSent?: number;
691
+ /**
692
+ * The SSRC for the RTX stream, if applicable.
693
+ */
694
+ rtxSsrc?: number;
695
+ /**
696
+ * The target bitrate for this RTP stream in bits per second.
697
+ */
698
+ targetBitrate?: number;
699
+ /**
700
+ * The total target encoded bytes for this stream.
701
+ */
702
+ totalEncodedBytesTarget?: number;
703
+ /**
704
+ * The width of the frames sent in pixels.
705
+ */
706
+ frameWidth?: number;
707
+ /**
708
+ * The height of the frames sent in pixels.
709
+ */
710
+ frameHeight?: number;
711
+ /**
712
+ * The number of frames sent per second.
713
+ */
714
+ framesPerSecond?: number;
715
+ /**
716
+ * The total number of frames sent on this stream.
717
+ */
718
+ framesSent?: number;
719
+ /**
720
+ * The total number of huge frames sent on this stream.
721
+ */
722
+ hugeFramesSent?: number;
723
+ /**
724
+ * The total number of frames encoded on this stream.
725
+ */
726
+ framesEncoded?: number;
727
+ /**
728
+ * The total number of key frames encoded on this stream.
729
+ */
730
+ keyFramesEncoded?: number;
731
+ /**
732
+ * The sum of QP values for all frames encoded on this stream.
733
+ */
734
+ qpSum?: number;
735
+ /**
736
+ * The total time spent encoding frames on this stream in seconds.
737
+ */
738
+ totalEncodeTime?: number;
739
+ /**
740
+ * The total delay for packets sent on this stream in seconds.
741
+ */
742
+ totalPacketSendDelay?: number;
743
+ /**
744
+ * The reason for any quality limitation on this stream.
745
+ */
746
+ qualityLimitationReason?: string;
747
+ /**
748
+ * The number of resolution changes due to quality limitations.
749
+ */
750
+ qualityLimitationResolutionChanges?: number;
751
+ /**
752
+ * The total number of NACK packets sent on this stream.
753
+ */
754
+ nackCount?: number;
755
+ /**
756
+ * The total number of FIR packets sent on this stream.
757
+ */
758
+ firCount?: number;
759
+ /**
760
+ * The total number of PLI packets sent on this stream.
761
+ */
762
+ pliCount?: number;
763
+ /**
764
+ * The implementation of the encoder used for this stream.
765
+ */
766
+ encoderImplementation?: string;
767
+ /**
768
+ * Indicates whether the encoder is power efficient.
769
+ */
770
+ powerEfficientEncoder?: boolean;
771
+ /**
772
+ * Indicates whether this stream is actively sending data.
773
+ */
774
+ active?: boolean;
775
+ /**
776
+ * The scalability mode of the encoder used for this stream.
777
+ */
778
+ scalabilityMode?: string;
779
+ /**
780
+ * The duration of quality limitation reasons categorized by type.
781
+ */
782
+ qualityLimitationDurations?: QualityLimitationDurations;
783
+ /**
784
+ * Additional information attached to this stats.
785
+ */
786
+ attachments?: Record<string, unknown>;
787
+ };
788
+ /**
789
+ * Remote Inbound RTPs
790
+ */
791
+ type RemoteInboundRtpStats = {
792
+ /**
793
+ * The timestamp for this stats object in DOMHighResTimeStamp format.
794
+ */
795
+ timestamp: number;
796
+ /**
797
+ * The unique identifier for this stats object.
798
+ */
799
+ id: string;
800
+ /**
801
+ * The SSRC identifier of the RTP stream.
802
+ */
803
+ ssrc: number;
804
+ /**
805
+ * The type of media ('audio' or 'video').
806
+ */
807
+ kind: string;
808
+ /**
809
+ * The ID of the transport used for this stream.
810
+ */
811
+ transportId?: string;
812
+ /**
813
+ * The ID of the codec used for this stream.
814
+ */
815
+ codecId?: string;
816
+ /**
817
+ * The total number of packets received on this stream.
818
+ */
819
+ packetsReceived?: number;
820
+ /**
821
+ * The total number of packets lost on this stream.
822
+ */
823
+ packetsLost?: number;
824
+ /**
825
+ * The jitter value for this stream in seconds.
826
+ */
827
+ jitter?: number;
828
+ /**
829
+ * The ID of the local object corresponding to this remote stream.
830
+ */
831
+ localId?: string;
832
+ /**
833
+ * The most recent RTT measurement for this stream in seconds.
834
+ */
835
+ roundTripTime?: number;
836
+ /**
837
+ * The cumulative RTT for all packets on this stream in seconds.
838
+ */
839
+ totalRoundTripTime?: number;
840
+ /**
841
+ * The fraction of packets lost on this stream, calculated over a time interval.
842
+ */
843
+ fractionLost?: number;
844
+ /**
845
+ * The total number of RTT measurements for this stream.
846
+ */
847
+ roundTripTimeMeasurements?: number;
848
+ /**
849
+ * Additional information attached to this stats
850
+ */
851
+ attachments?: Record<string, unknown>;
852
+ };
853
+ /**
854
+ * Inbound RTPs
855
+ */
856
+ type InboundRtpStats = {
857
+ /**
858
+ * The time the stats were collected, in high-resolution time.
859
+ */
860
+ timestamp: number;
861
+ /**
862
+ * Unique identifier of the stats object.
863
+ */
864
+ id: string;
865
+ /**
866
+ * Synchronization source identifier of the RTP stream.
867
+ */
868
+ ssrc: number;
869
+ /**
870
+ * Kind of the media (e.g., 'audio' or 'video').
871
+ */
872
+ kind: string;
873
+ /**
874
+ * Identifier for the media track associated with the RTP stream.
875
+ */
876
+ trackIdentifier: string;
877
+ /**
878
+ * ID of the transport associated with the RTP stream.
879
+ */
880
+ transportId?: string;
881
+ /**
882
+ * ID of the codec used for the RTP stream.
883
+ */
884
+ codecId?: string;
885
+ /**
886
+ * Number of packets received on the RTP stream.
887
+ */
888
+ packetsReceived?: number;
889
+ /**
890
+ * Number of packets lost on the RTP stream.
891
+ */
892
+ packetsLost?: number;
893
+ /**
894
+ * Jitter of the RTP stream in seconds.
895
+ */
896
+ jitter?: number;
897
+ /**
898
+ * The MediaStream ID of the RTP stream.
899
+ */
900
+ mid?: string;
901
+ /**
902
+ * Remote stats object ID associated with the RTP stream.
903
+ */
904
+ remoteId?: string;
905
+ /**
906
+ * Number of frames decoded.
907
+ */
908
+ framesDecoded?: number;
909
+ /**
910
+ * Number of keyframes decoded.
911
+ */
912
+ keyFramesDecoded?: number;
913
+ /**
914
+ * Number of frames rendered.
915
+ */
916
+ framesRendered?: number;
917
+ /**
918
+ * Number of frames dropped.
919
+ */
920
+ framesDropped?: number;
921
+ /**
922
+ * Width of the decoded video frames.
923
+ */
924
+ frameWidth?: number;
925
+ /**
926
+ * Height of the decoded video frames.
927
+ */
928
+ frameHeight?: number;
929
+ /**
930
+ * Frame rate in frames per second.
931
+ */
932
+ framesPerSecond?: number;
933
+ /**
934
+ * Sum of the Quantization Parameter values for decoded frames.
935
+ */
936
+ qpSum?: number;
937
+ /**
938
+ * Total time spent decoding in seconds.
939
+ */
940
+ totalDecodeTime?: number;
941
+ /**
942
+ * Sum of inter-frame delays in seconds.
943
+ */
944
+ totalInterFrameDelay?: number;
945
+ /**
946
+ * Sum of squared inter-frame delays in seconds.
947
+ */
948
+ totalSquaredInterFrameDelay?: number;
949
+ /**
950
+ * Number of times playback was paused.
951
+ */
952
+ pauseCount?: number;
953
+ /**
954
+ * Total duration of pauses in seconds.
955
+ */
956
+ totalPausesDuration?: number;
957
+ /**
958
+ * Number of times playback was frozen.
959
+ */
960
+ freezeCount?: number;
961
+ /**
962
+ * Total duration of freezes in seconds.
963
+ */
964
+ totalFreezesDuration?: number;
965
+ /**
966
+ * Timestamp of the last packet received.
967
+ */
968
+ lastPacketReceivedTimestamp?: number;
969
+ /**
970
+ * Total header bytes received.
971
+ */
972
+ headerBytesReceived?: number;
973
+ /**
974
+ * Total packets discarded.
975
+ */
976
+ packetsDiscarded?: number;
977
+ /**
978
+ * Total bytes received from FEC.
979
+ */
980
+ fecBytesReceived?: number;
981
+ /**
982
+ * Total packets received from FEC.
983
+ */
984
+ fecPacketsReceived?: number;
985
+ /**
986
+ * Total FEC packets discarded.
987
+ */
988
+ fecPacketsDiscarded?: number;
989
+ /**
990
+ * Total bytes received on the RTP stream.
991
+ */
992
+ bytesReceived?: number;
993
+ /**
994
+ * Number of NACKs sent.
995
+ */
996
+ nackCount?: number;
997
+ /**
998
+ * Number of Full Intra Requests sent.
999
+ */
1000
+ firCount?: number;
1001
+ /**
1002
+ * Number of Picture Loss Indications sent.
1003
+ */
1004
+ pliCount?: number;
1005
+ /**
1006
+ * Total processing delay in seconds.
1007
+ */
1008
+ totalProcessingDelay?: number;
1009
+ /**
1010
+ * Estimated timestamp of playout.
1011
+ */
1012
+ estimatedPlayoutTimestamp?: number;
1013
+ /**
1014
+ * Total jitter buffer delay in seconds.
1015
+ */
1016
+ jitterBufferDelay?: number;
1017
+ /**
1018
+ * Target delay for the jitter buffer in seconds.
1019
+ */
1020
+ jitterBufferTargetDelay?: number;
1021
+ /**
1022
+ * Number of packets emitted from the jitter buffer.
1023
+ */
1024
+ jitterBufferEmittedCount?: number;
1025
+ /**
1026
+ * Minimum delay of the jitter buffer in seconds.
1027
+ */
1028
+ jitterBufferMinimumDelay?: number;
1029
+ /**
1030
+ * Total audio samples received.
1031
+ */
1032
+ totalSamplesReceived?: number;
1033
+ /**
1034
+ * Number of concealed audio samples.
1035
+ */
1036
+ concealedSamples?: number;
1037
+ /**
1038
+ * Number of silent audio samples concealed.
1039
+ */
1040
+ silentConcealedSamples?: number;
1041
+ /**
1042
+ * Number of audio concealment events.
1043
+ */
1044
+ concealmentEvents?: number;
1045
+ /**
1046
+ * Number of audio samples inserted for deceleration.
1047
+ */
1048
+ insertedSamplesForDeceleration?: number;
1049
+ /**
1050
+ * Number of audio samples removed for acceleration.
1051
+ */
1052
+ removedSamplesForAcceleration?: number;
1053
+ /**
1054
+ * Audio level in the range [0.0, 1.0].
1055
+ */
1056
+ audioLevel?: number;
1057
+ /**
1058
+ * Total audio energy in the stream.
1059
+ */
1060
+ totalAudioEnergy?: number;
1061
+ /**
1062
+ * Total duration of all received audio samples in seconds.
1063
+ */
1064
+ totalSamplesDuration?: number;
1065
+ /**
1066
+ * Total number of frames received.
1067
+ */
1068
+ framesReceived?: number;
1069
+ /**
1070
+ * Decoder implementation used for decoding frames.
1071
+ */
1072
+ decoderImplementation?: string;
1073
+ /**
1074
+ * Playout identifier for the RTP stream.
1075
+ */
1076
+ playoutId?: string;
1077
+ /**
1078
+ * Indicates if the decoder is power-efficient.
1079
+ */
1080
+ powerEfficientDecoder?: boolean;
1081
+ /**
1082
+ * Number of frames assembled from multiple packets.
1083
+ */
1084
+ framesAssembledFromMultiplePackets?: number;
1085
+ /**
1086
+ * Total assembly time for frames in seconds.
1087
+ */
1088
+ totalAssemblyTime?: number;
1089
+ /**
1090
+ * Number of retransmitted packets received.
1091
+ */
1092
+ retransmittedPacketsReceived?: number;
1093
+ /**
1094
+ * Number of retransmitted bytes received.
1095
+ */
1096
+ retransmittedBytesReceived?: number;
1097
+ /**
1098
+ * SSRC of the retransmission stream.
1099
+ */
1100
+ rtxSsrc?: number;
1101
+ /**
1102
+ * SSRC of the FEC stream.
1103
+ */
1104
+ fecSsrc?: number;
1105
+ /**
1106
+ * Total corruption probability of packets.
1107
+ */
1108
+ totalCorruptionProbability?: number;
1109
+ /**
1110
+ * Total squared corruption probability of packets.
1111
+ */
1112
+ totalSquaredCorruptionProbability?: number;
1113
+ /**
1114
+ * Number of corruption measurements.
1115
+ */
1116
+ corruptionMeasurements?: number;
1117
+ /**
1118
+ * Additional information attached to this stats
1119
+ */
1120
+ attachments?: Record<string, unknown>;
1121
+ };
1122
+ /**
1123
+ * Codec items
1124
+ */
1125
+ type CodecStats = {
1126
+ /**
1127
+ * The timestamp when the stats were generated.
1128
+ */
1129
+ timestamp: number;
1130
+ /**
1131
+ * The unique identifier for the stats object.
1132
+ */
1133
+ id: string;
1134
+ /**
1135
+ * The MIME type of the codec.
1136
+ */
1137
+ mimeType: string;
1138
+ /**
1139
+ * The payload type of the codec.
1140
+ */
1141
+ payloadType?: number;
1142
+ /**
1143
+ * The identifier of the transport associated with the codec.
1144
+ */
1145
+ transportId?: string;
1146
+ /**
1147
+ * The clock rate of the codec in Hz.
1148
+ */
1149
+ clockRate?: number;
1150
+ /**
1151
+ * The number of audio channels for the codec, if applicable.
1152
+ */
1153
+ channels?: number;
1154
+ /**
1155
+ * The SDP format-specific parameters line for the codec.
1156
+ */
1157
+ sdpFmtpLine?: string;
1158
+ /**
1159
+ * Additional information attached to this stats
1160
+ */
1161
+ attachments?: Record<string, unknown>;
1162
+ };
1163
+ /**
1164
+ * Outbound Track Stats items
1165
+ */
1166
+ type OutboundTrackSample = {
1167
+ /**
1168
+ * The timestamp when the stats were generated.
1169
+ */
1170
+ timestamp: number;
1171
+ /**
1172
+ * The unique identifier for the stats object.
1173
+ */
1174
+ id: string;
1175
+ /**
1176
+ * Kind of the media (e.g., 'audio' or 'video').
1177
+ */
1178
+ kind: string;
1179
+ /**
1180
+ * Calculated score for track (details should be added to attachments)
1181
+ */
1182
+ score?: number;
1183
+ /**
1184
+ * Additional information attached to this stats
1185
+ */
1186
+ attachments?: Record<string, unknown>;
1187
+ };
1188
+ /**
1189
+ * Inbound Track Stats items
1190
+ */
1191
+ type InboundTrackSample = {
1192
+ /**
1193
+ * The timestamp when the stats were generated.
1194
+ */
1195
+ timestamp: number;
1196
+ /**
1197
+ * The unique identifier for the stats object.
1198
+ */
1199
+ id: string;
1200
+ /**
1201
+ * Kind of the media (e.g., 'audio' or 'video').
1202
+ */
1203
+ kind: string;
1204
+ /**
1205
+ * Calculated score for track (details should be added to attachments)
1206
+ */
1207
+ score?: number;
1208
+ /**
1209
+ * Additional information attached to this stats
1210
+ */
1211
+ attachments?: Record<string, unknown>;
1212
+ };
1213
+ /**
1214
+ * docs
1215
+ */
1216
+ type PeerConnectionSample = {
1217
+ /**
1218
+ * Unique identifier of the stats object.
1219
+ */
1220
+ peerConnectionId: string;
1221
+ /**
1222
+ * Additional information attached to this sample
1223
+ */
1224
+ attachments?: Record<string, unknown>;
1225
+ /**
1226
+ * Calculated score for peer connection (details should be added to attachments)
1227
+ */
1228
+ score?: number;
1229
+ /**
1230
+ * Inbound Track Stats items
1231
+ */
1232
+ inboundTracks?: InboundTrackSample[];
1233
+ /**
1234
+ * Outbound Track Stats items
1235
+ */
1236
+ outboundTracks?: OutboundTrackSample[];
1237
+ /**
1238
+ * Codec items
1239
+ */
1240
+ codecs?: CodecStats[];
1241
+ /**
1242
+ * Inbound RTPs
1243
+ */
1244
+ inboundRtps?: InboundRtpStats[];
1245
+ /**
1246
+ * Remote Inbound RTPs
1247
+ */
1248
+ remoteInboundRtps?: RemoteInboundRtpStats[];
1249
+ /**
1250
+ * Outbound RTPs
1251
+ */
1252
+ outboundRtps?: OutboundRtpStats[];
1253
+ /**
1254
+ * Remote Outbound RTPs
1255
+ */
1256
+ remoteOutboundRtps?: RemoteOutboundRtpStats[];
1257
+ /**
1258
+ * Audio Source Stats
1259
+ */
1260
+ mediaSources?: MediaSourceStats[];
1261
+ /**
1262
+ * Media Playout Stats
1263
+ */
1264
+ mediaPlayouts?: MediaPlayoutStats[];
1265
+ /**
1266
+ * PeerConnection Transport Stats
1267
+ */
1268
+ peerConnectionTransports?: PeerConnectionTransportStats[];
1269
+ /**
1270
+ * Data Channels Stats
1271
+ */
1272
+ dataChannels?: DataChannelStats[];
1273
+ /**
1274
+ * ICE Transport Stats
1275
+ */
1276
+ iceTransports?: IceTransportStats[];
1277
+ /**
1278
+ * ICE Candidate Stats
1279
+ */
1280
+ iceCandidates?: IceCandidateStats[];
1281
+ /**
1282
+ * ICE Candidate Pair Stats
1283
+ */
1284
+ iceCandidatePairs?: IceCandidatePairStats[];
1285
+ /**
1286
+ * Certificates
1287
+ */
1288
+ certificates?: CertificateStats[];
1289
+ };
1290
+ /**
1291
+ * docs
1292
+ */
1293
+ type ClientSample = {
1294
+ /**
1295
+ * The timestamp the sample is created in GMT
1296
+ */
1297
+ timestamp: number;
1298
+ /**
1299
+ * the unique identifier of the call or session
1300
+ */
1301
+ callId?: string;
1302
+ /**
1303
+ * Unique id of the client providing samples.
1304
+ */
1305
+ clientId?: string;
1306
+ /**
1307
+ * Additional information attached to this sample (e.g.: roomId, userId, displayName, etc...)
1308
+ */
1309
+ attachments?: Record<string, unknown>;
1310
+ /**
1311
+ * Calculated score for client (details should be added to attachments)
1312
+ */
1313
+ score?: number;
1314
+ /**
1315
+ * Samples taken PeerConnections
1316
+ */
1317
+ peerConnections?: PeerConnectionSample[];
1318
+ /**
1319
+ * A list of client events.
1320
+ */
1321
+ clientEvents?: ClientEvent[];
1322
+ /**
1323
+ * A list of client issues.
1324
+ */
1325
+ clientIssues?: ClientIssue[];
1326
+ /**
1327
+ * A list of additional client events.
1328
+ */
1329
+ clientMetaItems?: ClientMetaData[];
1330
+ /**
1331
+ * The WebRTC app provided custom stats payload
1332
+ */
1333
+ extensionStats?: ExtensionStat[];
1334
+ };
1335
+
1336
+ type CalculatedScore = {
1337
+ weight: number;
1338
+ value?: number;
1339
+ appData?: Record<string, unknown>;
1340
+ };
1341
+
1342
+ type MediaKind = 'audio' | 'video';
1343
+
1344
+ declare class ObservedMediaPlayout implements MediaPlayoutStats {
1345
+ timestamp: number;
1346
+ id: string;
1347
+ kind: MediaKind;
1348
+ private readonly _peerConnection;
1349
+ private _visited;
1350
+ appData?: Record<string, unknown>;
1351
+ synthesizedSamplesDuration?: number | undefined;
1352
+ synthesizedSamplesEvents?: number | undefined;
1353
+ totalSamplesDuration?: number | undefined;
1354
+ totalPlayoutDelay?: number | undefined;
1355
+ totalSamplesCount?: number | undefined;
1356
+ attachments?: Record<string, unknown> | undefined;
1357
+ constructor(timestamp: number, id: string, kind: MediaKind, _peerConnection: ObservedPeerConnection);
1358
+ get visited(): boolean;
1359
+ getPeerConnection(): ObservedPeerConnection;
1360
+ update(stats: MediaPlayoutStats): void;
1361
+ }
1362
+
1363
+ declare class ObservedMediaSource implements MediaSourceStats {
1364
+ timestamp: number;
1365
+ id: string;
1366
+ kind: MediaKind;
1367
+ private readonly _peerConnection;
1368
+ private _visited;
1369
+ appData?: Record<string, unknown>;
1370
+ trackIdentifier?: string | undefined;
1371
+ audioLevel?: number | undefined;
1372
+ totalAudioEnergy?: number | undefined;
1373
+ totalSamplesDuration?: number | undefined;
1374
+ echoReturnLoss?: number | undefined;
1375
+ echoReturnLossEnhancement?: number | undefined;
1376
+ width?: number | undefined;
1377
+ height?: number | undefined;
1378
+ frames?: number | undefined;
1379
+ framesPerSecond?: number | undefined;
1380
+ attachments?: Record<string, unknown> | undefined;
1381
+ constructor(timestamp: number, id: string, kind: MediaKind, _peerConnection: ObservedPeerConnection);
1382
+ get visited(): boolean;
1383
+ getPeerConnection(): ObservedPeerConnection;
1384
+ getTrack(): ObservedOutboundTrack | undefined;
1385
+ update(stats: MediaSourceStats): void;
1386
+ }
1387
+
1388
+ declare class ObservedIceCandidate implements IceCandidateStats {
1389
+ timestamp: number;
1390
+ id: string;
1391
+ private readonly _peerConnection;
1392
+ private _visited;
1393
+ appData?: Record<string, unknown>;
1394
+ transportId?: string | undefined;
1395
+ address?: string | undefined;
1396
+ port?: number | undefined;
1397
+ protocol?: string | undefined;
1398
+ candidateType?: string | undefined;
1399
+ priority?: number | undefined;
1400
+ url?: string | undefined;
1401
+ relayProtocol?: string | undefined;
1402
+ foundation?: string | undefined;
1403
+ relatedAddress?: string | undefined;
1404
+ relatedPort?: number | undefined;
1405
+ usernameFragment?: string | undefined;
1406
+ tcpType?: string | undefined;
1407
+ attachments?: Record<string, unknown> | undefined;
1408
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1409
+ get visited(): boolean;
1410
+ getPeerConnection(): ObservedPeerConnection;
1411
+ getIceTransport(): ObservedIceTransport | undefined;
1412
+ update(stats: IceCandidateStats): void;
1413
+ }
1414
+
1415
+ declare class ObservedIceCandidatePair implements IceCandidatePairStats {
1416
+ timestamp: number;
1417
+ id: string;
1418
+ private readonly _peerConnection;
1419
+ private _visited;
1420
+ appData?: Record<string, unknown>;
1421
+ transportId?: string | undefined;
1422
+ localCandidateId?: string | undefined;
1423
+ remoteCandidateId?: string | undefined;
1424
+ state?: 'new' | 'in-progress' | 'waiting' | 'failed' | 'succeeded' | undefined;
1425
+ nominated?: boolean | undefined;
1426
+ packetsSent?: number | undefined;
1427
+ packetsReceived?: number | undefined;
1428
+ bytesSent?: number | undefined;
1429
+ bytesReceived?: number | undefined;
1430
+ lastPacketSentTimestamp?: number | undefined;
1431
+ lastPacketReceivedTimestamp?: number | undefined;
1432
+ totalRoundTripTime?: number | undefined;
1433
+ currentRoundTripTime?: number | undefined;
1434
+ availableOutgoingBitrate?: number | undefined;
1435
+ availableIncomingBitrate?: number | undefined;
1436
+ requestsReceived?: number | undefined;
1437
+ requestsSent?: number | undefined;
1438
+ responsesReceived?: number | undefined;
1439
+ responsesSent?: number | undefined;
1440
+ consentRequestsSent?: number | undefined;
1441
+ packetsDiscardedOnSend?: number | undefined;
1442
+ bytesDiscardedOnSend?: number | undefined;
1443
+ attachments?: Record<string, unknown> | undefined;
1444
+ deltaBytesSent: number;
1445
+ deltaBytesReceived: number;
1446
+ deltaPacketsSent: number;
1447
+ deltaPacketsReceived: number;
1448
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1449
+ get visited(): boolean;
1450
+ getPeerConnection(): ObservedPeerConnection;
1451
+ getIceTransport(): ObservedIceTransport | undefined;
1452
+ getLocalCandidate(): ObservedIceCandidate | undefined;
1453
+ getRemoteCandidate(): ObservedIceCandidate | undefined;
1454
+ update(stats: IceCandidatePairStats): void;
1455
+ private _convertState;
1456
+ }
1457
+
1458
+ declare class ObservedIceTransport implements IceTransportStats {
1459
+ timestamp: number;
1460
+ id: string;
1461
+ private readonly _peerConnection;
1462
+ private _visited;
1463
+ appData?: Record<string, unknown>;
1464
+ packetsSent?: number | undefined;
1465
+ packetsReceived?: number | undefined;
1466
+ bytesSent?: number | undefined;
1467
+ bytesReceived?: number | undefined;
1468
+ iceRole?: string | undefined;
1469
+ iceLocalUsernameFragment?: string | undefined;
1470
+ dtlsState?: string | undefined;
1471
+ iceState?: string | undefined;
1472
+ selectedCandidatePairId?: string | undefined;
1473
+ localCertificateId?: string | undefined;
1474
+ remoteCertificateId?: string | undefined;
1475
+ tlsVersion?: string | undefined;
1476
+ dtlsCipher?: string | undefined;
1477
+ dtlsRole?: string | undefined;
1478
+ srtpCipher?: string | undefined;
1479
+ selectedCandidatePairChanges?: number | undefined;
1480
+ attachments?: Record<string, unknown> | undefined;
1481
+ deltaPacketsReceived: number;
1482
+ deltaPacketsSent: number;
1483
+ deltaBytesReceived: number;
1484
+ deltaBytesSent: number;
1485
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1486
+ get visited(): boolean;
1487
+ getPeerConnection(): ObservedPeerConnection;
1488
+ getSelectedCandidatePair(): ObservedIceCandidatePair | undefined;
1489
+ update(stats: IceTransportStats): void;
1490
+ }
1491
+
1492
+ declare class ObservedCodec implements CodecStats {
1493
+ timestamp: number;
1494
+ id: string;
1495
+ mimeType: string;
1496
+ private readonly _peerConnection;
1497
+ private _visited;
1498
+ appData?: Record<string, unknown>;
1499
+ payloadType?: number | undefined;
1500
+ transportId?: string | undefined;
1501
+ clockRate?: number | undefined;
1502
+ channels?: number | undefined;
1503
+ sdpFmtpLine?: string | undefined;
1504
+ attachments?: Record<string, unknown> | undefined;
1505
+ constructor(timestamp: number, id: string, mimeType: string, _peerConnection: ObservedPeerConnection);
1506
+ get visited(): boolean;
1507
+ getPeerConnection(): ObservedPeerConnection;
1508
+ getIceTransport(): ObservedIceTransport | undefined;
1509
+ update(stats: CodecStats): void;
1510
+ }
1511
+
1512
+ declare class ObservedRemoteInboundRtp implements RemoteInboundRtpStats {
1513
+ timestamp: number;
1514
+ id: string;
1515
+ ssrc: number;
1516
+ kind: MediaKind;
1517
+ private readonly _peerConnection;
1518
+ private _visited;
1519
+ appData?: Record<string, unknown>;
1520
+ transportId?: string | undefined;
1521
+ codecId?: string | undefined;
1522
+ packetsReceived?: number | undefined;
1523
+ packetsLost?: number | undefined;
1524
+ jitter?: number | undefined;
1525
+ localId?: string | undefined;
1526
+ roundTripTime?: number | undefined;
1527
+ totalRoundTripTime?: number | undefined;
1528
+ fractionLost?: number | undefined;
1529
+ roundTripTimeMeasurements?: number | undefined;
1530
+ attachments?: Record<string, unknown> | undefined;
1531
+ constructor(timestamp: number, id: string, ssrc: number, kind: MediaKind, _peerConnection: ObservedPeerConnection);
1532
+ get visited(): boolean;
1533
+ getPeerConnection(): ObservedPeerConnection;
1534
+ getOutboundRtp(): ObservedOutboundRtp | undefined;
1535
+ getCodec(): ObservedCodec | undefined;
1536
+ update(stats: RemoteInboundRtpStats): void;
1537
+ }
1538
+
1539
+ declare class ObservedOutboundRtp implements OutboundRtpStats {
1540
+ timestamp: number;
1541
+ id: string;
1542
+ ssrc: number;
1543
+ kind: MediaKind;
1544
+ private readonly _peerConnection;
1545
+ private _visited;
1546
+ appData?: Record<string, unknown>;
1547
+ transportId?: string | undefined;
1548
+ codecId?: string | undefined;
1549
+ packetsSent?: number | undefined;
1550
+ bytesSent?: number | undefined;
1551
+ mid?: string | undefined;
1552
+ mediaSourceId?: string | undefined;
1553
+ remoteId?: string | undefined;
1554
+ rid?: string | undefined;
1555
+ headerBytesSent?: number | undefined;
1556
+ retransmittedPacketsSent?: number | undefined;
1557
+ retransmittedBytesSent?: number | undefined;
1558
+ rtxSsrc?: number | undefined;
1559
+ targetBitrate?: number | undefined;
1560
+ totalEncodedBytesTarget?: number | undefined;
1561
+ frameWidth?: number | undefined;
1562
+ frameHeight?: number | undefined;
1563
+ framesPerSecond?: number | undefined;
1564
+ framesSent?: number | undefined;
1565
+ hugeFramesSent?: number | undefined;
1566
+ framesEncoded?: number | undefined;
1567
+ keyFramesEncoded?: number | undefined;
1568
+ qpSum?: number | undefined;
1569
+ totalEncodeTime?: number | undefined;
1570
+ totalPacketSendDelay?: number | undefined;
1571
+ qualityLimitationReason?: string | undefined;
1572
+ qualityLimitationResolutionChanges?: number | undefined;
1573
+ nackCount?: number | undefined;
1574
+ firCount?: number | undefined;
1575
+ pliCount?: number | undefined;
1576
+ encoderImplementation?: string | undefined;
1577
+ powerEfficientEncoder?: boolean | undefined;
1578
+ active?: boolean | undefined;
1579
+ scalabilityMode?: string | undefined;
1580
+ qualityLimitationDurations?: QualityLimitationDurations | undefined;
1581
+ attachments?: Record<string, unknown> | undefined;
1582
+ bitrate: number;
1583
+ payloadBitrate: number;
1584
+ packetRate: number;
1585
+ bitPerPixel: number;
1586
+ deltaPacketsSent: number;
1587
+ deltaBytesSent: number;
1588
+ remoteRttInMs?: number;
1589
+ remoteFractionLost?: number;
1590
+ remoteJitter?: number;
1591
+ remotePacketsLost?: number;
1592
+ constructor(timestamp: number, id: string, ssrc: number, kind: MediaKind, _peerConnection: ObservedPeerConnection);
1593
+ get visited(): boolean;
1594
+ getPeerConnection(): ObservedPeerConnection;
1595
+ getRemoteInboundRtp(): ObservedRemoteInboundRtp | undefined;
1596
+ getCodec(): ObservedCodec | undefined;
1597
+ getMediaSource(): ObservedMediaSource | undefined;
1598
+ getTrack(): ObservedOutboundTrack | undefined;
1599
+ update(stats: OutboundRtpStats): void;
1600
+ }
1601
+
1602
+ declare class ObservedOutboundTrack implements OutboundTrackSample {
1603
+ timestamp: number;
1604
+ readonly id: string;
1605
+ readonly kind: MediaKind;
1606
+ private readonly _peerConnection;
1607
+ private readonly _outboundRtps?;
1608
+ private readonly _mediaSource?;
1609
+ private _visited;
1610
+ appData?: Record<string, unknown>;
1611
+ readonly remoteInboundTracks: Set<ObservedInboundTrack>;
1612
+ readonly calculatedScore: CalculatedScore;
1613
+ addedAt?: number | undefined;
1614
+ removedAt?: number | undefined;
1615
+ muted?: boolean;
1616
+ attachments?: Record<string, unknown> | undefined;
1617
+ constructor(timestamp: number, id: string, kind: MediaKind, _peerConnection: ObservedPeerConnection, _outboundRtps?: ObservedOutboundRtp[] | undefined, _mediaSource?: ObservedMediaSource | undefined);
1618
+ get score(): number | undefined;
1619
+ get visited(): boolean;
1620
+ getPeerConnection(): ObservedPeerConnection;
1621
+ getOutboundRtps(): ObservedOutboundRtp[] | undefined;
1622
+ getMediaSource(): ObservedMediaSource | undefined;
1623
+ update(stats: OutboundTrackSample): void;
1624
+ }
1625
+
1626
+ declare class ObservedInboundTrack implements InboundTrackSample {
1627
+ timestamp: number;
1628
+ readonly id: string;
1629
+ readonly kind: MediaKind;
1630
+ private readonly _peerConnection;
1631
+ private readonly _inboundRtp?;
1632
+ private readonly _mediaPlayout?;
1633
+ readonly calculatedScore: CalculatedScore;
1634
+ appData?: Record<string, unknown>;
1635
+ remoteOutboundTrack?: ObservedOutboundTrack | undefined;
1636
+ private _visited;
1637
+ addedAt?: number | undefined;
1638
+ removedAt?: number | undefined;
1639
+ muted?: boolean;
1640
+ attachments?: Record<string, unknown> | undefined;
1641
+ constructor(timestamp: number, id: string, kind: MediaKind, _peerConnection: ObservedPeerConnection, _inboundRtp?: ObservedInboundRtp | undefined, _mediaPlayout?: ObservedMediaPlayout | undefined);
1642
+ get score(): number | undefined;
1643
+ get visited(): boolean;
1644
+ getPeerConnection(): ObservedPeerConnection;
1645
+ getInboundRtp(): ObservedInboundRtp | undefined;
1646
+ getMediaPlayout(): ObservedMediaPlayout | undefined;
1647
+ update(stats: InboundTrackSample): void;
1648
+ }
1649
+
1650
+ declare class ObservedRemoteOutboundRtp implements RemoteOutboundRtpStats {
1651
+ timestamp: number;
1652
+ id: string;
1653
+ ssrc: number;
1654
+ kind: MediaKind;
1655
+ private readonly _peerConnection;
1656
+ private _visited;
1657
+ appData?: Record<string, unknown>;
1658
+ transportId?: string | undefined;
1659
+ codecId?: string | undefined;
1660
+ packetsSent?: number | undefined;
1661
+ bytesSent?: number | undefined;
1662
+ localId?: string | undefined;
1663
+ remoteTimestamp?: number | undefined;
1664
+ reportsSent?: number | undefined;
1665
+ roundTripTime?: number | undefined;
1666
+ totalRoundTripTime?: number | undefined;
1667
+ roundTripTimeMeasurements?: number | undefined;
1668
+ attachments?: Record<string, unknown> | undefined;
1669
+ constructor(timestamp: number, id: string, ssrc: number, kind: MediaKind, _peerConnection: ObservedPeerConnection);
1670
+ get visited(): boolean;
1671
+ getPeerConnection(): ObservedPeerConnection;
1672
+ getInboundRtp(): ObservedInboundRtp | undefined;
1673
+ getCodec(): ObservedCodec | undefined;
1674
+ update(stats: RemoteOutboundRtpStats): void;
1675
+ }
1676
+
1677
+ declare class ObservedInboundRtp implements InboundRtpStats {
1678
+ timestamp: number;
1679
+ id: string;
1680
+ ssrc: number;
1681
+ kind: MediaKind;
1682
+ trackIdentifier: string;
1683
+ private readonly _peerConnection;
1684
+ appData?: Record<string, unknown>;
1685
+ private _visited;
1686
+ transportId?: string | undefined;
1687
+ codecId?: string | undefined;
1688
+ packetsReceived?: number | undefined;
1689
+ packetsLost?: number | undefined;
1690
+ mid?: string | undefined;
1691
+ remoteId?: string | undefined;
1692
+ framesDecoded?: number | undefined;
1693
+ keyFramesDecoded?: number | undefined;
1694
+ framesRendered?: number | undefined;
1695
+ framesDropped?: number | undefined;
1696
+ frameWidth?: number | undefined;
1697
+ frameHeight?: number | undefined;
1698
+ framesPerSecond?: number | undefined;
1699
+ qpSum?: number | undefined;
1700
+ totalDecodeTime?: number | undefined;
1701
+ totalInterFrameDelay?: number | undefined;
1702
+ totalSquaredInterFrameDelay?: number | undefined;
1703
+ pauseCount?: number | undefined;
1704
+ totalPausesDuration?: number | undefined;
1705
+ freezeCount?: number | undefined;
1706
+ totalFreezesDuration?: number | undefined;
1707
+ lastPacketReceivedTimestamp?: number | undefined;
1708
+ headerBytesReceived?: number | undefined;
1709
+ packetsDiscarded?: number | undefined;
1710
+ fecBytesReceived?: number | undefined;
1711
+ fecPacketsReceived?: number | undefined;
1712
+ fecPacketsDiscarded?: number | undefined;
1713
+ bytesReceived?: number | undefined;
1714
+ nackCount?: number | undefined;
1715
+ firCount?: number | undefined;
1716
+ pliCount?: number | undefined;
1717
+ totalProcessingDelay?: number | undefined;
1718
+ estimatedPlayoutTimestamp?: number | undefined;
1719
+ jitterBufferDelay?: number | undefined;
1720
+ jitterBufferTargetDelay?: number | undefined;
1721
+ jitterBufferEmittedCount?: number | undefined;
1722
+ jitterBufferMinimumDelay?: number | undefined;
1723
+ totalSamplesReceived?: number | undefined;
1724
+ concealedSamples?: number | undefined;
1725
+ silentConcealedSamples?: number | undefined;
1726
+ concealmentEvents?: number | undefined;
1727
+ insertedSamplesForDeceleration?: number | undefined;
1728
+ removedSamplesForAcceleration?: number | undefined;
1729
+ audioLevel?: number | undefined;
1730
+ totalAudioEnergy?: number | undefined;
1731
+ totalSamplesDuration?: number | undefined;
1732
+ framesReceived?: number | undefined;
1733
+ decoderImplementation?: string | undefined;
1734
+ playoutId?: string | undefined;
1735
+ powerEfficientDecoder?: boolean | undefined;
1736
+ framesAssembledFromMultiplePackets?: number | undefined;
1737
+ totalAssemblyTime?: number | undefined;
1738
+ retransmittedPacketsReceived?: number | undefined;
1739
+ retransmittedBytesReceived?: number | undefined;
1740
+ rtxSsrc?: number | undefined;
1741
+ fecSsrc?: number | undefined;
1742
+ totalCorruptionProbability?: number | undefined;
1743
+ totalSquaredCorruptionProbability?: number | undefined;
1744
+ corruptionMeasurements?: number | undefined;
1745
+ attachments?: Record<string, unknown> | undefined;
1746
+ jitter?: number | undefined;
1747
+ bitrate: number;
1748
+ fractionLost?: number;
1749
+ bitPerPixel: number;
1750
+ deltaLostPackets: number;
1751
+ deltaReceivedPackets: number;
1752
+ deltaBytesReceived: number;
1753
+ deltaReceivedSamples: number;
1754
+ deltaSilentConcealedSamples: number;
1755
+ remoteRttInMs?: number;
1756
+ remoteBytesSent?: number;
1757
+ remotePacketsSent?: number;
1758
+ remoteTimestamp?: number;
1759
+ constructor(timestamp: number, id: string, ssrc: number, kind: MediaKind, trackIdentifier: string, _peerConnection: ObservedPeerConnection);
1760
+ get visited(): boolean;
1761
+ getPeerConnection(): ObservedPeerConnection;
1762
+ getRemoteOutboundRtp(): ObservedRemoteOutboundRtp | undefined;
1763
+ getIceTransport(): ObservedIceTransport | undefined;
1764
+ getCodec(): ObservedCodec | undefined;
1765
+ getMediaPlayout(): ObservedMediaPlayout | undefined;
1766
+ getTrack(): ObservedInboundTrack | undefined;
1767
+ update(stats: InboundRtpStats): void;
1768
+ }
1769
+
1770
+ declare class ObservedCertificate implements CertificateStats {
1771
+ timestamp: number;
1772
+ id: string;
1773
+ private readonly _peerConnection;
1774
+ appData?: Record<string, unknown>;
1775
+ private _visited;
1776
+ fingerprint?: string;
1777
+ fingerprintAlgorithm?: string;
1778
+ base64Certificate?: string;
1779
+ issuerCertificateId?: string;
1780
+ attachments?: Record<string, unknown>;
1781
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1782
+ get visited(): boolean;
1783
+ getPeerConnection(): ObservedPeerConnection;
1784
+ update(stats: CertificateStats): void;
1785
+ }
1786
+
1787
+ declare class ObservedDataChannel implements DataChannelStats {
1788
+ timestamp: number;
1789
+ id: string;
1790
+ private readonly _peerConnection;
1791
+ private _visited;
1792
+ label?: string | undefined;
1793
+ protocol?: string | undefined;
1794
+ dataChannelIdentifier?: number | undefined;
1795
+ state?: string | undefined;
1796
+ messagesSent?: number | undefined;
1797
+ bytesSent?: number | undefined;
1798
+ messagesReceived?: number | undefined;
1799
+ bytesReceived?: number | undefined;
1800
+ attachments?: Record<string, unknown> | undefined;
1801
+ addedAt?: number | undefined;
1802
+ removedAt?: number | undefined;
1803
+ deltaBytesSent: number;
1804
+ deltaBytesReceived: number;
1805
+ deltaMessagesSent: number;
1806
+ deltaMessagesReceived: number;
1807
+ appData?: Record<string, unknown>;
1808
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1809
+ get visited(): boolean;
1810
+ getPeerConnection(): ObservedPeerConnection;
1811
+ update(stats: DataChannelStats): void;
1812
+ }
1813
+
1814
+ declare class ObservedPeerConnectionTransport implements PeerConnectionTransportStats {
1815
+ timestamp: number;
1816
+ id: string;
1817
+ private readonly _peerConnection;
1818
+ private _visited;
1819
+ appData?: Record<string, unknown>;
1820
+ dataChannelsOpened?: number | undefined;
1821
+ dataChannelsClosed?: number | undefined;
1822
+ attachments?: Record<string, unknown> | undefined;
1823
+ constructor(timestamp: number, id: string, _peerConnection: ObservedPeerConnection);
1824
+ get visited(): boolean;
1825
+ getPeerConnection(): ObservedPeerConnection;
1826
+ update(stats: PeerConnectionTransportStats): void;
1827
+ }
1828
+
1829
+ type ObservedTURNEventMap = {
1830
+ 'update': [ObservedTURN];
1831
+ 'close': [];
1832
+ };
1833
+ declare interface ObservedTURN {
1834
+ on<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
1835
+ off<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
1836
+ once<U extends keyof ObservedTURNEventMap>(event: U, listener: (...args: ObservedTURNEventMap[U]) => void): this;
1837
+ emit<U extends keyof ObservedTURNEventMap>(event: U, ...args: ObservedTURNEventMap[U]): boolean;
1838
+ }
1839
+ declare class ObservedTURN extends EventEmitter {
1840
+ totalBytesSent: number;
1841
+ totalBytesReceived: number;
1842
+ totalPacketsSent: number;
1843
+ totalPacketsReceived: number;
1844
+ packetsSentPerSecond: number;
1845
+ packetsReceivedPerSecond: number;
1846
+ outboundBitrate: number;
1847
+ inboundBitrate: number;
1848
+ numberOfClients: number;
1849
+ readonly servers: Map<string, ObservedTurnServer>;
1850
+ constructor();
1851
+ update(): void;
1852
+ addPeerConnection(peerConnection: ObservedPeerConnection): ObservedTurnServer | undefined;
1853
+ removePeerConnection(peerConnection: ObservedPeerConnection): void;
1854
+ }
1855
+
1856
+ declare class ObservedTurnServer {
1857
+ readonly url: string;
1858
+ readonly observedTURN: ObservedTURN;
1859
+ totalBytesSent: number;
1860
+ totalBytesReceived: number;
1861
+ totalPacketsSent: number;
1862
+ totalPacketsReceived: number;
1863
+ packetsSentPerSecond: number;
1864
+ packetsReceivedPerSecond: number;
1865
+ outboundBitrate: number;
1866
+ inboundBitrate: number;
1867
+ deltaBytesSent: number;
1868
+ deltaBytesReceived: number;
1869
+ deltaPacketsSent: number;
1870
+ deltaPacketsReceived: number;
1871
+ readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
1872
+ updated: number;
1873
+ constructor(url: string, observedTURN: ObservedTURN);
1874
+ updateTurnUsage(...selectedcandidatepairs: ObservedIceCandidatePair[]): void;
1875
+ update(): void;
1876
+ }
1877
+
1878
+ type ObservedPeerConnectionEvents = {
1879
+ 'removed-inbound-track': [ObservedInboundTrack];
1880
+ 'removed-outbound-track': [ObservedOutboundTrack];
1881
+ close: [];
1882
+ };
1883
+ declare interface ObservedPeerConnection {
1884
+ on<U extends keyof ObservedPeerConnectionEvents>(event: U, listener: (...args: ObservedPeerConnectionEvents[U]) => void): this;
1885
+ off<U extends keyof ObservedPeerConnectionEvents>(event: U, listener: (...args: ObservedPeerConnectionEvents[U]) => void): this;
1886
+ once<U extends keyof ObservedPeerConnectionEvents>(event: U, listener: (...args: ObservedPeerConnectionEvents[U]) => void): this;
1887
+ emit<U extends keyof ObservedPeerConnectionEvents>(event: U, ...args: ObservedPeerConnectionEvents[U]): boolean;
1888
+ }
1889
+ declare class ObservedPeerConnection extends EventEmitter {
1890
+ readonly peerConnectionId: string;
1891
+ readonly client: ObservedClient;
1892
+ private _visited;
1893
+ appData?: Record<string, unknown>;
1894
+ readonly calculatedScore: CalculatedScore;
1895
+ closed: boolean;
1896
+ openedAt?: number;
1897
+ closedAt?: number;
1898
+ updated: number;
1899
+ connectionState?: 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';
1900
+ iceConnectionState?: 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';
1901
+ iceGatheringState?: 'new' | 'gathering' | 'complete';
1902
+ availableIncomingBitrate: number;
1903
+ availableOutgoingBitrate: number;
1904
+ totalInboundPacketsLost: number;
1905
+ totalInboundPacketsReceived: number;
1906
+ totalOutboundPacketsSent: number;
1907
+ totalDataChannelBytesSent: number;
1908
+ totalDataChannelBytesReceived: number;
1909
+ totalDataChannelMessagesSent: number;
1910
+ totalDataChannelMessagesReceived: number;
1911
+ totalSentAudioBytes: number;
1912
+ totalSentVideoBytes: number;
1913
+ totalSentAudioPackets: number;
1914
+ totalSentVideoPackets: number;
1915
+ totalReceivedAudioPacktes: number;
1916
+ totalReceivedVideoPackets: number;
1917
+ totalReceivedAudioBytes: number;
1918
+ totalReceivedVideoBytes: number;
1919
+ deltaInboundPacketsLost: number;
1920
+ deltaInboundPacketsReceived: number;
1921
+ deltaOutboundPacketsSent: number;
1922
+ deltaDataChannelBytesSent: number;
1923
+ deltaDataChannelBytesReceived: number;
1924
+ deltaDataChannelMessagesSent: number;
1925
+ deltaDataChannelMessagesReceived: number;
1926
+ deltaInboundReceivedBytes: number;
1927
+ deltaOutboundSentBytes: number;
1928
+ deltaReceivedAudioBytes: number;
1929
+ deltaReceivedVideoBytes: number;
1930
+ deltaReceivedAudioPackets: number;
1931
+ deltaReceivedVideoPackets: number;
1932
+ deltaSentAudioBytes: number;
1933
+ deltaSentVideoBytes: number;
1934
+ deltaSentAudioPackets: number;
1935
+ deltaSentVideoPackets: number;
1936
+ deltaTransportSentBytes: number;
1937
+ deltaTransportReceivedBytes: number;
1938
+ receivingPacketsPerSecond: number;
1939
+ sendingPacketsPerSecond: number;
1940
+ sendingAudioBitrate: number;
1941
+ sendingVideoBitrate: number;
1942
+ receivingAudioBitrate: number;
1943
+ receivingVideoBitrate: number;
1944
+ currentRttInMs?: number;
1945
+ currentJitter?: number;
1946
+ usingTCP: boolean;
1947
+ usingTURN: boolean;
1948
+ observedTurnServer?: ObservedTurnServer;
1949
+ readonly observedCertificates: Map<string, ObservedCertificate>;
1950
+ readonly observedCodecs: Map<string, ObservedCodec>;
1951
+ readonly observedDataChannels: Map<string, ObservedDataChannel>;
1952
+ readonly observedIceCandidates: Map<string, ObservedIceCandidate>;
1953
+ readonly observedIceCandidatesPair: Map<string, ObservedIceCandidatePair>;
1954
+ readonly observedIceTransports: Map<string, ObservedIceTransport>;
1955
+ readonly observedInboundRtps: Map<number, ObservedInboundRtp>;
1956
+ readonly observedInboundTracks: Map<string, ObservedInboundTrack>;
1957
+ readonly observedMediaPlayouts: Map<string, ObservedMediaPlayout>;
1958
+ readonly observedMediaSources: Map<string, ObservedMediaSource>;
1959
+ readonly observedOutboundRtps: Map<number, ObservedOutboundRtp>;
1960
+ readonly observedOutboundTracks: Map<string, ObservedOutboundTrack>;
1961
+ readonly observedPeerConnectionTransports: Map<string, ObservedPeerConnectionTransport>;
1962
+ readonly observedRemoteInboundRtps: Map<number, ObservedRemoteInboundRtp>;
1963
+ readonly observedRemoteOutboundRtps: Map<number, ObservedRemoteOutboundRtp>;
1964
+ private readonly eventScope;
1965
+ constructor(peerConnectionId: string, client: ObservedClient);
1966
+ get score(): number | undefined;
1967
+ get visited(): boolean;
1968
+ get codecs(): ObservedCodec[];
1969
+ get inboundRtps(): ObservedInboundRtp[];
1970
+ get remoteOutboundRtps(): ObservedRemoteOutboundRtp[];
1971
+ get outboundRtps(): ObservedOutboundRtp[];
1972
+ get remoteInboundRtps(): ObservedRemoteInboundRtp[];
1973
+ get mediaSources(): ObservedMediaSource[];
1974
+ get mediaPlayouts(): ObservedMediaPlayout[];
1975
+ get dataChannels(): ObservedDataChannel[];
1976
+ get peerConnectionTransports(): ObservedPeerConnectionTransport[];
1977
+ get iceTransports(): ObservedIceTransport[];
1978
+ get iceCandidates(): ObservedIceCandidate[];
1979
+ get iceCandidatePairs(): ObservedIceCandidatePair[];
1980
+ get certificates(): ObservedCertificate[];
1981
+ get selectedIceCandidatePairs(): ObservedIceCandidatePair[];
1982
+ get selectedIceCandiadtePairForTurn(): ObservedIceCandidatePair[];
1983
+ close(): void;
1984
+ accept(sample: PeerConnectionSample, context?: AcceptContext): void;
1985
+ private _checkVisited;
1986
+ private _updateCertificateStats;
1987
+ private _updateCodecStats;
1988
+ private _updateDataChannelStats;
1989
+ private _updateIceCandidateStats;
1990
+ private _updateIceCandidatePairStats;
1991
+ private _updateIceTransportStats;
1992
+ private _updateInboundRtpStats;
1993
+ private _updateInboundTrackSample;
1994
+ private _updateMediaPlayoutStats;
1995
+ private _updateMediaSourceStats;
1996
+ private _updateOutboundRtpStats;
1997
+ private _updateOutboundTrackSample;
1998
+ private _updatePeerConnectionTransportStats;
1999
+ private _updateRemoteInboundRtpStats;
2000
+ private _updateRemoteOutboundRtpStats;
2001
+ /** Emit an Observer-bus event scoped to this peer connection. */
2002
+ private _notify;
2003
+ }
2004
+
2005
+ declare enum ClientMetaTypes {
2006
+ MEDIA_CONSTRAINT = "MEDIA_CONSTRAINT",
2007
+ MEDIA_DEVICE = "MEDIA_DEVICE",
2008
+ MEDIA_DEVICES_SUPPORTED_CONSTRAINTS = "MEDIA_DEVICES_SUPPORTED_CONSTRAINTS",
2009
+ USER_MEDIA_ERROR = "USER_MEDIA_ERROR",
2010
+ LOCAL_SDP = "LOCAL_SDP",
2011
+ OPERATION_SYSTEM = "OPERATION_SYSTEM",
2012
+ ENGINE = "ENGINE",
2013
+ PLATFORM = "PLATFORM",
2014
+ BROWSER = "BROWSER"
2015
+ }
2016
+ type MediaDeviceInfo = {
2017
+ deviceId: string;
2018
+ label: string;
2019
+ kind: string;
2020
+ groupId: string;
2021
+ };
2022
+ type Browser = {
2023
+ name: string;
2024
+ version: string;
2025
+ };
2026
+ type Platform = {
2027
+ name: string;
2028
+ version: string;
2029
+ };
2030
+ type Engine = {
2031
+ name: string;
2032
+ version: string;
2033
+ };
2034
+ type OperationSystem = {
2035
+ name: string;
2036
+ version: string;
2037
+ };
2038
+
2039
+ /** The lifecycle events a sink may emit (a subset of Node's writable-stream events). */
2040
+ type ClientSampleSinkEvents = {
2041
+ /** The destination is fully written and closed (e.g. a file flushed and its fd closed). */
2042
+ close: [];
2043
+ /** The destination failed. */
2044
+ error: [Error];
2045
+ /** `end()` was processed and all queued data was flushed (before `close`). */
2046
+ finish: [];
2047
+ /** The buffer drained after backpressure; safe to write more. */
2048
+ drain: [];
2049
+ };
2050
+ declare interface ClientSampleSink {
2051
+ on<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;
2052
+ once<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;
2053
+ off<E extends keyof ClientSampleSinkEvents>(event: E, listener: (...args: ClientSampleSinkEvents[E]) => void): this;
2054
+ emit<E extends keyof ClientSampleSinkEvents>(event: E, ...args: ClientSampleSinkEvents[E]): boolean;
2055
+ }
2056
+ /**
2057
+ * A per-client destination for accepted samples — a typed `EventEmitter` base class. One sink is
2058
+ * created per `ObservedClient` (via `ObserverConfig.createClientSink`). It is **object-mode**:
2059
+ * `write` receives the `ClientSample` itself, so each sink decides how to serialize it (JSON
2060
+ * line, protobuf, msgpack, a remote payload, …).
2061
+ *
2062
+ * The library calls `write(sample)` synchronously per accepted sample (not awaited), `end()`s the
2063
+ * sink when the client closes, and attaches an `error` listener so a failing sink can't crash the
2064
+ * process. The application — which created the sink — listens for `close` (destination ready,
2065
+ * e.g. a file flushed and its fd closed) and `error`.
2066
+ *
2067
+ * Subclass this and implement `write`/`end` (and `emit` your lifecycle events). Built-in sinks
2068
+ * (`JsonlFileSink`, `InMemorySink`) and their factories are exported from the package root.
2069
+ */
2070
+ declare abstract class ClientSampleSink extends EventEmitter {
2071
+ /** Accept one sample; the sink serializes it however it likes. `false` signals backpressure. */
2072
+ abstract write(sample: ClientSample): boolean;
2073
+ /** Finish writing; the sink flushes and (if applicable) emits `close`. */
2074
+ abstract end(): void;
2075
+ }
2076
+ /**
2077
+ * Produces a sink for a newly-created client, or `undefined` for no sink. Receives the
2078
+ * client id and its (already-created) parent call, so the destination can be derived
2079
+ * from `callId` / `clientId`.
2080
+ */
2081
+ type ClientSampleSinkFactory = (params: {
2082
+ clientId: string;
2083
+ observedCall: ObservedCall;
2084
+ }) => ClientSampleSink | undefined;
2085
+
2086
+ /** mediasoup `TransportTuple` (the selected local/remote address pair of a transport). */
2087
+ type TransportTuple = {
2088
+ localAddress: string;
2089
+ localPort: number;
2090
+ remoteIp?: string;
2091
+ remotePort?: number;
2092
+ protocol: 'udp' | 'tcp';
2093
+ };
2094
+ /** mediasoup `RtpCodecParameters` (the negotiated codec of a producer/consumer). */
2095
+ type RtpCodecParameters = {
2096
+ mimeType: string;
2097
+ payloadType: number;
2098
+ clockRate: number;
2099
+ channels?: number;
2100
+ parameters?: Record<string, unknown>;
2101
+ rtcpFeedback?: {
2102
+ type: string;
2103
+ parameter?: string;
2104
+ }[];
2105
+ };
2106
+ type SampleHistoryItem<T extends string> = Record<string, unknown> & {
2107
+ type: T;
2108
+ timestamp: number;
2109
+ };
2110
+ type MediasoupRouterSample = Record<string, unknown> & {
2111
+ routerId: string;
2112
+ attachments: Record<string, unknown>;
2113
+ createdAt: number;
2114
+ closedAt?: number;
2115
+ producers: MediasoupProducerSample[];
2116
+ consumers: MediasoupConsumerSample[];
2117
+ dataProducers: MediasoupDataProducerSample[];
2118
+ dataConsumers: MediasoupDataConsumerSample[];
2119
+ transports: MediasoupTransportSample[];
2120
+ };
2121
+ type MediasoupWebRtcTransportSampleEventTypes = 'icestate-changed-to-new' | 'icestate-changed-to-connected' | 'icestate-changed-to-completed' | 'icestate-changed-to-disconnected' | 'icestate-changed-to-closed' | 'dtlsstate-changed-to-new' | 'dtlsstate-changed-to-connecting' | 'dtlsstate-changed-to-connected' | 'dtlsstate-changed-to-failed' | 'dtlsstate-changed-to-closed' | 'sctpstate-changed-to-new' | 'sctpstate-changed-to-connecting' | 'sctpstate-changed-to-connected' | 'sctpstate-changed-to-failed' | 'sctpstate-changed-to-closed' | 'iceselectedtuple-changed';
2122
+ type MediasoupWebRtcTransportSampleEventMap = {
2123
+ [K in MediasoupWebRtcTransportSampleEventTypes]: SampleHistoryItem<K>;
2124
+ }[MediasoupWebRtcTransportSampleEventTypes];
2125
+ type MediasoupWebRtcTransportSample = {
2126
+ type: 'webrtc';
2127
+ history: MediasoupWebRtcTransportSampleEventMap[];
2128
+ };
2129
+ type MediasoupPlainTransportSampleEventTypes = 'sctpstate-changed-to-new' | 'sctpstate-changed-to-connecting' | 'sctpstate-changed-to-connected' | 'sctpstate-changed-to-failed' | 'sctpstate-changed-to-closed' | 'tuple-changed' | 'rtcptuple-changed';
2130
+ type MediasoupPlainTransportSampleEventMap = {
2131
+ [K in MediasoupPlainTransportSampleEventTypes]: SampleHistoryItem<K>;
2132
+ }[MediasoupPlainTransportSampleEventTypes];
2133
+ type MediasoupPlainTransportSample = {
2134
+ type: 'plain';
2135
+ rtcpTuple?: TransportTuple;
2136
+ history: MediasoupPlainTransportSampleEventMap[];
2137
+ };
2138
+ type MediasoupPipeTransportSampleEventTypes = 'sctpstate-changed-to-new' | 'sctpstate-changed-to-connecting' | 'sctpstate-changed-to-connected' | 'sctpstate-changed-to-failed' | 'sctpstate-changed-to-closed';
2139
+ type MediasoupPipeTransportSampleEventMap = {
2140
+ [K in MediasoupPipeTransportSampleEventTypes]: SampleHistoryItem<K>;
2141
+ }[MediasoupPipeTransportSampleEventTypes];
2142
+ type MediasoupPipeTransportSample = {
2143
+ type: 'pipe';
2144
+ history: MediasoupPipeTransportSampleEventMap[];
2145
+ };
2146
+ type MediasoupDirectTransportSampleEventTypes = never;
2147
+ type MediasoupDirectTransportSampleEventMap = {
2148
+ [K in MediasoupDirectTransportSampleEventTypes]: SampleHistoryItem<K>;
2149
+ }[MediasoupDirectTransportSampleEventTypes];
2150
+ type MediasoupDirectTransportSample = {
2151
+ type: 'direct';
2152
+ history: MediasoupDirectTransportSampleEventMap[];
2153
+ };
2154
+ type MediasoupTransportSample = Record<string, unknown> & {
2155
+ id: string;
2156
+ createdAt: number;
2157
+ connectedAt?: number;
2158
+ closedAt?: number;
2159
+ tuple?: TransportTuple;
2160
+ } & (MediasoupWebRtcTransportSample | MediasoupPlainTransportSample | MediasoupPipeTransportSample | MediasoupDirectTransportSample);
2161
+ type MediasoupProducerSampleEventMap = {
2162
+ 'pause': undefined;
2163
+ 'resume': undefined;
2164
+ 'degraded': undefined;
2165
+ 'restored': undefined;
2166
+ };
2167
+ type MediasoupProducerSampleEvent = {
2168
+ [K in keyof MediasoupProducerSampleEventMap]: SampleHistoryItem<K>;
2169
+ }[keyof MediasoupProducerSampleEventMap];
2170
+ type MediasoupProducerSample = Record<string, unknown> & {
2171
+ id: string;
2172
+ transportId: string;
2173
+ createdAt: number;
2174
+ closedAt?: number;
2175
+ codecInfo: RtpCodecParameters;
2176
+ kind: 'audio' | 'video';
2177
+ ssrcs?: number[];
2178
+ rids?: string[];
2179
+ history: MediasoupProducerSampleEvent[];
2180
+ };
2181
+ type MediasoupConsumerSampleEventMap = {
2182
+ 'pause': undefined;
2183
+ 'resume': undefined;
2184
+ 'producerPaused': undefined;
2185
+ 'producerResumed': undefined;
2186
+ 'stopped': undefined;
2187
+ 'started': undefined;
2188
+ 'degraded': undefined;
2189
+ 'restored': undefined;
2190
+ };
2191
+ type MediasoupConsumerSampleEvent = {
2192
+ [K in keyof MediasoupConsumerSampleEventMap]: SampleHistoryItem<K>;
2193
+ }[keyof MediasoupConsumerSampleEventMap];
2194
+ type MediasoupConsumerSample = Record<string, unknown> & {
2195
+ id: string;
2196
+ producerId: string;
2197
+ transportId: string;
2198
+ createdAt: number;
2199
+ closedAt?: number;
2200
+ kind: 'audio' | 'video';
2201
+ history: MediasoupConsumerSampleEvent[];
2202
+ };
2203
+ type MediasoupDataProducerSample = Record<string, unknown> & {
2204
+ id: string;
2205
+ transportId: string;
2206
+ createdAt: number;
2207
+ closedAt?: number;
2208
+ label: string;
2209
+ protocol: string;
2210
+ };
2211
+ type MediasoupDataConsumerSample = Record<string, unknown> & {
2212
+ id: string;
2213
+ dataProducerId: string;
2214
+ transportId: string;
2215
+ createdAt: number;
2216
+ closedAt?: number;
2217
+ label: string;
2218
+ protocol: string;
2219
+ };
2220
+
2221
+ type ObservedMediasoupRouterSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
2222
+ router: types.Router;
2223
+ appData?: AppData;
2224
+ attachments?: Record<string, unknown>;
2225
+ };
2226
+ type ObservedMediasoupRouterEvents = {
2227
+ close: [];
2228
+ };
2229
+ declare interface ObservedMediasoupRouter {
2230
+ on<U extends keyof ObservedMediasoupRouterEvents>(event: U, listener: (...args: ObservedMediasoupRouterEvents[U]) => void): this;
2231
+ off<U extends keyof ObservedMediasoupRouterEvents>(event: U, listener: (...args: ObservedMediasoupRouterEvents[U]) => void): this;
2232
+ once<U extends keyof ObservedMediasoupRouterEvents>(event: U, listener: (...args: ObservedMediasoupRouterEvents[U]) => void): this;
2233
+ emit<U extends keyof ObservedMediasoupRouterEvents>(event: U, ...args: ObservedMediasoupRouterEvents[U]): boolean;
2234
+ }
2235
+ declare class ObservedMediasoupRouter<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
2236
+ readonly router: types.Router;
2237
+ readonly sample: MediasoupRouterSample;
2238
+ appData: AppData;
2239
+ readonly webrtcTransportIds: Set<string>;
2240
+ get attachments(): Record<string, unknown>;
2241
+ closed: boolean;
2242
+ constructor(settings: ObservedMediasoupRouterSettings<AppData>);
2243
+ get id(): string;
2244
+ addTransport: (transport: types.Transport) => void;
2245
+ addWebRtcTransport(transport: types.WebRtcTransport): void;
2246
+ addPlainTransport(transport: types.PlainTransport): void;
2247
+ addPipeTransport(transport: types.PipeTransport): void;
2248
+ addDirectTransport(transport: types.DirectTransport): void;
2249
+ addProducer(transport: types.Transport, producer: types.Producer): void;
2250
+ addConsumer(transport: types.Transport, consumer: types.Consumer): void;
2251
+ addDataProducer(transport: types.Transport, dataProducer: types.DataProducer): void;
2252
+ addDataConsumer(transport: types.Transport, dataConsumer: types.DataConsumer): void;
2253
+ close(): void;
2254
+ private attachRouterListeners;
2255
+ private _attachTransportObserverListeners;
2256
+ }
2257
+
2258
+ /**
2259
+ * The Observer is the single event bus for the whole hierarchy. Every event
2260
+ * worth subscribing to is emitted on the Observer with a payload object that
2261
+ * carries the ancestry of the entity it originates from, down to the subject,
2262
+ * plus the optional `context` passed through `accept(sample, context?)`.
2263
+ *
2264
+ * Lifecycle/coordination events (close, update, joined, left, newclient, ...)
2265
+ * remain as local EventEmitter events on each Observed* component so that
2266
+ * parent/child teardown and the updaters can wire to them directly.
2267
+ */
2268
+ /** Base fields present on every Observer event payload. */
2269
+ type ObserverEventBase = {
2270
+ observer: Observer;
2271
+ context?: AcceptContext;
2272
+ };
2273
+ /** Scope reaching a call. */
2274
+ type ObservedCallScope = ObserverEventBase & {
2275
+ observedCall: ObservedCall;
2276
+ };
2277
+ /** Scope reaching a client (carries its call). */
2278
+ type ObservedClientScope = ObservedCallScope & {
2279
+ observedClient: ObservedClient;
2280
+ };
2281
+ /** Scope reaching a peer connection (carries its call and client). */
2282
+ type ObservedPeerConnectionScope = ObservedClientScope & {
2283
+ observedPeerConnection: ObservedPeerConnection;
2284
+ };
2285
+ type ObservedMediasoupRouterScope = Omit<ObserverEventBase, 'context'> & {
2286
+ observedMediasoupRouter: ObservedMediasoupRouter;
2287
+ };
2288
+ type ObserverEvents = {
2289
+ 'observer-updated': [ObserverEventBase];
2290
+ 'observer-closed': [ObserverEventBase];
2291
+ 'sample-rejected': [ObserverEventBase & {
2292
+ reason: SampleRejectedReason;
2293
+ sample: ClientSample;
2294
+ }];
2295
+ 'mediasoup-router-added': [ObservedMediasoupRouterScope];
2296
+ 'mediasoup-router-removed': [ObservedMediasoupRouterScope];
2297
+ 'mediasoup-router-matched-with-peer-connection': [ObservedMediasoupRouterScope & ObservedPeerConnectionScope];
2298
+ 'call-added': [ObservedCallScope];
2299
+ 'call-updated': [ObservedCallScope];
2300
+ 'call-closed': [ObservedCallScope];
2301
+ 'call-empty': [ObservedCallScope];
2302
+ 'call-not-empty': [ObservedCallScope];
2303
+ 'call-issue': [ObservedCallScope & {
2304
+ issue: ClientIssue;
2305
+ }];
2306
+ 'client-added': [ObservedClientScope];
2307
+ 'client-sink-created': [ObservedClientScope & {
2308
+ sink: ClientSampleSink;
2309
+ }];
2310
+ 'client-updated': [ObservedClientScope & {
2311
+ sample: ClientSample;
2312
+ elapsedTimeInMs: number;
2313
+ }];
2314
+ 'client-closed': [ObservedClientScope];
2315
+ 'client-joined': [ObservedClientScope];
2316
+ 'client-left': [ObservedClientScope];
2317
+ 'client-rejoined': [ObservedClientScope & {
2318
+ timestamp: number;
2319
+ }];
2320
+ 'client-issue': [ObservedClientScope & {
2321
+ issue: ClientIssue;
2322
+ }];
2323
+ 'client-metadata': [ObservedClientScope & {
2324
+ metaData: ClientMetaData;
2325
+ }];
2326
+ 'client-extension-stats': [ObservedClientScope & {
2327
+ extensionStats: ExtensionStat;
2328
+ }];
2329
+ 'client-event': [ObservedClientScope & {
2330
+ event: ClientEvent;
2331
+ }];
2332
+ 'peer-connection-added': [ObservedPeerConnectionScope];
2333
+ 'peer-connection-updated': [ObservedPeerConnectionScope];
2334
+ 'peer-connection-closed': [ObservedPeerConnectionScope];
2335
+ 'ice-connection-state-changed': [ObservedPeerConnectionScope & {
2336
+ state: string;
2337
+ }];
2338
+ 'ice-gathering-state-changed': [ObservedPeerConnectionScope & {
2339
+ state: string;
2340
+ }];
2341
+ 'connection-state-changed': [ObservedPeerConnectionScope & {
2342
+ state: string;
2343
+ }];
2344
+ 'selected-candidate-pair-changed': [ObservedPeerConnectionScope];
2345
+ 'certificate-added': [ObservedPeerConnectionScope & {
2346
+ observedCertificate: ObservedCertificate;
2347
+ }];
2348
+ 'certificate-updated': [ObservedPeerConnectionScope & {
2349
+ observedCertificate: ObservedCertificate;
2350
+ }];
2351
+ 'certificate-removed': [ObservedPeerConnectionScope & {
2352
+ observedCertificate: ObservedCertificate;
2353
+ }];
2354
+ 'codec-added': [ObservedPeerConnectionScope & {
2355
+ observedCodec: ObservedCodec;
2356
+ }];
2357
+ 'codec-updated': [ObservedPeerConnectionScope & {
2358
+ observedCodec: ObservedCodec;
2359
+ }];
2360
+ 'codec-removed': [ObservedPeerConnectionScope & {
2361
+ observedCodec: ObservedCodec;
2362
+ }];
2363
+ 'inbound-rtp-added': [ObservedPeerConnectionScope & {
2364
+ observedInboundRtp: ObservedInboundRtp;
2365
+ }];
2366
+ 'inbound-rtp-updated': [ObservedPeerConnectionScope & {
2367
+ observedInboundRtp: ObservedInboundRtp;
2368
+ }];
2369
+ 'inbound-rtp-removed': [ObservedPeerConnectionScope & {
2370
+ observedInboundRtp: ObservedInboundRtp;
2371
+ }];
2372
+ 'outbound-rtp-added': [ObservedPeerConnectionScope & {
2373
+ observedOutboundRtp: ObservedOutboundRtp;
2374
+ }];
2375
+ 'outbound-rtp-updated': [ObservedPeerConnectionScope & {
2376
+ observedOutboundRtp: ObservedOutboundRtp;
2377
+ }];
2378
+ 'outbound-rtp-removed': [ObservedPeerConnectionScope & {
2379
+ observedOutboundRtp: ObservedOutboundRtp;
2380
+ }];
2381
+ 'remote-inbound-rtp-added': [ObservedPeerConnectionScope & {
2382
+ observedRemoteInboundRtp: ObservedRemoteInboundRtp;
2383
+ }];
2384
+ 'remote-inbound-rtp-updated': [ObservedPeerConnectionScope & {
2385
+ observedRemoteInboundRtp: ObservedRemoteInboundRtp;
2386
+ }];
2387
+ 'remote-inbound-rtp-removed': [ObservedPeerConnectionScope & {
2388
+ observedRemoteInboundRtp: ObservedRemoteInboundRtp;
2389
+ }];
2390
+ 'remote-outbound-rtp-added': [ObservedPeerConnectionScope & {
2391
+ observedRemoteOutboundRtp: ObservedRemoteOutboundRtp;
2392
+ }];
2393
+ 'remote-outbound-rtp-updated': [ObservedPeerConnectionScope & {
2394
+ observedRemoteOutboundRtp: ObservedRemoteOutboundRtp;
2395
+ }];
2396
+ 'remote-outbound-rtp-removed': [ObservedPeerConnectionScope & {
2397
+ observedRemoteOutboundRtp: ObservedRemoteOutboundRtp;
2398
+ }];
2399
+ 'data-channel-added': [ObservedPeerConnectionScope & {
2400
+ observedDataChannel: ObservedDataChannel;
2401
+ }];
2402
+ 'data-channel-updated': [ObservedPeerConnectionScope & {
2403
+ observedDataChannel: ObservedDataChannel;
2404
+ }];
2405
+ 'data-channel-removed': [ObservedPeerConnectionScope & {
2406
+ observedDataChannel: ObservedDataChannel;
2407
+ }];
2408
+ 'ice-candidate-added': [ObservedPeerConnectionScope & {
2409
+ observedIceCandidate: ObservedIceCandidate;
2410
+ }];
2411
+ 'ice-candidate-updated': [ObservedPeerConnectionScope & {
2412
+ observedIceCandidate: ObservedIceCandidate;
2413
+ }];
2414
+ 'ice-candidate-removed': [ObservedPeerConnectionScope & {
2415
+ observedIceCandidate: ObservedIceCandidate;
2416
+ }];
2417
+ 'ice-candidate-pair-added': [ObservedPeerConnectionScope & {
2418
+ observedIceCandidatePair: ObservedIceCandidatePair;
2419
+ }];
2420
+ 'ice-candidate-pair-updated': [ObservedPeerConnectionScope & {
2421
+ observedIceCandidatePair: ObservedIceCandidatePair;
2422
+ }];
2423
+ 'ice-candidate-pair-removed': [ObservedPeerConnectionScope & {
2424
+ observedIceCandidatePair: ObservedIceCandidatePair;
2425
+ }];
2426
+ 'ice-transport-added': [ObservedPeerConnectionScope & {
2427
+ observedIceTransport: ObservedIceTransport;
2428
+ }];
2429
+ 'ice-transport-updated': [ObservedPeerConnectionScope & {
2430
+ observedIceTransport: ObservedIceTransport;
2431
+ }];
2432
+ 'ice-transport-removed': [ObservedPeerConnectionScope & {
2433
+ observedIceTransport: ObservedIceTransport;
2434
+ }];
2435
+ 'media-source-added': [ObservedPeerConnectionScope & {
2436
+ observedMediaSource: ObservedMediaSource;
2437
+ }];
2438
+ 'media-source-updated': [ObservedPeerConnectionScope & {
2439
+ observedMediaSource: ObservedMediaSource;
2440
+ }];
2441
+ 'media-source-removed': [ObservedPeerConnectionScope & {
2442
+ observedMediaSource: ObservedMediaSource;
2443
+ }];
2444
+ 'media-playout-added': [ObservedPeerConnectionScope & {
2445
+ observedMediaPlayout: ObservedMediaPlayout;
2446
+ }];
2447
+ 'media-playout-updated': [ObservedPeerConnectionScope & {
2448
+ observedMediaPlayout: ObservedMediaPlayout;
2449
+ }];
2450
+ 'media-playout-removed': [ObservedPeerConnectionScope & {
2451
+ observedMediaPlayout: ObservedMediaPlayout;
2452
+ }];
2453
+ 'peer-connection-transport-added': [ObservedPeerConnectionScope & {
2454
+ observedPeerConnectionTransport: ObservedPeerConnectionTransport;
2455
+ }];
2456
+ 'peer-connection-transport-updated': [ObservedPeerConnectionScope & {
2457
+ observedPeerConnectionTransport: ObservedPeerConnectionTransport;
2458
+ }];
2459
+ 'peer-connection-transport-removed': [ObservedPeerConnectionScope & {
2460
+ observedPeerConnectionTransport: ObservedPeerConnectionTransport;
2461
+ }];
2462
+ 'inbound-track-added': [ObservedPeerConnectionScope & {
2463
+ observedInboundTrack: ObservedInboundTrack;
2464
+ }];
2465
+ 'inbound-track-updated': [ObservedPeerConnectionScope & {
2466
+ observedInboundTrack: ObservedInboundTrack;
2467
+ }];
2468
+ 'inbound-track-removed': [ObservedPeerConnectionScope & {
2469
+ observedInboundTrack: ObservedInboundTrack;
2470
+ }];
2471
+ 'inbound-track-muted': [ObservedPeerConnectionScope & {
2472
+ observedInboundTrack: ObservedInboundTrack;
2473
+ }];
2474
+ 'inbound-track-unmuted': [ObservedPeerConnectionScope & {
2475
+ observedInboundTrack: ObservedInboundTrack;
2476
+ }];
2477
+ 'outbound-track-added': [ObservedPeerConnectionScope & {
2478
+ observedOutboundTrack: ObservedOutboundTrack;
2479
+ }];
2480
+ 'outbound-track-updated': [ObservedPeerConnectionScope & {
2481
+ observedOutboundTrack: ObservedOutboundTrack;
2482
+ }];
2483
+ 'outbound-track-removed': [ObservedPeerConnectionScope & {
2484
+ observedOutboundTrack: ObservedOutboundTrack;
2485
+ }];
2486
+ 'outbound-track-muted': [ObservedPeerConnectionScope & {
2487
+ observedOutboundTrack: ObservedOutboundTrack;
2488
+ }];
2489
+ 'outbound-track-unmuted': [ObservedPeerConnectionScope & {
2490
+ observedOutboundTrack: ObservedOutboundTrack;
2491
+ }];
2492
+ };
2493
+
2494
+ type ObservedClientSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = {
2495
+ clientId: string;
2496
+ appData?: AppData;
2497
+ closeClientIfIdleForMs?: number;
2498
+ };
2499
+ type ObservedClientEvents = {
2500
+ update: [sample: ClientSample, elapsedTimeInMs: number, context?: AcceptContext];
2501
+ close: [];
2502
+ joined: [];
2503
+ left: [];
2504
+ };
2505
+ declare interface ObservedClient {
2506
+ on<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;
2507
+ off<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;
2508
+ once<U extends keyof ObservedClientEvents>(event: U, listener: (...args: ObservedClientEvents[U]) => void): this;
2509
+ emit<U extends keyof ObservedClientEvents>(event: U, ...args: ObservedClientEvents[U]): boolean;
2510
+ }
2511
+ declare class ObservedClient<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
2512
+ readonly call: ObservedCall;
2513
+ readonly clientId: string;
2514
+ readonly observedPeerConnections: Map<string, ObservedPeerConnection>;
2515
+ /** Per-client sink (from `ObserverConfig.createClientSink`), if any. */
2516
+ readonly sink?: ClientSampleSink;
2517
+ /** Ancestry base shared by all Observer-bus events originating at this client. */
2518
+ readonly eventScope: ObservedClientScope;
2519
+ readonly calculatedScore: CalculatedScore;
2520
+ readonly settings: Pick<ObservedClientSettings, 'closeClientIfIdleForMs'>;
2521
+ appData: AppData;
2522
+ attachments?: Record<string, unknown>;
2523
+ updated: number;
2524
+ acceptedSamples: number;
2525
+ closed: boolean;
2526
+ joinedAt?: number;
2527
+ leftAt?: number;
2528
+ closedAt?: number;
2529
+ lastSampleTimestamp?: number;
2530
+ operationSystem?: OperationSystem;
2531
+ engine?: Engine;
2532
+ platform?: Platform;
2533
+ browser?: Browser;
2534
+ mediaConstraints: string[];
2535
+ usingTURN: boolean;
2536
+ usingTCP: boolean;
2537
+ availableOutgoingBitrate: number;
2538
+ availableIncomingBitrate: number;
2539
+ deltaReceivedAudioBytes: number;
2540
+ deltaReceivedVideoBytes: number;
2541
+ deltaSentAudioBytes: number;
2542
+ deltaSentVideoBytes: number;
2543
+ deltaDataChannelBytesSent: number;
2544
+ deltaDataChannelBytesReceived: number;
2545
+ deltaDataChannelMessagesSent: number;
2546
+ deltaDataChannelMessagesReceived: number;
2547
+ deltaInboundPacketsLost: number;
2548
+ deltaInboundPacketsReceived: number;
2549
+ deltaOutboundPacketsSent: number;
2550
+ deltaTransportSentBytes: number;
2551
+ deltaTransportReceivedBytes: number;
2552
+ deltaRttLt50Measurements: number;
2553
+ deltaRttLt150Measurements: number;
2554
+ deltaRttLt300Measurements: number;
2555
+ deltaRttGtOrEq300Measurements: number;
2556
+ currentMaxRttInMs?: number;
2557
+ currentMinRttInMs?: number;
2558
+ currentAvgRttInMs?: number;
2559
+ sendingAudioBitrate: number;
2560
+ sendingVideoBitrate: number;
2561
+ receivingAudioBitrate: number;
2562
+ receivingVideoBitrate: number;
2563
+ numberOfInboundRtpStreams: number;
2564
+ numberOfInbundTracks: number;
2565
+ numberOfOutboundRtpStreams: number;
2566
+ numberOfOutboundTracks: number;
2567
+ numberOfDataChannels: number;
2568
+ deltaNumberOfIssues: number;
2569
+ totalScoreSum: number;
2570
+ numberOfScoreMeasurements: number;
2571
+ readonly mediaDevices: MediaDeviceInfo[];
2572
+ issues: ClientIssue[];
2573
+ private _injections;
2574
+ private closeTimer?;
2575
+ constructor(settings: ObservedClientSettings<AppData>, call: ObservedCall);
2576
+ get numberOfPeerConnections(): number;
2577
+ get score(): number | undefined;
2578
+ close(): void;
2579
+ accept(sample: ClientSample, context?: AcceptContext): void;
2580
+ injectMetaData(metaData: ClientMetaData): void;
2581
+ injectEvent(event: ClientEvent): void;
2582
+ injectIssue(issue: ClientIssue): void;
2583
+ injectExtensionStat(stat: ExtensionStat): void;
2584
+ injectAttachment(key: string, value: unknown): void;
2585
+ addMetadata(metadata: ClientMetaData): void;
2586
+ addIssue(issue: ClientIssue): void;
2587
+ addExtensionStats(stats: ExtensionStat): void;
2588
+ private _processClientEvent;
2589
+ private _updatePeerConnection;
2590
+ private _mergeInjections;
2591
+ /** Emit an Observer-bus event scoped to this client (or a peer connection under it). */
2592
+ private _notify;
2593
+ }
2594
+
2595
+ interface ScoreCalculator {
2596
+ update(): void;
2597
+ }
2598
+
2599
+ type RemoteTrackResolverFactory = (observedCall: ObservedCall) => RemoteTrackResolver;
2600
+ /**
2601
+ * Strategy functions that map a track to its publish/subscribe identity. Two tracks are linked
2602
+ * when a subscribed (inbound) track's **publisher id** equals a published (outbound) track's
2603
+ * **publisher id** — one publisher → many subscribers. The **subscriber id** is optional and is
2604
+ * only used to look an inbound track up via `getInboundTrackBySubscriberId`.
2605
+ *
2606
+ * The "publisher id" is whatever a strategy uses as the link key: mediasoup passes its producerId,
2607
+ * a p2p strategy the SSRC, a generic strategy a shared attachment value.
2608
+ */
2609
+ type RemoteTrackResolvers = {
2610
+ /** The publisher id a subscribed (inbound) track receives. Required — this is the link key. */
2611
+ resolveInboundTrackPublisherId: (inboundTrack: ObservedInboundTrack) => string | undefined;
2612
+ /** The publisher id a published (outbound) track represents. Required — this is the link key. */
2613
+ resolveOutboundTrackPublisherId: (outboundTrack: ObservedOutboundTrack) => string | undefined;
2614
+ /** Optional: the inbound track's own subscription id (enables `getInboundTrackBySubscriberId`). */
2615
+ resolveInboundTrackSubscriberId?: (inboundTrack: ObservedInboundTrack) => string | undefined;
2616
+ };
2617
+ /**
2618
+ * Generic, strategy-driven base resolver. It subscribes to the Observer bus (filtered to one call),
2619
+ * links subscribed↔published tracks by publisher id, and maintains the links directly on the tracks
2620
+ * (`inboundTrack.remoteOutboundTrack`, `outboundTrack.remoteInboundTracks`).
2621
+ *
2622
+ * Concrete strategies (mediasoup, p2p-by-SSRC, generic attachment) are just different
2623
+ * {@link RemoteTrackResolvers} passed to this class. Ids are re-resolved on demand rather than
2624
+ * cached, so the only state kept is the two lookup indexes that back the public getters.
2625
+ */
2626
+ declare class RemoteTrackResolver {
2627
+ readonly observedCall: ObservedCall;
2628
+ private readonly resolvers;
2629
+ private readonly _publisherIdToOutboundTrack;
2630
+ private readonly _subscriberIdToInboundTrack;
2631
+ constructor(observedCall: ObservedCall, resolvers: RemoteTrackResolvers);
2632
+ /** The published (outbound) track for a publisher id, if any. */
2633
+ getOutboundTrackByPublisherId(publisherId: string): ObservedOutboundTrack | undefined;
2634
+ /** The subscribed (inbound) track for a subscriber id, if the strategy resolves subscriber ids. */
2635
+ getInboundTrackBySubscriberId(subscriberId: string): ObservedInboundTrack | undefined;
2636
+ resolveRemoteOutboundTrack(inboundTrack: ObservedInboundTrack): ObservedOutboundTrack | undefined;
2637
+ resolveRemoteInboundTracks(outboundTrack: ObservedOutboundTrack): ObservedInboundTrack[] | undefined;
2638
+ private _addInboundTrack;
2639
+ private _removeInboundTrack;
2640
+ private _addOutboundTrack;
2641
+ private _removeOutboundTrack;
2642
+ }
2643
+
2644
+ interface Updater {
2645
+ readonly name: string;
2646
+ readonly description?: string;
2647
+ close(): void;
2648
+ }
2649
+
2650
+ interface Detector {
2651
+ readonly name: string;
2652
+ /** Called on every entity update; may raise issues via the entity it observes. */
2653
+ update(): void;
2654
+ }
2655
+
2656
+ declare class Detectors {
2657
+ private _detectors;
2658
+ constructor(...detectors: Detector[]);
2659
+ get listOfNames(): string[];
2660
+ add(detector: Detector): void;
2661
+ remove(detector: Detector): void;
2662
+ update(): void;
2663
+ clear(): void;
2664
+ }
2665
+
2666
+ type ObservedCallUpdateConfig = {
2667
+ updatePolicy?: 'update-on-any-client-updated' | 'update-when-all-client-updated' | 'none';
2668
+ };
2669
+ type ObservedCallSettings<AppData extends Record<string, unknown> = Record<string, unknown>> = ObservedCallUpdateConfig & {
2670
+ callId: string;
2671
+ appData?: AppData;
2672
+ closeCallIfEmptyForMs?: number;
2673
+ };
2674
+ type ObservedCallEvents = {
2675
+ update: [];
2676
+ newclient: [ObservedClient];
2677
+ empty: [];
2678
+ 'not-empty': [];
2679
+ close: [];
2680
+ };
2681
+ declare interface ObservedCall {
2682
+ on<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;
2683
+ off<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;
2684
+ once<U extends keyof ObservedCallEvents>(event: U, listener: (...args: ObservedCallEvents[U]) => void): this;
2685
+ emit<U extends keyof ObservedCallEvents>(event: U, ...args: ObservedCallEvents[U]): boolean;
2686
+ }
2687
+ declare class ObservedCall<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
2688
+ readonly observer: Observer;
2689
+ updater?: Updater;
2690
+ scoreCalculator: ScoreCalculator;
2691
+ readonly detectors: Detectors;
2692
+ readonly callId: string;
2693
+ readonly observedClients: Map<string, ObservedClient<Record<string, unknown>>>;
2694
+ readonly clientsUsedTurn: Set<string>;
2695
+ readonly calculatedScore: CalculatedScore;
2696
+ remoteTrackResolver?: RemoteTrackResolver;
2697
+ totalAddedClients: number;
2698
+ totalRemovedClients: number;
2699
+ numberOfIssues: number;
2700
+ numberOfPeerConnections: number;
2701
+ numberOfInboundRtpStreams: number;
2702
+ numberOfOutboundRtpStreams: number;
2703
+ numberOfDataChannels: number;
2704
+ maxNumberOfClients: number;
2705
+ deltaNumberOfIssues: number;
2706
+ appData: AppData;
2707
+ closed: boolean;
2708
+ startedAt?: number;
2709
+ endedAt?: number;
2710
+ closedAt?: number;
2711
+ readonly settings: Pick<ObservedCallSettings, 'closeCallIfEmptyForMs'>;
2712
+ /** Ancestry base shared by all Observer-bus events originating at this call. */
2713
+ readonly eventScope: ObservedCallScope;
2714
+ private closeTimer?;
2715
+ constructor(settings: ObservedCallSettings<AppData>, observer: Observer);
2716
+ get numberOfClients(): number;
2717
+ get score(): number | undefined;
2718
+ /** Raise a call-level (server-side) issue; surfaced on the Observer bus as `call-issue`. */
2719
+ addIssue(issue: ClientIssue): void;
2720
+ close(): void;
2721
+ getObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(clientId: string): ObservedClient<ClientAppData> | undefined;
2722
+ createObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedClientSettings<ClientAppData>): ObservedClient<ClientAppData> | undefined;
2723
+ getOrCreateObservedClient<ClientAppData extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedClientSettings<ClientAppData>): ObservedClient<ClientAppData> | undefined;
2724
+ update(context?: AcceptContext): void;
2725
+ private _onClientUpdate;
2726
+ private _clientJoined;
2727
+ private _clientLeft;
2728
+ /** Emit an Observer-bus event scoped to this call. */
2729
+ private _notify;
2730
+ }
2731
+
2732
+ type Middleware<T> = (input: T, next: (nextInput: T) => void) => void;
2733
+ interface Processor<T> {
2734
+ finalCallback?: Callback<T>;
2735
+ process(value: T): void;
2736
+ addMiddleware(...middlewares: Middleware<T>[]): Processor<T>;
2737
+ removeMiddleware(...middlewares: Middleware<T>[]): Processor<T>;
2738
+ }
2739
+ type Callback<T> = (input: T) => void;
2740
+ declare class MiddlewareProcessor<T> implements Processor<T> {
2741
+ private stack;
2742
+ finalCallback?: Callback<T>;
2743
+ addMiddleware(...middlewares: Middleware<T>[]): Processor<T>;
2744
+ removeMiddleware(...middlewares: Middleware<T>[]): Processor<T>;
2745
+ process(value: T): void;
2746
+ }
2747
+
2748
+ type SampleRejectedReason = 'observer-closed' | 'missing-callId' | 'missing-clientId';
2749
+
2750
+ /**
2751
+ * Optional, free-form context supplied to `accept()`. A single context object is
2752
+ * threaded down the accept chain (Observer -> Client -> PeerConnection) and is
2753
+ * merged into the `appData` of entities created during the accept pass.
2754
+ */
2755
+ type AcceptContext = Record<string, unknown>;
2756
+ /** The payload threaded through `accept()` middlewares: the sample and its optional context. */
2757
+ type AcceptMiddlewarePayload = {
2758
+ sample: ClientSample;
2759
+ context?: AcceptContext;
2760
+ };
2761
+ /**
2762
+ * A global middleware run on every sample passed to `observer.accept()`, in registration order,
2763
+ * **before** the sample is dispatched to any call/client. It may inspect or mutate the sample
2764
+ * (e.g. set/normalize `callId`/`clientId`, enrich, redact) or the context, then call
2765
+ * `next(payload)` to continue the chain. Not calling `next` **drops** the sample.
2766
+ */
2767
+ type AcceptMiddleware = Middleware<AcceptMiddlewarePayload>;
2768
+ type ObserverUpdateConfig = {
2769
+ updatePolicy?: 'update-on-any-call-updated' | 'update-when-all-call-updated' | 'none';
2770
+ };
2771
+ /** Produces the initial `appData` for a call created without an explicit `appData`. */
2772
+ type CallAppDataFactory = (params: {
2773
+ callId: string;
2774
+ observer: Observer;
2775
+ }) => Record<string, unknown>;
2776
+ /** Produces the initial `appData` for a client created without an explicit `appData`. */
2777
+ type ClientAppDataFactory = (params: {
2778
+ clientId: string;
2779
+ observedCall: ObservedCall;
2780
+ }) => Record<string, unknown>;
2781
+ type ObserverConfig<AppData extends Record<string, unknown> = Record<string, unknown>> = ObserverUpdateConfig & {
2782
+ defaultCallUpdatePolicy?: ObservedCallSettings['updatePolicy'];
2783
+ appData?: AppData;
2784
+ closeClientIfIdleForMs?: number;
2785
+ closeCallIfEmptyForMs?: number;
2786
+ /**
2787
+ * Optional factory invoked when a call is created without an explicit `appData`
2788
+ * (e.g. lazily by `accept()`), so apps can enrich appData without pre-creating the
2789
+ * entity. `appData` is application-owned; it is never modified by the `accept()` context.
2790
+ */
2791
+ createCallAppData?: CallAppDataFactory;
2792
+ /** Same as `createCallAppData`, for clients. Receives the (already-created) parent call. */
2793
+ createClientAppData?: ClientAppDataFactory;
2794
+ /**
2795
+ * Optional factory invoked when a client is created, producing a per-client sink that
2796
+ * receives every sample the client accepts (or `undefined` for no sink). The destination
2797
+ * can be derived from `callId` / `clientId`.
2798
+ */
2799
+ createClientSink?: ClientSampleSinkFactory;
2800
+ /**
2801
+ * Optional factory invoked when a call is created, producing the call's `RemoteTrackResolver`
2802
+ * (or `undefined` for none). Use the built-ins
2803
+ * (`createDefaultMediasoupRemoteTrackResolverFactory()` / `createP2pRemoteTrackResolverFactory()`)
2804
+ * or build a `RemoteTrackResolver` with custom publisher/subscriber id resolvers.
2805
+ */
2806
+ createTrackResolver?: RemoteTrackResolverFactory;
2807
+ };
2808
+ declare interface Observer {
2809
+ on<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
2810
+ off<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
2811
+ once<U extends keyof ObserverEvents>(event: U, listener: (...args: ObserverEvents[U]) => void): this;
2812
+ emit<U extends keyof ObserverEvents>(event: U, ...args: ObserverEvents[U]): boolean;
2813
+ }
2814
+ declare class Observer<AppData extends Record<string, unknown> = Record<string, unknown>> extends EventEmitter {
2815
+ readonly config: ObserverConfig<AppData>;
2816
+ readonly observedTURN: ObservedTURN;
2817
+ readonly observedCalls: Map<string, ObservedCall<Record<string, unknown>>>;
2818
+ readonly observedMediasoupRouters: Map<string, ObservedMediasoupRouter<Record<string, unknown>>>;
2819
+ updater?: Updater;
2820
+ /** Ancestry base shared by all Observer-bus events originating at the observer. */
2821
+ readonly eventScope: ObserverEventBase;
2822
+ closed: boolean;
2823
+ totalAddedCall: number;
2824
+ totalRemovedCall: number;
2825
+ numberOfClientsUsingTurn: number;
2826
+ numberOfClients: number;
2827
+ numberOfInboundRtpStreams: number;
2828
+ numberOfOutboundRtpStreams: number;
2829
+ numberOfDataChannels: number;
2830
+ numberOfPeerConnections: number;
2831
+ /** Global, pre-dispatch middleware chain run on every accepted sample. */
2832
+ readonly acceptMiddlewares: MiddlewareProcessor<AcceptMiddlewarePayload>;
2833
+ constructor(config?: ObserverConfig<AppData>);
2834
+ get numberOfCalls(): number;
2835
+ get appData(): AppData | undefined;
2836
+ getObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(callId: string): ObservedCall<T> | undefined;
2837
+ createObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedCallSettings<T>): ObservedCall<T> | undefined;
2838
+ getOrCreateObservedCall<T extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedCallSettings<T>): ObservedCall<T> | undefined;
2839
+ createObservedMediasoupRouter<T extends Record<string, unknown> = Record<string, unknown>>(settings: ObservedMediasoupRouterSettings<T>): ObservedMediasoupRouter<Record<string, unknown>> | undefined;
2840
+ close(): void;
2841
+ accept(sample: ClientSample, context?: AcceptContext): void;
2842
+ update(): void;
2843
+ /** Emit an Observer-bus event. */
2844
+ private _notify;
2845
+ }
2846
+
2847
+ declare enum ClientEventTypes {
2848
+ CLIENT_JOINED = "CLIENT_JOINED",
2849
+ CLIENT_LEFT = "CLIENT_LEFT",
2850
+ PEER_CONNECTION_OPENED = "PEER_CONNECTION_OPENED",
2851
+ PEER_CONNECTION_CLOSED = "PEER_CONNECTION_CLOSED",
2852
+ MEDIA_TRACK_ADDED = "MEDIA_TRACK_ADDED",
2853
+ MEDIA_TRACK_REMOVED = "MEDIA_TRACK_REMOVED",
2854
+ MEDIA_TRACK_RESUMED = "MEDIA_TRACK_RESUMED",
2855
+ MEDIA_TRACK_MUTED = "MEDIA_TRACK_MUTED",
2856
+ MEDIA_TRACK_UNMUTED = "MEDIA_TRACK_UNMUTED",
2857
+ ICE_GATHERING_STATE_CHANGED = "ICE_GATHERING_STATE_CHANGED",
2858
+ PEER_CONNECTION_STATE_CHANGED = "PEER_CONNECTION_STATE_CHANGED",
2859
+ ICE_CONNECTION_STATE_CHANGED = "ICE_CONNECTION_STATE_CHANGED",
2860
+ DATA_CHANNEL_OPEN = "DATA_CHANNEL_OPEN",
2861
+ DATA_CHANNEL_CLOSED = "DATA_CHANNEL_CLOSED",
2862
+ DATA_CHANNEL_ERROR = "DATA_CHANNEL_ERROR",
2863
+ NEGOTIATION_NEEDED = "NEGOTIATION_NEEDED",
2864
+ SIGNALING_STATE_CHANGE = "SIGNALING_STATE_CHANGE",
2865
+ ICE_CANDIDATE = "ICE_CANDIDATE",
2866
+ ICE_CANDIDATE_ERROR = "ICE_CANDIDATE_ERROR",
2867
+ PRODUCER_ADDED = "PRODUCER_ADDED",
2868
+ PRODUCER_REMOVED = "PRODUCER_REMOVED",
2869
+ PRODUCER_PAUSED = "PRODUCER_PAUSED",
2870
+ PRODUCER_RESUMED = "PRODUCER_RESUMED",
2871
+ CONSUMER_ADDED = "CONSUMER_ADDED",
2872
+ CONSUMER_REMOVED = "CONSUMER_REMOVED",
2873
+ CONSUMER_PAUSED = "CONSUMER_PAUSED",
2874
+ CONSUMER_RESUMED = "CONSUMER_RESUMED",
2875
+ DATA_PRODUCER_CREATED = "DATA_PRODUCER_CREATED",
2876
+ DATA_PRODUCER_CLOSED = "DATA_PRODUCER_CLOSED",
2877
+ DATA_CONSUMER_CREATED = "DATA_CONSUMER_CREATED",
2878
+ DATA_CONSUMER_CLOSED = "DATA_CONSUMER_CLOSED"
2879
+ }
2880
+
2881
+ interface Logger {
2882
+ trace(...args: any[]): void;
2883
+ debug(...args: any[]): void;
2884
+ info(...args: any[]): void;
2885
+ warn(...args: any[]): void;
2886
+ error(...args: any[]): void;
2887
+ }
2888
+ interface ObserverLogger {
2889
+ trace(module: string, ...args: any[]): void;
2890
+ debug(module: string, ...args: any[]): void;
2891
+ info(module: string, ...args: any[]): void;
2892
+ warn(module: string, ...args: any[]): void;
2893
+ error(module: string, ...args: any[]): void;
2894
+ }
2895
+ declare function createLogger(moduleName: string): Logger;
2896
+ declare function setObserverLogger(logger: ObserverLogger): void;
2897
+
2898
+ type JsonlFileSinkOptions = {
2899
+ /** Absolute or relative file path to append JSONL lines to. */
2900
+ path: string;
2901
+ /** Optional custom serializer; defaults to `JSON.stringify`. */
2902
+ serializeSample?: (sample: ClientSample) => string;
2903
+ };
2904
+ /**
2905
+ * A sink that serializes each sample to a JSON line and appends it to a file. It wraps an
2906
+ * `fs.WriteStream` and re-emits its lifecycle events, so `close` fires once the file is flushed
2907
+ * and its descriptor is closed (file ready) and `error` surfaces file errors.
2908
+ */
2909
+ declare class JsonlFileSink extends ClientSampleSink {
2910
+ /** The file this sink writes to. Read it (e.g. in a `close` handler) to upload/move the file. */
2911
+ readonly path: string;
2912
+ private readonly _stream;
2913
+ private readonly _serializeSample;
2914
+ constructor(options: JsonlFileSinkOptions);
2915
+ write(sample: ClientSample): boolean;
2916
+ end(): void;
2917
+ }
2918
+ /** Build a JSONL file sink for a single path. */
2919
+ declare function createJsonlFileSink(options: JsonlFileSinkOptions): ClientSampleSink;
2920
+ type JsonlFileSinkFactoryOptions = {
2921
+ /** Directory the per-client files are written into (must exists). */
2922
+ directory: string;
2923
+ /** Builds the file name from the call/client ids. Defaults to `${callId}__${clientId}.jsonl`. */
2924
+ getFileName?: (params: {
2925
+ callId: string;
2926
+ clientId: string;
2927
+ }) => string;
2928
+ /** Optional custom serializer; defaults to `JSON.stringify`. */
2929
+ serializeSample?: (sample: ClientSample) => string;
2930
+ };
2931
+ /**
2932
+ * Convenience factory that writes one JSONL file per client, with the path derived from
2933
+ * `callId` / `clientId`. Plug into `ObserverConfig.createClientSink`.
2934
+ */
2935
+ declare function createJsonlFileSinkFactory(options: JsonlFileSinkFactoryOptions): ClientSampleSinkFactory;
2936
+
2937
+ /**
2938
+ * A `ClientSampleSink` that collects the accepted sample objects into an array. Useful for
2939
+ * tests and offline replay. Emits `close` on `end()`.
2940
+ */
2941
+ declare class InMemorySink extends ClientSampleSink {
2942
+ readonly samples: ClientSample[];
2943
+ constructor(samples?: ClientSample[]);
2944
+ write(sample: ClientSample): boolean;
2945
+ end(): void;
2946
+ }
2947
+ declare function createInMemorySink(samples?: ClientSample[]): InMemorySink;
2948
+
2949
+ declare function createDefaultMediasoupRemoteTrackResolverFactory(): RemoteTrackResolverFactory;
2950
+ declare function createP2pRemoteTrackResolverFactory(): RemoteTrackResolverFactory;
2951
+
2952
+ export { type AcceptContext, type AcceptMiddleware, type AcceptMiddlewarePayload, type CallAppDataFactory, type ClientAppDataFactory, type ClientEvent, ClientEventTypes, type ClientIssue, type ClientMetaData, ClientMetaTypes, type ClientSample, ClientSampleSink, type ClientSampleSinkEvents, type ClientSampleSinkFactory, type Detector, Detectors, InMemorySink, JsonlFileSink, type JsonlFileSinkFactoryOptions, type JsonlFileSinkOptions, type Logger, type MediasoupConsumerSample, type MediasoupConsumerSampleEvent, type MediasoupDataConsumerSample, type MediasoupDataProducerSample, type MediasoupDirectTransportSample, type MediasoupDirectTransportSampleEventMap, type MediasoupPipeTransportSample, type MediasoupPipeTransportSampleEventMap, type MediasoupPlainTransportSample, type MediasoupPlainTransportSampleEventMap, type MediasoupProducerSample, type MediasoupProducerSampleEvent, type MediasoupRouterSample, type MediasoupTransportSample, type MediasoupWebRtcTransportSample, type MediasoupWebRtcTransportSampleEventMap, type Middleware, ObservedCall, type ObservedCallScope, ObservedCertificate, ObservedClient, type ObservedClientScope, ObservedCodec, ObservedDataChannel, ObservedIceCandidate, ObservedIceCandidatePair, ObservedIceTransport, ObservedInboundRtp, ObservedInboundTrack, ObservedMediaPlayout, ObservedMediaSource, ObservedMediasoupRouter, type ObservedMediasoupRouterEvents, type ObservedMediasoupRouterScope, type ObservedMediasoupRouterSettings, ObservedOutboundRtp, ObservedOutboundTrack, ObservedPeerConnection, type ObservedPeerConnectionScope, ObservedPeerConnectionTransport, ObservedRemoteInboundRtp, ObservedRemoteOutboundRtp, Observer, type ObserverEventBase, type ObserverEvents, type ObserverLogger, RemoteTrackResolver, type RemoteTrackResolverFactory, type RemoteTrackResolvers, type SampleRejectedReason, type ScoreCalculator, createDefaultMediasoupRemoteTrackResolverFactory, createInMemorySink, createJsonlFileSink, createJsonlFileSinkFactory, createLogger, createP2pRemoteTrackResolverFactory, setObserverLogger };