@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,1594 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/StreamVideoClient.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</a> StreamVideoClient.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">50.69% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>255/503</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'>4/4</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">21.05% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>4/19</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">50.69% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>255/503</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 medium'></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>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
570
|
+
<span class="cline-any cline-yes">1x</span>
|
|
571
|
+
<span class="cline-any cline-yes">1x</span>
|
|
572
|
+
<span class="cline-any cline-yes">1x</span>
|
|
573
|
+
<span class="cline-any cline-yes">1x</span>
|
|
574
|
+
<span class="cline-any cline-yes">1x</span>
|
|
575
|
+
<span class="cline-any cline-yes">1x</span>
|
|
576
|
+
<span class="cline-any cline-yes">1x</span>
|
|
577
|
+
<span class="cline-any cline-yes">1x</span>
|
|
578
|
+
<span class="cline-any cline-yes">1x</span>
|
|
579
|
+
<span class="cline-any cline-yes">1x</span>
|
|
580
|
+
<span class="cline-any cline-yes">1x</span>
|
|
581
|
+
<span class="cline-any cline-yes">1x</span>
|
|
582
|
+
<span class="cline-any cline-yes">1x</span>
|
|
583
|
+
<span class="cline-any cline-yes">1x</span>
|
|
584
|
+
<span class="cline-any cline-yes">1x</span>
|
|
585
|
+
<span class="cline-any cline-yes">1x</span>
|
|
586
|
+
<span class="cline-any cline-yes">1x</span>
|
|
587
|
+
<span class="cline-any cline-yes">1x</span>
|
|
588
|
+
<span class="cline-any cline-yes">1x</span>
|
|
589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
590
|
+
<span class="cline-any cline-yes">1x</span>
|
|
591
|
+
<span class="cline-any cline-yes">1x</span>
|
|
592
|
+
<span class="cline-any cline-yes">1x</span>
|
|
593
|
+
<span class="cline-any cline-yes">1x</span>
|
|
594
|
+
<span class="cline-any cline-yes">1x</span>
|
|
595
|
+
<span class="cline-any cline-yes">1x</span>
|
|
596
|
+
<span class="cline-any cline-yes">1x</span>
|
|
597
|
+
<span class="cline-any cline-yes">1x</span>
|
|
598
|
+
<span class="cline-any cline-yes">1x</span>
|
|
599
|
+
<span class="cline-any cline-yes">1x</span>
|
|
600
|
+
<span class="cline-any cline-yes">1x</span>
|
|
601
|
+
<span class="cline-any cline-yes">1x</span>
|
|
602
|
+
<span class="cline-any cline-yes">1x</span>
|
|
603
|
+
<span class="cline-any cline-yes">1x</span>
|
|
604
|
+
<span class="cline-any cline-yes">1x</span>
|
|
605
|
+
<span class="cline-any cline-yes">1x</span>
|
|
606
|
+
<span class="cline-any cline-yes">1x</span>
|
|
607
|
+
<span class="cline-any cline-yes">1x</span>
|
|
608
|
+
<span class="cline-any cline-yes">1x</span>
|
|
609
|
+
<span class="cline-any cline-yes">1x</span>
|
|
610
|
+
<span class="cline-any cline-yes">2x</span>
|
|
611
|
+
<span class="cline-any cline-yes">2x</span>
|
|
612
|
+
<span class="cline-any cline-yes">2x</span>
|
|
613
|
+
<span class="cline-any cline-yes">2x</span>
|
|
614
|
+
<span class="cline-any cline-yes">2x</span>
|
|
615
|
+
<span class="cline-any cline-yes">2x</span>
|
|
616
|
+
<span class="cline-any cline-yes">2x</span>
|
|
617
|
+
<span class="cline-any cline-yes">2x</span>
|
|
618
|
+
<span class="cline-any cline-yes">2x</span>
|
|
619
|
+
<span class="cline-any cline-yes">2x</span>
|
|
620
|
+
<span class="cline-any cline-yes">2x</span>
|
|
621
|
+
<span class="cline-any cline-yes">2x</span>
|
|
622
|
+
<span class="cline-any cline-yes">2x</span>
|
|
623
|
+
<span class="cline-any cline-yes">2x</span>
|
|
624
|
+
<span class="cline-any cline-yes">2x</span>
|
|
625
|
+
<span class="cline-any cline-yes">2x</span>
|
|
626
|
+
<span class="cline-any cline-yes">2x</span>
|
|
627
|
+
<span class="cline-any cline-yes">2x</span>
|
|
628
|
+
<span class="cline-any cline-yes">2x</span>
|
|
629
|
+
<span class="cline-any cline-yes">2x</span>
|
|
630
|
+
<span class="cline-any cline-yes">2x</span>
|
|
631
|
+
<span class="cline-any cline-yes">2x</span>
|
|
632
|
+
<span class="cline-any cline-yes">2x</span>
|
|
633
|
+
<span class="cline-any cline-yes">2x</span>
|
|
634
|
+
<span class="cline-any cline-yes">2x</span>
|
|
635
|
+
<span class="cline-any cline-yes">2x</span>
|
|
636
|
+
<span class="cline-any cline-yes">2x</span>
|
|
637
|
+
<span class="cline-any cline-yes">2x</span>
|
|
638
|
+
<span class="cline-any cline-yes">2x</span>
|
|
639
|
+
<span class="cline-any cline-yes">2x</span>
|
|
640
|
+
<span class="cline-any cline-yes">2x</span>
|
|
641
|
+
<span class="cline-any cline-yes">2x</span>
|
|
642
|
+
<span class="cline-any cline-yes">2x</span>
|
|
643
|
+
<span class="cline-any cline-yes">2x</span>
|
|
644
|
+
<span class="cline-any cline-yes">2x</span>
|
|
645
|
+
<span class="cline-any cline-yes">2x</span>
|
|
646
|
+
<span class="cline-any cline-yes">2x</span>
|
|
647
|
+
<span class="cline-any cline-yes">2x</span>
|
|
648
|
+
<span class="cline-any cline-yes">2x</span>
|
|
649
|
+
<span class="cline-any cline-yes">2x</span>
|
|
650
|
+
<span class="cline-any cline-yes">2x</span>
|
|
651
|
+
<span class="cline-any cline-yes">2x</span>
|
|
652
|
+
<span class="cline-any cline-yes">2x</span>
|
|
653
|
+
<span class="cline-any cline-yes">2x</span>
|
|
654
|
+
<span class="cline-any cline-yes">2x</span>
|
|
655
|
+
<span class="cline-any cline-yes">2x</span>
|
|
656
|
+
<span class="cline-any cline-yes">2x</span>
|
|
657
|
+
<span class="cline-any cline-yes">2x</span>
|
|
658
|
+
<span class="cline-any cline-yes">2x</span>
|
|
659
|
+
<span class="cline-any cline-yes">2x</span>
|
|
660
|
+
<span class="cline-any cline-yes">2x</span>
|
|
661
|
+
<span class="cline-any cline-yes">2x</span>
|
|
662
|
+
<span class="cline-any cline-yes">2x</span>
|
|
663
|
+
<span class="cline-any cline-yes">2x</span>
|
|
664
|
+
<span class="cline-any cline-yes">2x</span>
|
|
665
|
+
<span class="cline-any cline-yes">2x</span>
|
|
666
|
+
<span class="cline-any cline-yes">2x</span>
|
|
667
|
+
<span class="cline-any cline-yes">2x</span>
|
|
668
|
+
<span class="cline-any cline-yes">2x</span>
|
|
669
|
+
<span class="cline-any cline-yes">2x</span>
|
|
670
|
+
<span class="cline-any cline-yes">2x</span>
|
|
671
|
+
<span class="cline-any cline-yes">2x</span>
|
|
672
|
+
<span class="cline-any cline-yes">2x</span>
|
|
673
|
+
<span class="cline-any cline-yes">2x</span>
|
|
674
|
+
<span class="cline-any cline-yes">2x</span>
|
|
675
|
+
<span class="cline-any cline-yes">2x</span>
|
|
676
|
+
<span class="cline-any cline-yes">2x</span>
|
|
677
|
+
<span class="cline-any cline-yes">2x</span>
|
|
678
|
+
<span class="cline-any cline-yes">2x</span>
|
|
679
|
+
<span class="cline-any cline-yes">2x</span>
|
|
680
|
+
<span class="cline-any cline-yes">2x</span>
|
|
681
|
+
<span class="cline-any cline-yes">2x</span>
|
|
682
|
+
<span class="cline-any cline-yes">2x</span>
|
|
683
|
+
<span class="cline-any cline-yes">2x</span>
|
|
684
|
+
<span class="cline-any cline-yes">2x</span>
|
|
685
|
+
<span class="cline-any cline-yes">2x</span>
|
|
686
|
+
<span class="cline-any cline-yes">2x</span>
|
|
687
|
+
<span class="cline-any cline-yes">2x</span>
|
|
688
|
+
<span class="cline-any cline-yes">2x</span>
|
|
689
|
+
<span class="cline-any cline-yes">2x</span>
|
|
690
|
+
<span class="cline-any cline-yes">2x</span>
|
|
691
|
+
<span class="cline-any cline-yes">2x</span>
|
|
692
|
+
<span class="cline-any cline-yes">2x</span>
|
|
693
|
+
<span class="cline-any cline-yes">2x</span>
|
|
694
|
+
<span class="cline-any cline-yes">2x</span>
|
|
695
|
+
<span class="cline-any cline-yes">2x</span>
|
|
696
|
+
<span class="cline-any cline-yes">2x</span>
|
|
697
|
+
<span class="cline-any cline-yes">2x</span>
|
|
698
|
+
<span class="cline-any cline-yes">2x</span>
|
|
699
|
+
<span class="cline-any cline-yes">2x</span>
|
|
700
|
+
<span class="cline-any cline-yes">2x</span>
|
|
701
|
+
<span class="cline-any cline-yes">2x</span>
|
|
702
|
+
<span class="cline-any cline-yes">2x</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-no"> </span>
|
|
717
|
+
<span class="cline-any cline-no"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-no"> </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-yes">2x</span>
|
|
739
|
+
<span class="cline-any cline-yes">2x</span>
|
|
740
|
+
<span class="cline-any cline-yes">2x</span>
|
|
741
|
+
<span class="cline-any cline-yes">2x</span>
|
|
742
|
+
<span class="cline-any cline-yes">2x</span>
|
|
743
|
+
<span class="cline-any cline-yes">2x</span>
|
|
744
|
+
<span class="cline-any cline-yes">2x</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-yes">2x</span>
|
|
753
|
+
<span class="cline-any cline-yes">2x</span>
|
|
754
|
+
<span class="cline-any cline-yes">2x</span>
|
|
755
|
+
<span class="cline-any cline-yes">2x</span>
|
|
756
|
+
<span class="cline-any cline-yes">2x</span>
|
|
757
|
+
<span class="cline-any cline-yes">2x</span>
|
|
758
|
+
<span class="cline-any cline-yes">2x</span>
|
|
759
|
+
<span class="cline-any cline-yes">2x</span>
|
|
760
|
+
<span class="cline-any cline-yes">2x</span>
|
|
761
|
+
<span class="cline-any cline-yes">2x</span>
|
|
762
|
+
<span class="cline-any cline-yes">2x</span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-no"> </span>
|
|
765
|
+
<span class="cline-any cline-yes">2x</span>
|
|
766
|
+
<span class="cline-any cline-yes">2x</span>
|
|
767
|
+
<span class="cline-any cline-yes">2x</span>
|
|
768
|
+
<span class="cline-any cline-yes">2x</span>
|
|
769
|
+
<span class="cline-any cline-yes">2x</span>
|
|
770
|
+
<span class="cline-any cline-yes">2x</span>
|
|
771
|
+
<span class="cline-any cline-yes">2x</span>
|
|
772
|
+
<span class="cline-any cline-yes">2x</span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-no"> </span>
|
|
775
|
+
<span class="cline-any cline-yes">2x</span>
|
|
776
|
+
<span class="cline-any cline-yes">2x</span>
|
|
777
|
+
<span class="cline-any cline-yes">2x</span>
|
|
778
|
+
<span class="cline-any cline-yes">2x</span>
|
|
779
|
+
<span class="cline-any cline-yes">2x</span>
|
|
780
|
+
<span class="cline-any cline-yes">2x</span>
|
|
781
|
+
<span class="cline-any cline-yes">2x</span>
|
|
782
|
+
<span class="cline-any cline-yes">2x</span>
|
|
783
|
+
<span class="cline-any cline-yes">2x</span>
|
|
784
|
+
<span class="cline-any cline-yes">2x</span>
|
|
785
|
+
<span class="cline-any cline-yes">2x</span>
|
|
786
|
+
<span class="cline-any cline-yes">2x</span>
|
|
787
|
+
<span class="cline-any cline-yes">2x</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-no"> </span>
|
|
795
|
+
<span class="cline-any cline-no"> </span>
|
|
796
|
+
<span class="cline-any cline-no"> </span>
|
|
797
|
+
<span class="cline-any cline-no"> </span>
|
|
798
|
+
<span class="cline-any cline-no"> </span>
|
|
799
|
+
<span class="cline-any cline-no"> </span>
|
|
800
|
+
<span class="cline-any cline-no"> </span>
|
|
801
|
+
<span class="cline-any cline-no"> </span>
|
|
802
|
+
<span class="cline-any cline-no"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-no"> </span>
|
|
806
|
+
<span class="cline-any cline-no"> </span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-no"> </span>
|
|
809
|
+
<span class="cline-any cline-no"> </span>
|
|
810
|
+
<span class="cline-any cline-no"> </span>
|
|
811
|
+
<span class="cline-any cline-no"> </span>
|
|
812
|
+
<span class="cline-any cline-no"> </span>
|
|
813
|
+
<span class="cline-any cline-no"> </span>
|
|
814
|
+
<span class="cline-any cline-no"> </span>
|
|
815
|
+
<span class="cline-any cline-no"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-no"> </span>
|
|
819
|
+
<span class="cline-any cline-no"> </span>
|
|
820
|
+
<span class="cline-any cline-no"> </span>
|
|
821
|
+
<span class="cline-any cline-yes">2x</span>
|
|
822
|
+
<span class="cline-any cline-yes">2x</span>
|
|
823
|
+
<span class="cline-any cline-yes">2x</span>
|
|
824
|
+
<span class="cline-any cline-yes">2x</span>
|
|
825
|
+
<span class="cline-any cline-yes">2x</span>
|
|
826
|
+
<span class="cline-any cline-yes">2x</span>
|
|
827
|
+
<span class="cline-any cline-yes">2x</span>
|
|
828
|
+
<span class="cline-any cline-yes">2x</span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
830
|
+
<span class="cline-any cline-no"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-no"> </span>
|
|
833
|
+
<span class="cline-any cline-no"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
835
|
+
<span class="cline-any cline-no"> </span>
|
|
836
|
+
<span class="cline-any cline-yes">2x</span>
|
|
837
|
+
<span class="cline-any cline-yes">2x</span>
|
|
838
|
+
<span class="cline-any cline-yes">2x</span>
|
|
839
|
+
<span class="cline-any cline-yes">2x</span>
|
|
840
|
+
<span class="cline-any cline-yes">2x</span>
|
|
841
|
+
<span class="cline-any cline-yes">2x</span>
|
|
842
|
+
<span class="cline-any cline-yes">2x</span>
|
|
843
|
+
<span class="cline-any cline-yes">2x</span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-no"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-no"> </span>
|
|
849
|
+
<span class="cline-any cline-no"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-yes">2x</span>
|
|
858
|
+
<span class="cline-any cline-yes">2x</span>
|
|
859
|
+
<span class="cline-any cline-yes">2x</span>
|
|
860
|
+
<span class="cline-any cline-yes">2x</span>
|
|
861
|
+
<span class="cline-any cline-yes">2x</span>
|
|
862
|
+
<span class="cline-any cline-yes">2x</span>
|
|
863
|
+
<span class="cline-any cline-yes">2x</span>
|
|
864
|
+
<span class="cline-any cline-yes">2x</span>
|
|
865
|
+
<span class="cline-any cline-yes">2x</span>
|
|
866
|
+
<span class="cline-any cline-yes">2x</span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-no"> </span>
|
|
874
|
+
<span class="cline-any cline-no"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-no"> </span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-no"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-yes">2x</span>
|
|
888
|
+
<span class="cline-any cline-yes">2x</span>
|
|
889
|
+
<span class="cline-any cline-yes">2x</span>
|
|
890
|
+
<span class="cline-any cline-yes">2x</span>
|
|
891
|
+
<span class="cline-any cline-yes">2x</span>
|
|
892
|
+
<span class="cline-any cline-yes">2x</span>
|
|
893
|
+
<span class="cline-any cline-yes">2x</span>
|
|
894
|
+
<span class="cline-any cline-yes">2x</span>
|
|
895
|
+
<span class="cline-any cline-yes">2x</span>
|
|
896
|
+
<span class="cline-any cline-yes">2x</span>
|
|
897
|
+
<span class="cline-any cline-yes">2x</span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-no"> </span>
|
|
909
|
+
<span class="cline-any cline-no"> </span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-no"> </span>
|
|
919
|
+
<span class="cline-any cline-no"> </span>
|
|
920
|
+
<span class="cline-any cline-no"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-no"> </span>
|
|
923
|
+
<span class="cline-any cline-no"> </span>
|
|
924
|
+
<span class="cline-any cline-no"> </span>
|
|
925
|
+
<span class="cline-any cline-no"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-no"> </span>
|
|
928
|
+
<span class="cline-any cline-no"> </span>
|
|
929
|
+
<span class="cline-any cline-no"> </span>
|
|
930
|
+
<span class="cline-any cline-no"> </span>
|
|
931
|
+
<span class="cline-any cline-no"> </span>
|
|
932
|
+
<span class="cline-any cline-no"> </span>
|
|
933
|
+
<span class="cline-any cline-no"> </span>
|
|
934
|
+
<span class="cline-any cline-no"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-no"> </span>
|
|
937
|
+
<span class="cline-any cline-no"> </span>
|
|
938
|
+
<span class="cline-any cline-no"> </span>
|
|
939
|
+
<span class="cline-any cline-no"> </span>
|
|
940
|
+
<span class="cline-any cline-no"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-no"> </span>
|
|
944
|
+
<span class="cline-any cline-no"> </span>
|
|
945
|
+
<span class="cline-any cline-no"> </span>
|
|
946
|
+
<span class="cline-any cline-no"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-yes">2x</span>
|
|
950
|
+
<span class="cline-any cline-yes">2x</span>
|
|
951
|
+
<span class="cline-any cline-yes">2x</span>
|
|
952
|
+
<span class="cline-any cline-yes">2x</span>
|
|
953
|
+
<span class="cline-any cline-yes">2x</span>
|
|
954
|
+
<span class="cline-any cline-yes">2x</span>
|
|
955
|
+
<span class="cline-any cline-yes">2x</span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-no"> </span>
|
|
958
|
+
<span class="cline-any cline-no"> </span>
|
|
959
|
+
<span class="cline-any cline-no"> </span>
|
|
960
|
+
<span class="cline-any cline-no"> </span>
|
|
961
|
+
<span class="cline-any cline-no"> </span>
|
|
962
|
+
<span class="cline-any cline-yes">2x</span>
|
|
963
|
+
<span class="cline-any cline-yes">2x</span>
|
|
964
|
+
<span class="cline-any cline-yes">2x</span>
|
|
965
|
+
<span class="cline-any cline-yes">2x</span>
|
|
966
|
+
<span class="cline-any cline-yes">2x</span>
|
|
967
|
+
<span class="cline-any cline-yes">2x</span>
|
|
968
|
+
<span class="cline-any cline-yes">2x</span>
|
|
969
|
+
<span class="cline-any cline-no"> </span>
|
|
970
|
+
<span class="cline-any cline-no"> </span>
|
|
971
|
+
<span class="cline-any cline-no"> </span>
|
|
972
|
+
<span class="cline-any cline-no"> </span>
|
|
973
|
+
<span class="cline-any cline-no"> </span>
|
|
974
|
+
<span class="cline-any cline-no"> </span>
|
|
975
|
+
<span class="cline-any cline-yes">2x</span>
|
|
976
|
+
<span class="cline-any cline-yes">2x</span>
|
|
977
|
+
<span class="cline-any cline-yes">2x</span>
|
|
978
|
+
<span class="cline-any cline-yes">2x</span>
|
|
979
|
+
<span class="cline-any cline-yes">2x</span>
|
|
980
|
+
<span class="cline-any cline-yes">2x</span>
|
|
981
|
+
<span class="cline-any cline-yes">2x</span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-no"> </span>
|
|
985
|
+
<span class="cline-any cline-no"> </span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-no"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-no"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-no"> </span>
|
|
999
|
+
<span class="cline-any cline-no"> </span>
|
|
1000
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1002
|
+
<span class="cline-any cline-no"> </span>
|
|
1003
|
+
<span class="cline-any cline-no"> </span>
|
|
1004
|
+
<span class="cline-any cline-no"> </span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-no"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-no"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1036
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1037
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1060
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1061
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1062
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1063
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1064
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1065
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1067
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1068
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1069
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1070
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1071
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import {
|
|
1073
|
+
StreamVideoReadOnlyStateStore,
|
|
1074
|
+
StreamVideoWriteableStateStore,
|
|
1075
|
+
} from './store';
|
|
1076
|
+
import type {
|
|
1077
|
+
DatacenterResponse,
|
|
1078
|
+
GetCallEdgeServerRequest,
|
|
1079
|
+
GetOrCreateCallRequest,
|
|
1080
|
+
ICEServer,
|
|
1081
|
+
} from './gen/coordinator';
|
|
1082
|
+
|
|
1083
|
+
import type { ReportCallStatEventRequest } from './gen/video/coordinator/client_v1_rpc/client_rpc';
|
|
1084
|
+
import { measureResourceLoadLatencyTo } from './rpc';
|
|
1085
|
+
import { StreamSfuClient } from './StreamSfuClient';
|
|
1086
|
+
import { Call } from './rtc/Call';
|
|
1087
|
+
import { CallMetadata } from './rtc/CallMetadata';
|
|
1088
|
+
|
|
1089
|
+
// import { reportStats } from './stats/coordinator-stats-reporter';
|
|
1090
|
+
import { Timestamp } from './gen/google/protobuf/timestamp';
|
|
1091
|
+
import { Batcher } from './Batcher';
|
|
1092
|
+
import {
|
|
1093
|
+
watchCallAccepted,
|
|
1094
|
+
watchCallCancelled,
|
|
1095
|
+
watchCallCreated,
|
|
1096
|
+
watchCallRejected,
|
|
1097
|
+
} from './events/call';
|
|
1098
|
+
import { CALL_CONFIG } from './config/defaultConfigs';
|
|
1099
|
+
import { CallConfig } from './config/types';
|
|
1100
|
+
import { CallDropScheduler } from './CallDropScheduler';
|
|
1101
|
+
import { StreamCoordinatorClient } from './coordinator/StreamCoordinatorClient';
|
|
1102
|
+
import {
|
|
1103
|
+
EventHandler,
|
|
1104
|
+
StreamClientOptions,
|
|
1105
|
+
TokenOrProvider,
|
|
1106
|
+
User,
|
|
1107
|
+
} from './coordinator/connection/types';
|
|
1108
|
+
|
|
1109
|
+
/**
|
|
1110
|
+
* A `StreamVideoClient` instance lets you communicate with our API, and authenticate users.
|
|
1111
|
+
*/
|
|
1112
|
+
export class StreamVideoClient {
|
|
1113
|
+
/**
|
|
1114
|
+
* Configuration parameters for controlling call behavior.
|
|
1115
|
+
*/
|
|
1116
|
+
callConfig: CallConfig;
|
|
1117
|
+
/**
|
|
1118
|
+
* A reactive store that exposes all the state variables in a reactive manner - you can subscribe to changes of the different state variables. Our library is built in a way that all state changes are exposed in this store, so all UI changes in your application should be handled by subscribing to these variables.
|
|
1119
|
+
* @angular If you're using our Angular SDK, you shouldn't be interacting with the state store directly, instead, you should be using the [`StreamVideoService`](./StreamVideoService.md).
|
|
1120
|
+
*/
|
|
1121
|
+
readonly readOnlyStateStore: StreamVideoReadOnlyStateStore;
|
|
1122
|
+
private readonly writeableStateStore: StreamVideoWriteableStateStore;
|
|
1123
|
+
private callDropScheduler: CallDropScheduler | undefined;
|
|
1124
|
+
private coordinatorClient: StreamCoordinatorClient;
|
|
1125
|
+
/**
|
|
1126
|
+
* @internal
|
|
1127
|
+
*/
|
|
1128
|
+
public readonly userBatcher: Batcher<string>;
|
|
1129
|
+
|
|
1130
|
+
/**
|
|
1131
|
+
* You should create only one instance of `StreamVideoClient`.
|
|
1132
|
+
* @angular If you're using our Angular SDK, you shouldn't be calling the `constructor` directly, instead you should be using [`StreamVideoService`](./StreamVideoService.md/#init).
|
|
1133
|
+
* @param apiKey your Stream API key
|
|
1134
|
+
* @param opts the options for the client.
|
|
1135
|
+
* @param {CallConfig} [callConfig=CALL_CONFIG.meeting] custom call configuration
|
|
1136
|
+
*/
|
|
1137
|
+
constructor(
|
|
1138
|
+
apiKey: string,
|
|
1139
|
+
opts?: StreamClientOptions,
|
|
1140
|
+
callConfig: CallConfig = CALL_CONFIG.meeting,
|
|
1141
|
+
) {
|
|
1142
|
+
this.callConfig = callConfig;
|
|
1143
|
+
this.coordinatorClient = new StreamCoordinatorClient(apiKey, opts);
|
|
1144
|
+
|
|
1145
|
+
this.writeableStateStore = new StreamVideoWriteableStateStore();
|
|
1146
|
+
this.readOnlyStateStore = new StreamVideoReadOnlyStateStore(
|
|
1147
|
+
this.writeableStateStore,
|
|
1148
|
+
);
|
|
1149
|
+
|
|
1150
|
+
this.userBatcher = new Batcher<string>(
|
|
1151
|
+
3000,
|
|
1152
|
+
// this.handleUserBatch,
|
|
1153
|
+
() => {},
|
|
1154
|
+
);
|
|
1155
|
+
|
|
1156
|
+
// reportStats(
|
|
1157
|
+
// this.readOnlyStateStore,
|
|
1158
|
+
// (e) =>
|
|
1159
|
+
// this.reportCallStats(e).catch((err) => {
|
|
1160
|
+
// console.error('Failed to report stats', err);
|
|
1161
|
+
// }),
|
|
1162
|
+
// (e) =>
|
|
1163
|
+
// this.reportCallStatEvent(e).catch((err) => {
|
|
1164
|
+
// console.error('Failed to report stats', err);
|
|
1165
|
+
// }),
|
|
1166
|
+
// );
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
// private handleUserBatch = (idList: string[]) => {
|
|
1170
|
+
// this.client
|
|
1171
|
+
// .queryUsers({
|
|
1172
|
+
// mqJson: new TextEncoder().encode(
|
|
1173
|
+
// JSON.stringify({ id: { $in: idList } }),
|
|
1174
|
+
// ),
|
|
1175
|
+
// sorts: [],
|
|
1176
|
+
// })
|
|
1177
|
+
// .then(({ response: { users } }) => {
|
|
1178
|
+
// const mappedUsers = users.reduce<Record<string, User>>(
|
|
1179
|
+
// (userMap, user) => {
|
|
1180
|
+
// userMap[user.id] ??= user;
|
|
1181
|
+
// return userMap;
|
|
1182
|
+
// },
|
|
1183
|
+
// {},
|
|
1184
|
+
// );
|
|
1185
|
+
//
|
|
1186
|
+
// this.writeableStateStore.setCurrentValue(
|
|
1187
|
+
// this.writeableStateStore.participantsSubject,
|
|
1188
|
+
// (participants) =>
|
|
1189
|
+
// participants.map((participant) => {
|
|
1190
|
+
// const user = mappedUsers[participant.userId];
|
|
1191
|
+
// return user ? { ...participant, user } : participant;
|
|
1192
|
+
// }),
|
|
1193
|
+
// );
|
|
1194
|
+
// });
|
|
1195
|
+
// };
|
|
1196
|
+
|
|
1197
|
+
/**
|
|
1198
|
+
* Connects the given user to the client.
|
|
1199
|
+
* Only one user can connect at a time, if you want to change users, call `disconnectUser` before connecting a new user.
|
|
1200
|
+
* If the connection is successful, the connected user [state variable](#readonlystatestore) will be updated accordingly.
|
|
1201
|
+
*
|
|
1202
|
+
* @param user the user to connect.
|
|
1203
|
+
* @param tokenOrProvider a token or a function that returns a token.
|
|
1204
|
+
*/
|
|
1205
|
+
connectUser = <span class="fstat-no" title="function not covered" >async (user: User, tokenOrProvider: TokenOrProvider) => {</span>
|
|
1206
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.connectUser(user, tokenOrProvider);</span>
|
|
1207
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1208
|
+
<span class="cstat-no" title="statement not covered" > this.callDropScheduler = new CallDropScheduler(</span>
|
|
1209
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore,</span>
|
|
1210
|
+
<span class="cstat-no" title="statement not covered" > this.callConfig,</span>
|
|
1211
|
+
<span class="cstat-no" title="statement not covered" > this.rejectCall,</span>
|
|
1212
|
+
<span class="cstat-no" title="statement not covered" > this.cancelCall,</span>
|
|
1213
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1214
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1215
|
+
<span class="cstat-no" title="statement not covered" > this.on(</span>
|
|
1216
|
+
<span class="cstat-no" title="statement not covered" > 'call.created',</span>
|
|
1217
|
+
<span class="cstat-no" title="statement not covered" > // @ts-expect-error</span>
|
|
1218
|
+
<span class="cstat-no" title="statement not covered" > watchCallCreated(this.writeableStateStore),</span>
|
|
1219
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1220
|
+
<span class="cstat-no" title="statement not covered" > this.on(</span>
|
|
1221
|
+
<span class="cstat-no" title="statement not covered" > 'call.accepted',</span>
|
|
1222
|
+
<span class="cstat-no" title="statement not covered" > // @ts-expect-error</span>
|
|
1223
|
+
<span class="cstat-no" title="statement not covered" > watchCallAccepted(this.writeableStateStore),</span>
|
|
1224
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1225
|
+
<span class="cstat-no" title="statement not covered" > this.on(</span>
|
|
1226
|
+
<span class="cstat-no" title="statement not covered" > 'call.rejected',</span>
|
|
1227
|
+
<span class="cstat-no" title="statement not covered" > // @ts-expect-error</span>
|
|
1228
|
+
<span class="cstat-no" title="statement not covered" > watchCallRejected(this.writeableStateStore),</span>
|
|
1229
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1230
|
+
<span class="cstat-no" title="statement not covered" > this.on(</span>
|
|
1231
|
+
<span class="cstat-no" title="statement not covered" > 'call.cancelled',</span>
|
|
1232
|
+
<span class="cstat-no" title="statement not covered" > // @ts-expect-error</span>
|
|
1233
|
+
<span class="cstat-no" title="statement not covered" > watchCallCancelled(this.writeableStateStore),</span>
|
|
1234
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1235
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1236
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1237
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.connectedUserSubject,</span>
|
|
1238
|
+
<span class="cstat-no" title="statement not covered" > user,</span>
|
|
1239
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1240
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1241
|
+
|
|
1242
|
+
/**
|
|
1243
|
+
* Disconnects the currently connected user from the client.
|
|
1244
|
+
*
|
|
1245
|
+
* If the connection is successfully disconnected, the connected user [state variable](#readonlystatestore) will be updated accordingly
|
|
1246
|
+
*/
|
|
1247
|
+
disconnectUser = <span class="fstat-no" title="function not covered" >async () => {</span>
|
|
1248
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.disconnectUser();</span>
|
|
1249
|
+
<span class="cstat-no" title="statement not covered" > this.callDropScheduler?.cleanUp();</span>
|
|
1250
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1251
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.connectedUserSubject,</span>
|
|
1252
|
+
<span class="cstat-no" title="statement not covered" > undefined,</span>
|
|
1253
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1254
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1255
|
+
|
|
1256
|
+
/**
|
|
1257
|
+
* You can subscribe to WebSocket events provided by the API.
|
|
1258
|
+
* To remove a subscription, call the `off` method or, execute the returned unsubscribe function.
|
|
1259
|
+
* Please note that subscribing to WebSocket events is an advanced use-case, for most use-cases it should be enough to watch for changes in the reactive [state store](#readonlystatestore).
|
|
1260
|
+
*
|
|
1261
|
+
* @param eventName the event name.
|
|
1262
|
+
* @param callback the callback which will be called when the event is emitted.
|
|
1263
|
+
* @returns an unsubscribe function.
|
|
1264
|
+
*/
|
|
1265
|
+
on = (<span class="fstat-no" title="function not covered" >eventName: string, callback: EventHandler) => {</span>
|
|
1266
|
+
<span class="cstat-no" title="statement not covered" > return this.coordinatorClient.on(eventName, callback);</span>
|
|
1267
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1268
|
+
|
|
1269
|
+
/**
|
|
1270
|
+
* Remove subscription for WebSocket events that were created by the `on` method.
|
|
1271
|
+
*
|
|
1272
|
+
* @param event the event name.
|
|
1273
|
+
* @param callback the callback which was passed to the `on` method.
|
|
1274
|
+
*/
|
|
1275
|
+
off = (<span class="fstat-no" title="function not covered" >event: string, callback: EventHandler) => {</span>
|
|
1276
|
+
<span class="cstat-no" title="statement not covered" > return this.coordinatorClient.off(event, callback);</span>
|
|
1277
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1278
|
+
|
|
1279
|
+
/**
|
|
1280
|
+
* Allows you to create new calls with the given parameters.
|
|
1281
|
+
* If a call with the same combination of type and id already exists, it will be returned.
|
|
1282
|
+
*
|
|
1283
|
+
* Causes the CallCreated event to be emitted to all the call members in case this call didnot exist before.
|
|
1284
|
+
*
|
|
1285
|
+
* @param id the id of the call.
|
|
1286
|
+
* @param type the type of the call.
|
|
1287
|
+
* @param data the data for the call.
|
|
1288
|
+
* @returns A call metadata with information about the call.
|
|
1289
|
+
*/
|
|
1290
|
+
getOrCreateCall = <span class="fstat-no" title="function not covered" >async (</span>
|
|
1291
|
+
<span class="cstat-no" title="statement not covered" > id: string,</span>
|
|
1292
|
+
<span class="cstat-no" title="statement not covered" > type: string,</span>
|
|
1293
|
+
<span class="cstat-no" title="statement not covered" > data?: GetOrCreateCallRequest,</span>
|
|
1294
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > const response = await this.coordinatorClient.getOrCreateCall(</span>
|
|
1296
|
+
<span class="cstat-no" title="statement not covered" > id,</span>
|
|
1297
|
+
<span class="cstat-no" title="statement not covered" > type,</span>
|
|
1298
|
+
<span class="cstat-no" title="statement not covered" > data,</span>
|
|
1299
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1300
|
+
<span class="cstat-no" title="statement not covered" > const { call } = response;</span>
|
|
1301
|
+
<span class="cstat-no" title="statement not covered" > if (!call) {</span>
|
|
1302
|
+
<span class="cstat-no" title="statement not covered" > console.log(`Call with id ${id} and type ${type} could not be created`);</span>
|
|
1303
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1304
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1305
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1306
|
+
<span class="cstat-no" title="statement not covered" > const currentPendingCalls = this.writeableStateStore.getCurrentValue(</span>
|
|
1307
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.pendingCallsSubject,</span>
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1309
|
+
<span class="cstat-no" title="statement not covered" > const callAlreadyRegistered = currentPendingCalls.find(</span>
|
|
1310
|
+
<span class="cstat-no" title="statement not covered" > (pendingCall) => pendingCall.call.id === call.id,</span>
|
|
1311
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1312
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1313
|
+
<span class="cstat-no" title="statement not covered" > if (!callAlreadyRegistered) {</span>
|
|
1314
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1315
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.pendingCallsSubject,</span>
|
|
1316
|
+
<span class="cstat-no" title="statement not covered" > (pendingCalls) => [...pendingCalls, new CallMetadata(call)],</span>
|
|
1317
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1318
|
+
<span class="cstat-no" title="statement not covered" > return response;</span>
|
|
1319
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1320
|
+
<span class="cstat-no" title="statement not covered" > // TODO: handle error?</span>
|
|
1321
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1322
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1323
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1324
|
+
|
|
1325
|
+
/**
|
|
1326
|
+
* Signals other users that I have accepted the incoming call.
|
|
1327
|
+
* Causes the `CallAccepted` event to be emitted to all the call members.
|
|
1328
|
+
* @param callCid config ID of the rejected call
|
|
1329
|
+
* @returns
|
|
1330
|
+
*/
|
|
1331
|
+
acceptCall = <span class="fstat-no" title="function not covered" >async (callCid: string) => {</span>
|
|
1332
|
+
<span class="cstat-no" title="statement not covered" > // FIXME OL: change the method's signature to accept callId and callType</span>
|
|
1333
|
+
<span class="cstat-no" title="statement not covered" > const [type, id] = callCid.split(':');</span>
|
|
1334
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.sendEvent(id, type, {</span>
|
|
1335
|
+
<span class="cstat-no" title="statement not covered" > event_type: 'call.accepted',</span>
|
|
1336
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1337
|
+
<span class="cstat-no" title="statement not covered" > return await this.joinCall(id, type);</span>
|
|
1338
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1339
|
+
|
|
1340
|
+
/**
|
|
1341
|
+
* Signals other users that I have rejected the incoming call.
|
|
1342
|
+
* Causes the `CallRejected` event to be emitted to all the call members.
|
|
1343
|
+
* @param callCid config ID of the rejected call
|
|
1344
|
+
* @returns
|
|
1345
|
+
*/
|
|
1346
|
+
rejectCall = <span class="fstat-no" title="function not covered" >async (callCid: string) => {</span>
|
|
1347
|
+
<span class="cstat-no" title="statement not covered" > // FIXME OL: change the method's signature to accept callId and callType</span>
|
|
1348
|
+
<span class="cstat-no" title="statement not covered" > const [type, id] = callCid.split(':');</span>
|
|
1349
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1350
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.pendingCallsSubject,</span>
|
|
1351
|
+
<span class="cstat-no" title="statement not covered" > (pendingCalls) =></span>
|
|
1352
|
+
<span class="cstat-no" title="statement not covered" > pendingCalls.filter(</span>
|
|
1353
|
+
<span class="cstat-no" title="statement not covered" > (incomingCall) => incomingCall.call.cid !== callCid,</span>
|
|
1354
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
1355
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1356
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.sendEvent(id, type, {</span>
|
|
1357
|
+
<span class="cstat-no" title="statement not covered" > event_type: 'call.rejected',</span>
|
|
1358
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1359
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1360
|
+
|
|
1361
|
+
/**
|
|
1362
|
+
* Signals other users that I have cancelled my call to them before they accepted it.
|
|
1363
|
+
* Causes the CallCancelled event to be emitted to all the call members.
|
|
1364
|
+
*
|
|
1365
|
+
* Cancelling a call is only possible before the local participant joined the call.
|
|
1366
|
+
* @param callCid config ID of the cancelled call
|
|
1367
|
+
* @returns
|
|
1368
|
+
*/
|
|
1369
|
+
cancelCall = <span class="fstat-no" title="function not covered" >async (callCid: string) => {</span>
|
|
1370
|
+
<span class="cstat-no" title="statement not covered" > // FIXME OL: change the method's signature to accept callId and callType</span>
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" > const [type, id] = callCid.split(':');</span>
|
|
1372
|
+
<span class="cstat-no" title="statement not covered" > const store = this.writeableStateStore;</span>
|
|
1373
|
+
<span class="cstat-no" title="statement not covered" > const activeCall = store.getCurrentValue(store.activeCallSubject);</span>
|
|
1374
|
+
<span class="cstat-no" title="statement not covered" > const leavingActiveCall = activeCall?.data.call.cid === callCid;</span>
|
|
1375
|
+
<span class="cstat-no" title="statement not covered" > if (leavingActiveCall) {</span>
|
|
1376
|
+
<span class="cstat-no" title="statement not covered" > activeCall.leave();</span>
|
|
1377
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1378
|
+
<span class="cstat-no" title="statement not covered" > store.setCurrentValue(store.pendingCallsSubject, (pendingCalls) =></span>
|
|
1379
|
+
<span class="cstat-no" title="statement not covered" > pendingCalls.filter((pendingCall) => pendingCall.call.cid !== callCid),</span>
|
|
1380
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1381
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1382
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1383
|
+
<span class="cstat-no" title="statement not covered" > const remoteParticipants = store.getCurrentValue(store.remoteParticipants$);</span>
|
|
1384
|
+
<span class="cstat-no" title="statement not covered" > if (!remoteParticipants.length && !leavingActiveCall) {</span>
|
|
1385
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.sendEvent(id, type, {</span>
|
|
1386
|
+
<span class="cstat-no" title="statement not covered" > event_type: 'call.cancelled',</span>
|
|
1387
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1388
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1389
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1390
|
+
|
|
1391
|
+
/**
|
|
1392
|
+
* Allows you to create a new call with the given parameters and joins the call immediately.
|
|
1393
|
+
* If a call with the same combination of `type` and `id` already exists, it will join the existing call.
|
|
1394
|
+
*
|
|
1395
|
+
* @param id the id of the call.
|
|
1396
|
+
* @param type the type of the call.
|
|
1397
|
+
* @param data the data for the call.
|
|
1398
|
+
* @returns A [`Call`](./Call.md) instance that can be used to interact with the call.
|
|
1399
|
+
*/
|
|
1400
|
+
joinCall = <span class="fstat-no" title="function not covered" >async (</span>
|
|
1401
|
+
<span class="cstat-no" title="statement not covered" > id: string,</span>
|
|
1402
|
+
<span class="cstat-no" title="statement not covered" > type: string,</span>
|
|
1403
|
+
<span class="cstat-no" title="statement not covered" > data?: GetOrCreateCallRequest,</span>
|
|
1404
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
1405
|
+
<span class="cstat-no" title="statement not covered" > const joinCallResponse = await this.coordinatorClient.joinCall(</span>
|
|
1406
|
+
<span class="cstat-no" title="statement not covered" > id,</span>
|
|
1407
|
+
<span class="cstat-no" title="statement not covered" > type,</span>
|
|
1408
|
+
<span class="cstat-no" title="statement not covered" > data,</span>
|
|
1409
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1410
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1411
|
+
<span class="cstat-no" title="statement not covered" > const { call: callMeta, edges, members } = joinCallResponse;</span>
|
|
1412
|
+
<span class="cstat-no" title="statement not covered" > if (callMeta && edges) {</span>
|
|
1413
|
+
<span class="cstat-no" title="statement not covered" > const edge = await this.getCallEdgeServer(id, type, edges);</span>
|
|
1414
|
+
<span class="cstat-no" title="statement not covered" > if (edge.credentials && edge.credentials.server) {</span>
|
|
1415
|
+
<span class="cstat-no" title="statement not covered" > // TODO OL: compute the initial value from `activeCallSubject`</span>
|
|
1416
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1417
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.callRecordingInProgressSubject,</span>
|
|
1418
|
+
<span class="cstat-no" title="statement not covered" > !!callMeta.record_egress, // FIXME OL: this is not correct</span>
|
|
1419
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1420
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1421
|
+
<span class="cstat-no" title="statement not covered" > const { server, ice_servers, token } = edge.credentials;</span>
|
|
1422
|
+
<span class="cstat-no" title="statement not covered" > const sfuClient = new StreamSfuClient(server.url!, token!);</span>
|
|
1423
|
+
<span class="cstat-no" title="statement not covered" > const metadata = new CallMetadata(callMeta, members);</span>
|
|
1424
|
+
<span class="cstat-no" title="statement not covered" > const callOptions = {</span>
|
|
1425
|
+
<span class="cstat-no" title="statement not covered" > connectionConfig: this.toRtcConfiguration(ice_servers),</span>
|
|
1426
|
+
<span class="cstat-no" title="statement not covered" > edgeName: server!.edge_name,</span>
|
|
1427
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1428
|
+
<span class="cstat-no" title="statement not covered" > const call = new Call(</span>
|
|
1429
|
+
<span class="cstat-no" title="statement not covered" > metadata,</span>
|
|
1430
|
+
<span class="cstat-no" title="statement not covered" > sfuClient,</span>
|
|
1431
|
+
<span class="cstat-no" title="statement not covered" > callOptions,</span>
|
|
1432
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore,</span>
|
|
1433
|
+
<span class="cstat-no" title="statement not covered" > this.userBatcher,</span>
|
|
1434
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1435
|
+
<span class="cstat-no" title="statement not covered" > await call.join();</span>
|
|
1436
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1437
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1438
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.activeCallSubject,</span>
|
|
1439
|
+
<span class="cstat-no" title="statement not covered" > call,</span>
|
|
1440
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1441
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1442
|
+
<span class="cstat-no" title="statement not covered" > return call;</span>
|
|
1443
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1444
|
+
<span class="cstat-no" title="statement not covered" > // TODO: handle error?</span>
|
|
1445
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1446
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1447
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1448
|
+
<span class="cstat-no" title="statement not covered" > // TODO: handle error?</span>
|
|
1449
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1450
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1451
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1452
|
+
|
|
1453
|
+
/**
|
|
1454
|
+
* Starts recording for the call described by the given `callId` and `callType`.
|
|
1455
|
+
* @param callId can be extracted from a [`Call` instance](./Call.md/#data)
|
|
1456
|
+
* @param callType can be extracted from a [`Call` instance](./Call.md/#data)
|
|
1457
|
+
*/
|
|
1458
|
+
startRecording = <span class="fstat-no" title="function not covered" >async (callId: string, callType: string) => {</span>
|
|
1459
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.startRecording(callId, callType);</span>
|
|
1460
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1461
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.callRecordingInProgressSubject,</span>
|
|
1462
|
+
<span class="cstat-no" title="statement not covered" > true,</span>
|
|
1463
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1464
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1465
|
+
|
|
1466
|
+
/**
|
|
1467
|
+
* Stops recording for the call described by the given `callId` and `callType`.
|
|
1468
|
+
* @param callId can be extracted from a [`Call` instance](./Call.md/#data)
|
|
1469
|
+
* @param callType can be extracted from a [`Call` instance](./Call.md/#data)
|
|
1470
|
+
*/
|
|
1471
|
+
stopRecording = <span class="fstat-no" title="function not covered" >async (callId: string, callType: string) => {</span>
|
|
1472
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.stopRecording(callId, callType);</span>
|
|
1473
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.setCurrentValue(</span>
|
|
1474
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.callRecordingInProgressSubject,</span>
|
|
1475
|
+
<span class="cstat-no" title="statement not covered" > false,</span>
|
|
1476
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1477
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1478
|
+
|
|
1479
|
+
/**
|
|
1480
|
+
* Reports call WebRTC metrics to coordinator API
|
|
1481
|
+
* @param stats
|
|
1482
|
+
* @returns
|
|
1483
|
+
*/
|
|
1484
|
+
private reportCallStats = <span class="fstat-no" title="function not covered" >async (stats: Object) => {</span>
|
|
1485
|
+
<span class="cstat-no" title="statement not covered" > const callMetadata = this.writeableStateStore.getCurrentValue(</span>
|
|
1486
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.activeCallSubject,</span>
|
|
1487
|
+
<span class="cstat-no" title="statement not covered" > )?.data;</span>
|
|
1488
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1489
|
+
<span class="cstat-no" title="statement not covered" > if (!callMetadata) {</span>
|
|
1490
|
+
<span class="cstat-no" title="statement not covered" > console.log("There isn't an active call");</span>
|
|
1491
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1492
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1493
|
+
<span class="cstat-no" title="statement not covered" > const request = {</span>
|
|
1494
|
+
<span class="cstat-no" title="statement not covered" > callCid: callMetadata.call.cid,</span>
|
|
1495
|
+
<span class="cstat-no" title="statement not covered" > statsJson: new TextEncoder().encode(JSON.stringify(stats)),</span>
|
|
1496
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1497
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.reportCallStats(</span>
|
|
1498
|
+
<span class="cstat-no" title="statement not covered" > callMetadata.call.id!,</span>
|
|
1499
|
+
<span class="cstat-no" title="statement not covered" > callMetadata.call.type!,</span>
|
|
1500
|
+
<span class="cstat-no" title="statement not covered" > request,</span>
|
|
1501
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1502
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1503
|
+
|
|
1504
|
+
private getCallEdgeServer = <span class="fstat-no" title="function not covered" >async (</span>
|
|
1505
|
+
<span class="cstat-no" title="statement not covered" > id: string,</span>
|
|
1506
|
+
<span class="cstat-no" title="statement not covered" > type: string,</span>
|
|
1507
|
+
<span class="cstat-no" title="statement not covered" > edges: DatacenterResponse[],</span>
|
|
1508
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
1509
|
+
<span class="cstat-no" title="statement not covered" > const latencyByEdge: GetCallEdgeServerRequest['latency_measurements'] = {};</span>
|
|
1510
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(</span>
|
|
1511
|
+
<span class="cstat-no" title="statement not covered" > edges.map(async (edge) => {</span>
|
|
1512
|
+
<span class="cstat-no" title="statement not covered" > latencyByEdge[edge.name!] = await measureResourceLoadLatencyTo(</span>
|
|
1513
|
+
<span class="cstat-no" title="statement not covered" > edge.latency_url!,</span>
|
|
1514
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1515
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1516
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1517
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1518
|
+
<span class="cstat-no" title="statement not covered" > return await this.coordinatorClient.getCallEdgeServer(id, type, {</span>
|
|
1519
|
+
<span class="cstat-no" title="statement not covered" > latency_measurements: latencyByEdge,</span>
|
|
1520
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1521
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1522
|
+
|
|
1523
|
+
private toRtcConfiguration = (<span class="fstat-no" title="function not covered" >config?: ICEServer[]) => {</span>
|
|
1524
|
+
<span class="cstat-no" title="statement not covered" > if (!config || config.length === 0) return undefined;</span>
|
|
1525
|
+
<span class="cstat-no" title="statement not covered" > const rtcConfig: RTCConfiguration = {</span>
|
|
1526
|
+
<span class="cstat-no" title="statement not covered" > iceServers: config.map((ice) => ({</span>
|
|
1527
|
+
<span class="cstat-no" title="statement not covered" > urls: ice.urls!,</span>
|
|
1528
|
+
<span class="cstat-no" title="statement not covered" > username: ice.username,</span>
|
|
1529
|
+
<span class="cstat-no" title="statement not covered" > credential: ice.password,</span>
|
|
1530
|
+
<span class="cstat-no" title="statement not covered" > })),</span>
|
|
1531
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1532
|
+
<span class="cstat-no" title="statement not covered" > return rtcConfig;</span>
|
|
1533
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1534
|
+
|
|
1535
|
+
/**
|
|
1536
|
+
* Reports call events (for example local participant muted themselves) to the coordinator API
|
|
1537
|
+
* @param statEvent
|
|
1538
|
+
* @returns
|
|
1539
|
+
*/
|
|
1540
|
+
private reportCallStatEvent = <span class="fstat-no" title="function not covered" >async (</span>
|
|
1541
|
+
<span class="cstat-no" title="statement not covered" > statEvent: ReportCallStatEventRequest['event'],</span>
|
|
1542
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
1543
|
+
<span class="cstat-no" title="statement not covered" > const callMetadata = this.writeableStateStore.getCurrentValue(</span>
|
|
1544
|
+
<span class="cstat-no" title="statement not covered" > this.writeableStateStore.activeCallSubject,</span>
|
|
1545
|
+
<span class="cstat-no" title="statement not covered" > )?.data;</span>
|
|
1546
|
+
<span class="cstat-no" title="statement not covered" > if (!callMetadata) {</span>
|
|
1547
|
+
<span class="cstat-no" title="statement not covered" > console.log("There isn't an active call");</span>
|
|
1548
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1549
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1550
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1551
|
+
<span class="cstat-no" title="statement not covered" > const request = {</span>
|
|
1552
|
+
<span class="cstat-no" title="statement not covered" > callCid: callMetadata.call.cid,</span>
|
|
1553
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Timestamp.fromDate(new Date()),</span>
|
|
1554
|
+
<span class="cstat-no" title="statement not covered" > event: statEvent,</span>
|
|
1555
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1556
|
+
<span class="cstat-no" title="statement not covered" > await this.coordinatorClient.reportCallStatEvent(</span>
|
|
1557
|
+
<span class="cstat-no" title="statement not covered" > callMetadata.call.id!,</span>
|
|
1558
|
+
<span class="cstat-no" title="statement not covered" > callMetadata.call.type!,</span>
|
|
1559
|
+
<span class="cstat-no" title="statement not covered" > request,</span>
|
|
1560
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1561
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1562
|
+
|
|
1563
|
+
/**
|
|
1564
|
+
* Sets the `participant.isPinned` value.
|
|
1565
|
+
* @param sessionId the session id of the participant
|
|
1566
|
+
* @param isPinned the value to set the participant.isPinned
|
|
1567
|
+
* @returns
|
|
1568
|
+
*/
|
|
1569
|
+
setParticipantIsPinned = (sessionId: string, isPinned: boolean): void => {
|
|
1570
|
+
this.writeableStateStore.updateParticipant(sessionId, {
|
|
1571
|
+
isPinned,
|
|
1572
|
+
});
|
|
1573
|
+
};
|
|
1574
|
+
}
|
|
1575
|
+
</pre></td></tr></table></pre>
|
|
1576
|
+
|
|
1577
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1578
|
+
</div><!-- /wrapper -->
|
|
1579
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1580
|
+
Code coverage generated by
|
|
1581
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1582
|
+
at 2023-02-09T16:25:50.250Z
|
|
1583
|
+
</div>
|
|
1584
|
+
<script src="../prettify.js"></script>
|
|
1585
|
+
<script>
|
|
1586
|
+
window.onload = function () {
|
|
1587
|
+
prettyPrint();
|
|
1588
|
+
};
|
|
1589
|
+
</script>
|
|
1590
|
+
<script src="../sorter.js"></script>
|
|
1591
|
+
<script src="../block-navigation.js"></script>
|
|
1592
|
+
</body>
|
|
1593
|
+
</html>
|
|
1594
|
+
|