@vpalmisano/webrtcperf 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +296 -0
- package/app.min.js +2 -0
- package/build/src/app.d.ts +6 -0
- package/build/src/app.js +207 -0
- package/build/src/app.js.map +1 -0
- package/build/src/config.d.ts +104 -0
- package/build/src/config.js +880 -0
- package/build/src/config.js.map +1 -0
- package/build/src/generate-config-docs.d.ts +1 -0
- package/build/src/generate-config-docs.js +41 -0
- package/build/src/generate-config-docs.js.map +1 -0
- package/build/src/index.d.ts +9 -0
- package/build/src/index.js +26 -0
- package/build/src/index.js.map +1 -0
- package/build/src/media.d.ts +33 -0
- package/build/src/media.js +113 -0
- package/build/src/media.js.map +1 -0
- package/build/src/rtcstats.d.ts +302 -0
- package/build/src/rtcstats.js +418 -0
- package/build/src/rtcstats.js.map +1 -0
- package/build/src/server.d.ts +173 -0
- package/build/src/server.js +639 -0
- package/build/src/server.js.map +1 -0
- package/build/src/session.d.ts +277 -0
- package/build/src/session.js +1552 -0
- package/build/src/session.js.map +1 -0
- package/build/src/stats.d.ts +243 -0
- package/build/src/stats.js +1383 -0
- package/build/src/stats.js.map +1 -0
- package/build/src/utils.d.ts +249 -0
- package/build/src/utils.js +1220 -0
- package/build/src/utils.js.map +1 -0
- package/build/src/visqol.d.ts +6 -0
- package/build/src/visqol.js +61 -0
- package/build/src/visqol.js.map +1 -0
- package/build/src/vmaf.d.ts +83 -0
- package/build/src/vmaf.js +624 -0
- package/build/src/vmaf.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +129 -0
- package/src/app.ts +241 -0
- package/src/config.ts +852 -0
- package/src/generate-config-docs.ts +47 -0
- package/src/index.ts +9 -0
- package/src/media.ts +151 -0
- package/src/rtcstats.ts +507 -0
- package/src/server.ts +645 -0
- package/src/session.ts +1908 -0
- package/src/stats.ts +1668 -0
- package/src/utils.ts +1295 -0
- package/src/visqol.ts +62 -0
- package/src/vmaf.ts +771 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RtcStatsMetricNames = exports.PageStatsNames = void 0;
|
|
7
|
+
exports.rtcStatKey = rtcStatKey;
|
|
8
|
+
exports.parseRtStatKey = parseRtStatKey;
|
|
9
|
+
exports.updateRtcStats = updateRtcStats;
|
|
10
|
+
const assert_1 = __importDefault(require("assert"));
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
/**
|
|
13
|
+
* Page stats metric names.
|
|
14
|
+
*/
|
|
15
|
+
var PageStatsNames;
|
|
16
|
+
(function (PageStatsNames) {
|
|
17
|
+
/** The browser processes CPU usage (per page). */
|
|
18
|
+
PageStatsNames["cpu"] = "cpu";
|
|
19
|
+
/** The browser processes memory usage (per page). */
|
|
20
|
+
PageStatsNames["memory"] = "memory";
|
|
21
|
+
/** The tool nodejs CPU usage. */
|
|
22
|
+
PageStatsNames["nodeCpu"] = "nodeCpu";
|
|
23
|
+
/** The tool nodejs memory usage. */
|
|
24
|
+
PageStatsNames["nodeMemory"] = "nodeMemory";
|
|
25
|
+
/** The system total CPU usage. */
|
|
26
|
+
PageStatsNames["usedCpu"] = "usedCpu";
|
|
27
|
+
/** The system total memory usage. */
|
|
28
|
+
PageStatsNames["usedMemory"] = "usedMemory";
|
|
29
|
+
/** The system total GPU usage. */
|
|
30
|
+
PageStatsNames["usedGpu"] = "usedGpu";
|
|
31
|
+
/** The page CPU usage. */
|
|
32
|
+
PageStatsNames["pageCpu"] = "pageCpu";
|
|
33
|
+
/** The page memory usage. */
|
|
34
|
+
PageStatsNames["pageMemory"] = "pageMemory";
|
|
35
|
+
/** The opened pages count. */
|
|
36
|
+
PageStatsNames["pages"] = "pages";
|
|
37
|
+
/** The current opened PeerConnections. */
|
|
38
|
+
PageStatsNames["peerConnections"] = "peerConnections";
|
|
39
|
+
/** The maximum PeerConnections connected duration. */
|
|
40
|
+
PageStatsNames["peerConnectionConnectionTime"] = "peerConnectionConnectionTime";
|
|
41
|
+
/** The maximum PeerConnections disconnection duration. */
|
|
42
|
+
PageStatsNames["peerConnectionDisconnectionTime"] = "peerConnectionDisconnectionTime";
|
|
43
|
+
/** The total created PeerConnections. */
|
|
44
|
+
PageStatsNames["peerConnectionsCreated"] = "peerConnectionsCreated";
|
|
45
|
+
/** The total connected PeerConnections. */
|
|
46
|
+
PageStatsNames["peerConnectionsConnected"] = "peerConnectionsConnected";
|
|
47
|
+
/** The total closed PeerConnections. */
|
|
48
|
+
PageStatsNames["peerConnectionsClosed"] = "peerConnectionsClosed";
|
|
49
|
+
/** The total disconnected PeerConnections. */
|
|
50
|
+
PageStatsNames["peerConnectionsDisconnected"] = "peerConnectionsDisconnected";
|
|
51
|
+
/** The total failed PeerConnections. */
|
|
52
|
+
PageStatsNames["peerConnectionsFailed"] = "peerConnectionsFailed";
|
|
53
|
+
/** The total delay from PeerConnections creation to connection. */
|
|
54
|
+
PageStatsNames["peerConnectionsDelay"] = "peerConnectionsDelay";
|
|
55
|
+
/** The page errors count. */
|
|
56
|
+
PageStatsNames["errors"] = "errors";
|
|
57
|
+
/** The page warnings count. */
|
|
58
|
+
PageStatsNames["warnings"] = "warnings";
|
|
59
|
+
/** The page total HTTP sent bytes. */
|
|
60
|
+
PageStatsNames["httpSentBytes"] = "httpSentBytes";
|
|
61
|
+
/** The page total HTTP received bytes. */
|
|
62
|
+
PageStatsNames["httpRecvBytes"] = "httpRecvBytes";
|
|
63
|
+
/** The page HTTP receive latency. */
|
|
64
|
+
PageStatsNames["httpRecvLatency"] = "httpRecvLatency";
|
|
65
|
+
/** The page total WebSocket sent bytes. */
|
|
66
|
+
PageStatsNames["wsSentBytes"] = "wsSentBytes";
|
|
67
|
+
/** The page total WebSocket received bytes. */
|
|
68
|
+
PageStatsNames["wsRecvBytes"] = "wsRecvBytes";
|
|
69
|
+
/** The page WebSocket receive latency. */
|
|
70
|
+
PageStatsNames["wsRecvLatency"] = "wsRecvLatency";
|
|
71
|
+
/** The audio end to end total delay. */
|
|
72
|
+
PageStatsNames["audioEndToEndDelay"] = "audioEndToEndDelay";
|
|
73
|
+
/** The audio start frame delay. */
|
|
74
|
+
PageStatsNames["audioStartFrameDelay"] = "audioStartFrameDelay";
|
|
75
|
+
/** The video end to end total delay. */
|
|
76
|
+
PageStatsNames["videoEndToEndDelay"] = "videoEndToEndDelay";
|
|
77
|
+
/** The video start frame delay. */
|
|
78
|
+
PageStatsNames["videoStartFrameDelay"] = "videoStartFrameDelay";
|
|
79
|
+
/** The screen end to end total delay. */
|
|
80
|
+
PageStatsNames["screenEndToEndDelay"] = "screenEndToEndDelay";
|
|
81
|
+
/** The screen start frame delay. */
|
|
82
|
+
PageStatsNames["screenStartFrameDelay"] = "screenStartFrameDelay";
|
|
83
|
+
PageStatsNames["cpuPressure"] = "cpuPressure";
|
|
84
|
+
PageStatsNames["videoWidth"] = "videoWidth";
|
|
85
|
+
PageStatsNames["videoHeight"] = "videoHeight";
|
|
86
|
+
PageStatsNames["videoBufferedTime"] = "videoBufferedTime";
|
|
87
|
+
PageStatsNames["videoPlayingTime"] = "videoPlayingTime";
|
|
88
|
+
PageStatsNames["videoBufferingTime"] = "videoBufferingTime";
|
|
89
|
+
PageStatsNames["videoBufferingEvents"] = "videoBufferingEvents";
|
|
90
|
+
/** The throttle upload rate limitation. */
|
|
91
|
+
PageStatsNames["throttleUpRate"] = "throttleUpRate";
|
|
92
|
+
/** The throttle upload delay. */
|
|
93
|
+
PageStatsNames["throttleUpDelay"] = "throttleUpDelay";
|
|
94
|
+
/** The throttle upload packet loss. */
|
|
95
|
+
PageStatsNames["throttleUpLoss"] = "throttleUpLoss";
|
|
96
|
+
/** The throttle upload packet queue. */
|
|
97
|
+
PageStatsNames["throttleUpQueue"] = "throttleUpQueue";
|
|
98
|
+
/** The throttle download rate limitation. */
|
|
99
|
+
PageStatsNames["throttleDownRate"] = "throttleDownRate";
|
|
100
|
+
/** The throttle download delay. */
|
|
101
|
+
PageStatsNames["throttleDownDelay"] = "throttleDownDelay";
|
|
102
|
+
/** The throttle download packet loss. */
|
|
103
|
+
PageStatsNames["throttleDownLoss"] = "throttleDownLoss";
|
|
104
|
+
/** The throttle download packet queue. */
|
|
105
|
+
PageStatsNames["throttleDownQueue"] = "throttleDownQueue";
|
|
106
|
+
})(PageStatsNames || (exports.PageStatsNames = PageStatsNames = {}));
|
|
107
|
+
/**
|
|
108
|
+
* RTC metrics collected by the page helper scripts and related to each
|
|
109
|
+
* track object created by PeerConnections.
|
|
110
|
+
*/
|
|
111
|
+
var RtcStatsMetricNames;
|
|
112
|
+
(function (RtcStatsMetricNames) {
|
|
113
|
+
/** The sent audio codec. */
|
|
114
|
+
RtcStatsMetricNames["audioSentCodec"] = "audioSentCodec";
|
|
115
|
+
/** The total sent audio bytes. */
|
|
116
|
+
RtcStatsMetricNames["audioSentBytes"] = "audioSentBytes";
|
|
117
|
+
/** The sent audio packets. */
|
|
118
|
+
RtcStatsMetricNames["audioSentPackets"] = "audioSentPackets";
|
|
119
|
+
/** The sent audio bitrates. */
|
|
120
|
+
RtcStatsMetricNames["audioSentBitrates"] = "audioSentBitrates";
|
|
121
|
+
/** The send audio lost packets. */
|
|
122
|
+
RtcStatsMetricNames["audioSentPacketsLost"] = "audioSentPacketsLost";
|
|
123
|
+
//'audioSentPacketsLostCount',
|
|
124
|
+
/** The total audio NACK received by the sender. */
|
|
125
|
+
RtcStatsMetricNames["audioSentNackCountRecv"] = "audioSentNackCountRecv";
|
|
126
|
+
/** The sent audio round trip time. */
|
|
127
|
+
RtcStatsMetricNames["audioSentRoundTripTime"] = "audioSentRoundTripTime";
|
|
128
|
+
/** The sent audio jitter. */
|
|
129
|
+
RtcStatsMetricNames["audioSentJitter"] = "audioSentJitter";
|
|
130
|
+
/** The audio RTC transport round trip time. */
|
|
131
|
+
RtcStatsMetricNames["audioSentTransportRoundTripTime"] = "audioSentTransportRoundTripTime";
|
|
132
|
+
/** The sent audio encoding max bitrate. */
|
|
133
|
+
RtcStatsMetricNames["audioSentMaxBitrate"] = "audioSentMaxBitrate";
|
|
134
|
+
/** The sent audio RTX packets. */
|
|
135
|
+
RtcStatsMetricNames["audioSentRetransmittedPackets"] = "audioSentRetransmittedPackets";
|
|
136
|
+
/** The sent video codec. */
|
|
137
|
+
RtcStatsMetricNames["videoSentCodec"] = "videoSentCodec";
|
|
138
|
+
/** The FIR requests received by the video sender. */
|
|
139
|
+
RtcStatsMetricNames["videoFirCountReceived"] = "videoFirCountReceived";
|
|
140
|
+
/** The PLI requests received by the video sender. */
|
|
141
|
+
RtcStatsMetricNames["videoPliCountReceived"] = "videoPliCountReceived";
|
|
142
|
+
/** The sent video encode latency. */
|
|
143
|
+
RtcStatsMetricNames["videoEncodeLatency"] = "videoEncodeLatency";
|
|
144
|
+
/** The sent video latency. */
|
|
145
|
+
RtcStatsMetricNames["videoSentLatency"] = "videoSentLatency";
|
|
146
|
+
/** The sent video bandwidth quality limitations. */
|
|
147
|
+
RtcStatsMetricNames["videoQualityLimitationBandwidth"] = "videoQualityLimitationBandwidth";
|
|
148
|
+
/** The sent video cpu quality limitations. */
|
|
149
|
+
RtcStatsMetricNames["videoQualityLimitationCpu"] = "videoQualityLimitationCpu";
|
|
150
|
+
/** The sent video total resolution changes for quality limitations. */
|
|
151
|
+
RtcStatsMetricNames["videoQualityLimitationResolutionChanges"] = "videoQualityLimitationResolutionChanges";
|
|
152
|
+
/** The sent video Simulcast active spatial layers. */
|
|
153
|
+
RtcStatsMetricNames["videoSentActiveEncodings"] = "videoSentActiveEncodings";
|
|
154
|
+
/** The sent video bitrates. */
|
|
155
|
+
RtcStatsMetricNames["videoSentBitrates"] = "videoSentBitrates";
|
|
156
|
+
/** The sent video bytes. */
|
|
157
|
+
RtcStatsMetricNames["videoSentBytes"] = "videoSentBytes";
|
|
158
|
+
/** The sent video packets. */
|
|
159
|
+
RtcStatsMetricNames["videoSentPackets"] = "videoSentPackets";
|
|
160
|
+
/** The sent video frames. */
|
|
161
|
+
RtcStatsMetricNames["videoSentFrames"] = "videoSentFrames";
|
|
162
|
+
/** The sent video framerate. */
|
|
163
|
+
RtcStatsMetricNames["videoSentFps"] = "videoSentFps";
|
|
164
|
+
/** The sent video width. */
|
|
165
|
+
RtcStatsMetricNames["videoSentWidth"] = "videoSentWidth";
|
|
166
|
+
/** The sent video height. */
|
|
167
|
+
RtcStatsMetricNames["videoSentHeight"] = "videoSentHeight";
|
|
168
|
+
/** The sent video encoding max bitrate. */
|
|
169
|
+
RtcStatsMetricNames["videoSentMaxBitrate"] = "videoSentMaxBitrate";
|
|
170
|
+
//'videoSentPackets',
|
|
171
|
+
/** The sent video lost packets. */
|
|
172
|
+
RtcStatsMetricNames["videoSentPacketsLost"] = "videoSentPacketsLost";
|
|
173
|
+
//'videoSentPacketsLostCount',
|
|
174
|
+
/** The NACK count received by video sender. */
|
|
175
|
+
RtcStatsMetricNames["videoSentNackCountRecv"] = "videoSentNackCountRecv";
|
|
176
|
+
/** The sent video round trip time. */
|
|
177
|
+
RtcStatsMetricNames["videoSentRoundTripTime"] = "videoSentRoundTripTime";
|
|
178
|
+
/** The transport send video round trip time. */
|
|
179
|
+
RtcStatsMetricNames["videoSentTransportRoundTripTime"] = "videoSentTransportRoundTripTime";
|
|
180
|
+
/** The video sent jitter. */
|
|
181
|
+
RtcStatsMetricNames["videoSentJitter"] = "videoSentJitter";
|
|
182
|
+
/** The sent video RTX packets. */
|
|
183
|
+
RtcStatsMetricNames["videoSentRetransmittedPackets"] = "videoSentRetransmittedPackets";
|
|
184
|
+
/** The sent screen codec. */
|
|
185
|
+
RtcStatsMetricNames["screenSentCodec"] = "screenSentCodec";
|
|
186
|
+
/** The received FIR from screen sender. */
|
|
187
|
+
RtcStatsMetricNames["screenFirCountReceived"] = "screenFirCountReceived";
|
|
188
|
+
/** The received PLI from screen sender. */
|
|
189
|
+
RtcStatsMetricNames["screenPliCountReceived"] = "screenPliCountReceived";
|
|
190
|
+
/** The sent screen encode latency. */
|
|
191
|
+
RtcStatsMetricNames["screenEncodeLatency"] = "screenEncodeLatency";
|
|
192
|
+
/** The sent screen latency. */
|
|
193
|
+
RtcStatsMetricNames["screenSentLatency"] = "screenSentLatency";
|
|
194
|
+
/** The sent screen bandwidth quality limitation. */
|
|
195
|
+
RtcStatsMetricNames["screenQualityLimitationBandwidth"] = "screenQualityLimitationBandwidth";
|
|
196
|
+
/** The sent screen cpu quality limitation. */
|
|
197
|
+
RtcStatsMetricNames["screenQualityLimitationCpu"] = "screenQualityLimitationCpu";
|
|
198
|
+
/** The sent screen resolustion changes caused by quality limitation. */
|
|
199
|
+
RtcStatsMetricNames["screenQualityLimitationResolutionChanges"] = "screenQualityLimitationResolutionChanges";
|
|
200
|
+
/** The sent screen active Simulcast spatial layers. */
|
|
201
|
+
RtcStatsMetricNames["screenSentActiveEncodings"] = "screenSentActiveEncodings";
|
|
202
|
+
/** The sent screen bitrates. */
|
|
203
|
+
RtcStatsMetricNames["screenSentBitrates"] = "screenSentBitrates";
|
|
204
|
+
/** The sent screen bytes. */
|
|
205
|
+
RtcStatsMetricNames["screenSentBytes"] = "screenSentBytes";
|
|
206
|
+
/** The sent screen packets. */
|
|
207
|
+
RtcStatsMetricNames["screenSentPackets"] = "screenSentPackets";
|
|
208
|
+
/** The sent screen frames. */
|
|
209
|
+
RtcStatsMetricNames["screenSentFrames"] = "screenSentFrames";
|
|
210
|
+
/** The sent screen framerate. */
|
|
211
|
+
RtcStatsMetricNames["screenSentFps"] = "screenSentFps";
|
|
212
|
+
/** The sent screen width. */
|
|
213
|
+
RtcStatsMetricNames["screenSentWidth"] = "screenSentWidth";
|
|
214
|
+
/** The sent screen height. */
|
|
215
|
+
RtcStatsMetricNames["screenSentHeight"] = "screenSentHeight";
|
|
216
|
+
/** The sent screen encoding max bitrate. */
|
|
217
|
+
RtcStatsMetricNames["screenSentMaxBitrate"] = "screenSentMaxBitrate";
|
|
218
|
+
//'screenSentPackets',
|
|
219
|
+
/** The sent screen lost packets. */
|
|
220
|
+
RtcStatsMetricNames["screenSentPacketsLost"] = "screenSentPacketsLost";
|
|
221
|
+
//'screenSentPacketsLostCount',
|
|
222
|
+
/** The NACK count received by screen sender. */
|
|
223
|
+
RtcStatsMetricNames["screenSentNackCountRecv"] = "screenSentNackCountRecv";
|
|
224
|
+
/** The sent screen round trip time. */
|
|
225
|
+
RtcStatsMetricNames["screenSentRoundTripTime"] = "screenSentRoundTripTime";
|
|
226
|
+
/** The transport sent screen round trip time. */
|
|
227
|
+
RtcStatsMetricNames["screenSentTransportRoundTripTime"] = "screenSentTransportRoundTripTime";
|
|
228
|
+
/** The screen sent jitter. */
|
|
229
|
+
RtcStatsMetricNames["screenSentJitter"] = "screenSentJitter";
|
|
230
|
+
/** The screen audio RTX packets. */
|
|
231
|
+
RtcStatsMetricNames["screenSentRetransmittedPackets"] = "screenSentRetransmittedPackets";
|
|
232
|
+
// inbound audio,
|
|
233
|
+
RtcStatsMetricNames["audioRecvCodec"] = "audioRecvCodec";
|
|
234
|
+
RtcStatsMetricNames["audioRecvBytes"] = "audioRecvBytes";
|
|
235
|
+
RtcStatsMetricNames["audioRecvAvgJitterBufferDelay"] = "audioRecvAvgJitterBufferDelay";
|
|
236
|
+
RtcStatsMetricNames["audioRecvBitrates"] = "audioRecvBitrates";
|
|
237
|
+
RtcStatsMetricNames["audioRecvJitter"] = "audioRecvJitter";
|
|
238
|
+
RtcStatsMetricNames["audioRecvRoundTripTime"] = "audioRecvRoundTripTime";
|
|
239
|
+
RtcStatsMetricNames["audioRecvPackets"] = "audioRecvPackets";
|
|
240
|
+
RtcStatsMetricNames["audioRecvPacketsLost"] = "audioRecvPacketsLost";
|
|
241
|
+
RtcStatsMetricNames["audioRecvLostPackets"] = "audioRecvLostPackets";
|
|
242
|
+
RtcStatsMetricNames["audioRecvPacketsLossRate"] = "audioRecvPacketsLossRate";
|
|
243
|
+
RtcStatsMetricNames["audioRecvRetransmittedPackets"] = "audioRecvRetransmittedPackets";
|
|
244
|
+
RtcStatsMetricNames["audioRecvNackCountSent"] = "audioRecvNackCountSent";
|
|
245
|
+
RtcStatsMetricNames["audioRecvLevel"] = "audioRecvLevel";
|
|
246
|
+
RtcStatsMetricNames["audioRecvTotalSamplesReceived"] = "audioRecvTotalSamplesReceived";
|
|
247
|
+
RtcStatsMetricNames["audioRecvConcealedSamples"] = "audioRecvConcealedSamples";
|
|
248
|
+
RtcStatsMetricNames["audioRecvConcealmentEvents"] = "audioRecvConcealmentEvents";
|
|
249
|
+
RtcStatsMetricNames["audioRecvInsertedSamplesForDeceleration"] = "audioRecvInsertedSamplesForDeceleration";
|
|
250
|
+
RtcStatsMetricNames["audioRecvRemovedSamplesForAcceleration"] = "audioRecvRemovedSamplesForAcceleration";
|
|
251
|
+
// inbound video,
|
|
252
|
+
RtcStatsMetricNames["videoRecvCodec"] = "videoRecvCodec";
|
|
253
|
+
RtcStatsMetricNames["videoFirCountSent"] = "videoFirCountSent";
|
|
254
|
+
RtcStatsMetricNames["videoPliCountSent"] = "videoPliCountSent";
|
|
255
|
+
RtcStatsMetricNames["videoDecodeLatency"] = "videoDecodeLatency";
|
|
256
|
+
//'videoFramesDecoded',
|
|
257
|
+
RtcStatsMetricNames["videoRecvFrames"] = "videoRecvFrames";
|
|
258
|
+
RtcStatsMetricNames["videoRecvFps"] = "videoRecvFps";
|
|
259
|
+
RtcStatsMetricNames["videoRecvAvgJitterBufferDelay"] = "videoRecvAvgJitterBufferDelay";
|
|
260
|
+
RtcStatsMetricNames["videoRecvBitrates"] = "videoRecvBitrates";
|
|
261
|
+
RtcStatsMetricNames["videoRecvBytes"] = "videoRecvBytes";
|
|
262
|
+
RtcStatsMetricNames["videoRecvHeight"] = "videoRecvHeight";
|
|
263
|
+
RtcStatsMetricNames["videoRecvJitter"] = "videoRecvJitter";
|
|
264
|
+
RtcStatsMetricNames["videoRecvRoundTripTime"] = "videoRecvRoundTripTime";
|
|
265
|
+
RtcStatsMetricNames["videoRecvPackets"] = "videoRecvPackets";
|
|
266
|
+
RtcStatsMetricNames["videoRecvLostPackets"] = "videoRecvLostPackets";
|
|
267
|
+
RtcStatsMetricNames["videoRecvPacketsLost"] = "videoRecvPacketsLost";
|
|
268
|
+
RtcStatsMetricNames["videoRecvPacketsLossRate"] = "videoRecvPacketsLossRate";
|
|
269
|
+
RtcStatsMetricNames["videoRecvRetransmittedPackets"] = "videoRecvRetransmittedPackets";
|
|
270
|
+
RtcStatsMetricNames["videoRecvNackCountSent"] = "videoRecvNackCountSent";
|
|
271
|
+
RtcStatsMetricNames["videoRecvWidth"] = "videoRecvWidth";
|
|
272
|
+
//'videoTotalDecodeTime',
|
|
273
|
+
RtcStatsMetricNames["videoTotalFreezesDuration"] = "videoTotalFreezesDuration";
|
|
274
|
+
// inbound screen,
|
|
275
|
+
RtcStatsMetricNames["screenRecvCodec"] = "screenRecvCodec";
|
|
276
|
+
RtcStatsMetricNames["screenFirCountSent"] = "screenFirCountSent";
|
|
277
|
+
RtcStatsMetricNames["screenPliCountSent"] = "screenPliCountSent";
|
|
278
|
+
RtcStatsMetricNames["screenDecodeLatency"] = "screenDecodeLatency";
|
|
279
|
+
//'screenFramesDecoded',
|
|
280
|
+
RtcStatsMetricNames["screenRecvFrames"] = "screenRecvFrames";
|
|
281
|
+
RtcStatsMetricNames["screenRecvFps"] = "screenRecvFps";
|
|
282
|
+
RtcStatsMetricNames["screenRecvAvgJitterBufferDelay"] = "screenRecvAvgJitterBufferDelay";
|
|
283
|
+
RtcStatsMetricNames["screenRecvBitrates"] = "screenRecvBitrates";
|
|
284
|
+
RtcStatsMetricNames["screenRecvBytes"] = "screenRecvBytes";
|
|
285
|
+
RtcStatsMetricNames["screenRecvHeight"] = "screenRecvHeight";
|
|
286
|
+
RtcStatsMetricNames["screenRecvJitter"] = "screenRecvJitter";
|
|
287
|
+
RtcStatsMetricNames["screenRecvRoundTripTime"] = "screenRecvRoundTripTime";
|
|
288
|
+
RtcStatsMetricNames["screenRecvPackets"] = "screenRecvPackets";
|
|
289
|
+
RtcStatsMetricNames["screenRecvLostPackets"] = "screenRecvLostPackets";
|
|
290
|
+
RtcStatsMetricNames["screenRecvPacketsLost"] = "screenRecvPacketsLost";
|
|
291
|
+
RtcStatsMetricNames["screenRecvPacketsLossRate"] = "screenRecvPacketsLossRate";
|
|
292
|
+
RtcStatsMetricNames["screenRecvRetransmittedPackets"] = "screenRecvRetransmittedPackets";
|
|
293
|
+
RtcStatsMetricNames["screenRecvNackCountSent"] = "screenRecvNackCountSent";
|
|
294
|
+
RtcStatsMetricNames["screenRecvWidth"] = "screenRecvWidth";
|
|
295
|
+
//'screenTotalDecodeTime',
|
|
296
|
+
RtcStatsMetricNames["screenTotalFreezesDuration"] = "screenTotalFreezesDuration";
|
|
297
|
+
/** The transport availableOutgoingBitrate stat. */
|
|
298
|
+
RtcStatsMetricNames["transportSentAvailableOutgoingBitrate"] = "transportSentAvailableOutgoingBitrate";
|
|
299
|
+
})(RtcStatsMetricNames || (exports.RtcStatsMetricNames = RtcStatsMetricNames = {}));
|
|
300
|
+
const RtcStatsMetrics = Object.keys(RtcStatsMetricNames);
|
|
301
|
+
function setStats(stats, name, key, value) {
|
|
302
|
+
(0, assert_1.default)(RtcStatsMetrics.includes(name), `Unknown stat name: ${name}`);
|
|
303
|
+
if (value === undefined)
|
|
304
|
+
return;
|
|
305
|
+
if (!stats[name]) {
|
|
306
|
+
stats[name] = {};
|
|
307
|
+
}
|
|
308
|
+
stats[name][key] = value;
|
|
309
|
+
}
|
|
310
|
+
function rtcStatKey({ pageIndex, trackId, hostName, codec, participantName, }) {
|
|
311
|
+
return [pageIndex ?? '', participantName || '', hostName || 'unknown', codec || '', trackId || ''].join(':');
|
|
312
|
+
}
|
|
313
|
+
function parseRtStatKey(key) {
|
|
314
|
+
const [pageIndex, participantName, hostName, codec, trackId] = key.split(':', 5);
|
|
315
|
+
return {
|
|
316
|
+
pageIndex: pageIndex ? parseInt(pageIndex) : undefined,
|
|
317
|
+
trackId: trackId || undefined,
|
|
318
|
+
hostName: hostName || 'unknown',
|
|
319
|
+
codec: codec || undefined,
|
|
320
|
+
participantName: participantName || undefined,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Updates the {@link RtcStats} object with the collected track values.
|
|
325
|
+
*/
|
|
326
|
+
function updateRtcStats(stats, pageIndex, trackId,
|
|
327
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
328
|
+
value, signalingHost, participantName) {
|
|
329
|
+
const { enabled, inboundRtp, outboundRtp, remoteAddress, videoSentActiveEncodings, sentMaxBitrate, isDisplay, codec, availableOutgoingBitrate, } = value;
|
|
330
|
+
const hostName = signalingHost || remoteAddress;
|
|
331
|
+
const key = rtcStatKey({
|
|
332
|
+
pageIndex,
|
|
333
|
+
trackId,
|
|
334
|
+
hostName,
|
|
335
|
+
codec,
|
|
336
|
+
participantName,
|
|
337
|
+
});
|
|
338
|
+
//log.log(`updateRtcStats`, {enabled, signalingHost, remoteAddress, isDisplay, key})
|
|
339
|
+
// inbound
|
|
340
|
+
if (inboundRtp) {
|
|
341
|
+
const prefix = inboundRtp.kind === 'video' ? (isDisplay ? 'screen' : 'video') : 'audio';
|
|
342
|
+
setStats(stats, (prefix + 'RecvCodec'), key, codec);
|
|
343
|
+
if (enabled) {
|
|
344
|
+
setStats(stats, (prefix + 'RecvAvgJitterBufferDelay'), key, inboundRtp.jitterBuffer);
|
|
345
|
+
setStats(stats, (prefix + 'RecvBitrates'), key, inboundRtp.bitrate);
|
|
346
|
+
setStats(stats, (prefix + 'RecvBytes'), key, inboundRtp.bytesReceived);
|
|
347
|
+
setStats(stats, (prefix + 'RecvJitter'), key, inboundRtp.jitter);
|
|
348
|
+
setStats(stats, (prefix + 'RecvRoundTripTime'), key, inboundRtp.transportRoundTripTime);
|
|
349
|
+
setStats(stats, (prefix + 'RecvPackets'), key, inboundRtp.packetsReceived);
|
|
350
|
+
setStats(stats, (prefix + 'RecvRetransmittedPackets'), key, inboundRtp.retransmittedPacketsReceived);
|
|
351
|
+
// TODO: remove this.
|
|
352
|
+
setStats(stats, (prefix + 'RecvPacketsLost'), key, inboundRtp.packetsLossRate);
|
|
353
|
+
setStats(stats, (prefix + 'RecvPacketsLossRate'), key, inboundRtp.packetsLossRate);
|
|
354
|
+
setStats(stats, (prefix + 'RecvLostPackets'), key, inboundRtp.packetsLost);
|
|
355
|
+
setStats(stats, (prefix + 'RecvNackCountSent'), key, inboundRtp.nackCount);
|
|
356
|
+
if (inboundRtp.kind === 'audio') {
|
|
357
|
+
;
|
|
358
|
+
[
|
|
359
|
+
'audioLevel',
|
|
360
|
+
'totalSamplesReceived',
|
|
361
|
+
'concealedSamples',
|
|
362
|
+
'concealmentEvents',
|
|
363
|
+
'insertedSamplesForDeceleration',
|
|
364
|
+
'removedSamplesForAcceleration',
|
|
365
|
+
].forEach(name => {
|
|
366
|
+
setStats(stats, (prefix + 'Recv' + (0, utils_1.toTitleCase)(name.replace('audio', ''))), key, inboundRtp[name]);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
if (inboundRtp.kind === 'video' && inboundRtp.keyFramesDecoded > 0) {
|
|
370
|
+
//setStats(stats, prefix + 'FramesDecoded', key, inboundRtp.framesDecoded
|
|
371
|
+
setStats(stats, (prefix + 'RecvFrames'), key, inboundRtp.framesReceived);
|
|
372
|
+
setStats(stats, (prefix + 'RecvFps'), key, inboundRtp.framesPerSecond);
|
|
373
|
+
setStats(stats, (prefix + 'RecvHeight'), key, inboundRtp.frameHeight);
|
|
374
|
+
setStats(stats, (prefix + 'RecvWidth'), key, inboundRtp.frameWidth);
|
|
375
|
+
//setStats(stats, prefix + 'TotalDecodeTime', key, inboundRtp.totalDecodeTime)
|
|
376
|
+
setStats(stats, (prefix + 'FirCountSent'), key, inboundRtp.firCount);
|
|
377
|
+
setStats(stats, (prefix + 'PliCountSent'), key, inboundRtp.pliCount);
|
|
378
|
+
setStats(stats, (prefix + 'DecodeLatency'), key, inboundRtp.decodeLatency);
|
|
379
|
+
setStats(stats, (prefix + 'TotalFreezesDuration'), key, inboundRtp.totalFreezesDuration);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// outbound
|
|
384
|
+
if (outboundRtp) {
|
|
385
|
+
// log.log('outboundRtp', isDisplay, JSON.stringify(outboundRtp, null, 2));
|
|
386
|
+
const prefix = outboundRtp.kind === 'video' ? (isDisplay ? 'screen' : 'video') : 'audio';
|
|
387
|
+
setStats(stats, (prefix + 'SentCodec'), key, codec);
|
|
388
|
+
if (enabled) {
|
|
389
|
+
setStats(stats, (prefix + 'SentBitrates'), key, outboundRtp.bitrate);
|
|
390
|
+
setStats(stats, (prefix + 'SentBytes'), key, outboundRtp.bytesSent + outboundRtp.headerBytesSent);
|
|
391
|
+
setStats(stats, (prefix + 'SentPackets'), key, outboundRtp.packetsSent);
|
|
392
|
+
setStats(stats, (prefix + 'SentPacketsLost'), key, outboundRtp.packetsLossRate);
|
|
393
|
+
setStats(stats, (prefix + 'SentNackCountRecv'), key, outboundRtp.nackCount);
|
|
394
|
+
//setStats(stats, prefix + 'SentPacketsLostCount', key, outboundRtp.packetsLost)
|
|
395
|
+
setStats(stats, (prefix + 'SentRoundTripTime'), key, outboundRtp.roundTripTime);
|
|
396
|
+
setStats(stats, (prefix + 'SentJitter'), key, outboundRtp.jitter);
|
|
397
|
+
setStats(stats, (prefix + 'SentTransportRoundTripTime'), key, outboundRtp.transportRoundTripTime);
|
|
398
|
+
setStats(stats, 'transportSentAvailableOutgoingBitrate', key, availableOutgoingBitrate);
|
|
399
|
+
setStats(stats, (prefix + 'SentMaxBitrate'), key, sentMaxBitrate);
|
|
400
|
+
setStats(stats, (prefix + 'SentRetransmittedPackets'), key, outboundRtp.retransmittedPacketsSent);
|
|
401
|
+
if (outboundRtp.kind === 'video') {
|
|
402
|
+
setStats(stats, (prefix + 'SentActiveEncodings'), key, videoSentActiveEncodings);
|
|
403
|
+
setStats(stats, (prefix + 'QualityLimitationResolutionChanges'), key, outboundRtp.qualityLimitationResolutionChanges);
|
|
404
|
+
setStats(stats, (prefix + 'QualityLimitationCpu'), key, outboundRtp.qualityLimitationCpu);
|
|
405
|
+
setStats(stats, (prefix + 'QualityLimitationBandwidth'), key, outboundRtp.qualityLimitationBandwidth);
|
|
406
|
+
setStats(stats, (prefix + 'SentWidth'), key, outboundRtp.frameWidth);
|
|
407
|
+
setStats(stats, (prefix + 'SentHeight'), key, outboundRtp.frameHeight);
|
|
408
|
+
setStats(stats, (prefix + 'SentFrames'), key, outboundRtp.framesSent);
|
|
409
|
+
setStats(stats, (prefix + 'SentFps'), key, outboundRtp.framesPerSecond);
|
|
410
|
+
setStats(stats, (prefix + 'FirCountReceived'), key, outboundRtp.firCountReceived);
|
|
411
|
+
setStats(stats, (prefix + 'PliCountReceived'), key, outboundRtp.pliCountReceived);
|
|
412
|
+
setStats(stats, (prefix + 'EncodeLatency'), key, outboundRtp.encodeLatency);
|
|
413
|
+
setStats(stats, (prefix + 'SentLatency'), key, outboundRtp.sentLatency);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=rtcstats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtcstats.js","sourceRoot":"","sources":["../../src/rtcstats.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert'\n\nimport { toTitleCase } from './utils'\n\n/**\n * Page stats metric names.\n */\nexport enum PageStatsNames {\n /** The browser processes CPU usage (per page). */\n cpu = 'cpu',\n /** The browser processes memory usage (per page). */\n memory = 'memory',\n /** The tool nodejs CPU usage. */\n nodeCpu = 'nodeCpu',\n /** The tool nodejs memory usage. */\n nodeMemory = 'nodeMemory',\n /** The system total CPU usage. */\n usedCpu = 'usedCpu',\n /** The system total memory usage. */\n usedMemory = 'usedMemory',\n /** The system total GPU usage. */\n usedGpu = 'usedGpu',\n /** The page CPU usage. */\n pageCpu = 'pageCpu',\n /** The page memory usage. */\n pageMemory = 'pageMemory',\n\n /** The opened pages count. */\n pages = 'pages',\n /** The current opened PeerConnections. */\n peerConnections = 'peerConnections',\n /** The maximum PeerConnections connected duration. */\n peerConnectionConnectionTime = 'peerConnectionConnectionTime',\n /** The maximum PeerConnections disconnection duration. */\n peerConnectionDisconnectionTime = 'peerConnectionDisconnectionTime',\n /** The total created PeerConnections. */\n peerConnectionsCreated = 'peerConnectionsCreated',\n /** The total connected PeerConnections. */\n peerConnectionsConnected = 'peerConnectionsConnected',\n /** The total closed PeerConnections. */\n peerConnectionsClosed = 'peerConnectionsClosed',\n /** The total disconnected PeerConnections. */\n peerConnectionsDisconnected = 'peerConnectionsDisconnected',\n /** The total failed PeerConnections. */\n peerConnectionsFailed = 'peerConnectionsFailed',\n /** The total delay from PeerConnections creation to connection. */\n peerConnectionsDelay = 'peerConnectionsDelay',\n\n /** The page errors count. */\n errors = 'errors',\n /** The page warnings count. */\n warnings = 'warnings',\n\n /** The page total HTTP sent bytes. */\n httpSentBytes = 'httpSentBytes',\n /** The page total HTTP received bytes. */\n httpRecvBytes = 'httpRecvBytes',\n /** The page HTTP receive latency. */\n httpRecvLatency = 'httpRecvLatency',\n\n /** The page total WebSocket sent bytes. */\n wsSentBytes = 'wsSentBytes',\n /** The page total WebSocket received bytes. */\n wsRecvBytes = 'wsRecvBytes',\n /** The page WebSocket receive latency. */\n wsRecvLatency = 'wsRecvLatency',\n\n /** The audio end to end total delay. */\n audioEndToEndDelay = 'audioEndToEndDelay',\n /** The audio start frame delay. */\n audioStartFrameDelay = 'audioStartFrameDelay',\n\n /** The video end to end total delay. */\n videoEndToEndDelay = 'videoEndToEndDelay',\n /** The video start frame delay. */\n videoStartFrameDelay = 'videoStartFrameDelay',\n\n /** The screen end to end total delay. */\n screenEndToEndDelay = 'screenEndToEndDelay',\n /** The screen start frame delay. */\n screenStartFrameDelay = 'screenStartFrameDelay',\n\n cpuPressure = 'cpuPressure',\n\n videoWidth = 'videoWidth',\n videoHeight = 'videoHeight',\n videoBufferedTime = 'videoBufferedTime',\n videoPlayingTime = 'videoPlayingTime',\n videoBufferingTime = 'videoBufferingTime',\n videoBufferingEvents = 'videoBufferingEvents',\n\n /** The throttle upload rate limitation. */\n throttleUpRate = 'throttleUpRate',\n /** The throttle upload delay. */\n throttleUpDelay = 'throttleUpDelay',\n /** The throttle upload packet loss. */\n throttleUpLoss = 'throttleUpLoss',\n /** The throttle upload packet queue. */\n throttleUpQueue = 'throttleUpQueue',\n\n /** The throttle download rate limitation. */\n throttleDownRate = 'throttleDownRate',\n /** The throttle download delay. */\n throttleDownDelay = 'throttleDownDelay',\n /** The throttle download packet loss. */\n throttleDownLoss = 'throttleDownLoss',\n /** The throttle download packet queue. */\n throttleDownQueue = 'throttleDownQueue',\n}\n\n/**\n * RTC metrics collected by the page helper scripts and related to each\n * track object created by PeerConnections.\n */\nexport enum RtcStatsMetricNames {\n /** The sent audio codec. */\n audioSentCodec = 'audioSentCodec',\n /** The total sent audio bytes. */\n audioSentBytes = 'audioSentBytes',\n /** The sent audio packets. */\n audioSentPackets = 'audioSentPackets',\n /** The sent audio bitrates. */\n audioSentBitrates = 'audioSentBitrates',\n /** The send audio lost packets. */\n audioSentPacketsLost = 'audioSentPacketsLost',\n //'audioSentPacketsLostCount',\n /** The total audio NACK received by the sender. */\n audioSentNackCountRecv = 'audioSentNackCountRecv',\n /** The sent audio round trip time. */\n audioSentRoundTripTime = 'audioSentRoundTripTime',\n /** The sent audio jitter. */\n audioSentJitter = 'audioSentJitter',\n /** The audio RTC transport round trip time. */\n audioSentTransportRoundTripTime = 'audioSentTransportRoundTripTime',\n /** The sent audio encoding max bitrate. */\n audioSentMaxBitrate = 'audioSentMaxBitrate',\n /** The sent audio RTX packets. */\n audioSentRetransmittedPackets = 'audioSentRetransmittedPackets',\n\n /** The sent video codec. */\n videoSentCodec = 'videoSentCodec',\n /** The FIR requests received by the video sender. */\n videoFirCountReceived = 'videoFirCountReceived',\n /** The PLI requests received by the video sender. */\n videoPliCountReceived = 'videoPliCountReceived',\n /** The sent video encode latency. */\n videoEncodeLatency = 'videoEncodeLatency',\n /** The sent video latency. */\n videoSentLatency = 'videoSentLatency',\n /** The sent video bandwidth quality limitations. */\n videoQualityLimitationBandwidth = 'videoQualityLimitationBandwidth',\n /** The sent video cpu quality limitations. */\n videoQualityLimitationCpu = 'videoQualityLimitationCpu',\n /** The sent video total resolution changes for quality limitations. */\n videoQualityLimitationResolutionChanges = 'videoQualityLimitationResolutionChanges',\n /** The sent video Simulcast active spatial layers. */\n videoSentActiveEncodings = 'videoSentActiveEncodings',\n /** The sent video bitrates. */\n videoSentBitrates = 'videoSentBitrates',\n /** The sent video bytes. */\n videoSentBytes = 'videoSentBytes',\n /** The sent video packets. */\n videoSentPackets = 'videoSentPackets',\n /** The sent video frames. */\n videoSentFrames = 'videoSentFrames',\n /** The sent video framerate. */\n videoSentFps = 'videoSentFps',\n /** The sent video width. */\n videoSentWidth = 'videoSentWidth',\n /** The sent video height. */\n videoSentHeight = 'videoSentHeight',\n /** The sent video encoding max bitrate. */\n videoSentMaxBitrate = 'videoSentMaxBitrate',\n //'videoSentPackets',\n /** The sent video lost packets. */\n videoSentPacketsLost = 'videoSentPacketsLost',\n //'videoSentPacketsLostCount',\n /** The NACK count received by video sender. */\n videoSentNackCountRecv = 'videoSentNackCountRecv',\n /** The sent video round trip time. */\n videoSentRoundTripTime = 'videoSentRoundTripTime',\n /** The transport send video round trip time. */\n videoSentTransportRoundTripTime = 'videoSentTransportRoundTripTime',\n /** The video sent jitter. */\n videoSentJitter = 'videoSentJitter',\n /** The sent video RTX packets. */\n videoSentRetransmittedPackets = 'videoSentRetransmittedPackets',\n\n /** The sent screen codec. */\n screenSentCodec = 'screenSentCodec',\n /** The received FIR from screen sender. */\n screenFirCountReceived = 'screenFirCountReceived',\n /** The received PLI from screen sender. */\n screenPliCountReceived = 'screenPliCountReceived',\n /** The sent screen encode latency. */\n screenEncodeLatency = 'screenEncodeLatency',\n /** The sent screen latency. */\n screenSentLatency = 'screenSentLatency',\n /** The sent screen bandwidth quality limitation. */\n screenQualityLimitationBandwidth = 'screenQualityLimitationBandwidth',\n /** The sent screen cpu quality limitation. */\n screenQualityLimitationCpu = 'screenQualityLimitationCpu',\n /** The sent screen resolustion changes caused by quality limitation. */\n screenQualityLimitationResolutionChanges = 'screenQualityLimitationResolutionChanges',\n /** The sent screen active Simulcast spatial layers. */\n screenSentActiveEncodings = 'screenSentActiveEncodings',\n /** The sent screen bitrates. */\n screenSentBitrates = 'screenSentBitrates',\n /** The sent screen bytes. */\n screenSentBytes = 'screenSentBytes',\n /** The sent screen packets. */\n screenSentPackets = 'screenSentPackets',\n /** The sent screen frames. */\n screenSentFrames = 'screenSentFrames',\n /** The sent screen framerate. */\n screenSentFps = 'screenSentFps',\n /** The sent screen width. */\n screenSentWidth = 'screenSentWidth',\n /** The sent screen height. */\n screenSentHeight = 'screenSentHeight',\n /** The sent screen encoding max bitrate. */\n screenSentMaxBitrate = 'screenSentMaxBitrate',\n //'screenSentPackets',\n /** The sent screen lost packets. */\n screenSentPacketsLost = 'screenSentPacketsLost',\n //'screenSentPacketsLostCount',\n /** The NACK count received by screen sender. */\n screenSentNackCountRecv = 'screenSentNackCountRecv',\n /** The sent screen round trip time. */\n screenSentRoundTripTime = 'screenSentRoundTripTime',\n /** The transport sent screen round trip time. */\n screenSentTransportRoundTripTime = 'screenSentTransportRoundTripTime',\n /** The screen sent jitter. */\n screenSentJitter = 'screenSentJitter',\n /** The screen audio RTX packets. */\n screenSentRetransmittedPackets = 'screenSentRetransmittedPackets',\n\n // inbound audio,\n audioRecvCodec = 'audioRecvCodec',\n audioRecvBytes = 'audioRecvBytes',\n audioRecvAvgJitterBufferDelay = 'audioRecvAvgJitterBufferDelay',\n audioRecvBitrates = 'audioRecvBitrates',\n audioRecvJitter = 'audioRecvJitter',\n audioRecvRoundTripTime = 'audioRecvRoundTripTime',\n audioRecvPackets = 'audioRecvPackets',\n audioRecvPacketsLost = 'audioRecvPacketsLost', // TODO: remove this.\n audioRecvLostPackets = 'audioRecvLostPackets',\n audioRecvPacketsLossRate = 'audioRecvPacketsLossRate',\n audioRecvRetransmittedPackets = 'audioRecvRetransmittedPackets',\n audioRecvNackCountSent = 'audioRecvNackCountSent',\n audioRecvLevel = 'audioRecvLevel',\n audioRecvTotalSamplesReceived = 'audioRecvTotalSamplesReceived',\n audioRecvConcealedSamples = 'audioRecvConcealedSamples',\n audioRecvConcealmentEvents = 'audioRecvConcealmentEvents',\n audioRecvInsertedSamplesForDeceleration = 'audioRecvInsertedSamplesForDeceleration',\n audioRecvRemovedSamplesForAcceleration = 'audioRecvRemovedSamplesForAcceleration',\n // inbound video,\n videoRecvCodec = 'videoRecvCodec',\n videoFirCountSent = 'videoFirCountSent',\n videoPliCountSent = 'videoPliCountSent',\n videoDecodeLatency = 'videoDecodeLatency',\n //'videoFramesDecoded',\n videoRecvFrames = 'videoRecvFrames',\n videoRecvFps = 'videoRecvFps',\n videoRecvAvgJitterBufferDelay = 'videoRecvAvgJitterBufferDelay',\n videoRecvBitrates = 'videoRecvBitrates',\n videoRecvBytes = 'videoRecvBytes',\n videoRecvHeight = 'videoRecvHeight',\n videoRecvJitter = 'videoRecvJitter',\n videoRecvRoundTripTime = 'videoRecvRoundTripTime',\n videoRecvPackets = 'videoRecvPackets',\n videoRecvLostPackets = 'videoRecvLostPackets',\n videoRecvPacketsLost = 'videoRecvPacketsLost', // TODO: remove this.\n videoRecvPacketsLossRate = 'videoRecvPacketsLossRate',\n videoRecvRetransmittedPackets = 'videoRecvRetransmittedPackets',\n videoRecvNackCountSent = 'videoRecvNackCountSent',\n videoRecvWidth = 'videoRecvWidth',\n //'videoTotalDecodeTime',\n videoTotalFreezesDuration = 'videoTotalFreezesDuration',\n // inbound screen,\n screenRecvCodec = 'screenRecvCodec',\n screenFirCountSent = 'screenFirCountSent',\n screenPliCountSent = 'screenPliCountSent',\n screenDecodeLatency = 'screenDecodeLatency',\n //'screenFramesDecoded',\n screenRecvFrames = 'screenRecvFrames',\n screenRecvFps = 'screenRecvFps',\n screenRecvAvgJitterBufferDelay = 'screenRecvAvgJitterBufferDelay',\n screenRecvBitrates = 'screenRecvBitrates',\n screenRecvBytes = 'screenRecvBytes',\n screenRecvHeight = 'screenRecvHeight',\n screenRecvJitter = 'screenRecvJitter',\n screenRecvRoundTripTime = 'screenRecvRoundTripTime',\n screenRecvPackets = 'screenRecvPackets',\n screenRecvLostPackets = 'screenRecvLostPackets',\n screenRecvPacketsLost = 'screenRecvPacketsLost', // TODO: remove this.\n screenRecvPacketsLossRate = 'screenRecvPacketsLossRate',\n screenRecvRetransmittedPackets = 'screenRecvRetransmittedPackets',\n screenRecvNackCountSent = 'screenRecvNackCountSent',\n screenRecvWidth = 'screenRecvWidth',\n //'screenTotalDecodeTime',\n screenTotalFreezesDuration = 'screenTotalFreezesDuration',\n\n /** The transport availableOutgoingBitrate stat. */\n transportSentAvailableOutgoingBitrate = 'transportSentAvailableOutgoingBitrate',\n}\n\n/**\n * The RTC stats collection indexed by {@link RtcStatsMetricNames}.\n *\n * Each {@link RtcStatsMetricNames} record points to an object indexed by\n * `trackId:hostName:codec`, where:\n * - `trackId`: The RTC getStats track identifier.\n * - `hostName`: The remote endpoint IP address or hostname.\n * - `codec`: The track codec.\n */\nexport type RtcStats = Record<RtcStatsMetricNames, Record<string, number | string>>\n\nconst RtcStatsMetrics = Object.keys(RtcStatsMetricNames)\n\nfunction setStats(stats: RtcStats, name: RtcStatsMetricNames, key: string, value?: number | string): void {\n assert(RtcStatsMetrics.includes(name), `Unknown stat name: ${name}`)\n if (value === undefined) return\n if (!stats[name]) {\n stats[name] = {}\n }\n stats[name][key] = value\n}\n\nexport function rtcStatKey({\n pageIndex,\n trackId,\n hostName,\n codec,\n participantName,\n}: {\n pageIndex?: number\n trackId?: string\n hostName?: string\n codec?: string\n participantName?: string\n}): string {\n return [pageIndex ?? '', participantName || '', hostName || 'unknown', codec || '', trackId || ''].join(':')\n}\n\nexport function parseRtStatKey(key: string): {\n pageIndex?: number\n trackId?: string\n hostName: string\n codec?: string\n participantName?: string\n} {\n const [pageIndex, participantName, hostName, codec, trackId] = key.split(':', 5)\n return {\n pageIndex: pageIndex ? parseInt(pageIndex) : undefined,\n trackId: trackId || undefined,\n hostName: hostName || 'unknown',\n codec: codec || undefined,\n participantName: participantName || undefined,\n }\n}\n\n/**\n * Updates the {@link RtcStats} object with the collected track values.\n */\nexport function updateRtcStats(\n stats: RtcStats,\n pageIndex: number,\n trackId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n signalingHost?: string,\n participantName?: string,\n): void {\n const {\n enabled,\n inboundRtp,\n outboundRtp,\n remoteAddress,\n videoSentActiveEncodings,\n sentMaxBitrate,\n isDisplay,\n codec,\n availableOutgoingBitrate,\n } = value\n const hostName = signalingHost || remoteAddress\n const key = rtcStatKey({\n pageIndex,\n trackId,\n hostName,\n codec,\n participantName,\n })\n //log.log(`updateRtcStats`, {enabled, signalingHost, remoteAddress, isDisplay, key})\n // inbound\n if (inboundRtp) {\n const prefix = inboundRtp.kind === 'video' ? (isDisplay ? 'screen' : 'video') : 'audio'\n setStats(stats, (prefix + 'RecvCodec') as RtcStatsMetricNames, key, codec)\n if (enabled) {\n setStats(stats, (prefix + 'RecvAvgJitterBufferDelay') as RtcStatsMetricNames, key, inboundRtp.jitterBuffer)\n setStats(stats, (prefix + 'RecvBitrates') as RtcStatsMetricNames, key, inboundRtp.bitrate)\n setStats(stats, (prefix + 'RecvBytes') as RtcStatsMetricNames, key, inboundRtp.bytesReceived)\n setStats(stats, (prefix + 'RecvJitter') as RtcStatsMetricNames, key, inboundRtp.jitter)\n setStats(stats, (prefix + 'RecvRoundTripTime') as RtcStatsMetricNames, key, inboundRtp.transportRoundTripTime)\n setStats(stats, (prefix + 'RecvPackets') as RtcStatsMetricNames, key, inboundRtp.packetsReceived)\n setStats(\n stats,\n (prefix + 'RecvRetransmittedPackets') as RtcStatsMetricNames,\n key,\n inboundRtp.retransmittedPacketsReceived,\n )\n // TODO: remove this.\n setStats(stats, (prefix + 'RecvPacketsLost') as RtcStatsMetricNames, key, inboundRtp.packetsLossRate)\n setStats(stats, (prefix + 'RecvPacketsLossRate') as RtcStatsMetricNames, key, inboundRtp.packetsLossRate)\n setStats(stats, (prefix + 'RecvLostPackets') as RtcStatsMetricNames, key, inboundRtp.packetsLost)\n setStats(stats, (prefix + 'RecvNackCountSent') as RtcStatsMetricNames, key, inboundRtp.nackCount)\n if (inboundRtp.kind === 'audio') {\n ;[\n 'audioLevel',\n 'totalSamplesReceived',\n 'concealedSamples',\n 'concealmentEvents',\n 'insertedSamplesForDeceleration',\n 'removedSamplesForAcceleration',\n ].forEach(name => {\n setStats(\n stats,\n (prefix + 'Recv' + toTitleCase(name.replace('audio', ''))) as RtcStatsMetricNames,\n key,\n inboundRtp[name],\n )\n })\n }\n if (inboundRtp.kind === 'video' && inboundRtp.keyFramesDecoded > 0) {\n //setStats(stats, prefix + 'FramesDecoded', key, inboundRtp.framesDecoded\n setStats(stats, (prefix + 'RecvFrames') as RtcStatsMetricNames, key, inboundRtp.framesReceived)\n setStats(stats, (prefix + 'RecvFps') as RtcStatsMetricNames, key, inboundRtp.framesPerSecond)\n setStats(stats, (prefix + 'RecvHeight') as RtcStatsMetricNames, key, inboundRtp.frameHeight)\n setStats(stats, (prefix + 'RecvWidth') as RtcStatsMetricNames, key, inboundRtp.frameWidth)\n //setStats(stats, prefix + 'TotalDecodeTime', key, inboundRtp.totalDecodeTime)\n setStats(stats, (prefix + 'FirCountSent') as RtcStatsMetricNames, key, inboundRtp.firCount)\n setStats(stats, (prefix + 'PliCountSent') as RtcStatsMetricNames, key, inboundRtp.pliCount)\n setStats(stats, (prefix + 'DecodeLatency') as RtcStatsMetricNames, key, inboundRtp.decodeLatency)\n setStats(stats, (prefix + 'TotalFreezesDuration') as RtcStatsMetricNames, key, inboundRtp.totalFreezesDuration)\n }\n }\n }\n // outbound\n if (outboundRtp) {\n // log.log('outboundRtp', isDisplay, JSON.stringify(outboundRtp, null, 2));\n const prefix = outboundRtp.kind === 'video' ? (isDisplay ? 'screen' : 'video') : 'audio'\n setStats(stats, (prefix + 'SentCodec') as RtcStatsMetricNames, key, codec)\n if (enabled) {\n setStats(stats, (prefix + 'SentBitrates') as RtcStatsMetricNames, key, outboundRtp.bitrate)\n setStats(\n stats,\n (prefix + 'SentBytes') as RtcStatsMetricNames,\n key,\n outboundRtp.bytesSent + outboundRtp.headerBytesSent,\n )\n setStats(stats, (prefix + 'SentPackets') as RtcStatsMetricNames, key, outboundRtp.packetsSent)\n setStats(stats, (prefix + 'SentPacketsLost') as RtcStatsMetricNames, key, outboundRtp.packetsLossRate)\n setStats(stats, (prefix + 'SentNackCountRecv') as RtcStatsMetricNames, key, outboundRtp.nackCount)\n //setStats(stats, prefix + 'SentPacketsLostCount', key, outboundRtp.packetsLost)\n setStats(stats, (prefix + 'SentRoundTripTime') as RtcStatsMetricNames, key, outboundRtp.roundTripTime)\n setStats(stats, (prefix + 'SentJitter') as RtcStatsMetricNames, key, outboundRtp.jitter)\n setStats(\n stats,\n (prefix + 'SentTransportRoundTripTime') as RtcStatsMetricNames,\n key,\n outboundRtp.transportRoundTripTime,\n )\n setStats(stats, 'transportSentAvailableOutgoingBitrate' as RtcStatsMetricNames, key, availableOutgoingBitrate)\n setStats(stats, (prefix + 'SentMaxBitrate') as RtcStatsMetricNames, key, sentMaxBitrate)\n setStats(\n stats,\n (prefix + 'SentRetransmittedPackets') as RtcStatsMetricNames,\n key,\n outboundRtp.retransmittedPacketsSent,\n )\n if (outboundRtp.kind === 'video') {\n setStats(stats, (prefix + 'SentActiveEncodings') as RtcStatsMetricNames, key, videoSentActiveEncodings)\n setStats(\n stats,\n (prefix + 'QualityLimitationResolutionChanges') as RtcStatsMetricNames,\n key,\n outboundRtp.qualityLimitationResolutionChanges,\n )\n setStats(stats, (prefix + 'QualityLimitationCpu') as RtcStatsMetricNames, key, outboundRtp.qualityLimitationCpu)\n setStats(\n stats,\n (prefix + 'QualityLimitationBandwidth') as RtcStatsMetricNames,\n key,\n outboundRtp.qualityLimitationBandwidth,\n )\n setStats(stats, (prefix + 'SentWidth') as RtcStatsMetricNames, key, outboundRtp.frameWidth)\n setStats(stats, (prefix + 'SentHeight') as RtcStatsMetricNames, key, outboundRtp.frameHeight)\n setStats(stats, (prefix + 'SentFrames') as RtcStatsMetricNames, key, outboundRtp.framesSent)\n setStats(stats, (prefix + 'SentFps') as RtcStatsMetricNames, key, outboundRtp.framesPerSecond)\n setStats(stats, (prefix + 'FirCountReceived') as RtcStatsMetricNames, key, outboundRtp.firCountReceived)\n setStats(stats, (prefix + 'PliCountReceived') as RtcStatsMetricNames, key, outboundRtp.pliCountReceived)\n setStats(stats, (prefix + 'EncodeLatency') as RtcStatsMetricNames, key, outboundRtp.encodeLatency)\n setStats(stats, (prefix + 'SentLatency') as RtcStatsMetricNames, key, outboundRtp.sentLatency)\n }\n }\n }\n}\n"]}
|