@observertc/observer-js 0.41.7 → 0.42.0

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 (53) 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 +4 -0
  5. package/lib/ObservedClient.d.ts.map +1 -1
  6. package/lib/ObservedClient.js +81 -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/RemoteTrackAssigner.d.ts +14 -0
  23. package/lib/RemoteTrackAssigner.d.ts.map +1 -0
  24. package/lib/RemoteTrackAssigner.js +52 -0
  25. package/lib/common/CalculatedScore.d.ts +79 -0
  26. package/lib/common/CalculatedScore.d.ts.map +1 -0
  27. package/lib/common/CalculatedScore.js +155 -0
  28. package/lib/common/QualityScoreUtils.d.ts +1 -0
  29. package/lib/common/QualityScoreUtils.d.ts.map +1 -0
  30. package/lib/common/QualityScoreUtils.js +1 -0
  31. package/lib/common/utils.d.ts +1 -0
  32. package/lib/common/utils.d.ts.map +1 -1
  33. package/lib/common/utils.js +14 -1
  34. package/lib/index.d.ts +4 -2
  35. package/lib/index.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/src/ObservedCall.ts +40 -4
  38. package/src/ObservedClient.ts +77 -17
  39. package/src/ObservedInboundAudioTrack.ts +336 -0
  40. package/src/{ObservedInboundTrack.ts → ObservedInboundVideoTrack.ts} +85 -66
  41. package/src/{ObservedOutboundTrack.ts → ObservedOutboundAudioTrack.ts} +59 -74
  42. package/src/ObservedOutboundVideoTrack.ts +326 -0
  43. package/src/ObservedPeerConnection.ts +205 -131
  44. package/src/RemoteTrackAssigner.ts +68 -0
  45. package/src/common/CalculatedScore.ts +180 -0
  46. package/src/common/QualityScoreUtils.ts +0 -0
  47. package/src/common/utils.ts +17 -1
  48. package/src/index.ts +4 -2
  49. package/src/monitors/CallSummaryMonitor.ts +3 -3
  50. package/lib/ObservedInboundTrack.d.ts +0 -96
  51. package/lib/ObservedInboundTrack.d.ts.map +0 -1
  52. package/lib/ObservedOutboundTrack.d.ts +0 -84
  53. 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
@@ -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 { ObservedInboundTrack, ObservedInboundTrackModel, ObservedInboundTrackEvents } from './ObservedInboundTrack';
63
- export type { ObservedOutboundTrack, ObservedOutboundTrackModel, ObservedOutboundTrackEvents } from './ObservedOutboundTrack';
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: ObservedOutboundTrack<'video'>) => this._addOutboundVideoTrack(clientSummary, 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: ObservedOutboundTrack<'video'>) {
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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"}