@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.
- package/lib/ObservedCall.d.ts +10 -3
- package/lib/ObservedCall.d.ts.map +1 -1
- package/lib/ObservedCall.js +28 -0
- package/lib/ObservedClient.d.ts +5 -0
- package/lib/ObservedClient.d.ts.map +1 -1
- package/lib/ObservedClient.js +83 -32
- package/lib/ObservedInboundAudioTrack.d.ts +94 -0
- package/lib/ObservedInboundAudioTrack.d.ts.map +1 -0
- package/lib/ObservedInboundAudioTrack.js +215 -0
- package/lib/ObservedInboundVideoTrack.d.ts +98 -0
- package/lib/ObservedInboundVideoTrack.d.ts.map +1 -0
- package/lib/{ObservedInboundTrack.js → ObservedInboundVideoTrack.js} +53 -44
- package/lib/ObservedOutboundAudioTrack.d.ts +85 -0
- package/lib/ObservedOutboundAudioTrack.d.ts.map +1 -0
- package/lib/{ObservedOutboundTrack.js → ObservedOutboundAudioTrack.js} +35 -58
- package/lib/ObservedOutboundVideoTrack.d.ts +88 -0
- package/lib/ObservedOutboundVideoTrack.d.ts.map +1 -0
- package/lib/ObservedOutboundVideoTrack.js +204 -0
- package/lib/ObservedPeerConnection.d.ts +26 -16
- package/lib/ObservedPeerConnection.d.ts.map +1 -1
- package/lib/ObservedPeerConnection.js +157 -86
- package/lib/Observer.d.ts +1 -0
- package/lib/Observer.d.ts.map +1 -1
- package/lib/Observer.js +2 -2
- package/lib/RemoteTrackAssigner.d.ts +14 -0
- package/lib/RemoteTrackAssigner.d.ts.map +1 -0
- package/lib/RemoteTrackAssigner.js +52 -0
- package/lib/common/CalculatedScore.d.ts +79 -0
- package/lib/common/CalculatedScore.d.ts.map +1 -0
- package/lib/common/CalculatedScore.js +155 -0
- package/lib/common/QualityScoreUtils.d.ts +1 -0
- package/lib/common/QualityScoreUtils.d.ts.map +1 -0
- package/lib/common/QualityScoreUtils.js +1 -0
- package/lib/common/utils.d.ts +1 -0
- package/lib/common/utils.d.ts.map +1 -1
- package/lib/common/utils.js +14 -1
- package/lib/index.d.ts +4 -2
- package/lib/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ObservedCall.ts +40 -4
- package/src/ObservedClient.ts +79 -17
- package/src/ObservedInboundAudioTrack.ts +336 -0
- package/src/{ObservedInboundTrack.ts → ObservedInboundVideoTrack.ts} +85 -66
- package/src/{ObservedOutboundTrack.ts → ObservedOutboundAudioTrack.ts} +59 -74
- package/src/ObservedOutboundVideoTrack.ts +326 -0
- package/src/ObservedPeerConnection.ts +205 -131
- package/src/Observer.ts +3 -2
- package/src/RemoteTrackAssigner.ts +68 -0
- package/src/common/CalculatedScore.ts +180 -0
- package/src/common/QualityScoreUtils.ts +0 -0
- package/src/common/utils.ts +17 -1
- package/src/index.ts +4 -2
- package/src/monitors/CallSummaryMonitor.ts +3 -3
- package/lib/ObservedInboundTrack.d.ts +0 -96
- package/lib/ObservedInboundTrack.d.ts.map +0 -1
- package/lib/ObservedOutboundTrack.d.ts +0 -84
- package/lib/ObservedOutboundTrack.d.ts.map +0 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { ClientIssue } from '../monitors/CallSummary';
|
|
2
|
+
import { ObservedInboundVideoTrack } from '../ObservedInboundVideoTrack';
|
|
3
|
+
import { ObservedInboundAudioTrack } from '../ObservedInboundAudioTrack';
|
|
4
|
+
import { ObservedOutboundVideoTrack } from '../ObservedOutboundVideoTrack';
|
|
5
|
+
import { ObservedOutboundAudioTrack } from '../ObservedOutboundAudioTrack';
|
|
6
|
+
|
|
7
|
+
export type CalculationRemark = {
|
|
8
|
+
severity: 'none' | 'minor' | 'major' | 'critical',
|
|
9
|
+
text: string,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type CalculatedScore = {
|
|
13
|
+
score: number,
|
|
14
|
+
timestamp: number,
|
|
15
|
+
remarks: CalculationRemark[],
|
|
16
|
+
debugText?: string,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// every track calculates its own score and stores
|
|
20
|
+
// the latest CalculatedScore in a score property also emits as an event 'score'
|
|
21
|
+
// every peer connection collects the scores and calculates its own score based on RTT, and stores it in the score property similar to track
|
|
22
|
+
// every client collects the scores and calculates its own score based on the peer connection scores, and stores it in the score property similar to track
|
|
23
|
+
// every call collects the scores and calculates its own score based on the client scores, and stores it in the score property similar to track, but
|
|
24
|
+
// but calls only recalculate it after a configured amount of time passed from the last recalculation, and it does not trigger automatically
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
Recommended bpp Ranges for Good Quality
|
|
28
|
+
|
|
29
|
+
| Content Type | H.264 (AVC) bpp Range | H.265 (HEVC) bpp Range | VP8 bpp Range | VP9 bpp Range |
|
|
30
|
+
|--------------------|-----------------------|-----------------------|---------------|---------------|
|
|
31
|
+
| Low Motion | 0.1 - 0.2 | 0.05 - 0.15 | 0.1 - 0.2 | 0.05 - 0.15 |
|
|
32
|
+
| Standard Motion | 0.15 - 0.25 | 0.1 - 0.2 | 0.15 - 0.25 | 0.1 - 0.2 |
|
|
33
|
+
| High Motion | 0.25 - 0.4 | 0.15 - 0.3 | 0.25 - 0.4 | 0.15 - 0.3 |
|
|
34
|
+
|
|
35
|
+
*/
|
|
36
|
+
export const BPP_RANGES = {
|
|
37
|
+
'lowmotion': {
|
|
38
|
+
'h264': { low: 0.1, high: 0.2 },
|
|
39
|
+
'h265': { low: 0.05, high: 0.15 },
|
|
40
|
+
'vp8': { low: 0.1, high: 0.2 },
|
|
41
|
+
'vp9': { low: 0.05, high: 0.15 },
|
|
42
|
+
},
|
|
43
|
+
'standard': {
|
|
44
|
+
'h264': { low: 0.15, high: 0.25 },
|
|
45
|
+
'h265': { low: 0.1, high: 0.2 },
|
|
46
|
+
'vp8': { low: 0.15, high: 0.25 },
|
|
47
|
+
'vp9': { low: 0.1, high: 0.2 },
|
|
48
|
+
},
|
|
49
|
+
'highmotion': {
|
|
50
|
+
'h264': { low: 0.25, high: 0.4 },
|
|
51
|
+
'h265': { low: 0.15, high: 0.3 },
|
|
52
|
+
'vp8': { low: 0.25, high: 0.4 },
|
|
53
|
+
'vp9': { low: 0.15, high: 0.3 },
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export function calculateBaseVideoScore(track: ObservedInboundVideoTrack | ObservedOutboundVideoTrack, newIssues: ClientIssue[]): CalculatedScore | undefined {
|
|
58
|
+
if (!track.highestLayer) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const {
|
|
62
|
+
frameHeight,
|
|
63
|
+
frameWidth,
|
|
64
|
+
framesPerSecond,
|
|
65
|
+
bitrate,
|
|
66
|
+
} = track.highestLayer;
|
|
67
|
+
const score: CalculatedScore = {
|
|
68
|
+
remarks: [],
|
|
69
|
+
score: 0.0,
|
|
70
|
+
timestamp: track.statsTimestamp,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
if (!frameHeight || !frameWidth || !bitrate || !framesPerSecond) {
|
|
74
|
+
score.score = 0.0;
|
|
75
|
+
score.remarks.push({
|
|
76
|
+
severity: 'major',
|
|
77
|
+
text: 'Missing data for score calculation',
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return score;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const bpp = bitrate / (frameHeight * frameWidth * framesPerSecond);
|
|
84
|
+
// let's assume vp8 for now
|
|
85
|
+
const bppRange = BPP_RANGES[track.contentType][track.codec];
|
|
86
|
+
|
|
87
|
+
if (bpp / 2 < bppRange.low) {
|
|
88
|
+
score.score = 1.0;
|
|
89
|
+
score.remarks.push({
|
|
90
|
+
severity: 'major',
|
|
91
|
+
text: `Bitrate per pixel is too low for ${track.contentType} content`,
|
|
92
|
+
});
|
|
93
|
+
} else if (bppRange.low < bpp) {
|
|
94
|
+
score.score = 1.0;
|
|
95
|
+
score.remarks.push({
|
|
96
|
+
severity: 'minor',
|
|
97
|
+
text: `Bitrate per pixel is good for ${track.contentType} content`,
|
|
98
|
+
});
|
|
99
|
+
} else {
|
|
100
|
+
score.score = Math.min(3.0, 2.0 + ((bpp - bppRange.low) / (bppRange.high - bppRange.low)));
|
|
101
|
+
score.remarks.push({
|
|
102
|
+
severity: 'none',
|
|
103
|
+
text: `Bitrate per pixel is good for ${track.contentType} content`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
for (const issue of newIssues) {
|
|
108
|
+
if (issue.severity === 'critical') {
|
|
109
|
+
score.score = 0.0;
|
|
110
|
+
} else if (issue.severity === 'major') {
|
|
111
|
+
score.score *= 0.5;
|
|
112
|
+
} else if (issue.severity === 'minor') {
|
|
113
|
+
score.score *= 0.8;
|
|
114
|
+
}
|
|
115
|
+
score.remarks.push({
|
|
116
|
+
severity: issue.severity,
|
|
117
|
+
text: issue.description ?? 'Issue occurred',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return score;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function calculateBaseAudioScore(track: ObservedInboundAudioTrack | ObservedOutboundAudioTrack, newIssues: ClientIssue[]): CalculatedScore | undefined {
|
|
125
|
+
const score: CalculatedScore = {
|
|
126
|
+
remarks: [],
|
|
127
|
+
score: 0.0,
|
|
128
|
+
timestamp: track.statsTimestamp,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
if (track.bitrate < 8000) {
|
|
132
|
+
score.score = 1.0;
|
|
133
|
+
score.remarks.push({
|
|
134
|
+
severity: 'none',
|
|
135
|
+
text: 'Bitrate is too low for audio',
|
|
136
|
+
});
|
|
137
|
+
} else if (track.bitrate < 16000) {
|
|
138
|
+
score.score = 2.8;
|
|
139
|
+
score.remarks.push({
|
|
140
|
+
severity: 'none',
|
|
141
|
+
text: 'Bitrate is low for audio',
|
|
142
|
+
});
|
|
143
|
+
} else {
|
|
144
|
+
score.score = 3.0;
|
|
145
|
+
score.remarks.push({
|
|
146
|
+
severity: 'none',
|
|
147
|
+
text: 'Bitrate is good for audio',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
for (const issues of newIssues) {
|
|
152
|
+
if (issues.severity === 'critical') {
|
|
153
|
+
score.score = 0.0;
|
|
154
|
+
} else if (issues.severity === 'major') {
|
|
155
|
+
score.score *= 0.5;
|
|
156
|
+
} else if (issues.severity === 'minor') {
|
|
157
|
+
score.score *= 0.8;
|
|
158
|
+
}
|
|
159
|
+
score.remarks.push({
|
|
160
|
+
severity: issues.severity,
|
|
161
|
+
text: issues.description ?? 'Issue occurred',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return score;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function calculateLatencyMOS(
|
|
169
|
+
{ avgJitter, rttInMs, packetsLoss }:
|
|
170
|
+
{ avgJitter: number, rttInMs: number, packetsLoss: number },
|
|
171
|
+
): number {
|
|
172
|
+
const effectiveLatency = rttInMs + (avgJitter * 2) + 10;
|
|
173
|
+
let rFactor = effectiveLatency < 160
|
|
174
|
+
? 93.2 - (effectiveLatency / 40)
|
|
175
|
+
: 93.2 - (effectiveLatency / 120) - 10;
|
|
176
|
+
|
|
177
|
+
rFactor -= (packetsLoss * 2.5);
|
|
178
|
+
|
|
179
|
+
return 1 + ((0.035) * rFactor) + ((0.000007) * rFactor * (rFactor - 60) * (100 - rFactor));
|
|
180
|
+
}
|
|
File without changes
|
package/src/common/utils.ts
CHANGED
|
@@ -28,4 +28,20 @@ export function isValidUuid(str: string): boolean {
|
|
|
28
28
|
const regexp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
29
29
|
|
|
30
30
|
return regexp.test(str);
|
|
31
|
-
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getMedian(arr: number[]): number {
|
|
34
|
+
// Sort the array in ascending order
|
|
35
|
+
const sortedArr = arr.slice().sort((a, b) => a - b);
|
|
36
|
+
|
|
37
|
+
// Calculate the middle index
|
|
38
|
+
const mid = Math.floor(sortedArr.length / 2);
|
|
39
|
+
|
|
40
|
+
// If the array length is odd, return the middle element
|
|
41
|
+
if (sortedArr.length % 2 !== 0) {
|
|
42
|
+
return sortedArr[mid];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// If the array length is even, return the average of the two middle elements
|
|
46
|
+
return (sortedArr[mid - 1] + sortedArr[mid]) / 2;
|
|
47
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -59,8 +59,10 @@ export type {
|
|
|
59
59
|
export type { ObservedCall, ObservedCallModel } from './ObservedCall';
|
|
60
60
|
export type { ObservedClient, ObservedClientModel } from './ObservedClient';
|
|
61
61
|
export type { ObservedPeerConnection, ObservedPeerConnectionModel, ObservedPeerConnectionEvents } from './ObservedPeerConnection';
|
|
62
|
-
export type {
|
|
63
|
-
export type {
|
|
62
|
+
export type { ObservedInboundAudioTrack, ObservedInboundAudioTrackModel, ObservedInboundAudioTrackEvents } from './ObservedInboundAudioTrack';
|
|
63
|
+
export type { ObservedOutboundAudioTrack, ObservedOutboundAudioTrackModel, ObservedOutboundAudioTrackEvents } from './ObservedOutboundAudioTrack';
|
|
64
|
+
export type { ObservedInboundVideoTrack, ObservedInboundVideoTrackModel, ObservedInboundVideoTrackEvents } from './ObservedInboundVideoTrack';
|
|
65
|
+
export type { ObservedOutboundVideoTrack, ObservedOutboundVideoTrackModel, ObservedOutboundVideoTrackEvents } from './ObservedOutboundVideoTrack';
|
|
64
66
|
export type { CallSummary, ClientSummary, ClientIssue } from './monitors/CallSummary';
|
|
65
67
|
export type { ObserverSinkContext } from './common/types';
|
|
66
68
|
export type { SfuServerMonitorMetricsRecord } from './monitors/SfuServerMonitor';
|
|
@@ -2,8 +2,8 @@ import { EventEmitter } from 'events';
|
|
|
2
2
|
import { CallSummary, ClientSummary } from './CallSummary';
|
|
3
3
|
import { ObservedCall } from '../ObservedCall';
|
|
4
4
|
import { ObservedClient } from '../ObservedClient';
|
|
5
|
-
import { ObservedOutboundTrack } from '../ObservedOutboundTrack';
|
|
6
5
|
import { ObservedPeerConnection } from '../ObservedPeerConnection';
|
|
6
|
+
import { ObservedOutboundVideoTrack } from '../ObservedOutboundVideoTrack';
|
|
7
7
|
|
|
8
8
|
export type CallSummaryMonitorEvents = {
|
|
9
9
|
close: [],
|
|
@@ -141,7 +141,7 @@ export class CallSummaryMonitor extends EventEmitter {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
private _addPeerConnection(clientSummary: ClientSummary, peerConnection: ObservedPeerConnection) {
|
|
144
|
-
const onOutboundVideoTrack = (track:
|
|
144
|
+
const onOutboundVideoTrack = (track: ObservedOutboundVideoTrack) => this._addOutboundVideoTrack(clientSummary, track);
|
|
145
145
|
|
|
146
146
|
peerConnection.on('newoutboundvideotrack', onOutboundVideoTrack);
|
|
147
147
|
peerConnection.once('close', () => {
|
|
@@ -149,7 +149,7 @@ export class CallSummaryMonitor extends EventEmitter {
|
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
private _addOutboundVideoTrack(clientSummary: ClientSummary, track:
|
|
152
|
+
private _addOutboundVideoTrack(clientSummary: ClientSummary, track: ObservedOutboundVideoTrack) {
|
|
153
153
|
const onQualityLimitationChanged = (reason: string) => {
|
|
154
154
|
if (!this.config.detectMediaTrackQualityLimitationIssues) return;
|
|
155
155
|
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
4
|
-
import { InboundAudioTrack, InboundVideoTrack } from '@observertc/sample-schemas-js';
|
|
5
|
-
import { ObservedOutboundTrack } from './ObservedOutboundTrack';
|
|
6
|
-
import { MediaKind } from './common/types';
|
|
7
|
-
export type ObservedInboundTrackModel<K extends MediaKind> = {
|
|
8
|
-
trackId: string;
|
|
9
|
-
kind: K;
|
|
10
|
-
sfuStreamId?: string;
|
|
11
|
-
sfuSinkId?: string;
|
|
12
|
-
};
|
|
13
|
-
export type ObservedInboundTrackEvents<K extends MediaKind> = {
|
|
14
|
-
update: [
|
|
15
|
-
{
|
|
16
|
-
elapsedTimeInMs: number;
|
|
17
|
-
}
|
|
18
|
-
];
|
|
19
|
-
close: [];
|
|
20
|
-
remoteoutboundtrack: [ObservedOutboundTrack<K>];
|
|
21
|
-
};
|
|
22
|
-
export type ObservedInboundTrackStatsUpdate<K extends MediaKind> = K extends 'audio' ? InboundAudioTrack : InboundVideoTrack;
|
|
23
|
-
export type ObservedInboundTrackStats<K extends MediaKind> = ObservedInboundTrackStatsUpdate<K> & {
|
|
24
|
-
ssrc: number;
|
|
25
|
-
bitrate: number;
|
|
26
|
-
fractionLost: number;
|
|
27
|
-
rttInMs?: number;
|
|
28
|
-
deltaReceivedBytes?: number;
|
|
29
|
-
deltaLostPackets?: number;
|
|
30
|
-
deltaReceivedPackets?: number;
|
|
31
|
-
deltaReceivedFrames?: number;
|
|
32
|
-
deltaDecodedFrames?: number;
|
|
33
|
-
deltaDroppedFrames?: number;
|
|
34
|
-
deltaReceivedSamples?: number;
|
|
35
|
-
deltaSilentConcealedSamples?: number;
|
|
36
|
-
fractionLoss?: number;
|
|
37
|
-
statsTimestamp: number;
|
|
38
|
-
};
|
|
39
|
-
export declare interface ObservedInboundTrack<Kind extends MediaKind> {
|
|
40
|
-
on<U extends keyof ObservedInboundTrackEvents<Kind>>(event: U, listener: (...args: ObservedInboundTrackEvents<Kind>[U]) => void): this;
|
|
41
|
-
off<U extends keyof ObservedInboundTrackEvents<Kind>>(event: U, listener: (...args: ObservedInboundTrackEvents<Kind>[U]) => void): this;
|
|
42
|
-
once<U extends keyof ObservedInboundTrackEvents<Kind>>(event: U, listener: (...args: ObservedInboundTrackEvents<Kind>[U]) => void): this;
|
|
43
|
-
emit<U extends keyof ObservedInboundTrackEvents<Kind>>(event: U, ...args: ObservedInboundTrackEvents<Kind>[U]): boolean;
|
|
44
|
-
update(sample: ObservedInboundTrackStatsUpdate<Kind>, timestamp: number): void;
|
|
45
|
-
}
|
|
46
|
-
export declare class ObservedInboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
47
|
-
private readonly _model;
|
|
48
|
-
readonly peerConnection: ObservedPeerConnection;
|
|
49
|
-
readonly created: number;
|
|
50
|
-
visited: boolean;
|
|
51
|
-
private readonly _stats;
|
|
52
|
-
private _closed;
|
|
53
|
-
private _updated;
|
|
54
|
-
private _remoteOutboundTrack?;
|
|
55
|
-
private _lastMaxStatsTimestamp;
|
|
56
|
-
bitrate: number;
|
|
57
|
-
rttInMs?: number;
|
|
58
|
-
fractionLoss: number;
|
|
59
|
-
marker?: string;
|
|
60
|
-
totalLostPackets: number;
|
|
61
|
-
totalReceivedPackets: number;
|
|
62
|
-
totalBytesReceived: number;
|
|
63
|
-
totalReceivedFrames: number;
|
|
64
|
-
totalDecodedFrames: number;
|
|
65
|
-
totalDroppedFrames: number;
|
|
66
|
-
totalReceivedSamples: number;
|
|
67
|
-
totalSilentConcealedSamples: number;
|
|
68
|
-
deltaLostPackets: number;
|
|
69
|
-
deltaReceivedPackets: number;
|
|
70
|
-
deltaBytesReceived: number;
|
|
71
|
-
deltaReceivedFrames: number;
|
|
72
|
-
deltaDecodedFrames: number;
|
|
73
|
-
deltaDroppedFrames: number;
|
|
74
|
-
deltaReceivedSamples: number;
|
|
75
|
-
deltaSilentConcealedSamples: number;
|
|
76
|
-
constructor(_model: ObservedInboundTrackModel<Kind>, peerConnection: ObservedPeerConnection);
|
|
77
|
-
get serviceId(): string;
|
|
78
|
-
get roomId(): string;
|
|
79
|
-
get callId(): string;
|
|
80
|
-
get clientId(): string;
|
|
81
|
-
get mediaUnitId(): string;
|
|
82
|
-
get peerConnectionId(): string;
|
|
83
|
-
get trackId(): string;
|
|
84
|
-
get kind(): Kind;
|
|
85
|
-
get sfuStreamId(): string | undefined;
|
|
86
|
-
get sfuSinkId(): string | undefined;
|
|
87
|
-
get updated(): number;
|
|
88
|
-
get stats(): ReadonlyMap<number, ObservedInboundTrackStats<Kind>>;
|
|
89
|
-
get reports(): import("./ReportsCollector").ReportsCollector;
|
|
90
|
-
set remoteOutboundTrack(track: ObservedOutboundTrack<Kind> | undefined);
|
|
91
|
-
get remoteOutboundTrack(): ObservedOutboundTrack<Kind> | undefined;
|
|
92
|
-
get closed(): boolean;
|
|
93
|
-
close(): void;
|
|
94
|
-
updateMetrics(): void;
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=ObservedInboundTrack.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedInboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedInboundTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
|
-
import { ObservedPeerConnection } from './ObservedPeerConnection';
|
|
4
|
-
import { OutboundAudioTrack, OutboundVideoTrack } from '@observertc/sample-schemas-js';
|
|
5
|
-
import { ObservedInboundTrack } from './ObservedInboundTrack';
|
|
6
|
-
import { MediaKind } from './common/types';
|
|
7
|
-
export type ObservedOutboundTrackModel<K extends MediaKind> = {
|
|
8
|
-
trackId: string;
|
|
9
|
-
kind: K;
|
|
10
|
-
sfuStreamId?: string;
|
|
11
|
-
};
|
|
12
|
-
export type ObservedOutboundTrackEvents = {
|
|
13
|
-
qualitylimitationchanged: [string];
|
|
14
|
-
update: [
|
|
15
|
-
{
|
|
16
|
-
elapsedTimeInMs: number;
|
|
17
|
-
}
|
|
18
|
-
];
|
|
19
|
-
close: [];
|
|
20
|
-
};
|
|
21
|
-
export type ObservedOutboundTrackStatsUpdate<K extends MediaKind> = K extends 'audio' ? OutboundAudioTrack : OutboundVideoTrack;
|
|
22
|
-
export type ObservedOutboundTrackStats<K extends MediaKind> = ObservedOutboundTrackStatsUpdate<K> & {
|
|
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 ObservedOutboundTrack<Kind extends MediaKind> {
|
|
34
|
-
on<U extends keyof ObservedOutboundTrackEvents>(event: U, listener: (...args: ObservedOutboundTrackEvents[U]) => void): this;
|
|
35
|
-
off<U extends keyof ObservedOutboundTrackEvents>(event: U, listener: (...args: ObservedOutboundTrackEvents[U]) => void): this;
|
|
36
|
-
once<U extends keyof ObservedOutboundTrackEvents>(event: U, listener: (...args: ObservedOutboundTrackEvents[U]) => void): this;
|
|
37
|
-
emit<U extends keyof ObservedOutboundTrackEvents>(event: U, ...args: ObservedOutboundTrackEvents[U]): boolean;
|
|
38
|
-
update(sample: ObservedOutboundTrackStatsUpdate<Kind>, timestamp: number): void;
|
|
39
|
-
}
|
|
40
|
-
export declare class ObservedOutboundTrack<Kind extends MediaKind> extends EventEmitter {
|
|
41
|
-
private readonly _model;
|
|
42
|
-
readonly peerConnection: ObservedPeerConnection;
|
|
43
|
-
readonly created: number;
|
|
44
|
-
visited: boolean;
|
|
45
|
-
bitrate: number;
|
|
46
|
-
rttInMs?: number;
|
|
47
|
-
marker?: string;
|
|
48
|
-
totalLostPackets: number;
|
|
49
|
-
totalSentPackets: number;
|
|
50
|
-
totalSentBytes: number;
|
|
51
|
-
totalSentFrames: number;
|
|
52
|
-
deltaLostPackets: number;
|
|
53
|
-
deltaSentPackets: number;
|
|
54
|
-
deltaSentBytes: number;
|
|
55
|
-
deltaSentFrames: number;
|
|
56
|
-
deltaEncodedFrames: number;
|
|
57
|
-
sendingBitrate: number;
|
|
58
|
-
private readonly _stats;
|
|
59
|
-
private _lastMaxStatsTimestamp;
|
|
60
|
-
private _closed;
|
|
61
|
-
private _updated;
|
|
62
|
-
private _remoteInboundTracks;
|
|
63
|
-
constructor(_model: ObservedOutboundTrackModel<Kind>, peerConnection: ObservedPeerConnection);
|
|
64
|
-
get serviceId(): string;
|
|
65
|
-
get roomId(): string;
|
|
66
|
-
get callId(): string;
|
|
67
|
-
get clientId(): string;
|
|
68
|
-
get mediaUnitId(): string;
|
|
69
|
-
get peerConnectionId(): string;
|
|
70
|
-
get kind(): Kind;
|
|
71
|
-
get trackId(): string;
|
|
72
|
-
get sfuStreamId(): string | undefined;
|
|
73
|
-
get remoteInboundTracks(): ReadonlyMap<string, ObservedInboundTrack<Kind>>;
|
|
74
|
-
get reports(): import("./ReportsCollector").ReportsCollector;
|
|
75
|
-
get updated(): number;
|
|
76
|
-
get stats(): ReadonlyMap<number, ObservedOutboundTrackStats<Kind>>;
|
|
77
|
-
get closed(): boolean;
|
|
78
|
-
close(): void;
|
|
79
|
-
connectInboundTrack(track: ObservedInboundTrack<Kind>): void;
|
|
80
|
-
private _lastUpdateMetrics?;
|
|
81
|
-
updateMetrics(): void;
|
|
82
|
-
private _assignSfuStreamId;
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=ObservedOutboundTrack.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObservedOutboundTrack.d.ts","sourceRoot":"","sources":["../src/ObservedOutboundTrack.ts"],"names":[],"mappings":"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"}
|