|
|
@@ -1,7 +1,6 @@
|
|
1
|
|
-// @flow
|
|
2
|
|
-
|
|
3
|
1
|
import _ from 'lodash';
|
|
4
|
2
|
|
|
|
3
|
+import { IJitsiConference } from '../base/conference/reducer';
|
|
5
|
4
|
import {
|
|
6
|
5
|
JitsiConnectionQualityEvents
|
|
7
|
6
|
} from '../base/lib-jitsi-meet';
|
|
|
@@ -13,7 +12,13 @@ import {
|
|
13
|
12
|
* userId: Function[]
|
|
14
|
13
|
* }.
|
|
15
|
14
|
*/
|
|
16
|
|
-const subscribers = {};
|
|
|
15
|
+const subscribers: any = {};
|
|
|
16
|
+
|
|
|
17
|
+interface Stats {
|
|
|
18
|
+ codec?: Object;
|
|
|
19
|
+ framerate?: Object;
|
|
|
20
|
+ resolution?: Object;
|
|
|
21
|
+}
|
|
17
|
22
|
|
|
18
|
23
|
/**
|
|
19
|
24
|
* A singleton that acts as a pub/sub service for connection stat updates.
|
|
|
@@ -27,12 +32,12 @@ const statsEmitter = {
|
|
27
|
32
|
* {@code statsEmitter} should subscribe for stat updates.
|
|
28
|
33
|
* @returns {void}
|
|
29
|
34
|
*/
|
|
30
|
|
- startListeningForStats(conference: Object) {
|
|
|
35
|
+ startListeningForStats(conference: IJitsiConference) {
|
|
31
|
36
|
conference.on(JitsiConnectionQualityEvents.LOCAL_STATS_UPDATED,
|
|
32
|
|
- stats => this._onStatsUpdated(conference.myUserId(), stats));
|
|
|
37
|
+ (stats: Stats) => this._onStatsUpdated(conference.myUserId(), stats));
|
|
33
|
38
|
|
|
34
|
39
|
conference.on(JitsiConnectionQualityEvents.REMOTE_STATS_UPDATED,
|
|
35
|
|
- (id, stats) => this._emitStatsUpdate(id, stats));
|
|
|
40
|
+ (id: string, stats: Stats) => this._emitStatsUpdate(id, stats));
|
|
36
|
41
|
},
|
|
37
|
42
|
|
|
38
|
43
|
/**
|
|
|
@@ -44,7 +49,7 @@ const statsEmitter = {
|
|
44
|
49
|
* user have been updated.
|
|
45
|
50
|
* @returns {void}
|
|
46
|
51
|
*/
|
|
47
|
|
- subscribeToClientStats(id: ?string, callback: Function) {
|
|
|
52
|
+ subscribeToClientStats(id: string | undefined, callback: Function) {
|
|
48
|
53
|
if (!id) {
|
|
49
|
54
|
return;
|
|
50
|
55
|
}
|
|
|
@@ -72,7 +77,7 @@ const statsEmitter = {
|
|
72
|
77
|
}
|
|
73
|
78
|
|
|
74
|
79
|
const filteredSubscribers = subscribers[id].filter(
|
|
75
|
|
- subscriber => subscriber !== callback);
|
|
|
80
|
+ (subscriber: Function) => subscriber !== callback);
|
|
76
|
81
|
|
|
77
|
82
|
if (filteredSubscribers.length) {
|
|
78
|
83
|
subscribers[id] = filteredSubscribers;
|
|
|
@@ -89,10 +94,10 @@ const statsEmitter = {
|
|
89
|
94
|
* @param {Object} stats - New connection stats for the user.
|
|
90
|
95
|
* @returns {void}
|
|
91
|
96
|
*/
|
|
92
|
|
- _emitStatsUpdate(id: string, stats: Object = {}) {
|
|
|
97
|
+ _emitStatsUpdate(id: string, stats: Stats = {}) {
|
|
93
|
98
|
const callbacks = subscribers[id] || [];
|
|
94
|
99
|
|
|
95
|
|
- callbacks.forEach(callback => {
|
|
|
100
|
+ callbacks.forEach((callback: Function) => {
|
|
96
|
101
|
callback(stats);
|
|
97
|
102
|
});
|
|
98
|
103
|
},
|
|
|
@@ -107,7 +112,7 @@ const statsEmitter = {
|
|
107
|
112
|
* by the library.
|
|
108
|
113
|
* @returns {void}
|
|
109
|
114
|
*/
|
|
110
|
|
- _onStatsUpdated(localUserId: string, stats: Object) {
|
|
|
115
|
+ _onStatsUpdated(localUserId: string, stats: Stats) {
|
|
111
|
116
|
const allUserFramerates = stats.framerate || {};
|
|
112
|
117
|
const allUserResolutions = stats.resolution || {};
|
|
113
|
118
|
const allUserCodecs = stats.codec || {};
|
|
|
@@ -117,9 +122,9 @@ const statsEmitter = {
|
|
117
|
122
|
// be primitives, not maps, so here we override the 'lib-jitsi-meet'
|
|
118
|
123
|
// stats objects.
|
|
119
|
124
|
const modifiedLocalStats = Object.assign({}, stats, {
|
|
120
|
|
- framerate: allUserFramerates[localUserId],
|
|
121
|
|
- resolution: allUserResolutions[localUserId],
|
|
122
|
|
- codec: allUserCodecs[localUserId]
|
|
|
125
|
+ framerate: allUserFramerates[localUserId as keyof typeof allUserFramerates],
|
|
|
126
|
+ resolution: allUserResolutions[localUserId as keyof typeof allUserResolutions],
|
|
|
127
|
+ codec: allUserCodecs[localUserId as keyof typeof allUserCodecs]
|
|
123
|
128
|
});
|
|
124
|
129
|
|
|
125
|
130
|
this._emitStatsUpdate(localUserId, modifiedLocalStats);
|
|
|
@@ -133,21 +138,21 @@ const statsEmitter = {
|
|
133
|
138
|
_.union(framerateUserIds, resolutionUserIds, codecUserIds)
|
|
134
|
139
|
.filter(id => id !== localUserId)
|
|
135
|
140
|
.forEach(id => {
|
|
136
|
|
- const remoteUserStats = {};
|
|
|
141
|
+ const remoteUserStats: Stats = {};
|
|
137
|
142
|
|
|
138
|
|
- const framerate = allUserFramerates[id];
|
|
|
143
|
+ const framerate = allUserFramerates[id as keyof typeof allUserFramerates];
|
|
139
|
144
|
|
|
140
|
145
|
if (framerate) {
|
|
141
|
146
|
remoteUserStats.framerate = framerate;
|
|
142
|
147
|
}
|
|
143
|
148
|
|
|
144
|
|
- const resolution = allUserResolutions[id];
|
|
|
149
|
+ const resolution = allUserResolutions[id as keyof typeof allUserResolutions];
|
|
145
|
150
|
|
|
146
|
151
|
if (resolution) {
|
|
147
|
152
|
remoteUserStats.resolution = resolution;
|
|
148
|
153
|
}
|
|
149
|
154
|
|
|
150
|
|
- const codec = allUserCodecs[id];
|
|
|
155
|
+ const codec = allUserCodecs[id as keyof typeof allUserCodecs];
|
|
151
|
156
|
|
|
152
|
157
|
if (codec) {
|
|
153
|
158
|
remoteUserStats.codec = codec;
|