@stream-io/video-client 0.0.1-alpha.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.
- package/LICENSE +219 -0
- package/README.md +14 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +296 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/Batcher.ts.html +214 -0
- package/coverage/lcov-report/src/CallDropScheduler.ts.html +661 -0
- package/coverage/lcov-report/src/StreamSfuClient.ts.html +640 -0
- package/coverage/lcov-report/src/StreamVideoClient.ts.html +1594 -0
- package/coverage/lcov-report/src/config/defaultConfigs.ts.html +130 -0
- package/coverage/lcov-report/src/config/index.html +116 -0
- package/coverage/lcov-report/src/coordinator/StreamCoordinatorClient.ts.html +430 -0
- package/coverage/lcov-report/src/coordinator/connection/base64.ts.html +325 -0
- package/coverage/lcov-report/src/coordinator/connection/client.ts.html +2527 -0
- package/coverage/lcov-report/src/coordinator/connection/connection.ts.html +2335 -0
- package/coverage/lcov-report/src/coordinator/connection/connection_fallback.ts.html +802 -0
- package/coverage/lcov-report/src/coordinator/connection/errors.ts.html +295 -0
- package/coverage/lcov-report/src/coordinator/connection/index.html +251 -0
- package/coverage/lcov-report/src/coordinator/connection/insights.ts.html +349 -0
- package/coverage/lcov-report/src/coordinator/connection/signing.ts.html +397 -0
- package/coverage/lcov-report/src/coordinator/connection/token_manager.ts.html +565 -0
- package/coverage/lcov-report/src/coordinator/connection/types.ts.html +418 -0
- package/coverage/lcov-report/src/coordinator/connection/utils.ts.html +529 -0
- package/coverage/lcov-report/src/coordinator/index.html +116 -0
- package/coverage/lcov-report/src/events/call.ts.html +583 -0
- package/coverage/lcov-report/src/events/index.html +161 -0
- package/coverage/lcov-report/src/events/internal.ts.html +226 -0
- package/coverage/lcov-report/src/events/participant.ts.html +376 -0
- package/coverage/lcov-report/src/events/speaker.ts.html +271 -0
- package/coverage/lcov-report/src/gen/google/protobuf/index.html +131 -0
- package/coverage/lcov-report/src/gen/google/protobuf/struct.ts.html +1528 -0
- package/coverage/lcov-report/src/gen/google/protobuf/timestamp.ts.html +958 -0
- package/coverage/lcov-report/src/gen/video/sfu/event/events.ts.html +5971 -0
- package/coverage/lcov-report/src/gen/video/sfu/event/index.html +116 -0
- package/coverage/lcov-report/src/gen/video/sfu/models/index.html +116 -0
- package/coverage/lcov-report/src/gen/video/sfu/models/models.ts.html +3271 -0
- package/coverage/lcov-report/src/index.html +161 -0
- package/coverage/lcov-report/src/rpc/index.html +131 -0
- package/coverage/lcov-report/src/rpc/index.ts.html +91 -0
- package/coverage/lcov-report/src/rpc/latency.ts.html +214 -0
- package/coverage/lcov-report/src/rtc/Call.ts.html +1840 -0
- package/coverage/lcov-report/src/rtc/CallMetadata.ts.html +157 -0
- package/coverage/lcov-report/src/rtc/Dispatcher.ts.html +223 -0
- package/coverage/lcov-report/src/rtc/IceTrickleBuffer.ts.html +148 -0
- package/coverage/lcov-report/src/rtc/callEventHandlers.ts.html +196 -0
- package/coverage/lcov-report/src/rtc/codecs.ts.html +268 -0
- package/coverage/lcov-report/src/rtc/helpers/iceCandidate.ts.html +133 -0
- package/coverage/lcov-report/src/rtc/helpers/index.html +131 -0
- package/coverage/lcov-report/src/rtc/helpers/tracks.ts.html +139 -0
- package/coverage/lcov-report/src/rtc/index.html +251 -0
- package/coverage/lcov-report/src/rtc/publisher.ts.html +1000 -0
- package/coverage/lcov-report/src/rtc/signal.ts.html +187 -0
- package/coverage/lcov-report/src/rtc/subscriber.ts.html +340 -0
- package/coverage/lcov-report/src/rtc/videoLayers.ts.html +394 -0
- package/coverage/lcov-report/src/stats/index.html +116 -0
- package/coverage/lcov-report/src/stats/state-store-stats-reporter.ts.html +1177 -0
- package/coverage/lcov-report/src/store/index.html +146 -0
- package/coverage/lcov-report/src/store/index.ts.html +91 -0
- package/coverage/lcov-report/src/store/rxUtils.ts.html +211 -0
- package/coverage/lcov-report/src/store/stateStore.ts.html +1108 -0
- package/coverage/lcov.info +11463 -0
- package/coverage/tmp/coverage-2131-1675959950516-2.json +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +8636 -0
- package/dist/index.js.map +1 -0
- package/dist/src/Batcher.d.ts +12 -0
- package/dist/src/CallDropScheduler.d.ts +44 -0
- package/dist/src/StreamSfuClient.d.ts +25 -0
- package/dist/src/StreamVideoClient.d.ts +145 -0
- package/dist/src/__tests__/StreamVideoClient.test.d.ts +1 -0
- package/dist/src/config/defaultConfigs.d.ts +2 -0
- package/dist/src/config/types.d.ts +29 -0
- package/dist/src/coordinator/StreamCoordinatorClient.d.ts +19 -0
- package/dist/src/coordinator/connection/base64.d.ts +2 -0
- package/dist/src/coordinator/connection/client.d.ts +174 -0
- package/dist/src/coordinator/connection/connection.d.ts +139 -0
- package/dist/src/coordinator/connection/connection_fallback.d.ts +38 -0
- package/dist/src/coordinator/connection/errors.d.ts +16 -0
- package/dist/src/coordinator/connection/events.d.ts +10 -0
- package/dist/src/coordinator/connection/insights.d.ts +58 -0
- package/dist/src/coordinator/connection/signing.d.ts +30 -0
- package/dist/src/coordinator/connection/token_manager.d.ts +39 -0
- package/dist/src/coordinator/connection/types.d.ts +87 -0
- package/dist/src/coordinator/connection/utils.d.ts +25 -0
- package/dist/src/devices.d.ts +79 -0
- package/dist/src/events/call.d.ts +26 -0
- package/dist/src/events/internal.d.ts +8 -0
- package/dist/src/events/participant.d.ts +21 -0
- package/dist/src/events/speaker.d.ts +10 -0
- package/dist/src/gen/coordinator/index.d.ts +1973 -0
- package/dist/src/gen/google/protobuf/descriptor.d.ts +1650 -0
- package/dist/src/gen/google/protobuf/duration.d.ts +113 -0
- package/dist/src/gen/google/protobuf/struct.d.ts +184 -0
- package/dist/src/gen/google/protobuf/timestamp.d.ts +158 -0
- package/dist/src/gen/video/coordinator/broadcast_v1/broadcast.d.ts +66 -0
- package/dist/src/gen/video/coordinator/call_v1/call.d.ts +254 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.d.ts +351 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.d.ts +1488 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/envelopes.d.ts +143 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/websocket.d.ts +292 -0
- package/dist/src/gen/video/coordinator/edge_v1/edge.d.ts +183 -0
- package/dist/src/gen/video/coordinator/event_v1/event.d.ts +411 -0
- package/dist/src/gen/video/coordinator/geofence_v1/geofence.d.ts +63 -0
- package/dist/src/gen/video/coordinator/member_v1/member.d.ts +59 -0
- package/dist/src/gen/video/coordinator/participant_v1/participant.d.ts +103 -0
- package/dist/src/gen/video/coordinator/push_v1/push.d.ts +240 -0
- package/dist/src/gen/video/coordinator/stat_v1/stat.d.ts +308 -0
- package/dist/src/gen/video/coordinator/user_v1/user.d.ts +112 -0
- package/dist/src/gen/video/coordinator/utils_v1/utils.d.ts +47 -0
- package/dist/src/gen/video/sfu/event/events.d.ts +736 -0
- package/dist/src/gen/video/sfu/models/models.d.ts +460 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +89 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +320 -0
- package/dist/src/helpers/browsers.d.ts +8 -0
- package/dist/src/helpers/sound-detector.d.ts +34 -0
- package/dist/src/rpc/createClient.d.ts +10 -0
- package/dist/src/rpc/index.d.ts +2 -0
- package/dist/src/rpc/latency.d.ts +9 -0
- package/dist/src/rtc/Call.d.ts +180 -0
- package/dist/src/rtc/CallMetadata.d.ts +9 -0
- package/dist/src/rtc/Dispatcher.d.ts +9 -0
- package/dist/src/rtc/IceTrickleBuffer.d.ts +11 -0
- package/dist/src/rtc/callEventHandlers.d.ts +5 -0
- package/dist/src/rtc/codecs.d.ts +2 -0
- package/dist/src/rtc/helpers/iceCandidate.d.ts +2 -0
- package/dist/src/rtc/helpers/tracks.d.ts +3 -0
- package/dist/src/rtc/publisher.d.ts +53 -0
- package/dist/src/rtc/signal.d.ts +5 -0
- package/dist/src/rtc/subscriber.d.ts +7 -0
- package/dist/src/rtc/types.d.ts +84 -0
- package/dist/src/rtc/videoLayers.d.ts +17 -0
- package/dist/src/stats/coordinator-stats-reporter.d.ts +10 -0
- package/dist/src/stats/state-store-stats-reporter.d.ts +57 -0
- package/dist/src/stats/types.d.ts +42 -0
- package/dist/src/store/index.d.ts +2 -0
- package/dist/src/store/rxUtils.d.ts +18 -0
- package/dist/src/store/stateStore.d.ts +182 -0
- package/generate-openapi.sh +32 -0
- package/index.ts +31 -0
- package/openapitools.json +7 -0
- package/package.json +54 -0
- package/rollup.config.mjs +48 -0
- package/src/Batcher.ts +43 -0
- package/src/CallDropScheduler.ts +192 -0
- package/src/StreamSfuClient.ts +185 -0
- package/src/StreamVideoClient.ts +503 -0
- package/src/__tests__/StreamVideoClient.test.ts +83 -0
- package/src/config/defaultConfigs.ts +15 -0
- package/src/config/types.ts +30 -0
- package/src/coordinator/StreamCoordinatorClient.ts +115 -0
- package/src/coordinator/connection/base64.ts +80 -0
- package/src/coordinator/connection/client.ts +814 -0
- package/src/coordinator/connection/connection.ts +750 -0
- package/src/coordinator/connection/connection_fallback.ts +239 -0
- package/src/coordinator/connection/errors.ts +70 -0
- package/src/coordinator/connection/events.ts +13 -0
- package/src/coordinator/connection/insights.ts +88 -0
- package/src/coordinator/connection/signing.ts +104 -0
- package/src/coordinator/connection/token_manager.ts +160 -0
- package/src/coordinator/connection/types.ts +111 -0
- package/src/coordinator/connection/utils.ts +148 -0
- package/src/devices.ts +266 -0
- package/src/events/call.ts +166 -0
- package/src/events/internal.ts +47 -0
- package/src/events/participant.ts +97 -0
- package/src/events/speaker.ts +62 -0
- package/src/gen/coordinator/index.ts +1956 -0
- package/src/gen/google/protobuf/descriptor.ts +3466 -0
- package/src/gen/google/protobuf/duration.ts +232 -0
- package/src/gen/google/protobuf/struct.ts +481 -0
- package/src/gen/google/protobuf/timestamp.ts +291 -0
- package/src/gen/video/coordinator/broadcast_v1/broadcast.ts +154 -0
- package/src/gen/video/coordinator/call_v1/call.ts +651 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.ts +463 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.ts +3819 -0
- package/src/gen/video/coordinator/client_v1_rpc/envelopes.ts +424 -0
- package/src/gen/video/coordinator/client_v1_rpc/websocket.ts +719 -0
- package/src/gen/video/coordinator/edge_v1/edge.ts +532 -0
- package/src/gen/video/coordinator/event_v1/event.ts +1171 -0
- package/src/gen/video/coordinator/geofence_v1/geofence.ts +128 -0
- package/src/gen/video/coordinator/member_v1/member.ts +138 -0
- package/src/gen/video/coordinator/participant_v1/participant.ts +261 -0
- package/src/gen/video/coordinator/push_v1/push.ts +651 -0
- package/src/gen/video/coordinator/stat_v1/stat.ts +656 -0
- package/src/gen/video/coordinator/user_v1/user.ts +277 -0
- package/src/gen/video/coordinator/utils_v1/utils.ts +98 -0
- package/src/gen/video/sfu/event/events.ts +1962 -0
- package/src/gen/video/sfu/models/models.ts +1062 -0
- package/src/gen/video/sfu/signal_rpc/signal.client.ts +108 -0
- package/src/gen/video/sfu/signal_rpc/signal.ts +906 -0
- package/src/helpers/browsers.ts +13 -0
- package/src/helpers/sound-detector.ts +85 -0
- package/src/rpc/createClient.ts +50 -0
- package/src/rpc/index.ts +2 -0
- package/src/rpc/latency.ts +43 -0
- package/src/rtc/Call.ts +585 -0
- package/src/rtc/CallMetadata.ts +24 -0
- package/src/rtc/Dispatcher.ts +46 -0
- package/src/rtc/IceTrickleBuffer.ts +21 -0
- package/src/rtc/callEventHandlers.ts +37 -0
- package/src/rtc/codecs.ts +61 -0
- package/src/rtc/helpers/iceCandidate.ts +16 -0
- package/src/rtc/helpers/tracks.ts +18 -0
- package/src/rtc/publisher.ts +305 -0
- package/src/rtc/signal.ts +34 -0
- package/src/rtc/subscriber.ts +85 -0
- package/src/rtc/types.ts +105 -0
- package/src/rtc/videoLayers.ts +103 -0
- package/src/stats/coordinator-stats-reporter.ts +167 -0
- package/src/stats/state-store-stats-reporter.ts +364 -0
- package/src/stats/types.ts +46 -0
- package/src/store/index.ts +2 -0
- package/src/store/rxUtils.ts +42 -0
- package/src/store/stateStore.ts +341 -0
- package/tsconfig.json +25 -0
- package/typedoc.json +11 -0
- package/vite.config.ts +11 -0
|
@@ -0,0 +1,1177 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/stats/state-store-stats-reporter.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/stats</a> state-store-stats-reporter.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">27.74% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>101/364</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/0</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/5</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">27.74% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>101/364</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
431
|
+
<span class="cline-any cline-yes">1x</span>
|
|
432
|
+
<span class="cline-any cline-yes">1x</span>
|
|
433
|
+
<span class="cline-any cline-yes">1x</span>
|
|
434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
435
|
+
<span class="cline-any cline-yes">1x</span>
|
|
436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
437
|
+
<span class="cline-any cline-yes">1x</span>
|
|
438
|
+
<span class="cline-any cline-yes">1x</span>
|
|
439
|
+
<span class="cline-any cline-yes">1x</span>
|
|
440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
441
|
+
<span class="cline-any cline-yes">1x</span>
|
|
442
|
+
<span class="cline-any cline-yes">1x</span>
|
|
443
|
+
<span class="cline-any cline-yes">1x</span>
|
|
444
|
+
<span class="cline-any cline-yes">1x</span>
|
|
445
|
+
<span class="cline-any cline-yes">1x</span>
|
|
446
|
+
<span class="cline-any cline-yes">1x</span>
|
|
447
|
+
<span class="cline-any cline-yes">1x</span>
|
|
448
|
+
<span class="cline-any cline-yes">1x</span>
|
|
449
|
+
<span class="cline-any cline-yes">1x</span>
|
|
450
|
+
<span class="cline-any cline-yes">1x</span>
|
|
451
|
+
<span class="cline-any cline-yes">1x</span>
|
|
452
|
+
<span class="cline-any cline-yes">1x</span>
|
|
453
|
+
<span class="cline-any cline-yes">1x</span>
|
|
454
|
+
<span class="cline-any cline-yes">1x</span>
|
|
455
|
+
<span class="cline-any cline-yes">1x</span>
|
|
456
|
+
<span class="cline-any cline-yes">1x</span>
|
|
457
|
+
<span class="cline-any cline-yes">1x</span>
|
|
458
|
+
<span class="cline-any cline-yes">1x</span>
|
|
459
|
+
<span class="cline-any cline-yes">1x</span>
|
|
460
|
+
<span class="cline-any cline-yes">1x</span>
|
|
461
|
+
<span class="cline-any cline-yes">1x</span>
|
|
462
|
+
<span class="cline-any cline-yes">1x</span>
|
|
463
|
+
<span class="cline-any cline-yes">1x</span>
|
|
464
|
+
<span class="cline-any cline-yes">1x</span>
|
|
465
|
+
<span class="cline-any cline-yes">1x</span>
|
|
466
|
+
<span class="cline-any cline-yes">1x</span>
|
|
467
|
+
<span class="cline-any cline-yes">1x</span>
|
|
468
|
+
<span class="cline-any cline-yes">1x</span>
|
|
469
|
+
<span class="cline-any cline-yes">1x</span>
|
|
470
|
+
<span class="cline-any cline-yes">1x</span>
|
|
471
|
+
<span class="cline-any cline-yes">1x</span>
|
|
472
|
+
<span class="cline-any cline-yes">1x</span>
|
|
473
|
+
<span class="cline-any cline-yes">1x</span>
|
|
474
|
+
<span class="cline-any cline-yes">1x</span>
|
|
475
|
+
<span class="cline-any cline-yes">1x</span>
|
|
476
|
+
<span class="cline-any cline-yes">1x</span>
|
|
477
|
+
<span class="cline-any cline-yes">1x</span>
|
|
478
|
+
<span class="cline-any cline-yes">1x</span>
|
|
479
|
+
<span class="cline-any cline-yes">1x</span>
|
|
480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
481
|
+
<span class="cline-any cline-yes">1x</span>
|
|
482
|
+
<span class="cline-any cline-yes">1x</span>
|
|
483
|
+
<span class="cline-any cline-yes">1x</span>
|
|
484
|
+
<span class="cline-any cline-yes">1x</span>
|
|
485
|
+
<span class="cline-any cline-yes">1x</span>
|
|
486
|
+
<span class="cline-any cline-yes">1x</span>
|
|
487
|
+
<span class="cline-any cline-yes">1x</span>
|
|
488
|
+
<span class="cline-any cline-yes">1x</span>
|
|
489
|
+
<span class="cline-any cline-yes">1x</span>
|
|
490
|
+
<span class="cline-any cline-yes">1x</span>
|
|
491
|
+
<span class="cline-any cline-yes">1x</span>
|
|
492
|
+
<span class="cline-any cline-yes">1x</span>
|
|
493
|
+
<span class="cline-any cline-yes">1x</span>
|
|
494
|
+
<span class="cline-any cline-yes">1x</span>
|
|
495
|
+
<span class="cline-any cline-yes">1x</span>
|
|
496
|
+
<span class="cline-any cline-no"> </span>
|
|
497
|
+
<span class="cline-any cline-no"> </span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-no"> </span>
|
|
500
|
+
<span class="cline-any cline-no"> </span>
|
|
501
|
+
<span class="cline-any cline-no"> </span>
|
|
502
|
+
<span class="cline-any cline-no"> </span>
|
|
503
|
+
<span class="cline-any cline-no"> </span>
|
|
504
|
+
<span class="cline-any cline-no"> </span>
|
|
505
|
+
<span class="cline-any cline-no"> </span>
|
|
506
|
+
<span class="cline-any cline-no"> </span>
|
|
507
|
+
<span class="cline-any cline-no"> </span>
|
|
508
|
+
<span class="cline-any cline-no"> </span>
|
|
509
|
+
<span class="cline-any cline-no"> </span>
|
|
510
|
+
<span class="cline-any cline-no"> </span>
|
|
511
|
+
<span class="cline-any cline-no"> </span>
|
|
512
|
+
<span class="cline-any cline-no"> </span>
|
|
513
|
+
<span class="cline-any cline-no"> </span>
|
|
514
|
+
<span class="cline-any cline-no"> </span>
|
|
515
|
+
<span class="cline-any cline-no"> </span>
|
|
516
|
+
<span class="cline-any cline-no"> </span>
|
|
517
|
+
<span class="cline-any cline-no"> </span>
|
|
518
|
+
<span class="cline-any cline-no"> </span>
|
|
519
|
+
<span class="cline-any cline-no"> </span>
|
|
520
|
+
<span class="cline-any cline-no"> </span>
|
|
521
|
+
<span class="cline-any cline-no"> </span>
|
|
522
|
+
<span class="cline-any cline-no"> </span>
|
|
523
|
+
<span class="cline-any cline-no"> </span>
|
|
524
|
+
<span class="cline-any cline-no"> </span>
|
|
525
|
+
<span class="cline-any cline-no"> </span>
|
|
526
|
+
<span class="cline-any cline-no"> </span>
|
|
527
|
+
<span class="cline-any cline-no"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-no"> </span>
|
|
530
|
+
<span class="cline-any cline-no"> </span>
|
|
531
|
+
<span class="cline-any cline-no"> </span>
|
|
532
|
+
<span class="cline-any cline-no"> </span>
|
|
533
|
+
<span class="cline-any cline-no"> </span>
|
|
534
|
+
<span class="cline-any cline-no"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-no"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </span>
|
|
538
|
+
<span class="cline-any cline-no"> </span>
|
|
539
|
+
<span class="cline-any cline-no"> </span>
|
|
540
|
+
<span class="cline-any cline-no"> </span>
|
|
541
|
+
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-no"> </span>
|
|
543
|
+
<span class="cline-any cline-no"> </span>
|
|
544
|
+
<span class="cline-any cline-no"> </span>
|
|
545
|
+
<span class="cline-any cline-no"> </span>
|
|
546
|
+
<span class="cline-any cline-no"> </span>
|
|
547
|
+
<span class="cline-any cline-no"> </span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-no"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-no"> </span>
|
|
556
|
+
<span class="cline-any cline-no"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-no"> </span>
|
|
559
|
+
<span class="cline-any cline-no"> </span>
|
|
560
|
+
<span class="cline-any cline-no"> </span>
|
|
561
|
+
<span class="cline-any cline-no"> </span>
|
|
562
|
+
<span class="cline-any cline-no"> </span>
|
|
563
|
+
<span class="cline-any cline-no"> </span>
|
|
564
|
+
<span class="cline-any cline-no"> </span>
|
|
565
|
+
<span class="cline-any cline-no"> </span>
|
|
566
|
+
<span class="cline-any cline-no"> </span>
|
|
567
|
+
<span class="cline-any cline-no"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-no"> </span>
|
|
570
|
+
<span class="cline-any cline-no"> </span>
|
|
571
|
+
<span class="cline-any cline-no"> </span>
|
|
572
|
+
<span class="cline-any cline-no"> </span>
|
|
573
|
+
<span class="cline-any cline-no"> </span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </span>
|
|
581
|
+
<span class="cline-any cline-no"> </span>
|
|
582
|
+
<span class="cline-any cline-no"> </span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-no"> </span>
|
|
586
|
+
<span class="cline-any cline-no"> </span>
|
|
587
|
+
<span class="cline-any cline-no"> </span>
|
|
588
|
+
<span class="cline-any cline-no"> </span>
|
|
589
|
+
<span class="cline-any cline-no"> </span>
|
|
590
|
+
<span class="cline-any cline-no"> </span>
|
|
591
|
+
<span class="cline-any cline-no"> </span>
|
|
592
|
+
<span class="cline-any cline-no"> </span>
|
|
593
|
+
<span class="cline-any cline-no"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-no"> </span>
|
|
596
|
+
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-no"> </span>
|
|
598
|
+
<span class="cline-any cline-no"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-no"> </span>
|
|
606
|
+
<span class="cline-any cline-no"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
609
|
+
<span class="cline-any cline-no"> </span>
|
|
610
|
+
<span class="cline-any cline-no"> </span>
|
|
611
|
+
<span class="cline-any cline-no"> </span>
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
613
|
+
<span class="cline-any cline-no"> </span>
|
|
614
|
+
<span class="cline-any cline-no"> </span>
|
|
615
|
+
<span class="cline-any cline-no"> </span>
|
|
616
|
+
<span class="cline-any cline-no"> </span>
|
|
617
|
+
<span class="cline-any cline-no"> </span>
|
|
618
|
+
<span class="cline-any cline-no"> </span>
|
|
619
|
+
<span class="cline-any cline-no"> </span>
|
|
620
|
+
<span class="cline-any cline-no"> </span>
|
|
621
|
+
<span class="cline-any cline-no"> </span>
|
|
622
|
+
<span class="cline-any cline-no"> </span>
|
|
623
|
+
<span class="cline-any cline-no"> </span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-no"> </span>
|
|
626
|
+
<span class="cline-any cline-no"> </span>
|
|
627
|
+
<span class="cline-any cline-no"> </span>
|
|
628
|
+
<span class="cline-any cline-no"> </span>
|
|
629
|
+
<span class="cline-any cline-no"> </span>
|
|
630
|
+
<span class="cline-any cline-no"> </span>
|
|
631
|
+
<span class="cline-any cline-no"> </span>
|
|
632
|
+
<span class="cline-any cline-no"> </span>
|
|
633
|
+
<span class="cline-any cline-no"> </span>
|
|
634
|
+
<span class="cline-any cline-no"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-no"> </span>
|
|
637
|
+
<span class="cline-any cline-no"> </span>
|
|
638
|
+
<span class="cline-any cline-no"> </span>
|
|
639
|
+
<span class="cline-any cline-yes">1x</span>
|
|
640
|
+
<span class="cline-any cline-yes">1x</span>
|
|
641
|
+
<span class="cline-any cline-yes">1x</span>
|
|
642
|
+
<span class="cline-any cline-yes">1x</span>
|
|
643
|
+
<span class="cline-any cline-yes">1x</span>
|
|
644
|
+
<span class="cline-any cline-yes">1x</span>
|
|
645
|
+
<span class="cline-any cline-yes">1x</span>
|
|
646
|
+
<span class="cline-any cline-yes">1x</span>
|
|
647
|
+
<span class="cline-any cline-yes">1x</span>
|
|
648
|
+
<span class="cline-any cline-yes">1x</span>
|
|
649
|
+
<span class="cline-any cline-yes">1x</span>
|
|
650
|
+
<span class="cline-any cline-yes">1x</span>
|
|
651
|
+
<span class="cline-any cline-yes">1x</span>
|
|
652
|
+
<span class="cline-any cline-yes">1x</span>
|
|
653
|
+
<span class="cline-any cline-yes">1x</span>
|
|
654
|
+
<span class="cline-any cline-yes">1x</span>
|
|
655
|
+
<span class="cline-any cline-yes">1x</span>
|
|
656
|
+
<span class="cline-any cline-yes">1x</span>
|
|
657
|
+
<span class="cline-any cline-yes">1x</span>
|
|
658
|
+
<span class="cline-any cline-yes">1x</span>
|
|
659
|
+
<span class="cline-any cline-yes">1x</span>
|
|
660
|
+
<span class="cline-any cline-no"> </span>
|
|
661
|
+
<span class="cline-any cline-no"> </span>
|
|
662
|
+
<span class="cline-any cline-no"> </span>
|
|
663
|
+
<span class="cline-any cline-no"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-no"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-no"> </span>
|
|
669
|
+
<span class="cline-any cline-no"> </span>
|
|
670
|
+
<span class="cline-any cline-no"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-no"> </span>
|
|
674
|
+
<span class="cline-any cline-no"> </span>
|
|
675
|
+
<span class="cline-any cline-no"> </span>
|
|
676
|
+
<span class="cline-any cline-no"> </span>
|
|
677
|
+
<span class="cline-any cline-no"> </span>
|
|
678
|
+
<span class="cline-any cline-no"> </span>
|
|
679
|
+
<span class="cline-any cline-no"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
681
|
+
<span class="cline-any cline-no"> </span>
|
|
682
|
+
<span class="cline-any cline-no"> </span>
|
|
683
|
+
<span class="cline-any cline-no"> </span>
|
|
684
|
+
<span class="cline-any cline-no"> </span>
|
|
685
|
+
<span class="cline-any cline-no"> </span>
|
|
686
|
+
<span class="cline-any cline-no"> </span>
|
|
687
|
+
<span class="cline-any cline-no"> </span>
|
|
688
|
+
<span class="cline-any cline-no"> </span>
|
|
689
|
+
<span class="cline-any cline-no"> </span>
|
|
690
|
+
<span class="cline-any cline-no"> </span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-no"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-no"> </span>
|
|
695
|
+
<span class="cline-any cline-no"> </span>
|
|
696
|
+
<span class="cline-any cline-no"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-no"> </span>
|
|
701
|
+
<span class="cline-any cline-no"> </span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
704
|
+
<span class="cline-any cline-no"> </span>
|
|
705
|
+
<span class="cline-any cline-no"> </span>
|
|
706
|
+
<span class="cline-any cline-no"> </span>
|
|
707
|
+
<span class="cline-any cline-no"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-yes">1x</span>
|
|
717
|
+
<span class="cline-any cline-yes">1x</span>
|
|
718
|
+
<span class="cline-any cline-yes">1x</span>
|
|
719
|
+
<span class="cline-any cline-yes">1x</span>
|
|
720
|
+
<span class="cline-any cline-yes">1x</span>
|
|
721
|
+
<span class="cline-any cline-yes">1x</span>
|
|
722
|
+
<span class="cline-any cline-yes">1x</span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-no"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-no"> </span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-no"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-no"> </span>
|
|
754
|
+
<span class="cline-any cline-no"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-no"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-no"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-no"> </span>
|
|
770
|
+
<span class="cline-any cline-no"> </span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-no"> </span>
|
|
775
|
+
<span class="cline-any cline-no"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-no"> </span>
|
|
778
|
+
<span class="cline-any cline-no"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-yes">1x</span>
|
|
782
|
+
<span class="cline-any cline-yes">1x</span>
|
|
783
|
+
<span class="cline-any cline-yes">1x</span>
|
|
784
|
+
<span class="cline-any cline-yes">1x</span>
|
|
785
|
+
<span class="cline-any cline-yes">1x</span>
|
|
786
|
+
<span class="cline-any cline-yes">1x</span>
|
|
787
|
+
<span class="cline-any cline-yes">1x</span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-no"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-no"> </span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type {
|
|
795
|
+
AggregatedStatsReport,
|
|
796
|
+
BaseStats,
|
|
797
|
+
CallStatsReport,
|
|
798
|
+
ParticipantsStatsReport,
|
|
799
|
+
StatsReport,
|
|
800
|
+
} from './types';
|
|
801
|
+
import { StreamVideoWriteableStateStore } from '../store';
|
|
802
|
+
import { Publisher } from '../rtc/publisher';
|
|
803
|
+
|
|
804
|
+
export type StatsReporterOpts = {
|
|
805
|
+
subscriber: RTCPeerConnection;
|
|
806
|
+
publisher: Publisher;
|
|
807
|
+
store: StreamVideoWriteableStateStore;
|
|
808
|
+
pollingIntervalInMs?: number;
|
|
809
|
+
edgeName?: string;
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
export type StatsReporter = {
|
|
813
|
+
/**
|
|
814
|
+
* Will turn on stats reporting for a given sessionId.
|
|
815
|
+
*
|
|
816
|
+
* @param sessionId the session id.
|
|
817
|
+
*/
|
|
818
|
+
startReportingStatsFor: (sessionId: string) => void;
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Will turn off stats reporting for a given sessionId.
|
|
822
|
+
*
|
|
823
|
+
* @param sessionId the session id.
|
|
824
|
+
*/
|
|
825
|
+
stopReportingStatsFor: (sessionId: string) => void;
|
|
826
|
+
|
|
827
|
+
/**
|
|
828
|
+
* Helper method for retrieving stats for a given peer connection kind
|
|
829
|
+
* and media stream flowing through it.
|
|
830
|
+
*
|
|
831
|
+
* @param kind the peer connection kind (subscriber or publisher).
|
|
832
|
+
* @param mediaStream the media stream.
|
|
833
|
+
*/
|
|
834
|
+
getStatsForStream: (
|
|
835
|
+
kind: 'subscriber' | 'publisher',
|
|
836
|
+
mediaStream: MediaStream,
|
|
837
|
+
) => Promise<StatsReport[]>;
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* Helper method for retrieving raw stats for a given peer connection kind.
|
|
841
|
+
*
|
|
842
|
+
* @param kind the peer connection kind (subscriber or publisher).
|
|
843
|
+
* @param selector the track selector. If not provided, stats for all tracks will be returned.
|
|
844
|
+
*/
|
|
845
|
+
getRawStatsForTrack: (
|
|
846
|
+
kind: 'subscriber' | 'publisher',
|
|
847
|
+
selector?: MediaStreamTrack,
|
|
848
|
+
) => Promise<RTCStatsReport | undefined>;
|
|
849
|
+
|
|
850
|
+
/**
|
|
851
|
+
* Stops the stats reporter and releases all resources.
|
|
852
|
+
*/
|
|
853
|
+
stop: () => void;
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* Creates a new StatsReporter instance that collects metrics about the ongoing call and reports them to the state store
|
|
858
|
+
*/
|
|
859
|
+
export const createStatsReporter = (<span class="fstat-no" title="function not covered" >{</span>
|
|
860
|
+
<span class="cstat-no" title="statement not covered" > subscriber,</span>
|
|
861
|
+
<span class="cstat-no" title="statement not covered" > publisher,</span>
|
|
862
|
+
<span class="cstat-no" title="statement not covered" > store,</span>
|
|
863
|
+
<span class="cstat-no" title="statement not covered" > edgeName,</span>
|
|
864
|
+
<span class="cstat-no" title="statement not covered" > pollingIntervalInMs = 2000,</span>
|
|
865
|
+
<span class="cstat-no" title="statement not covered" >}: StatsReporterOpts): StatsReporter => {</span>
|
|
866
|
+
<span class="cstat-no" title="statement not covered" > const getRawStatsForTrack = async (</span>
|
|
867
|
+
<span class="cstat-no" title="statement not covered" > kind: 'subscriber' | 'publisher',</span>
|
|
868
|
+
<span class="cstat-no" title="statement not covered" > selector?: MediaStreamTrack,</span>
|
|
869
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
870
|
+
<span class="cstat-no" title="statement not covered" > if (kind === 'subscriber' && subscriber) {</span>
|
|
871
|
+
<span class="cstat-no" title="statement not covered" > return subscriber.getStats(selector);</span>
|
|
872
|
+
<span class="cstat-no" title="statement not covered" > } else if (kind === 'publisher' && publisher) {</span>
|
|
873
|
+
<span class="cstat-no" title="statement not covered" > return publisher.getStats(selector);</span>
|
|
874
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
875
|
+
<span class="cstat-no" title="statement not covered" > console.warn(`Can't retrieve RTC stats for`, kind);</span>
|
|
876
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
877
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
878
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
879
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
880
|
+
<span class="cstat-no" title="statement not covered" > const getStatsForStream = async (</span>
|
|
881
|
+
<span class="cstat-no" title="statement not covered" > kind: 'subscriber' | 'publisher',</span>
|
|
882
|
+
<span class="cstat-no" title="statement not covered" > mediaStream: MediaStream,</span>
|
|
883
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
884
|
+
<span class="cstat-no" title="statement not covered" > const pc = kind === 'subscriber' ? subscriber : publisher;</span>
|
|
885
|
+
<span class="cstat-no" title="statement not covered" > const statsForStream: StatsReport[] = [];</span>
|
|
886
|
+
<span class="cstat-no" title="statement not covered" > for (let track of mediaStream.getTracks()) {</span>
|
|
887
|
+
<span class="cstat-no" title="statement not covered" > const report = await pc.getStats(track);</span>
|
|
888
|
+
<span class="cstat-no" title="statement not covered" > const stats = transform(report, {</span>
|
|
889
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
890
|
+
<span class="cstat-no" title="statement not covered" > trackKind: track.kind,</span>
|
|
891
|
+
<span class="cstat-no" title="statement not covered" > kind,</span>
|
|
892
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
893
|
+
<span class="cstat-no" title="statement not covered" > statsForStream.push(stats);</span>
|
|
894
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
895
|
+
<span class="cstat-no" title="statement not covered" > return statsForStream;</span>
|
|
896
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
897
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
898
|
+
<span class="cstat-no" title="statement not covered" > const startReportingStatsFor = (sessionId: string) => {</span>
|
|
899
|
+
<span class="cstat-no" title="statement not covered" > sessionIdsToTrack.add(sessionId);</span>
|
|
900
|
+
<span class="cstat-no" title="statement not covered" > void run();</span>
|
|
901
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
902
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
903
|
+
<span class="cstat-no" title="statement not covered" > const stopReportingStatsFor = (sessionId: string) => {</span>
|
|
904
|
+
<span class="cstat-no" title="statement not covered" > sessionIdsToTrack.delete(sessionId);</span>
|
|
905
|
+
<span class="cstat-no" title="statement not covered" > void run();</span>
|
|
906
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
907
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
908
|
+
<span class="cstat-no" title="statement not covered" > const sessionIdsToTrack = new Set<string>();</span>
|
|
909
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
910
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
911
|
+
<span class="cstat-no" title="statement not covered" > * The main stats reporting loop.</span>
|
|
912
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
913
|
+
<span class="cstat-no" title="statement not covered" > const run = async () => {</span>
|
|
914
|
+
<span class="cstat-no" title="statement not covered" > const participants = store.getCurrentValue(store.participantsSubject);</span>
|
|
915
|
+
<span class="cstat-no" title="statement not covered" > const participantStats: ParticipantsStatsReport = {};</span>
|
|
916
|
+
<span class="cstat-no" title="statement not covered" > const sessionIds = new Set(sessionIdsToTrack);</span>
|
|
917
|
+
<span class="cstat-no" title="statement not covered" > if (sessionIds.size > 0) {</span>
|
|
918
|
+
<span class="cstat-no" title="statement not covered" > for (let participant of participants) {</span>
|
|
919
|
+
<span class="cstat-no" title="statement not covered" > if (!sessionIds.has(participant.sessionId)) continue;</span>
|
|
920
|
+
<span class="cstat-no" title="statement not covered" > const kind = participant.isLoggedInUser ? 'publisher' : 'subscriber';</span>
|
|
921
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
922
|
+
<span class="cstat-no" title="statement not covered" > const mergedStream = new MediaStream([</span>
|
|
923
|
+
<span class="cstat-no" title="statement not covered" > ...(participant.videoStream?.getVideoTracks() || []),</span>
|
|
924
|
+
<span class="cstat-no" title="statement not covered" > ...(participant.audioStream?.getAudioTracks() || []),</span>
|
|
925
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
926
|
+
<span class="cstat-no" title="statement not covered" > participantStats[participant.sessionId] = await getStatsForStream(</span>
|
|
927
|
+
<span class="cstat-no" title="statement not covered" > kind,</span>
|
|
928
|
+
<span class="cstat-no" title="statement not covered" > mergedStream,</span>
|
|
929
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
930
|
+
<span class="cstat-no" title="statement not covered" > mergedStream.getTracks().forEach((t) => {</span>
|
|
931
|
+
<span class="cstat-no" title="statement not covered" > mergedStream.removeTrack(t);</span>
|
|
932
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
933
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
934
|
+
<span class="cstat-no" title="statement not covered" > console.error(`Failed to collect stats for ${kind}`, participant, e);</span>
|
|
935
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
936
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
937
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
938
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
939
|
+
<span class="cstat-no" title="statement not covered" > const [subscriberStats, publisherStats] = await Promise.all([</span>
|
|
940
|
+
<span class="cstat-no" title="statement not covered" > subscriber</span>
|
|
941
|
+
<span class="cstat-no" title="statement not covered" > .getStats()</span>
|
|
942
|
+
<span class="cstat-no" title="statement not covered" > .then((report) =></span>
|
|
943
|
+
<span class="cstat-no" title="statement not covered" > transform(report, {</span>
|
|
944
|
+
<span class="cstat-no" title="statement not covered" > kind: 'subscriber',</span>
|
|
945
|
+
<span class="cstat-no" title="statement not covered" > trackKind: 'video',</span>
|
|
946
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
947
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
948
|
+
<span class="cstat-no" title="statement not covered" > .then(aggregate),</span>
|
|
949
|
+
<span class="cstat-no" title="statement not covered" > publisher</span>
|
|
950
|
+
<span class="cstat-no" title="statement not covered" > .getStats()</span>
|
|
951
|
+
<span class="cstat-no" title="statement not covered" > .then((report) =></span>
|
|
952
|
+
<span class="cstat-no" title="statement not covered" > transform(report, {</span>
|
|
953
|
+
<span class="cstat-no" title="statement not covered" > kind: 'publisher',</span>
|
|
954
|
+
<span class="cstat-no" title="statement not covered" > trackKind: 'video',</span>
|
|
955
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
956
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
957
|
+
<span class="cstat-no" title="statement not covered" > .then(aggregate),</span>
|
|
958
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
959
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
960
|
+
<span class="cstat-no" title="statement not covered" > const [subscriberRawStats, publisherRawStats] = await Promise.all([</span>
|
|
961
|
+
<span class="cstat-no" title="statement not covered" > getRawStatsForTrack('subscriber'),</span>
|
|
962
|
+
<span class="cstat-no" title="statement not covered" > getRawStatsForTrack('publisher'),</span>
|
|
963
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
964
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
965
|
+
<span class="cstat-no" title="statement not covered" > const statsReport: CallStatsReport = {</span>
|
|
966
|
+
<span class="cstat-no" title="statement not covered" > datacenter: edgeName || 'N/A',</span>
|
|
967
|
+
<span class="cstat-no" title="statement not covered" > publisherStats,</span>
|
|
968
|
+
<span class="cstat-no" title="statement not covered" > subscriberStats,</span>
|
|
969
|
+
<span class="cstat-no" title="statement not covered" > subscriberRawStats,</span>
|
|
970
|
+
<span class="cstat-no" title="statement not covered" > publisherRawStats,</span>
|
|
971
|
+
<span class="cstat-no" title="statement not covered" > participants: participantStats,</span>
|
|
972
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
973
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
974
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
975
|
+
<span class="cstat-no" title="statement not covered" > store.setCurrentValue(store.callStatsReportSubject, statsReport);</span>
|
|
976
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
977
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
978
|
+
<span class="cstat-no" title="statement not covered" > let timeoutId: NodeJS.Timeout | undefined;</span>
|
|
979
|
+
<span class="cstat-no" title="statement not covered" > if (pollingIntervalInMs > 0) {</span>
|
|
980
|
+
<span class="cstat-no" title="statement not covered" > const loop = async () => {</span>
|
|
981
|
+
<span class="cstat-no" title="statement not covered" > await run().catch((e) => {</span>
|
|
982
|
+
<span class="cstat-no" title="statement not covered" > console.log('Failed to collect stats', e);</span>
|
|
983
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
984
|
+
<span class="cstat-no" title="statement not covered" > timeoutId = setTimeout(loop, pollingIntervalInMs);</span>
|
|
985
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
986
|
+
<span class="cstat-no" title="statement not covered" > void loop();</span>
|
|
987
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
988
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
989
|
+
<span class="cstat-no" title="statement not covered" > const stop = () => {</span>
|
|
990
|
+
<span class="cstat-no" title="statement not covered" > if (timeoutId) {</span>
|
|
991
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(timeoutId);</span>
|
|
992
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
993
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
994
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
995
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
996
|
+
<span class="cstat-no" title="statement not covered" > getRawStatsForTrack,</span>
|
|
997
|
+
<span class="cstat-no" title="statement not covered" > getStatsForStream,</span>
|
|
998
|
+
<span class="cstat-no" title="statement not covered" > startReportingStatsFor,</span>
|
|
999
|
+
<span class="cstat-no" title="statement not covered" > stopReportingStatsFor,</span>
|
|
1000
|
+
<span class="cstat-no" title="statement not covered" > stop,</span>
|
|
1001
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1002
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >};</span></span>
|
|
1003
|
+
|
|
1004
|
+
export type StatsTransformOpts = {
|
|
1005
|
+
/**
|
|
1006
|
+
* The kind of track we are transforming stats for.
|
|
1007
|
+
*/
|
|
1008
|
+
trackKind: 'audio' | 'video';
|
|
1009
|
+
|
|
1010
|
+
/**
|
|
1011
|
+
* The kind of peer connection we are transforming stats for.
|
|
1012
|
+
*/
|
|
1013
|
+
kind: 'subscriber' | 'publisher';
|
|
1014
|
+
};
|
|
1015
|
+
|
|
1016
|
+
/**
|
|
1017
|
+
* Transforms raw RTC stats into a slimmer and uniform across browsers format.
|
|
1018
|
+
*
|
|
1019
|
+
* @param report the report to transform.
|
|
1020
|
+
* @param opts the transform options.
|
|
1021
|
+
*/
|
|
1022
|
+
const transform = (
|
|
1023
|
+
<span class="fstat-no" title="function not covered" > report: RTCStatsReport,</span>
|
|
1024
|
+
<span class="cstat-no" title="statement not covered" > opts: StatsTransformOpts,</span>
|
|
1025
|
+
<span class="cstat-no" title="statement not covered" >): StatsReport => {</span>
|
|
1026
|
+
<span class="cstat-no" title="statement not covered" > const { trackKind, kind } = opts;</span>
|
|
1027
|
+
<span class="cstat-no" title="statement not covered" > const direction = kind === 'subscriber' ? 'inbound-rtp' : 'outbound-rtp';</span>
|
|
1028
|
+
<span class="cstat-no" title="statement not covered" > const stats = flatten(report);</span>
|
|
1029
|
+
<span class="cstat-no" title="statement not covered" > const streams = stats</span>
|
|
1030
|
+
<span class="cstat-no" title="statement not covered" > .filter(</span>
|
|
1031
|
+
<span class="cstat-no" title="statement not covered" > (stat) =></span>
|
|
1032
|
+
<span class="cstat-no" title="statement not covered" > stat.type === direction &&</span>
|
|
1033
|
+
<span class="cstat-no" title="statement not covered" > (stat as RTCRtpStreamStats).kind === trackKind,</span>
|
|
1034
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
1035
|
+
<span class="cstat-no" title="statement not covered" > .map((stat): BaseStats => {</span>
|
|
1036
|
+
<span class="cstat-no" title="statement not covered" > const rtcStreamStats = stat as RTCInboundRtpStreamStats &</span>
|
|
1037
|
+
<span class="cstat-no" title="statement not covered" > RTCOutboundRtpStreamStats;</span>
|
|
1038
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1039
|
+
<span class="cstat-no" title="statement not covered" > const codec = stats.find(</span>
|
|
1040
|
+
<span class="cstat-no" title="statement not covered" > (s) => s.type === 'codec' && s.id === rtcStreamStats.codecId,</span>
|
|
1041
|
+
<span class="cstat-no" title="statement not covered" > ) as { mimeType: string } | undefined; // FIXME OL: incorrect type!</span>
|
|
1042
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1043
|
+
<span class="cstat-no" title="statement not covered" > const transport = stats.find(</span>
|
|
1044
|
+
<span class="cstat-no" title="statement not covered" > (s) => s.type === 'transport' && s.id === rtcStreamStats.transportId,</span>
|
|
1045
|
+
<span class="cstat-no" title="statement not covered" > ) as RTCTransportStats | undefined;</span>
|
|
1046
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1047
|
+
<span class="cstat-no" title="statement not covered" > let roundTripTime: number | undefined;</span>
|
|
1048
|
+
<span class="cstat-no" title="statement not covered" > if (transport && transport.dtlsState === 'connected') {</span>
|
|
1049
|
+
<span class="cstat-no" title="statement not covered" > const candidatePair = stats.find(</span>
|
|
1050
|
+
<span class="cstat-no" title="statement not covered" > (s) =></span>
|
|
1051
|
+
<span class="cstat-no" title="statement not covered" > s.type === 'candidate-pair' &&</span>
|
|
1052
|
+
<span class="cstat-no" title="statement not covered" > s.id === transport.selectedCandidatePairId,</span>
|
|
1053
|
+
<span class="cstat-no" title="statement not covered" > ) as RTCIceCandidatePairStats | undefined;</span>
|
|
1054
|
+
<span class="cstat-no" title="statement not covered" > roundTripTime = candidatePair?.currentRoundTripTime;</span>
|
|
1055
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1056
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1057
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1058
|
+
<span class="cstat-no" title="statement not covered" > bytesSent: rtcStreamStats.bytesSent,</span>
|
|
1059
|
+
<span class="cstat-no" title="statement not covered" > bytesReceived: rtcStreamStats.bytesReceived,</span>
|
|
1060
|
+
<span class="cstat-no" title="statement not covered" > codec: codec?.mimeType,</span>
|
|
1061
|
+
<span class="cstat-no" title="statement not covered" > currentRoundTripTime: roundTripTime,</span>
|
|
1062
|
+
<span class="cstat-no" title="statement not covered" > frameHeight: rtcStreamStats.frameHeight,</span>
|
|
1063
|
+
<span class="cstat-no" title="statement not covered" > frameWidth: rtcStreamStats.frameWidth,</span>
|
|
1064
|
+
<span class="cstat-no" title="statement not covered" > framesPerSecond: rtcStreamStats.framesPerSecond,</span>
|
|
1065
|
+
<span class="cstat-no" title="statement not covered" > jitter: rtcStreamStats.jitter,</span>
|
|
1066
|
+
<span class="cstat-no" title="statement not covered" > kind: rtcStreamStats.kind,</span>
|
|
1067
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore: available in Chrome only, TS doesn't recognize this</span>
|
|
1068
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReason: rtcStreamStats.qualityLimitationReason,</span>
|
|
1069
|
+
<span class="cstat-no" title="statement not covered" > rid: rtcStreamStats.rid,</span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > ssrc: rtcStreamStats.ssrc,</span>
|
|
1071
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1073
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1074
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1075
|
+
<span class="cstat-no" title="statement not covered" > rawStats: report,</span>
|
|
1076
|
+
<span class="cstat-no" title="statement not covered" > streams,</span>
|
|
1077
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
1078
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" >};</span>
|
|
1080
|
+
|
|
1081
|
+
/**
|
|
1082
|
+
* Aggregates generic stats.
|
|
1083
|
+
*
|
|
1084
|
+
* @param stats the stats to aggregate.
|
|
1085
|
+
*/
|
|
1086
|
+
const aggregate = (<span class="fstat-no" title="function not covered" >stats: StatsReport): AggregatedStatsReport => {</span>
|
|
1087
|
+
<span class="cstat-no" title="statement not covered" > const aggregatedStats: AggregatedStatsReport = {</span>
|
|
1088
|
+
<span class="cstat-no" title="statement not covered" > totalBytesSent: 0,</span>
|
|
1089
|
+
<span class="cstat-no" title="statement not covered" > totalBytesReceived: 0,</span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > averageJitterInMs: 0,</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > averageRoundTripTimeInMs: 0,</span>
|
|
1092
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReasons: 'none',</span>
|
|
1093
|
+
<span class="cstat-no" title="statement not covered" > highestFrameWidth: 0,</span>
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" > highestFrameHeight: 0,</span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" > highestFramesPerSecond: 0,</span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
1097
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1098
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1099
|
+
<span class="cstat-no" title="statement not covered" > let maxArea = -1;</span>
|
|
1100
|
+
<span class="cstat-no" title="statement not covered" > const area = (w: number, h: number) => w * h;</span>
|
|
1101
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1102
|
+
<span class="cstat-no" title="statement not covered" > const qualityLimitationReasons = new Set<string>();</span>
|
|
1103
|
+
<span class="cstat-no" title="statement not covered" > const streams = stats.streams;</span>
|
|
1104
|
+
<span class="cstat-no" title="statement not covered" > const report = streams.reduce((acc, stream) => {</span>
|
|
1105
|
+
<span class="cstat-no" title="statement not covered" > acc.totalBytesSent += stream.bytesSent || 0;</span>
|
|
1106
|
+
<span class="cstat-no" title="statement not covered" > acc.totalBytesReceived += stream.bytesReceived || 0;</span>
|
|
1107
|
+
<span class="cstat-no" title="statement not covered" > acc.averageJitterInMs += stream.jitter || 0;</span>
|
|
1108
|
+
<span class="cstat-no" title="statement not covered" > acc.averageRoundTripTimeInMs += stream.currentRoundTripTime || 0;</span>
|
|
1109
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1110
|
+
<span class="cstat-no" title="statement not covered" > // naive calculation of the highest resolution</span>
|
|
1111
|
+
<span class="cstat-no" title="statement not covered" > const streamArea = area(stream.frameWidth || 0, stream.frameHeight || 0);</span>
|
|
1112
|
+
<span class="cstat-no" title="statement not covered" > if (streamArea > maxArea) {</span>
|
|
1113
|
+
<span class="cstat-no" title="statement not covered" > acc.highestFrameWidth = stream.frameWidth || 0;</span>
|
|
1114
|
+
<span class="cstat-no" title="statement not covered" > acc.highestFrameHeight = stream.frameHeight || 0;</span>
|
|
1115
|
+
<span class="cstat-no" title="statement not covered" > acc.highestFramesPerSecond = stream.framesPerSecond || 0;</span>
|
|
1116
|
+
<span class="cstat-no" title="statement not covered" > maxArea = streamArea;</span>
|
|
1117
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1118
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1119
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReasons.add(stream.qualityLimitationReason || '');</span>
|
|
1120
|
+
<span class="cstat-no" title="statement not covered" > return acc;</span>
|
|
1121
|
+
<span class="cstat-no" title="statement not covered" > }, aggregatedStats);</span>
|
|
1122
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1123
|
+
<span class="cstat-no" title="statement not covered" > if (streams.length > 0) {</span>
|
|
1124
|
+
<span class="cstat-no" title="statement not covered" > report.averageJitterInMs = Math.round(</span>
|
|
1125
|
+
<span class="cstat-no" title="statement not covered" > (report.averageJitterInMs / streams.length) * 1000,</span>
|
|
1126
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1127
|
+
<span class="cstat-no" title="statement not covered" > report.averageRoundTripTimeInMs = Math.round(</span>
|
|
1128
|
+
<span class="cstat-no" title="statement not covered" > (report.averageRoundTripTimeInMs / streams.length) * 1000,</span>
|
|
1129
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1130
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1131
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1132
|
+
<span class="cstat-no" title="statement not covered" > const qualityLimitationReason = [</span>
|
|
1133
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReasons.has('cpu') && 'cpu',</span>
|
|
1134
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReasons.has('bandwidth') && 'bandwidth',</span>
|
|
1135
|
+
<span class="cstat-no" title="statement not covered" > qualityLimitationReasons.has('other') && 'other',</span>
|
|
1136
|
+
<span class="cstat-no" title="statement not covered" > ]</span>
|
|
1137
|
+
<span class="cstat-no" title="statement not covered" > .filter(Boolean)</span>
|
|
1138
|
+
<span class="cstat-no" title="statement not covered" > .join(', ');</span>
|
|
1139
|
+
<span class="cstat-no" title="statement not covered" > if (qualityLimitationReason) {</span>
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > report.qualityLimitationReasons = qualityLimitationReason;</span>
|
|
1141
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1142
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1143
|
+
<span class="cstat-no" title="statement not covered" > return report;</span>
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" >};</span>
|
|
1145
|
+
|
|
1146
|
+
/**
|
|
1147
|
+
* Flatten the stats report into an array of stats objects.
|
|
1148
|
+
*
|
|
1149
|
+
* @param report the report to flatten.
|
|
1150
|
+
*/
|
|
1151
|
+
const flatten = (<span class="fstat-no" title="function not covered" >report: RTCStatsReport) => {</span>
|
|
1152
|
+
<span class="cstat-no" title="statement not covered" > const stats: RTCStats[] = [];</span>
|
|
1153
|
+
<span class="cstat-no" title="statement not covered" > report.forEach((s) => {</span>
|
|
1154
|
+
<span class="cstat-no" title="statement not covered" > stats.push(s);</span>
|
|
1155
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1156
|
+
<span class="cstat-no" title="statement not covered" > return stats;</span>
|
|
1157
|
+
<span class="cstat-no" title="statement not covered" >};</span>
|
|
1158
|
+
</pre></td></tr></table></pre>
|
|
1159
|
+
|
|
1160
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1161
|
+
</div><!-- /wrapper -->
|
|
1162
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1163
|
+
Code coverage generated by
|
|
1164
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1165
|
+
at 2023-02-09T16:25:50.250Z
|
|
1166
|
+
</div>
|
|
1167
|
+
<script src="../../prettify.js"></script>
|
|
1168
|
+
<script>
|
|
1169
|
+
window.onload = function () {
|
|
1170
|
+
prettyPrint();
|
|
1171
|
+
};
|
|
1172
|
+
</script>
|
|
1173
|
+
<script src="../../sorter.js"></script>
|
|
1174
|
+
<script src="../../block-navigation.js"></script>
|
|
1175
|
+
</body>
|
|
1176
|
+
</html>
|
|
1177
|
+
|