@observertc/observer-js 0.30.2-beta → 0.30.3-beta
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/lib/ObservedClient.d.ts +8 -21
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +74 -10
- package/lib/ObservedInboundTrack.d.ts +20 -8
- package/lib/ObservedInboundTrack.d.ts.map +1 -1
- package/lib/ObservedInboundTrack.js +59 -26
- package/lib/ObservedOutboundTrack.d.ts +20 -3
- package/lib/ObservedOutboundTrack.d.ts.map +1 -1
- package/lib/ObservedOutboundTrack.js +53 -9
- package/lib/ObservedPeerConnection.d.ts +15 -7
- package/lib/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/ObservedPeerConnection.js +113 -19
- package/package.json +1 -1
- package/src/ObservedClient.ts +79 -24
- package/src/ObservedInboundTrack.ts +62 -17
- package/src/ObservedOutboundTrack.ts +70 -9
- package/src/ObservedPeerConnection.ts +146 -19
- package/lib/common/ReportsCollector.d.ts +0 -23
- package/lib/common/ReportsCollector.d.ts.map +0 -1
- package/lib/common/ReportsCollector.js +0 -26
- package/src/common/ReportsCollector.ts +0 -71
|
@@ -32,26 +32,31 @@ export declare class ObservedPeerConnection extends EventEmitter {
|
|
|
32
32
|
readonly client: ObservedClient;
|
|
33
33
|
private readonly _storageProvider;
|
|
34
34
|
static create(config: ObservedPeerConnectionConfig, client: ObservedClient, storageProvider: StorageProvider): Promise<ObservedPeerConnection>;
|
|
35
|
+
created: number;
|
|
35
36
|
totalInboundPacketsLost: number;
|
|
36
37
|
totalInboundPacketsReceived: number;
|
|
37
|
-
totalOutboundPacketsLost: number;
|
|
38
|
-
totalOutboundPacketsReceived: number;
|
|
39
38
|
totalOutboundPacketsSent: number;
|
|
40
39
|
totalDataChannelBytesSent: number;
|
|
41
40
|
totalDataChannelBytesReceived: number;
|
|
42
41
|
totalSentAudioBytes: number;
|
|
43
42
|
totalSentVideoBytes: number;
|
|
43
|
+
totalSentAudioPackets: number;
|
|
44
|
+
totalSentVideoPackets: number;
|
|
45
|
+
totalReceivedAudioPacktes: number;
|
|
46
|
+
totalReceivedVideoPackets: number;
|
|
44
47
|
totalReceivedAudioBytes: number;
|
|
45
48
|
totalReceivedVideoBytes: number;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
deltaOutboundPacketsReceived: number;
|
|
50
|
-
deltaOutboundPacketsSent: number;
|
|
49
|
+
deltaInboundLostPackets: number;
|
|
50
|
+
deltaInboundReceivedPackets: number;
|
|
51
|
+
deltaOutboundSentPackets: number;
|
|
51
52
|
deltaDataChannelBytesSent: number;
|
|
52
53
|
deltaDataChannelBytesReceived: number;
|
|
54
|
+
deltaInboundReceivedBytes: number;
|
|
55
|
+
deltaOutboundSentBytes: number;
|
|
53
56
|
deltaReceivedAudioBytes: number;
|
|
54
57
|
deltaReceivedVideoBytes: number;
|
|
58
|
+
deltaReceivedAudioPackets: number;
|
|
59
|
+
deltaReceivedVideoPackets: number;
|
|
55
60
|
deltaSentAudioBytes: number;
|
|
56
61
|
deltaSentVideoBytes: number;
|
|
57
62
|
sendingAudioBitrate: number;
|
|
@@ -81,8 +86,11 @@ export declare class ObservedPeerConnection extends EventEmitter {
|
|
|
81
86
|
get inboundVideoTracks(): ReadonlyMap<string, ObservedInboundTrack<'video'>>;
|
|
82
87
|
get outboundAudioTracks(): ReadonlyMap<string, ObservedOutboundTrack<'audio'>>;
|
|
83
88
|
get outboundVideoTracks(): ReadonlyMap<string, ObservedOutboundTrack<'video'>>;
|
|
89
|
+
get uptimeInMs(): number;
|
|
84
90
|
get closed(): boolean;
|
|
85
91
|
close(): void;
|
|
92
|
+
getTrack(trackId: string): ObservedInboundTrack<'audio'> | ObservedInboundTrack<'video'> | ObservedOutboundTrack<'audio'> | ObservedOutboundTrack<'video'> | undefined;
|
|
93
|
+
resetMetrics(): void;
|
|
86
94
|
updateMetrics(): void;
|
|
87
95
|
update(sample: PeerConnectionTransport, timestamp: number): void;
|
|
88
96
|
updateSelectedCandidate(localCandidate: IceLocalCandidate, remoteCandidate: IceRemoteCandidate): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAG7F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,4BAA4B,GAAG;IAC1C,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,EAAE,CAAC;IACV,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,mBAAmB,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,wBAAwB,EAAE,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC;IAClC,qBAAqB,EAAE,CAAC,MAAM,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IAC1C,gBAAgB,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,uBAAuB,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC;AAEjG,MAAM,CAAC,OAAO,WAAW,sBAAsB;IAC9C,EAAE,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/H,GAAG,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAChI,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACjI,IAAI,CAAC,CAAC,SAAS,MAAM,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,4BAA4B,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CAChH;AAED,qBAAa,sBAAuB,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"ObservedPeerConnection.d.ts","sourceRoot":"","sources":["../src/ObservedPeerConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,26 +60,31 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
60
60
|
this._model = _model;
|
|
61
61
|
this.client = client;
|
|
62
62
|
this._storageProvider = _storageProvider;
|
|
63
|
+
this.created = Date.now();
|
|
63
64
|
this.totalInboundPacketsLost = 0;
|
|
64
65
|
this.totalInboundPacketsReceived = 0;
|
|
65
|
-
this.totalOutboundPacketsLost = 0;
|
|
66
|
-
this.totalOutboundPacketsReceived = 0;
|
|
67
66
|
this.totalOutboundPacketsSent = 0;
|
|
68
67
|
this.totalDataChannelBytesSent = 0;
|
|
69
68
|
this.totalDataChannelBytesReceived = 0;
|
|
70
69
|
this.totalSentAudioBytes = 0;
|
|
71
70
|
this.totalSentVideoBytes = 0;
|
|
71
|
+
this.totalSentAudioPackets = 0;
|
|
72
|
+
this.totalSentVideoPackets = 0;
|
|
73
|
+
this.totalReceivedAudioPacktes = 0;
|
|
74
|
+
this.totalReceivedVideoPackets = 0;
|
|
72
75
|
this.totalReceivedAudioBytes = 0;
|
|
73
76
|
this.totalReceivedVideoBytes = 0;
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.deltaOutboundPacketsReceived = 0;
|
|
78
|
-
this.deltaOutboundPacketsSent = 0;
|
|
77
|
+
this.deltaInboundLostPackets = 0;
|
|
78
|
+
this.deltaInboundReceivedPackets = 0;
|
|
79
|
+
this.deltaOutboundSentPackets = 0;
|
|
79
80
|
this.deltaDataChannelBytesSent = 0;
|
|
80
81
|
this.deltaDataChannelBytesReceived = 0;
|
|
82
|
+
this.deltaInboundReceivedBytes = 0;
|
|
83
|
+
this.deltaOutboundSentBytes = 0;
|
|
81
84
|
this.deltaReceivedAudioBytes = 0;
|
|
82
85
|
this.deltaReceivedVideoBytes = 0;
|
|
86
|
+
this.deltaReceivedAudioPackets = 0;
|
|
87
|
+
this.deltaReceivedVideoPackets = 0;
|
|
83
88
|
this.deltaSentAudioBytes = 0;
|
|
84
89
|
this.deltaSentVideoBytes = 0;
|
|
85
90
|
this.sendingAudioBitrate = 0;
|
|
@@ -126,6 +131,9 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
126
131
|
get outboundVideoTracks() {
|
|
127
132
|
return this._outboundVideoTracks;
|
|
128
133
|
}
|
|
134
|
+
get uptimeInMs() {
|
|
135
|
+
return this._updated - this.created;
|
|
136
|
+
}
|
|
129
137
|
get closed() {
|
|
130
138
|
return this._closed;
|
|
131
139
|
}
|
|
@@ -141,28 +149,94 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
141
149
|
.catch(() => void 0)
|
|
142
150
|
.finally(() => this.emit('close'));
|
|
143
151
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
this.
|
|
150
|
-
this.
|
|
151
|
-
this.
|
|
152
|
-
this.receivingAudioBitrate = 0;
|
|
153
|
-
this.receivingVideoBitrate = 0;
|
|
152
|
+
getTrack(trackId) {
|
|
153
|
+
var _a, _b, _c;
|
|
154
|
+
return (_c = (_b = (_a = this._inboundAudioTracks.get(trackId)) !== null && _a !== void 0 ? _a : this._inboundVideoTracks.get(trackId)) !== null && _b !== void 0 ? _b : this._outboundAudioTracks.get(trackId)) !== null && _c !== void 0 ? _c : this._outboundVideoTracks.get(trackId);
|
|
155
|
+
}
|
|
156
|
+
resetMetrics() {
|
|
157
|
+
this.deltaInboundLostPackets = 0;
|
|
158
|
+
this.deltaInboundReceivedPackets = 0;
|
|
159
|
+
this.deltaOutboundSentPackets = 0;
|
|
154
160
|
this.deltaDataChannelBytesSent = 0;
|
|
155
161
|
this.deltaDataChannelBytesReceived = 0;
|
|
156
162
|
this.deltaReceivedAudioBytes = 0;
|
|
157
163
|
this.deltaReceivedVideoBytes = 0;
|
|
158
164
|
this.deltaSentAudioBytes = 0;
|
|
159
165
|
this.deltaSentVideoBytes = 0;
|
|
166
|
+
this._inboundAudioTracks.forEach((track) => track.resetMetrics());
|
|
167
|
+
this._inboundVideoTracks.forEach((track) => track.resetMetrics());
|
|
168
|
+
this._outboundAudioTracks.forEach((track) => track.resetMetrics());
|
|
169
|
+
this._outboundVideoTracks.forEach((track) => track.resetMetrics());
|
|
170
|
+
}
|
|
171
|
+
updateMetrics() {
|
|
172
|
+
this.totalInboundPacketsLost = 0;
|
|
173
|
+
this.totalInboundPacketsReceived = 0;
|
|
174
|
+
this.totalOutboundPacketsSent = 0;
|
|
175
|
+
this.totalDataChannelBytesSent = 0;
|
|
176
|
+
this.totalDataChannelBytesReceived = 0;
|
|
177
|
+
this.totalSentAudioBytes = 0;
|
|
178
|
+
this.totalSentVideoBytes = 0;
|
|
179
|
+
this.totalReceivedAudioBytes = 0;
|
|
180
|
+
this.totalReceivedVideoBytes = 0;
|
|
181
|
+
this.sendingAudioBitrate = 0;
|
|
182
|
+
this.sendingVideoBitrate = 0;
|
|
183
|
+
this.receivingAudioBitrate = 0;
|
|
184
|
+
this.receivingVideoBitrate = 0;
|
|
185
|
+
let sumRttInS = 0;
|
|
160
186
|
this._inboundAudioTracks.forEach((track) => {
|
|
161
|
-
|
|
187
|
+
var _a;
|
|
188
|
+
this.deltaInboundLostPackets += track.deltaLostPackets;
|
|
189
|
+
this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
|
|
190
|
+
this.deltaInboundReceivedBytes += track.deltaBytesReceived;
|
|
191
|
+
this.deltaReceivedAudioBytes += track.deltaBytesReceived;
|
|
192
|
+
this.deltaReceivedAudioPackets += track.deltaReceivedPackets;
|
|
193
|
+
this.receivingAudioBitrate += track.bitrate;
|
|
194
|
+
this.totalInboundPacketsLost += track.totalLostPackets;
|
|
195
|
+
this.totalInboundPacketsReceived += track.totalReceivedPackets;
|
|
196
|
+
this.totalReceivedAudioBytes += track.totalBytesReceived;
|
|
197
|
+
this.totalReceivedAudioPacktes += track.totalReceivedPackets;
|
|
198
|
+
sumRttInS = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0) / 1000.0;
|
|
162
199
|
});
|
|
163
200
|
this._inboundVideoTracks.forEach((track) => {
|
|
164
|
-
|
|
201
|
+
var _a;
|
|
202
|
+
this.deltaInboundLostPackets += track.deltaLostPackets;
|
|
203
|
+
this.deltaInboundReceivedPackets += track.deltaReceivedPackets;
|
|
204
|
+
this.deltaInboundReceivedBytes += track.deltaBytesReceived;
|
|
205
|
+
this.deltaReceivedVideoBytes += track.deltaBytesReceived;
|
|
206
|
+
this.deltaReceivedVideoPackets += track.deltaReceivedPackets;
|
|
207
|
+
this.receivingVideoBitrate += track.bitrate;
|
|
208
|
+
this.totalInboundPacketsLost += track.totalLostPackets;
|
|
209
|
+
this.totalInboundPacketsReceived += track.totalReceivedPackets;
|
|
210
|
+
this.totalReceivedVideoBytes += track.totalBytesReceived;
|
|
211
|
+
this.totalReceivedVideoPackets += track.totalReceivedPackets;
|
|
212
|
+
sumRttInS = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0) / 1000.0;
|
|
213
|
+
});
|
|
214
|
+
this._outboundAudioTracks.forEach((track) => {
|
|
215
|
+
var _a;
|
|
216
|
+
this.deltaOutboundSentPackets += track.deltaSentPackets;
|
|
217
|
+
this.deltaOutboundSentBytes += track.deltaSentBytes;
|
|
218
|
+
this.deltaSentAudioBytes += track.deltaSentBytes;
|
|
219
|
+
this.deltaSentAudioBytes += track.deltaSentPackets;
|
|
220
|
+
this.sendingAudioBitrate += track.bitrate;
|
|
221
|
+
this.totalOutboundPacketsSent += track.totalSentPackets;
|
|
222
|
+
this.totalSentAudioBytes += track.totalSentBytes;
|
|
223
|
+
this.totalSentAudioPackets += track.totalSentPackets;
|
|
224
|
+
sumRttInS = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0) / 1000.0;
|
|
225
|
+
});
|
|
226
|
+
this._outboundVideoTracks.forEach((track) => {
|
|
227
|
+
var _a;
|
|
228
|
+
this.deltaOutboundSentPackets += track.deltaSentPackets;
|
|
229
|
+
this.deltaOutboundSentBytes += track.deltaSentBytes;
|
|
230
|
+
this.deltaSentVideoBytes += track.deltaSentBytes;
|
|
231
|
+
this.deltaSentVideoBytes += track.deltaSentPackets;
|
|
232
|
+
this.sendingVideoBitrate += track.bitrate;
|
|
233
|
+
this.totalOutboundPacketsSent += track.totalSentPackets;
|
|
234
|
+
this.totalSentVideoBytes += track.totalSentBytes;
|
|
235
|
+
this.totalSentVideoPackets += track.totalSentPackets;
|
|
236
|
+
sumRttInS = ((_a = track.rttInMs) !== null && _a !== void 0 ? _a : 0) / 1000.0;
|
|
165
237
|
});
|
|
238
|
+
const nrOfBelongings = this._inboundAudioTracks.size + this._inboundVideoTracks.size + this._outboundAudioTracks.size + this._outboundVideoTracks.size;
|
|
239
|
+
this.avgRttInS = 0 < nrOfBelongings ? sumRttInS / nrOfBelongings : undefined;
|
|
166
240
|
}
|
|
167
241
|
update(sample, timestamp) {
|
|
168
242
|
if (this._closed)
|
|
@@ -187,6 +261,11 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
187
261
|
kind: 'audio',
|
|
188
262
|
trackId: config.trackId,
|
|
189
263
|
}, this, this._storageProvider);
|
|
264
|
+
const pendingTracksTimestamp = this.client.ωpendingCreatedTracksTimestamp.get(result.trackId);
|
|
265
|
+
if (pendingTracksTimestamp) {
|
|
266
|
+
this.client.ωpendingCreatedTracksTimestamp.delete(result.trackId);
|
|
267
|
+
result.created = pendingTracksTimestamp;
|
|
268
|
+
}
|
|
190
269
|
result.on('close', () => {
|
|
191
270
|
this._inboundAudioTracks.delete(result.trackId);
|
|
192
271
|
this._model.inboundTrackIds = this._model.inboundTrackIds.filter((id) => id !== result.trackId);
|
|
@@ -207,6 +286,11 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
207
286
|
kind: 'video',
|
|
208
287
|
trackId: config.trackId,
|
|
209
288
|
}, this, this._storageProvider);
|
|
289
|
+
const pendingTracksTimestamp = this.client.ωpendingCreatedTracksTimestamp.get(result.trackId);
|
|
290
|
+
if (pendingTracksTimestamp) {
|
|
291
|
+
this.client.ωpendingCreatedTracksTimestamp.delete(result.trackId);
|
|
292
|
+
result.created = pendingTracksTimestamp;
|
|
293
|
+
}
|
|
210
294
|
result.on('close', () => {
|
|
211
295
|
this._inboundVideoTracks.delete(result.trackId);
|
|
212
296
|
this._model.inboundTrackIds = this._model.inboundTrackIds.filter((id) => id !== result.trackId);
|
|
@@ -227,6 +311,11 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
227
311
|
kind: 'audio',
|
|
228
312
|
trackId: config.trackId,
|
|
229
313
|
}, this, this._storageProvider);
|
|
314
|
+
const pendingTracksTimestamp = this.client.ωpendingCreatedTracksTimestamp.get(result.trackId);
|
|
315
|
+
if (pendingTracksTimestamp) {
|
|
316
|
+
this.client.ωpendingCreatedTracksTimestamp.delete(result.trackId);
|
|
317
|
+
result.created = pendingTracksTimestamp;
|
|
318
|
+
}
|
|
230
319
|
result.on('close', () => {
|
|
231
320
|
this._outboundAudioTracks.delete(result.trackId);
|
|
232
321
|
this._model.outboundTrackIds = this._model.outboundTrackIds.filter((id) => id !== result.trackId);
|
|
@@ -249,6 +338,11 @@ class ObservedPeerConnection extends events_1.EventEmitter {
|
|
|
249
338
|
kind: 'video',
|
|
250
339
|
trackId: config.trackId,
|
|
251
340
|
}, this, this._storageProvider);
|
|
341
|
+
const pendingTracksTimestamp = this.client.ωpendingCreatedTracksTimestamp.get(result.trackId);
|
|
342
|
+
if (pendingTracksTimestamp) {
|
|
343
|
+
this.client.ωpendingCreatedTracksTimestamp.delete(result.trackId);
|
|
344
|
+
result.created = pendingTracksTimestamp;
|
|
345
|
+
}
|
|
252
346
|
result.on('close', () => {
|
|
253
347
|
this._outboundVideoTracks.delete(result.trackId);
|
|
254
348
|
result.sfuStreamId && this.client.call.sfuStreamIdToOutboundVideoTrack.set(result.sfuStreamId, result);
|
package/package.json
CHANGED
package/src/ObservedClient.ts
CHANGED
|
@@ -88,6 +88,8 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
88
88
|
return result;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
public created = Date.now();
|
|
92
|
+
|
|
91
93
|
private readonly _peerConnections = new Map<string, ObservedPeerConnection>();
|
|
92
94
|
private readonly _execute = createSingleExecutor();
|
|
93
95
|
|
|
@@ -101,38 +103,23 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
101
103
|
|
|
102
104
|
public totalInboundPacketsLost = 0;
|
|
103
105
|
public totalInboundPacketsReceived = 0;
|
|
104
|
-
public totalOutboundPacketsLost = 0;
|
|
105
|
-
public totalOutboundPacketsReceived = 0;
|
|
106
106
|
public totalOutboundPacketsSent = 0;
|
|
107
107
|
public totalDataChannelBytesSent = 0;
|
|
108
108
|
public totalDataChannelBytesReceived = 0;
|
|
109
|
-
public
|
|
110
|
-
public
|
|
111
|
-
public totalReceivedAudioBytes = 0;
|
|
112
|
-
public totalReceivedVideoBytes = 0;
|
|
113
|
-
|
|
114
|
-
public deltaInboundPacketsLost?: number;
|
|
115
|
-
public deltaInboundPacketsReceived?: number;
|
|
116
|
-
public deltaOutboundPacketsLost?: number;
|
|
117
|
-
public deltaOutboundPacketsReceived?: number;
|
|
118
|
-
public deltaOutboundPacketsSent?: number;
|
|
119
|
-
public deltaDataChannelBytesSent?: number;
|
|
120
|
-
public deltaDataChannelBytesReceived?: number;
|
|
121
|
-
public deltaReceivedAudioBytes?: number;
|
|
122
|
-
public deltaReceivedVideoBytes?: number;
|
|
123
|
-
public deltaSentAudioBytes?: number;
|
|
124
|
-
public deltaSentVideoBytes?: number;
|
|
109
|
+
public totalSentBytes = 0;
|
|
110
|
+
public totalReceivedBytes = 0;
|
|
125
111
|
|
|
126
112
|
public avgRttInS?: number;
|
|
127
|
-
public
|
|
128
|
-
public
|
|
129
|
-
public receivingAudioBitrate?: number;
|
|
130
|
-
public receivingVideoBitrate?: number;
|
|
113
|
+
public sendingBitrate?: number;
|
|
114
|
+
public receivingBitrate?: number;
|
|
131
115
|
|
|
132
116
|
public readonly mediaDevices: string[] = [];
|
|
133
117
|
public readonly codecs: string[] = [];
|
|
134
118
|
public readonly userMediaErrors: string[] = [];
|
|
135
119
|
|
|
120
|
+
public readonly ωpendingCreatedTracksTimestamp = new Map<string, number>();
|
|
121
|
+
public readonly ωpendingCreatedPeerConnectionTimestamp = new Map<string, number>();
|
|
122
|
+
|
|
136
123
|
private constructor(
|
|
137
124
|
private readonly _model: Models.Client,
|
|
138
125
|
public readonly call: ObservedCall,
|
|
@@ -212,6 +199,10 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
212
199
|
return this._updated;
|
|
213
200
|
}
|
|
214
201
|
|
|
202
|
+
public get uptimeInMs() {
|
|
203
|
+
return this._updated - this.created;
|
|
204
|
+
}
|
|
205
|
+
|
|
215
206
|
public get closed() {
|
|
216
207
|
return this._closed;
|
|
217
208
|
}
|
|
@@ -244,6 +235,11 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
244
235
|
}
|
|
245
236
|
|
|
246
237
|
return this._execute(async () => {
|
|
238
|
+
for (const peerConnection of this._peerConnections.values()) {
|
|
239
|
+
if (peerConnection.closed) continue;
|
|
240
|
+
peerConnection.resetMetrics();
|
|
241
|
+
}
|
|
242
|
+
|
|
247
243
|
let executeSave = false;
|
|
248
244
|
|
|
249
245
|
if (this.userId !== sample.userId) {
|
|
@@ -398,10 +394,13 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
398
394
|
});
|
|
399
395
|
}
|
|
400
396
|
|
|
401
|
-
for (const { timestamp
|
|
397
|
+
for (const { timestamp, ...callEvent } of sample.customCallEvents ?? []) {
|
|
402
398
|
const peerConnection = this._peerConnections.get(callEvent.peerConnectionId ?? '');
|
|
403
399
|
|
|
404
400
|
switch (callEvent.name) {
|
|
401
|
+
case CallEventType.CLIENT_JOINED:
|
|
402
|
+
this.created = timestamp ?? this.created;
|
|
403
|
+
break;
|
|
405
404
|
case CallEventType.CLIENT_LEFT:
|
|
406
405
|
this._leaveReported = true;
|
|
407
406
|
break;
|
|
@@ -414,6 +413,26 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
414
413
|
case CallEventType.PEER_CONNECTION_STATE_CHANGED:
|
|
415
414
|
peerConnection && callEvent.value && peerConnection.emit('connectionstatechange', callEvent.value);
|
|
416
415
|
break;
|
|
416
|
+
case CallEventType.PEER_CONNECTION_OPENED: {
|
|
417
|
+
if (!callEvent.peerConnectionId) break;
|
|
418
|
+
if (peerConnection) {
|
|
419
|
+
peerConnection.created = timestamp ?? peerConnection.created;
|
|
420
|
+
} else {
|
|
421
|
+
this.ωpendingCreatedPeerConnectionTimestamp.set(callEvent.peerConnectionId, timestamp ?? Date.now());
|
|
422
|
+
}
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
case CallEventType.MEDIA_TRACK_ADDED: {
|
|
426
|
+
if (!callEvent.mediaTrackId) break;
|
|
427
|
+
const track = peerConnection?.getTrack(callEvent.mediaTrackId);
|
|
428
|
+
|
|
429
|
+
if (track) {
|
|
430
|
+
track.created = timestamp ?? track.created;
|
|
431
|
+
} else {
|
|
432
|
+
this.ωpendingCreatedTracksTimestamp.set(callEvent.mediaTrackId, timestamp ?? Date.now());
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
417
436
|
}
|
|
418
437
|
|
|
419
438
|
this.reports.addCallEventReport({
|
|
@@ -423,7 +442,7 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
423
442
|
callId: this.callId,
|
|
424
443
|
clientId: this.clientId,
|
|
425
444
|
userId: this.userId,
|
|
426
|
-
timestamp,
|
|
445
|
+
timestamp: timestamp ?? Date.now(),
|
|
427
446
|
...callEvent,
|
|
428
447
|
});
|
|
429
448
|
}
|
|
@@ -712,6 +731,35 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
712
731
|
}
|
|
713
732
|
}
|
|
714
733
|
}
|
|
734
|
+
|
|
735
|
+
// update metrics
|
|
736
|
+
this.totalSentBytes = 0;
|
|
737
|
+
this.totalReceivedBytes = 0;
|
|
738
|
+
this.totalOutboundPacketsSent = 0;
|
|
739
|
+
this.totalInboundPacketsReceived = 0;
|
|
740
|
+
this.totalInboundPacketsLost = 0;
|
|
741
|
+
this.totalDataChannelBytesSent = 0;
|
|
742
|
+
this.totalDataChannelBytesReceived = 0;
|
|
743
|
+
this.sendingBitrate = 0;
|
|
744
|
+
this.receivingBitrate = 0;
|
|
745
|
+
let sumRttInS = 0;
|
|
746
|
+
|
|
747
|
+
for (const peerConnection of this._peerConnections.values()) {
|
|
748
|
+
if (peerConnection.closed) continue;
|
|
749
|
+
peerConnection.updateMetrics();
|
|
750
|
+
this.totalSentBytes += peerConnection.totalSentAudioBytes + peerConnection.totalSentVideoBytes;
|
|
751
|
+
this.totalReceivedBytes += peerConnection.totalReceivedAudioBytes + peerConnection.totalReceivedVideoBytes;
|
|
752
|
+
this.totalOutboundPacketsSent += peerConnection.totalOutboundPacketsSent;
|
|
753
|
+
this.totalInboundPacketsReceived += peerConnection.totalInboundPacketsReceived;
|
|
754
|
+
this.totalInboundPacketsLost += peerConnection.totalInboundPacketsLost;
|
|
755
|
+
this.totalDataChannelBytesSent += peerConnection.totalDataChannelBytesSent;
|
|
756
|
+
this.totalDataChannelBytesReceived += peerConnection.totalDataChannelBytesReceived;
|
|
757
|
+
this.sendingBitrate += peerConnection.sendingAudioBitrate + peerConnection.sendingVideoBitrate;
|
|
758
|
+
this.receivingBitrate += peerConnection.receivingAudioBitrate + peerConnection.receivingVideoBitrate;
|
|
759
|
+
sumRttInS += peerConnection.avgRttInS ?? 0;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
this.avgRttInS = this._peerConnections.size ? sumRttInS / this._peerConnections.size : -1;
|
|
715
763
|
|
|
716
764
|
if (executeSave) await this._save();
|
|
717
765
|
|
|
@@ -727,6 +775,13 @@ export class ObservedClient<AppData extends Record<string, unknown> = Record<str
|
|
|
727
775
|
peerConnectionId,
|
|
728
776
|
}, this, this._storageProvider);
|
|
729
777
|
|
|
778
|
+
const pendingTracksTimestamp = this.ωpendingCreatedTracksTimestamp.get(peerConnectionId);
|
|
779
|
+
|
|
780
|
+
if (pendingTracksTimestamp) {
|
|
781
|
+
result.created = pendingTracksTimestamp;
|
|
782
|
+
this.ωpendingCreatedTracksTimestamp.delete(peerConnectionId);
|
|
783
|
+
}
|
|
784
|
+
|
|
730
785
|
result.once('close', () => {
|
|
731
786
|
this._peerConnections.delete(peerConnectionId);
|
|
732
787
|
this._model.peerConnectionIds = this._model.peerConnectionIds.filter((id) => id !== peerConnectionId);
|
|
@@ -75,6 +75,8 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
75
75
|
|
|
76
76
|
return new ObservedInboundTrack<K>(model, peerConnection, storageProvider);
|
|
77
77
|
}
|
|
78
|
+
|
|
79
|
+
public created = Date.now();
|
|
78
80
|
|
|
79
81
|
private readonly _stats = new Map<number, ObservedInboundTrackStats<Kind>>();
|
|
80
82
|
private readonly _execute = createSingleExecutor();
|
|
@@ -82,16 +84,27 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
82
84
|
private _closed = false;
|
|
83
85
|
private _updated = Date.now();
|
|
84
86
|
private _remoteOutboundTrack?: ObservedOutboundTrack<Kind>;
|
|
85
|
-
public bitrate =
|
|
86
|
-
public rttInMs
|
|
87
|
-
public lostPackets = 0;
|
|
88
|
-
public receivedPackets = 0;
|
|
89
|
-
public receivedFrames = 0;
|
|
90
|
-
public decodedFrames = 0;
|
|
91
|
-
public droppedFrames = 0;
|
|
92
|
-
public receivedSamples = 0;
|
|
93
|
-
public silentConcealedSamples = 0;
|
|
87
|
+
public bitrate = 0;
|
|
88
|
+
public rttInMs?: number;
|
|
94
89
|
public fractionLoss = 0;
|
|
90
|
+
|
|
91
|
+
public totalLostPackets = 0;
|
|
92
|
+
public totalReceivedPackets = 0;
|
|
93
|
+
public totalBytesReceived = 0;
|
|
94
|
+
public totalReceivedFrames = 0;
|
|
95
|
+
public totalDecodedFrames = 0;
|
|
96
|
+
public totalDroppedFrames = 0;
|
|
97
|
+
public totalReceivedSamples = 0;
|
|
98
|
+
public totalSilentConcealedSamples = 0;
|
|
99
|
+
|
|
100
|
+
public deltaLostPackets = 0;
|
|
101
|
+
public deltaReceivedPackets = 0;
|
|
102
|
+
public deltaBytesReceived = 0;
|
|
103
|
+
public deltaReceivedFrames = 0;
|
|
104
|
+
public deltaDecodedFrames = 0;
|
|
105
|
+
public deltaDroppedFrames = 0;
|
|
106
|
+
public deltaReceivedSamples = 0;
|
|
107
|
+
public deltaSilentConcealedSamples = 0;
|
|
95
108
|
|
|
96
109
|
private constructor(
|
|
97
110
|
private readonly _model: Models.InboundTrack,
|
|
@@ -161,6 +174,10 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
161
174
|
return this.peerConnection.reports;
|
|
162
175
|
}
|
|
163
176
|
|
|
177
|
+
public get uptimeInMs() {
|
|
178
|
+
return this._updated - this.created;
|
|
179
|
+
}
|
|
180
|
+
|
|
164
181
|
public set remoteOutboundTrack(track: ObservedOutboundTrack<Kind> | undefined) {
|
|
165
182
|
if (this._closed) return;
|
|
166
183
|
if (this._remoteOutboundTrack) return;
|
|
@@ -190,6 +207,19 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
190
207
|
.finally(() => this.emit('close'));
|
|
191
208
|
}
|
|
192
209
|
|
|
210
|
+
public resetMetrics() {
|
|
211
|
+
this.bitrate = 0;
|
|
212
|
+
this.rttInMs = undefined;
|
|
213
|
+
this.deltaBytesReceived = 0;
|
|
214
|
+
this.deltaLostPackets = 0;
|
|
215
|
+
this.deltaReceivedFrames = 0;
|
|
216
|
+
this.deltaDecodedFrames = 0;
|
|
217
|
+
this.deltaDroppedFrames = 0;
|
|
218
|
+
this.deltaReceivedSamples = 0;
|
|
219
|
+
this.deltaSilentConcealedSamples = 0;
|
|
220
|
+
this.fractionLoss = 0;
|
|
221
|
+
}
|
|
222
|
+
|
|
193
223
|
public async update(sample: ObservedInboundTrackStatsUpdate<Kind>, timestamp: number) {
|
|
194
224
|
if (this._closed) return;
|
|
195
225
|
let executeSave = false;
|
|
@@ -205,6 +235,11 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
205
235
|
...sample,
|
|
206
236
|
timestamp,
|
|
207
237
|
sampleSeq: -1,
|
|
238
|
+
|
|
239
|
+
remoteClientId: sample.remoteClientId ?? this.remoteOutboundTrack?.peerConnection.client.clientId,
|
|
240
|
+
remoteUserId: this.remoteOutboundTrack?.peerConnection.client.userId,
|
|
241
|
+
remoteTrackId: this.remoteOutboundTrack?.trackId,
|
|
242
|
+
remotePeerConnectionId: this.remoteOutboundTrack?.peerConnection.peerConnectionId,
|
|
208
243
|
};
|
|
209
244
|
|
|
210
245
|
if (this.kind === 'audio') this.reports.addInboundAudioTrackReport(report);
|
|
@@ -264,14 +299,24 @@ export class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
|
264
299
|
|
|
265
300
|
this.bitrate = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.bitrate, 0);
|
|
266
301
|
this.rttInMs = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.rttInMs ?? 0), 0) / (this._stats.size || 1);
|
|
267
|
-
this.
|
|
268
|
-
this.
|
|
269
|
-
this.
|
|
270
|
-
this.
|
|
271
|
-
this.
|
|
272
|
-
this.
|
|
273
|
-
this.
|
|
274
|
-
this.
|
|
302
|
+
this.totalLostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.lostPackets ?? 0), 0);
|
|
303
|
+
this.totalReceivedPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedPackets ?? 0), 0);
|
|
304
|
+
this.totalBytesReceived = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.bytesReceived ?? 0), 0);
|
|
305
|
+
this.totalReceivedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedFrames ?? 0), 0);
|
|
306
|
+
this.totalDecodedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.decodedFrames ?? 0), 0);
|
|
307
|
+
this.totalDroppedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.droppedFrames ?? 0), 0);
|
|
308
|
+
this.totalReceivedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedSamples ?? 0), 0);
|
|
309
|
+
this.totalSilentConcealedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.silentConcealedSamples ?? 0), 0);
|
|
310
|
+
|
|
311
|
+
this.deltaLostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.lostPackets ?? 0), 0);
|
|
312
|
+
this.deltaReceivedPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedPackets ?? 0), 0);
|
|
313
|
+
this.deltaBytesReceived = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.bytesReceived ?? 0), 0);
|
|
314
|
+
this.deltaReceivedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedFrames ?? 0), 0);
|
|
315
|
+
this.deltaDecodedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.decodedFrames ?? 0), 0);
|
|
316
|
+
this.deltaDroppedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.droppedFrames ?? 0), 0);
|
|
317
|
+
this.deltaReceivedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedSamples ?? 0), 0);
|
|
318
|
+
this.deltaSilentConcealedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.silentConcealedSamples ?? 0), 0);
|
|
319
|
+
this.fractionLoss = 0 < this.deltaReceivedPackets && 0 < this.deltaLostPackets ? (this.deltaLostPackets / (this.deltaReceivedPackets + this.deltaLostPackets)) : 0;
|
|
275
320
|
|
|
276
321
|
if (executeSave) await this._save();
|
|
277
322
|
|