@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.
@@ -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
- deltaInboundPacketsLost: number;
47
- deltaInboundPacketsReceived: number;
48
- deltaOutboundPacketsLost: number;
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":"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"}
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.deltaInboundPacketsLost = 0;
75
- this.deltaInboundPacketsReceived = 0;
76
- this.deltaOutboundPacketsLost = 0;
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
- updateMetrics() {
145
- this.deltaInboundPacketsLost = 0;
146
- this.deltaInboundPacketsReceived = 0;
147
- this.deltaOutboundPacketsLost = 0;
148
- this.deltaOutboundPacketsReceived = 0;
149
- this.deltaOutboundPacketsSent = 0;
150
- this.sendingAudioBitrate = 0;
151
- this.sendingVideoBitrate = 0;
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
- this.deltaReceivedAudioBytes += track.receivedPackets;
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
- this.deltaReceivedVideoBytes += track.receivedPackets;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@observertc/observer-js",
3
- "version": "0.30.2-beta",
3
+ "version": "0.30.3-beta",
4
4
  "description": "Server Side NodeJS Library for processing ObserveRTC Samples",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -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 totalSentAudioBytes = 0;
110
- public totalSentVideoBytes = 0;
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 sendingAudioBitrate?: number;
128
- public sendingVideoBitrate?: number;
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 = Date.now(), ...callEvent } of sample.customCallEvents ?? []) {
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 = -1;
86
- public rttInMs = -1;
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.lostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.lostPackets ?? 0), 0);
268
- this.receivedPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedPackets ?? 0), 0);
269
- this.receivedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedFrames ?? 0), 0);
270
- this.decodedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.decodedFrames ?? 0), 0);
271
- this.droppedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.droppedFrames ?? 0), 0);
272
- this.receivedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.receivedSamples ?? 0), 0);
273
- this.silentConcealedSamples = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.silentConcealedSamples ?? 0), 0);
274
- this.fractionLoss = 0 < this.receivedPackets && 0 < this.lostPackets ? (this.lostPackets / (this.receivedPackets + this.lostPackets)) : 0;
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