@observertc/observer-js 0.41.7 → 0.42.1

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.
Files changed (57) hide show
  1. package/lib/ObservedCall.d.ts +10 -3
  2. package/lib/ObservedCall.d.ts.map +1 -1
  3. package/lib/ObservedCall.js +28 -0
  4. package/lib/ObservedClient.d.ts +5 -0
  5. package/lib/ObservedClient.d.ts.map +1 -1
  6. package/lib/ObservedClient.js +83 -32
  7. package/lib/ObservedInboundAudioTrack.d.ts +94 -0
  8. package/lib/ObservedInboundAudioTrack.d.ts.map +1 -0
  9. package/lib/ObservedInboundAudioTrack.js +215 -0
  10. package/lib/ObservedInboundVideoTrack.d.ts +98 -0
  11. package/lib/ObservedInboundVideoTrack.d.ts.map +1 -0
  12. package/lib/{ObservedInboundTrack.js → ObservedInboundVideoTrack.js} +53 -44
  13. package/lib/ObservedOutboundAudioTrack.d.ts +85 -0
  14. package/lib/ObservedOutboundAudioTrack.d.ts.map +1 -0
  15. package/lib/{ObservedOutboundTrack.js → ObservedOutboundAudioTrack.js} +35 -58
  16. package/lib/ObservedOutboundVideoTrack.d.ts +88 -0
  17. package/lib/ObservedOutboundVideoTrack.d.ts.map +1 -0
  18. package/lib/ObservedOutboundVideoTrack.js +204 -0
  19. package/lib/ObservedPeerConnection.d.ts +26 -16
  20. package/lib/ObservedPeerConnection.d.ts.map +1 -1
  21. package/lib/ObservedPeerConnection.js +157 -86
  22. package/lib/Observer.d.ts +1 -0
  23. package/lib/Observer.d.ts.map +1 -1
  24. package/lib/Observer.js +2 -2
  25. package/lib/RemoteTrackAssigner.d.ts +14 -0
  26. package/lib/RemoteTrackAssigner.d.ts.map +1 -0
  27. package/lib/RemoteTrackAssigner.js +52 -0
  28. package/lib/common/CalculatedScore.d.ts +79 -0
  29. package/lib/common/CalculatedScore.d.ts.map +1 -0
  30. package/lib/common/CalculatedScore.js +155 -0
  31. package/lib/common/QualityScoreUtils.d.ts +1 -0
  32. package/lib/common/QualityScoreUtils.d.ts.map +1 -0
  33. package/lib/common/QualityScoreUtils.js +1 -0
  34. package/lib/common/utils.d.ts +1 -0
  35. package/lib/common/utils.d.ts.map +1 -1
  36. package/lib/common/utils.js +14 -1
  37. package/lib/index.d.ts +4 -2
  38. package/lib/index.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/src/ObservedCall.ts +40 -4
  41. package/src/ObservedClient.ts +79 -17
  42. package/src/ObservedInboundAudioTrack.ts +336 -0
  43. package/src/{ObservedInboundTrack.ts → ObservedInboundVideoTrack.ts} +85 -66
  44. package/src/{ObservedOutboundTrack.ts → ObservedOutboundAudioTrack.ts} +59 -74
  45. package/src/ObservedOutboundVideoTrack.ts +326 -0
  46. package/src/ObservedPeerConnection.ts +205 -131
  47. package/src/Observer.ts +3 -2
  48. package/src/RemoteTrackAssigner.ts +68 -0
  49. package/src/common/CalculatedScore.ts +180 -0
  50. package/src/common/QualityScoreUtils.ts +0 -0
  51. package/src/common/utils.ts +17 -1
  52. package/src/index.ts +4 -2
  53. package/src/monitors/CallSummaryMonitor.ts +3 -3
  54. package/lib/ObservedInboundTrack.d.ts +0 -96
  55. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  56. package/lib/ObservedOutboundTrack.d.ts +0 -84
  57. package/lib/ObservedOutboundTrack.d.ts.map +0 -1
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ObservedOutboundTrack = void 0;
3
+ exports.ObservedOutboundAudioTrack = void 0;
4
4
  const events_1 = require("events");
5
- class ObservedOutboundTrack extends events_1.EventEmitter {
5
+ const CalculatedScore_1 = require("./common/CalculatedScore");
6
+ class ObservedOutboundAudioTrack extends events_1.EventEmitter {
6
7
  constructor(_model, peerConnection) {
7
8
  super();
8
9
  this._model = _model;
@@ -24,10 +25,9 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
24
25
  this._lastMaxStatsTimestamp = 0;
25
26
  this._closed = false;
26
27
  this._updated = Date.now();
27
- this._remoteInboundTracks = new Map();
28
+ this.ωpendingIssuesForScores = [];
29
+ this.remoteInboundTracks = new Map();
28
30
  this.setMaxListeners(Infinity);
29
- if (this._model.sfuStreamId)
30
- this._assignSfuStreamId(this._model.sfuStreamId);
31
31
  }
32
32
  get serviceId() {
33
33
  return this.peerConnection.serviceId;
@@ -47,21 +47,18 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
47
47
  get peerConnectionId() {
48
48
  return this.peerConnection.peerConnectionId;
49
49
  }
50
- get kind() {
51
- return this._model.kind;
52
- }
53
50
  get trackId() {
54
51
  return this._model.trackId;
55
52
  }
56
53
  get sfuStreamId() {
57
54
  return this._model.sfuStreamId;
58
55
  }
59
- get remoteInboundTracks() {
60
- return this._remoteInboundTracks;
61
- }
62
56
  get reports() {
63
57
  return this.peerConnection.reports;
64
58
  }
59
+ get statsTimestamp() {
60
+ return this._lastMaxStatsTimestamp;
61
+ }
65
62
  get updated() {
66
63
  return this._updated;
67
64
  }
@@ -82,10 +79,7 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
82
79
  return;
83
80
  const now = Date.now();
84
81
  const report = Object.assign(Object.assign({ serviceId: this.peerConnection.client.serviceId, roomId: this.peerConnection.client.call.roomId, callId: this.peerConnection.client.call.callId, clientId: this.peerConnection.client.clientId, userId: this.peerConnection.client.userId, mediaUnitId: this.peerConnection.client.mediaUnitId, peerConnectionId: this.peerConnection.peerConnectionId }, sample), { timestamp: statsTimestamp, sampleSeq: -1, marker: this.marker });
85
- if (this.kind === 'audio')
86
- this.reports.addOutboundAudioTrackReport(report);
87
- else if (this.kind === 'video')
88
- this.reports.addOutboundVideoTrackReport(report);
82
+ this.reports.addOutboundAudioTrackReport(report);
89
83
  const elapsedTimeInMs = Math.max(1, now - this._updated);
90
84
  const lastStat = this._stats.get(sample.ssrc);
91
85
  const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
@@ -107,22 +101,16 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
107
101
  }
108
102
  let deltaEncodedFrames;
109
103
  let deltaSentFrames;
110
- if (this.kind === 'video') {
111
- const videoSample = sample;
112
- const lastVideoStats = lastStat;
113
- if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesEncoded) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesEncoded) && lastVideoStats.framesEncoded < videoSample.framesEncoded) {
114
- deltaEncodedFrames = videoSample.framesEncoded - lastVideoStats.framesEncoded;
115
- }
116
- if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesSent) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesSent) && lastVideoStats.framesSent < videoSample.framesSent) {
117
- deltaSentFrames = videoSample.framesSent - lastVideoStats.framesSent;
118
- }
119
- if (videoSample.qualityLimitationReason && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.qualityLimitationReason) !== videoSample.qualityLimitationReason) {
120
- this.emit('qualitylimitationchanged', videoSample.qualityLimitationReason);
121
- }
104
+ const videoSample = sample;
105
+ const lastVideoStats = lastStat;
106
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesEncoded) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesEncoded) && lastVideoStats.framesEncoded < videoSample.framesEncoded) {
107
+ deltaEncodedFrames = videoSample.framesEncoded - lastVideoStats.framesEncoded;
122
108
  }
123
- else if (this.kind === 'audio') {
124
- // const audioSample = sample as OutboundAudioTrack;
125
- // const lastAudioStats = lastStat as OutboundAudioTrack | undefined;
109
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesSent) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesSent) && lastVideoStats.framesSent < videoSample.framesSent) {
110
+ deltaSentFrames = videoSample.framesSent - lastVideoStats.framesSent;
111
+ }
112
+ if (videoSample.qualityLimitationReason && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.qualityLimitationReason) !== videoSample.qualityLimitationReason) {
113
+ this.emit('qualitylimitationchanged', videoSample.qualityLimitationReason);
126
114
  }
127
115
  const stats = Object.assign(Object.assign({}, sample), { rttInMs,
128
116
  bitrate, ssrc: sample.ssrc, deltaLostPackets,
@@ -144,28 +132,17 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
144
132
  // this.deltaSentPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.deltaSentPackets, 0);
145
133
  // this.deltaSentBytes = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.deltaSentBytes, 0);
146
134
  // setting up sfu connection as it is not always available at the first sample
147
- if (sample.sfuStreamId && !this._model.sfuStreamId) {
148
- this._assignSfuStreamId(sample.sfuStreamId);
149
- }
150
135
  this.visited = true;
151
136
  this._updated = now;
152
137
  this.emit('update', {
153
138
  elapsedTimeInMs,
154
139
  });
155
140
  }
156
- connectInboundTrack(track) {
157
- if (this._closed)
158
- return;
159
- track.remoteOutboundTrack = this;
160
- track.once('close', () => {
161
- this._remoteInboundTracks.delete(track.trackId);
162
- });
163
- this._remoteInboundTracks.set(track.trackId, track);
164
- }
165
141
  updateMetrics() {
166
- var _a, _b, _c, _d, _e, _f;
142
+ var _a, _b, _c, _d, _e, _f, _g;
167
143
  let maxStatsTimestamp = 0;
168
144
  let rttInMsSum = 0;
145
+ let jitterSum = 0;
169
146
  let size = 0;
170
147
  this.bitrate = 0;
171
148
  this.rttInMs = undefined;
@@ -186,6 +163,7 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
186
163
  this.bitrate += stats.bitrate;
187
164
  maxStatsTimestamp = Math.max(maxStatsTimestamp, stats.statsTimestamp);
188
165
  rttInMsSum += (_f = stats.rttInMs) !== null && _f !== void 0 ? _f : 0;
166
+ jitterSum += (_g = stats.jitter) !== null && _g !== void 0 ? _g : 0;
189
167
  ++size;
190
168
  }
191
169
  const now = Date.now();
@@ -198,22 +176,21 @@ class ObservedOutboundTrack extends events_1.EventEmitter {
198
176
  this.totalSentBytes += this.deltaSentBytes;
199
177
  this.totalSentFrames += this.deltaSentFrames;
200
178
  this.rttInMs = rttInMsSum / Math.max(size, 1);
179
+ this.jitter = jitterSum / Math.max(size, 1);
201
180
  this._lastMaxStatsTimestamp = maxStatsTimestamp;
181
+ this._updateQualityScore(maxStatsTimestamp);
202
182
  }
203
- _assignSfuStreamId(sfuStreamId) {
204
- this._model.sfuStreamId = sfuStreamId;
205
- this.once('close', () => {
206
- if (!this._model.sfuStreamId)
207
- return;
208
- if (this.kind === 'audio')
209
- this.peerConnection.client.call.sfuStreamIdToOutboundAudioTrack.delete(this._model.sfuStreamId);
210
- else if (this.kind === 'video')
211
- this.peerConnection.client.call.sfuStreamIdToOutboundVideoTrack.delete(this._model.sfuStreamId);
212
- });
213
- if (this.kind === 'audio')
214
- this.peerConnection.client.call.sfuStreamIdToOutboundAudioTrack.set(this._model.sfuStreamId, this);
215
- else if (this.kind === 'video')
216
- this.peerConnection.client.call.sfuStreamIdToOutboundVideoTrack.set(this._model.sfuStreamId, this);
183
+ _updateQualityScore(timestamp) {
184
+ const newIssues = this.ωpendingIssuesForScores;
185
+ const score = (0, CalculatedScore_1.calculateBaseAudioScore)(this, newIssues);
186
+ if (0 < newIssues.length) {
187
+ this.ωpendingIssuesForScores = [];
188
+ }
189
+ if (!score)
190
+ return (this.score = undefined);
191
+ score.timestamp = timestamp;
192
+ this.score = score;
193
+ this.emit('score', this.score);
217
194
  }
218
195
  }
219
- exports.ObservedOutboundTrack = ObservedOutboundTrack;
196
+ exports.ObservedOutboundAudioTrack = ObservedOutboundAudioTrack;
@@ -0,0 +1,88 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import { ObservedPeerConnection } from './ObservedPeerConnection';
4
+ import { OutboundVideoTrack } from '@observertc/sample-schemas-js';
5
+ import { ObservedInboundVideoTrack } from './ObservedInboundVideoTrack';
6
+ import { CalculatedScore } from './common/CalculatedScore';
7
+ import { ClientIssue } from './monitors/CallSummary';
8
+ export type ObservedOutboundVideoTrackModel = {
9
+ trackId: string;
10
+ sfuStreamId?: string;
11
+ };
12
+ export type ObservedOutboundVideoTrackEvents = {
13
+ qualitylimitationchanged: [string];
14
+ update: [
15
+ {
16
+ elapsedTimeInMs: number;
17
+ }
18
+ ];
19
+ score: [CalculatedScore];
20
+ close: [];
21
+ };
22
+ export type ObservedOutboundVideoTrackStats = OutboundVideoTrack & {
23
+ ssrc: number;
24
+ bitrate: number;
25
+ rttInMs?: number;
26
+ deltaLostPackets: number;
27
+ deltaSentPackets: number;
28
+ deltaSentBytes: number;
29
+ deltaSentFrames?: number;
30
+ deltaEncodedFrames?: number;
31
+ statsTimestamp: number;
32
+ };
33
+ export declare interface ObservedOutboundVideoTrack {
34
+ on<U extends keyof ObservedOutboundVideoTrackEvents>(event: U, listener: (...args: ObservedOutboundVideoTrackEvents[U]) => void): this;
35
+ off<U extends keyof ObservedOutboundVideoTrackEvents>(event: U, listener: (...args: ObservedOutboundVideoTrackEvents[U]) => void): this;
36
+ once<U extends keyof ObservedOutboundVideoTrackEvents>(event: U, listener: (...args: ObservedOutboundVideoTrackEvents[U]) => void): this;
37
+ emit<U extends keyof ObservedOutboundVideoTrackEvents>(event: U, ...args: ObservedOutboundVideoTrackEvents[U]): boolean;
38
+ update(sample: OutboundVideoTrack, timestamp: number): void;
39
+ }
40
+ export declare class ObservedOutboundVideoTrack extends EventEmitter {
41
+ private readonly _model;
42
+ readonly peerConnection: ObservedPeerConnection;
43
+ readonly created: number;
44
+ visited: boolean;
45
+ contentType: 'lowmotion' | 'standard' | 'highmotion';
46
+ codec: 'vp8' | 'vp9' | 'h264';
47
+ highestLayer?: ObservedOutboundVideoTrackStats;
48
+ bitrate: number;
49
+ jitter?: number;
50
+ rttInMs?: number;
51
+ marker?: string;
52
+ totalLostPackets: number;
53
+ totalSentPackets: number;
54
+ totalSentBytes: number;
55
+ totalSentFrames: number;
56
+ deltaLostPackets: number;
57
+ deltaSentPackets: number;
58
+ deltaSentBytes: number;
59
+ deltaSentFrames: number;
60
+ deltaEncodedFrames: number;
61
+ sendingBitrate: number;
62
+ private readonly _stats;
63
+ private _lastMaxStatsTimestamp;
64
+ private _closed;
65
+ private _updated;
66
+ readonly remoteInboundTracks: Map<string, ObservedInboundVideoTrack>;
67
+ score?: CalculatedScore;
68
+ ωpendingIssuesForScores: ClientIssue[];
69
+ constructor(_model: ObservedOutboundVideoTrackModel, peerConnection: ObservedPeerConnection);
70
+ get serviceId(): string;
71
+ get roomId(): string;
72
+ get callId(): string;
73
+ get clientId(): string;
74
+ get mediaUnitId(): string;
75
+ get peerConnectionId(): string;
76
+ get trackId(): string;
77
+ get sfuStreamId(): string | undefined;
78
+ get reports(): import("./ReportsCollector").ReportsCollector;
79
+ get updated(): number;
80
+ get statsTimestamp(): number;
81
+ get stats(): ReadonlyMap<number, ObservedOutboundVideoTrackStats>;
82
+ get closed(): boolean;
83
+ close(): void;
84
+ private _lastUpdateMetrics?;
85
+ updateMetrics(): void;
86
+ private _updateQualityScore;
87
+ }
88
+ //# sourceMappingURL=ObservedOutboundVideoTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObservedOutboundVideoTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundVideoTrack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObservedOutboundVideoTrack = void 0;
4
+ const events_1 = require("events");
5
+ const CalculatedScore_1 = require("./common/CalculatedScore");
6
+ class ObservedOutboundVideoTrack extends events_1.EventEmitter {
7
+ constructor(_model, peerConnection) {
8
+ super();
9
+ this._model = _model;
10
+ this.peerConnection = peerConnection;
11
+ this.created = Date.now();
12
+ this.visited = false;
13
+ this.contentType = 'standard';
14
+ this.codec = 'vp8';
15
+ this.bitrate = 0;
16
+ this.totalLostPackets = 0;
17
+ this.totalSentPackets = 0;
18
+ this.totalSentBytes = 0;
19
+ this.totalSentFrames = 0;
20
+ this.deltaLostPackets = 0;
21
+ this.deltaSentPackets = 0;
22
+ this.deltaSentBytes = 0;
23
+ this.deltaSentFrames = 0;
24
+ this.deltaEncodedFrames = 0;
25
+ this.sendingBitrate = 0;
26
+ this._stats = new Map();
27
+ this._lastMaxStatsTimestamp = 0;
28
+ this._closed = false;
29
+ this._updated = Date.now();
30
+ this.remoteInboundTracks = new Map();
31
+ this.ωpendingIssuesForScores = [];
32
+ this.setMaxListeners(Infinity);
33
+ }
34
+ get serviceId() {
35
+ return this.peerConnection.serviceId;
36
+ }
37
+ get roomId() {
38
+ return this.peerConnection.roomId;
39
+ }
40
+ get callId() {
41
+ return this.peerConnection.callId;
42
+ }
43
+ get clientId() {
44
+ return this.peerConnection.clientId;
45
+ }
46
+ get mediaUnitId() {
47
+ return this.peerConnection.mediaUnitId;
48
+ }
49
+ get peerConnectionId() {
50
+ return this.peerConnection.peerConnectionId;
51
+ }
52
+ get trackId() {
53
+ return this._model.trackId;
54
+ }
55
+ get sfuStreamId() {
56
+ return this._model.sfuStreamId;
57
+ }
58
+ get reports() {
59
+ return this.peerConnection.reports;
60
+ }
61
+ get updated() {
62
+ return this._updated;
63
+ }
64
+ get statsTimestamp() {
65
+ return this._lastMaxStatsTimestamp;
66
+ }
67
+ get stats() {
68
+ return this._stats;
69
+ }
70
+ get closed() {
71
+ return this._closed;
72
+ }
73
+ close() {
74
+ if (this._closed)
75
+ return;
76
+ this._closed = true;
77
+ this.emit('close');
78
+ }
79
+ update(sample, statsTimestamp) {
80
+ if (this._closed)
81
+ return;
82
+ const now = Date.now();
83
+ const report = Object.assign(Object.assign({ serviceId: this.peerConnection.client.serviceId, roomId: this.peerConnection.client.call.roomId, callId: this.peerConnection.client.call.callId, clientId: this.peerConnection.client.clientId, userId: this.peerConnection.client.userId, mediaUnitId: this.peerConnection.client.mediaUnitId, peerConnectionId: this.peerConnection.peerConnectionId }, sample), { timestamp: statsTimestamp, sampleSeq: -1, marker: this.marker });
84
+ this.reports.addOutboundVideoTrackReport(report);
85
+ const elapsedTimeInMs = Math.max(1, now - this._updated);
86
+ const lastStat = this._stats.get(sample.ssrc);
87
+ const rttInMs = sample.roundTripTime ? sample.roundTripTime * 1000 : undefined;
88
+ let bitrate = 0;
89
+ let deltaLostPackets = 0;
90
+ let deltaSentPackets = 0;
91
+ let deltaSentBytes = 0;
92
+ if (sample.bytesSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) && lastStat.bytesSent < sample.bytesSent) {
93
+ bitrate = (sample.bytesSent - lastStat.bytesSent) * 8 / (elapsedTimeInMs / 1000);
94
+ }
95
+ if (sample.packetsLost && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsLost) && lastStat.packetsLost < sample.packetsLost) {
96
+ deltaLostPackets = sample.packetsLost - lastStat.packetsLost;
97
+ }
98
+ if (sample.packetsSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.packetsSent) && lastStat.packetsSent < sample.packetsSent) {
99
+ deltaSentPackets = sample.packetsSent - lastStat.packetsSent;
100
+ }
101
+ if (sample.bytesSent && (lastStat === null || lastStat === void 0 ? void 0 : lastStat.bytesSent) && lastStat.bytesSent < sample.bytesSent) {
102
+ deltaSentBytes = sample.bytesSent - lastStat.bytesSent;
103
+ }
104
+ let deltaEncodedFrames;
105
+ let deltaSentFrames;
106
+ const videoSample = sample;
107
+ const lastVideoStats = lastStat;
108
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesEncoded) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesEncoded) && lastVideoStats.framesEncoded < videoSample.framesEncoded) {
109
+ deltaEncodedFrames = videoSample.framesEncoded - lastVideoStats.framesEncoded;
110
+ }
111
+ if ((videoSample === null || videoSample === void 0 ? void 0 : videoSample.framesSent) && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.framesSent) && lastVideoStats.framesSent < videoSample.framesSent) {
112
+ deltaSentFrames = videoSample.framesSent - lastVideoStats.framesSent;
113
+ }
114
+ if (videoSample.qualityLimitationReason && (lastVideoStats === null || lastVideoStats === void 0 ? void 0 : lastVideoStats.qualityLimitationReason) !== videoSample.qualityLimitationReason) {
115
+ this.emit('qualitylimitationchanged', videoSample.qualityLimitationReason);
116
+ }
117
+ const stats = Object.assign(Object.assign({}, sample), { rttInMs,
118
+ bitrate, ssrc: sample.ssrc, deltaLostPackets,
119
+ deltaSentPackets,
120
+ deltaSentBytes,
121
+ deltaEncodedFrames,
122
+ deltaSentFrames,
123
+ statsTimestamp });
124
+ this._stats.set(sample.ssrc, stats);
125
+ // this.bitrate = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.bitrate, 0);
126
+ // this.rttInMs = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.rttInMs ?? 0), 0) / (this._stats.size || 1);
127
+ // this.totalLostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.packetsLost ?? 0), 0);
128
+ // this.totalSentPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.packetsSent ?? 0), 0);
129
+ // this.totalSentBytes = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.bytesSent ?? 0), 0);
130
+ // this.totalSentFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaSentPackets ?? 0), 0);
131
+ // this.deltaEncodedFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaEncodedFrames ?? 0), 0);
132
+ // this.deltaSentFrames = [ ...this._stats.values() ].reduce((acc, stat) => acc + (stat.deltaSentFrames ?? 0), 0);
133
+ // this.deltaLostPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.deltaLostPackets, 0);
134
+ // this.deltaSentPackets = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.deltaSentPackets, 0);
135
+ // this.deltaSentBytes = [ ...this._stats.values() ].reduce((acc, stat) => acc + stat.deltaSentBytes, 0);
136
+ // setting up sfu connection as it is not always available at the first sample
137
+ this.visited = true;
138
+ this._updated = now;
139
+ this.emit('update', {
140
+ elapsedTimeInMs,
141
+ });
142
+ }
143
+ updateMetrics() {
144
+ var _a, _b, _c, _d, _e, _f, _g;
145
+ let maxStatsTimestamp = 0;
146
+ let rttInMsSum = 0;
147
+ let jitterSum = 0;
148
+ let size = 0;
149
+ this.bitrate = 0;
150
+ this.rttInMs = undefined;
151
+ this.sendingBitrate = 0;
152
+ this.deltaLostPackets = 0;
153
+ this.deltaSentPackets = 0;
154
+ this.deltaSentBytes = 0;
155
+ this.deltaSentFrames = 0;
156
+ this.deltaEncodedFrames = 0;
157
+ const highestLayer = { ssrc: 0, bitrate: -1 };
158
+ for (const [ssrc, stats] of this._stats) {
159
+ if (stats.statsTimestamp <= this._lastMaxStatsTimestamp)
160
+ continue;
161
+ this.deltaLostPackets += (_a = stats.deltaLostPackets) !== null && _a !== void 0 ? _a : 0;
162
+ this.deltaSentPackets += (_b = stats.deltaSentPackets) !== null && _b !== void 0 ? _b : 0;
163
+ this.deltaSentBytes += (_c = stats.deltaSentBytes) !== null && _c !== void 0 ? _c : 0;
164
+ this.deltaSentFrames += (_d = stats.deltaSentFrames) !== null && _d !== void 0 ? _d : 0;
165
+ this.deltaEncodedFrames += (_e = stats.deltaEncodedFrames) !== null && _e !== void 0 ? _e : 0;
166
+ this.bitrate += stats.bitrate;
167
+ maxStatsTimestamp = Math.max(maxStatsTimestamp, stats.statsTimestamp);
168
+ rttInMsSum += (_f = stats.rttInMs) !== null && _f !== void 0 ? _f : 0;
169
+ jitterSum += (_g = stats.jitter) !== null && _g !== void 0 ? _g : 0;
170
+ ++size;
171
+ if (stats.bitrate > highestLayer.bitrate) {
172
+ highestLayer.ssrc = ssrc;
173
+ highestLayer.bitrate = stats.bitrate;
174
+ }
175
+ }
176
+ const now = Date.now();
177
+ if (this._lastUpdateMetrics) {
178
+ this.sendingBitrate = (this.deltaSentBytes * 8) / ((now - this._lastUpdateMetrics) / 1000);
179
+ }
180
+ this._lastUpdateMetrics = now;
181
+ this.highestLayer = this._stats.get(highestLayer.ssrc);
182
+ this.totalLostPackets += this.deltaLostPackets;
183
+ this.totalSentPackets += this.deltaSentPackets;
184
+ this.totalSentBytes += this.deltaSentBytes;
185
+ this.totalSentFrames += this.deltaSentFrames;
186
+ this.rttInMs = rttInMsSum / Math.max(size, 1);
187
+ this.jitter = jitterSum / Math.max(size, 1);
188
+ this._lastMaxStatsTimestamp = maxStatsTimestamp;
189
+ this._updateQualityScore(maxStatsTimestamp);
190
+ }
191
+ _updateQualityScore(timestamp) {
192
+ const newIssues = this.ωpendingIssuesForScores;
193
+ const score = (0, CalculatedScore_1.calculateBaseVideoScore)(this, newIssues);
194
+ if (0 < newIssues.length) {
195
+ this.ωpendingIssuesForScores = [];
196
+ }
197
+ if (!score)
198
+ return (this.score = undefined);
199
+ score.timestamp = timestamp;
200
+ this.score = score;
201
+ this.emit('score', this.score);
202
+ }
203
+ }
204
+ exports.ObservedOutboundVideoTrack = ObservedOutboundVideoTrack;
@@ -2,12 +2,16 @@
2
2
  import { EventEmitter } from 'events';
3
3
  import { PeerConnectionTransport } from '@observertc/sample-schemas-js';
4
4
  import { ObservedClient } from './ObservedClient';
5
- import { ObservedInboundTrack, ObservedInboundTrackModel } from './ObservedInboundTrack';
6
- import { ObservedOutboundTrack, ObservedOutboundTrackModel } from './ObservedOutboundTrack';
7
5
  import { CallEventReport } from '@observertc/report-schemas-js';
8
6
  import { ObservedICE } from './ObservedICE';
9
7
  import { ObservedDataChannel } from './ObservedDataChannel';
10
8
  import { PartialBy } from './common/utils';
9
+ import { ObservedInboundAudioTrack, ObservedInboundAudioTrackModel } from './ObservedInboundAudioTrack';
10
+ import { ObservedInboundVideoTrack, ObservedInboundVideoTrackModel } from './ObservedInboundVideoTrack';
11
+ import { ObservedOutboundAudioTrack, ObservedOutboundAudioTrackModel } from './ObservedOutboundAudioTrack';
12
+ import { ObservedOutboundVideoTrack, ObservedOutboundVideoTrackModel } from './ObservedOutboundVideoTrack';
13
+ import { CalculatedScore } from './common/CalculatedScore';
14
+ import { ClientIssue } from './monitors/CallSummary';
11
15
  export type ObservedPeerConnectionEvents = {
12
16
  update: [
13
17
  {
@@ -15,10 +19,11 @@ export type ObservedPeerConnectionEvents = {
15
19
  }
16
20
  ];
17
21
  close: [];
18
- newinboudaudiotrack: [ObservedInboundTrack<'audio'>];
19
- newinboudvideotrack: [ObservedInboundTrack<'video'>];
20
- newoutboundaudiotrack: [ObservedOutboundTrack<'audio'>];
21
- newoutboundvideotrack: [ObservedOutboundTrack<'video'>];
22
+ score: [CalculatedScore];
23
+ newinboudaudiotrack: [ObservedInboundAudioTrack];
24
+ newinboudvideotrack: [ObservedInboundVideoTrack];
25
+ newoutboundaudiotrack: [ObservedOutboundAudioTrack];
26
+ newoutboundvideotrack: [ObservedOutboundVideoTrack];
22
27
  newdatachannel: [ObservedDataChannel];
23
28
  };
24
29
  export type ObservedPeerConnectionModel = {
@@ -38,6 +43,9 @@ export declare class ObservedPeerConnection extends EventEmitter {
38
43
  readonly created: number;
39
44
  visited: boolean;
40
45
  private _elapsedTimeSinceLastUpdate?;
46
+ private _statsTimestamp?;
47
+ ωpendingIssuesForScores: ClientIssue[];
48
+ score?: CalculatedScore;
41
49
  totalInboundPacketsLost: number;
42
50
  totalInboundPacketsReceived: number;
43
51
  totalOutboundPacketsSent: number;
@@ -71,6 +79,7 @@ export declare class ObservedPeerConnection extends EventEmitter {
71
79
  receivingAudioBitrate: number;
72
80
  receivingVideoBitrate: number;
73
81
  avgRttInMs?: number;
82
+ avgJitter?: number;
74
83
  private _closed;
75
84
  private _updated;
76
85
  private _sample?;
@@ -96,10 +105,10 @@ export declare class ObservedPeerConnection extends EventEmitter {
96
105
  get reports(): import("./ReportsCollector").ReportsCollector;
97
106
  get stats(): ObservedPeerConnectionStats | undefined;
98
107
  get updated(): number;
99
- get inboundAudioTracks(): ReadonlyMap<string, ObservedInboundTrack<'audio'>>;
100
- get inboundVideoTracks(): ReadonlyMap<string, ObservedInboundTrack<'video'>>;
101
- get outboundAudioTracks(): ReadonlyMap<string, ObservedOutboundTrack<'audio'>>;
102
- get outboundVideoTracks(): ReadonlyMap<string, ObservedOutboundTrack<'video'>>;
108
+ get inboundAudioTracks(): ReadonlyMap<string, ObservedInboundAudioTrack>;
109
+ get inboundVideoTracks(): ReadonlyMap<string, ObservedInboundVideoTrack>;
110
+ get outboundAudioTracks(): ReadonlyMap<string, ObservedOutboundAudioTrack>;
111
+ get outboundVideoTracks(): ReadonlyMap<string, ObservedOutboundVideoTrack>;
103
112
  get dataChannels(): ReadonlyMap<number, ObservedDataChannel>;
104
113
  get uptimeInMs(): number;
105
114
  get marker(): string | undefined;
@@ -107,14 +116,15 @@ export declare class ObservedPeerConnection extends EventEmitter {
107
116
  addEventReport(params: PartialBy<Omit<CallEventReport, 'serviceId' | 'roomId' | 'callId' | 'clientId' | 'userId' | 'peerConnectionId' | 'marker'>, 'timestamp'>): void;
108
117
  get closed(): boolean;
109
118
  close(): void;
110
- getTrack(trackId: string): ObservedInboundTrack<'audio'> | ObservedInboundTrack<'video'> | ObservedOutboundTrack<'audio'> | ObservedOutboundTrack<'video'> | undefined;
119
+ getTrack(trackId: string): ObservedInboundAudioTrack | ObservedInboundVideoTrack | ObservedOutboundAudioTrack | ObservedOutboundVideoTrack | undefined;
111
120
  resetMetrics(): void;
112
- updateMetrics(): void;
113
121
  update(sample: PeerConnectionTransport, timestamp: number): void;
114
- createInboundAudioTrack(config: Omit<ObservedInboundTrackModel<'audio'>, 'kind'>): ObservedInboundTrack<'audio'>;
115
- createInboundVideoTrack(config: Omit<ObservedInboundTrackModel<'video'>, 'kind'>): ObservedInboundTrack<'video'>;
116
- createOutboundAudioTrack(config: Omit<ObservedOutboundTrackModel<'audio'>, 'kind'>): ObservedOutboundTrack<'audio'>;
117
- createOutboundVideoTrack(config: Omit<ObservedOutboundTrackModel<'video'>, 'kind'>): ObservedOutboundTrack<'video'>;
122
+ createInboundAudioTrack(config: ObservedInboundAudioTrackModel): ObservedInboundAudioTrack;
123
+ createInboundVideoTrack(config: ObservedInboundVideoTrackModel): ObservedInboundVideoTrack;
124
+ createOutboundAudioTrack(config: ObservedOutboundAudioTrackModel): ObservedOutboundAudioTrack;
125
+ createOutboundVideoTrack(config: ObservedOutboundVideoTrackModel): ObservedOutboundVideoTrack;
118
126
  createDataChannel(channelId: number): ObservedDataChannel;
127
+ updateMetrics(): void;
128
+ private _updateQualityScore;
119
129
  }
120
130
  //# sourceMappingURL=ObservedPeerConnection.d.ts.map
@@ -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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"}