@unwanted/matrix-sdk-mini 34.12.0-1 → 34.12.0-2
Sign up to get free protection for your applications and to get access to all the features.
- package/git-revision.txt +1 -1
- package/lib/@types/event.d.ts +0 -19
- package/lib/@types/event.d.ts.map +1 -1
- package/lib/@types/event.js.map +1 -1
- package/lib/client.d.ts +2 -50
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +391 -501
- package/lib/client.js.map +1 -1
- package/lib/embedded.d.ts.map +1 -1
- package/lib/embedded.js +0 -1
- package/lib/embedded.js.map +1 -1
- package/lib/matrix.d.ts +0 -6
- package/lib/matrix.d.ts.map +1 -1
- package/lib/matrix.js +1 -5
- package/lib/matrix.js.map +1 -1
- package/package.json +1 -1
- package/src/@types/event.ts +2 -36
- package/src/client.ts +1 -150
- package/src/embedded.ts +0 -2
- package/src/matrix.ts +0 -13
- package/lib/matrixrtc/CallMembership.d.ts +0 -66
- package/lib/matrixrtc/CallMembership.d.ts.map +0 -1
- package/lib/matrixrtc/CallMembership.js +0 -197
- package/lib/matrixrtc/CallMembership.js.map +0 -1
- package/lib/matrixrtc/LivekitFocus.d.ts +0 -16
- package/lib/matrixrtc/LivekitFocus.d.ts.map +0 -1
- package/lib/matrixrtc/LivekitFocus.js +0 -20
- package/lib/matrixrtc/LivekitFocus.js.map +0 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts +0 -295
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +0 -1
- package/lib/matrixrtc/MatrixRTCSession.js +0 -1043
- package/lib/matrixrtc/MatrixRTCSession.js.map +0 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +0 -40
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +0 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.js +0 -146
- package/lib/matrixrtc/MatrixRTCSessionManager.js.map +0 -1
- package/lib/matrixrtc/focus.d.ts +0 -10
- package/lib/matrixrtc/focus.d.ts.map +0 -1
- package/lib/matrixrtc/focus.js +0 -1
- package/lib/matrixrtc/focus.js.map +0 -1
- package/lib/matrixrtc/index.d.ts +0 -7
- package/lib/matrixrtc/index.d.ts.map +0 -1
- package/lib/matrixrtc/index.js +0 -21
- package/lib/matrixrtc/index.js.map +0 -1
- package/lib/matrixrtc/types.d.ts +0 -19
- package/lib/matrixrtc/types.d.ts.map +0 -1
- package/lib/matrixrtc/types.js +0 -1
- package/lib/matrixrtc/types.js.map +0 -1
- package/lib/webrtc/audioContext.d.ts +0 -15
- package/lib/webrtc/audioContext.d.ts.map +0 -1
- package/lib/webrtc/audioContext.js +0 -46
- package/lib/webrtc/audioContext.js.map +0 -1
- package/lib/webrtc/call.d.ts +0 -560
- package/lib/webrtc/call.d.ts.map +0 -1
- package/lib/webrtc/call.js +0 -2541
- package/lib/webrtc/call.js.map +0 -1
- package/lib/webrtc/callEventHandler.d.ts +0 -37
- package/lib/webrtc/callEventHandler.d.ts.map +0 -1
- package/lib/webrtc/callEventHandler.js +0 -344
- package/lib/webrtc/callEventHandler.js.map +0 -1
- package/lib/webrtc/callEventTypes.d.ts +0 -73
- package/lib/webrtc/callEventTypes.d.ts.map +0 -1
- package/lib/webrtc/callEventTypes.js +0 -13
- package/lib/webrtc/callEventTypes.js.map +0 -1
- package/lib/webrtc/callFeed.d.ts +0 -128
- package/lib/webrtc/callFeed.d.ts.map +0 -1
- package/lib/webrtc/callFeed.js +0 -289
- package/lib/webrtc/callFeed.js.map +0 -1
- package/lib/webrtc/groupCall.d.ts +0 -323
- package/lib/webrtc/groupCall.d.ts.map +0 -1
- package/lib/webrtc/groupCall.js +0 -1337
- package/lib/webrtc/groupCall.js.map +0 -1
- package/lib/webrtc/groupCallEventHandler.d.ts +0 -31
- package/lib/webrtc/groupCallEventHandler.d.ts.map +0 -1
- package/lib/webrtc/groupCallEventHandler.js +0 -178
- package/lib/webrtc/groupCallEventHandler.js.map +0 -1
- package/lib/webrtc/mediaHandler.d.ts +0 -89
- package/lib/webrtc/mediaHandler.d.ts.map +0 -1
- package/lib/webrtc/mediaHandler.js +0 -437
- package/lib/webrtc/mediaHandler.js.map +0 -1
- package/lib/webrtc/stats/callFeedStatsReporter.d.ts +0 -8
- package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +0 -1
- package/lib/webrtc/stats/callFeedStatsReporter.js +0 -82
- package/lib/webrtc/stats/callFeedStatsReporter.js.map +0 -1
- package/lib/webrtc/stats/callStatsReportGatherer.d.ts +0 -25
- package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +0 -1
- package/lib/webrtc/stats/callStatsReportGatherer.js +0 -199
- package/lib/webrtc/stats/callStatsReportGatherer.js.map +0 -1
- package/lib/webrtc/stats/callStatsReportSummary.d.ts +0 -17
- package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +0 -1
- package/lib/webrtc/stats/callStatsReportSummary.js +0 -1
- package/lib/webrtc/stats/callStatsReportSummary.js.map +0 -1
- package/lib/webrtc/stats/connectionStats.d.ts +0 -28
- package/lib/webrtc/stats/connectionStats.d.ts.map +0 -1
- package/lib/webrtc/stats/connectionStats.js +0 -26
- package/lib/webrtc/stats/connectionStats.js.map +0 -1
- package/lib/webrtc/stats/connectionStatsBuilder.d.ts +0 -5
- package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +0 -1
- package/lib/webrtc/stats/connectionStatsBuilder.js +0 -27
- package/lib/webrtc/stats/connectionStatsBuilder.js.map +0 -1
- package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +0 -7
- package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +0 -1
- package/lib/webrtc/stats/connectionStatsReportBuilder.js +0 -121
- package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +0 -1
- package/lib/webrtc/stats/groupCallStats.d.ts +0 -22
- package/lib/webrtc/stats/groupCallStats.d.ts.map +0 -1
- package/lib/webrtc/stats/groupCallStats.js +0 -78
- package/lib/webrtc/stats/groupCallStats.js.map +0 -1
- package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +0 -10
- package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +0 -1
- package/lib/webrtc/stats/media/mediaSsrcHandler.js +0 -57
- package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +0 -12
- package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackHandler.js +0 -62
- package/lib/webrtc/stats/media/mediaTrackHandler.js.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackStats.d.ts +0 -86
- package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackStats.js +0 -142
- package/lib/webrtc/stats/media/mediaTrackStats.js.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +0 -22
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +0 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +0 -76
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +0 -1
- package/lib/webrtc/stats/statsReport.d.ts +0 -99
- package/lib/webrtc/stats/statsReport.d.ts.map +0 -1
- package/lib/webrtc/stats/statsReport.js +0 -32
- package/lib/webrtc/stats/statsReport.js.map +0 -1
- package/lib/webrtc/stats/statsReportEmitter.d.ts +0 -15
- package/lib/webrtc/stats/statsReportEmitter.d.ts.map +0 -1
- package/lib/webrtc/stats/statsReportEmitter.js +0 -33
- package/lib/webrtc/stats/statsReportEmitter.js.map +0 -1
- package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +0 -16
- package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +0 -1
- package/lib/webrtc/stats/summaryStatsReportGatherer.js +0 -116
- package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +0 -1
- package/lib/webrtc/stats/trackStatsBuilder.d.ts +0 -19
- package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +0 -1
- package/lib/webrtc/stats/trackStatsBuilder.js +0 -168
- package/lib/webrtc/stats/trackStatsBuilder.js.map +0 -1
- package/lib/webrtc/stats/transportStats.d.ts +0 -11
- package/lib/webrtc/stats/transportStats.d.ts.map +0 -1
- package/lib/webrtc/stats/transportStats.js +0 -1
- package/lib/webrtc/stats/transportStats.js.map +0 -1
- package/lib/webrtc/stats/transportStatsBuilder.d.ts +0 -5
- package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +0 -1
- package/lib/webrtc/stats/transportStatsBuilder.js +0 -34
- package/lib/webrtc/stats/transportStatsBuilder.js.map +0 -1
- package/lib/webrtc/stats/valueFormatter.d.ts +0 -4
- package/lib/webrtc/stats/valueFormatter.d.ts.map +0 -1
- package/lib/webrtc/stats/valueFormatter.js +0 -25
- package/lib/webrtc/stats/valueFormatter.js.map +0 -1
- package/src/matrixrtc/CallMembership.ts +0 -247
- package/src/matrixrtc/LivekitFocus.ts +0 -39
- package/src/matrixrtc/MatrixRTCSession.ts +0 -1319
- package/src/matrixrtc/MatrixRTCSessionManager.ts +0 -166
- package/src/matrixrtc/focus.ts +0 -25
- package/src/matrixrtc/index.ts +0 -22
- package/src/matrixrtc/types.ts +0 -36
- package/src/webrtc/audioContext.ts +0 -44
- package/src/webrtc/call.ts +0 -3074
- package/src/webrtc/callEventHandler.ts +0 -425
- package/src/webrtc/callEventTypes.ts +0 -93
- package/src/webrtc/callFeed.ts +0 -364
- package/src/webrtc/groupCall.ts +0 -1735
- package/src/webrtc/groupCallEventHandler.ts +0 -234
- package/src/webrtc/mediaHandler.ts +0 -484
- package/src/webrtc/stats/callFeedStatsReporter.ts +0 -94
- package/src/webrtc/stats/callStatsReportGatherer.ts +0 -219
- package/src/webrtc/stats/callStatsReportSummary.ts +0 -30
- package/src/webrtc/stats/connectionStats.ts +0 -47
- package/src/webrtc/stats/connectionStatsBuilder.ts +0 -28
- package/src/webrtc/stats/connectionStatsReportBuilder.ts +0 -140
- package/src/webrtc/stats/groupCallStats.ts +0 -93
- package/src/webrtc/stats/media/mediaSsrcHandler.ts +0 -57
- package/src/webrtc/stats/media/mediaTrackHandler.ts +0 -76
- package/src/webrtc/stats/media/mediaTrackStats.ts +0 -176
- package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +0 -90
- package/src/webrtc/stats/statsReport.ts +0 -133
- package/src/webrtc/stats/statsReportEmitter.ts +0 -49
- package/src/webrtc/stats/summaryStatsReportGatherer.ts +0 -148
- package/src/webrtc/stats/trackStatsBuilder.ts +0 -207
- package/src/webrtc/stats/transportStats.ts +0 -26
- package/src/webrtc/stats/transportStatsBuilder.ts +0 -48
- package/src/webrtc/stats/valueFormatter.ts +0 -27
@@ -1,76 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
*/
|
16
|
-
|
17
|
-
export type TrackId = string;
|
18
|
-
|
19
|
-
export class MediaTrackHandler {
|
20
|
-
public constructor(private readonly pc: RTCPeerConnection) {}
|
21
|
-
|
22
|
-
public getLocalTracks(kind: "audio" | "video"): MediaStreamTrack[] {
|
23
|
-
const isNotNullAndKind = (track: MediaStreamTrack | null): boolean => {
|
24
|
-
return track !== null && track.kind === kind;
|
25
|
-
};
|
26
|
-
return this.pc
|
27
|
-
.getTransceivers()
|
28
|
-
.filter((t) => t.currentDirection === "sendonly" || t.currentDirection === "sendrecv")
|
29
|
-
.filter((t) => t.sender !== null)
|
30
|
-
.map((t) => t.sender)
|
31
|
-
.map((s) => s.track)
|
32
|
-
.filter(isNotNullAndKind) as MediaStreamTrack[];
|
33
|
-
}
|
34
|
-
|
35
|
-
public getTackById(trackId: string): MediaStreamTrack | undefined {
|
36
|
-
return this.pc
|
37
|
-
.getTransceivers()
|
38
|
-
.map((t) => {
|
39
|
-
if (t?.sender.track !== null && t.sender.track.id === trackId) {
|
40
|
-
return t.sender.track;
|
41
|
-
}
|
42
|
-
if (t?.receiver.track !== null && t.receiver.track.id === trackId) {
|
43
|
-
return t.receiver.track;
|
44
|
-
}
|
45
|
-
return undefined;
|
46
|
-
})
|
47
|
-
.find((t) => t !== undefined);
|
48
|
-
}
|
49
|
-
|
50
|
-
public getLocalTrackIdByMid(mid: string): string | undefined {
|
51
|
-
const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);
|
52
|
-
if (transceiver !== undefined && !!transceiver.sender && !!transceiver.sender.track) {
|
53
|
-
return transceiver.sender.track.id;
|
54
|
-
}
|
55
|
-
return undefined;
|
56
|
-
}
|
57
|
-
|
58
|
-
public getRemoteTrackIdByMid(mid: string): string | undefined {
|
59
|
-
const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);
|
60
|
-
if (transceiver !== undefined && !!transceiver.receiver && !!transceiver.receiver.track) {
|
61
|
-
return transceiver.receiver.track.id;
|
62
|
-
}
|
63
|
-
return undefined;
|
64
|
-
}
|
65
|
-
|
66
|
-
public getActiveSimulcastStreams(): number {
|
67
|
-
//@TODO implement this right.. Check how many layer configured
|
68
|
-
return 3;
|
69
|
-
}
|
70
|
-
|
71
|
-
public getTransceiverByTrackId(trackId: TrackId): RTCRtpTransceiver | undefined {
|
72
|
-
return this.pc.getTransceivers().find((t) => {
|
73
|
-
return t.receiver.track.id === trackId || (t.sender.track !== null && t.sender.track.id === trackId);
|
74
|
-
});
|
75
|
-
}
|
76
|
-
}
|
@@ -1,176 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
*/
|
16
|
-
|
17
|
-
import { AudioConcealment } from "../statsReport.ts";
|
18
|
-
import { TrackId } from "./mediaTrackHandler.ts";
|
19
|
-
|
20
|
-
export interface PacketLoss {
|
21
|
-
packetsTotal: number;
|
22
|
-
packetsLost: number;
|
23
|
-
isDownloadStream: boolean;
|
24
|
-
}
|
25
|
-
|
26
|
-
export interface Bitrate {
|
27
|
-
/**
|
28
|
-
* bytes per second
|
29
|
-
*/
|
30
|
-
download: number;
|
31
|
-
/**
|
32
|
-
* bytes per second
|
33
|
-
*/
|
34
|
-
upload: number;
|
35
|
-
}
|
36
|
-
export interface ConcealedAudio {
|
37
|
-
/**
|
38
|
-
* duration in ms
|
39
|
-
*/
|
40
|
-
duration: number;
|
41
|
-
|
42
|
-
ratio: number;
|
43
|
-
}
|
44
|
-
export interface Resolution {
|
45
|
-
width: number;
|
46
|
-
height: number;
|
47
|
-
}
|
48
|
-
|
49
|
-
export type TrackStatsType = "local" | "remote";
|
50
|
-
|
51
|
-
export class MediaTrackStats {
|
52
|
-
private loss: PacketLoss = { packetsTotal: 0, packetsLost: 0, isDownloadStream: false };
|
53
|
-
private bitrate: Bitrate = { download: 0, upload: 0 };
|
54
|
-
private resolution: Resolution = { width: -1, height: -1 };
|
55
|
-
private audioConcealment: AudioConcealment = { concealedAudio: 0, totalAudioDuration: 0 };
|
56
|
-
private framerate = 0;
|
57
|
-
private jitter = 0;
|
58
|
-
private codec = "";
|
59
|
-
private isAlive = true;
|
60
|
-
private isMuted = false;
|
61
|
-
private isEnabled = true;
|
62
|
-
|
63
|
-
public constructor(
|
64
|
-
public readonly trackId: TrackId,
|
65
|
-
public readonly type: TrackStatsType,
|
66
|
-
public readonly kind: "audio" | "video",
|
67
|
-
) {}
|
68
|
-
|
69
|
-
public getType(): TrackStatsType {
|
70
|
-
return this.type;
|
71
|
-
}
|
72
|
-
|
73
|
-
public setLoss(loss: PacketLoss): void {
|
74
|
-
this.loss = loss;
|
75
|
-
}
|
76
|
-
|
77
|
-
public getLoss(): PacketLoss {
|
78
|
-
return this.loss;
|
79
|
-
}
|
80
|
-
|
81
|
-
public setResolution(resolution: Resolution): void {
|
82
|
-
this.resolution = resolution;
|
83
|
-
}
|
84
|
-
|
85
|
-
public getResolution(): Resolution {
|
86
|
-
return this.resolution;
|
87
|
-
}
|
88
|
-
|
89
|
-
public setFramerate(framerate: number): void {
|
90
|
-
this.framerate = framerate;
|
91
|
-
}
|
92
|
-
|
93
|
-
public getFramerate(): number {
|
94
|
-
return this.framerate;
|
95
|
-
}
|
96
|
-
|
97
|
-
public setBitrate(bitrate: Bitrate): void {
|
98
|
-
this.bitrate = bitrate;
|
99
|
-
}
|
100
|
-
|
101
|
-
public getBitrate(): Bitrate {
|
102
|
-
return this.bitrate;
|
103
|
-
}
|
104
|
-
|
105
|
-
public setCodec(codecShortType: string): boolean {
|
106
|
-
this.codec = codecShortType;
|
107
|
-
return true;
|
108
|
-
}
|
109
|
-
|
110
|
-
public getCodec(): string {
|
111
|
-
return this.codec;
|
112
|
-
}
|
113
|
-
|
114
|
-
public resetBitrate(): void {
|
115
|
-
this.bitrate = { download: 0, upload: 0 };
|
116
|
-
}
|
117
|
-
|
118
|
-
public set alive(isAlive: boolean) {
|
119
|
-
this.isAlive = isAlive;
|
120
|
-
}
|
121
|
-
|
122
|
-
/**
|
123
|
-
* A MediaTrackState is alive if the corresponding MediaStreamTrack track bound to a transceiver and the
|
124
|
-
* MediaStreamTrack is in state MediaStreamTrack.readyState === live
|
125
|
-
*/
|
126
|
-
public get alive(): boolean {
|
127
|
-
return this.isAlive;
|
128
|
-
}
|
129
|
-
|
130
|
-
public set muted(isMuted: boolean) {
|
131
|
-
this.isMuted = isMuted;
|
132
|
-
}
|
133
|
-
|
134
|
-
/**
|
135
|
-
* A MediaTrackState.isMuted corresponding to MediaStreamTrack.muted.
|
136
|
-
* But these values only match if MediaTrackState.isAlive.
|
137
|
-
*/
|
138
|
-
public get muted(): boolean {
|
139
|
-
return this.isMuted;
|
140
|
-
}
|
141
|
-
|
142
|
-
public set enabled(isEnabled: boolean) {
|
143
|
-
this.isEnabled = isEnabled;
|
144
|
-
}
|
145
|
-
|
146
|
-
/**
|
147
|
-
* A MediaTrackState.isEnabled corresponding to MediaStreamTrack.enabled.
|
148
|
-
* But these values only match if MediaTrackState.isAlive.
|
149
|
-
*/
|
150
|
-
public get enabled(): boolean {
|
151
|
-
return this.isEnabled;
|
152
|
-
}
|
153
|
-
|
154
|
-
public setJitter(jitter: number): void {
|
155
|
-
this.jitter = jitter;
|
156
|
-
}
|
157
|
-
|
158
|
-
/**
|
159
|
-
* Jitter in milliseconds
|
160
|
-
*/
|
161
|
-
public getJitter(): number {
|
162
|
-
return this.jitter;
|
163
|
-
}
|
164
|
-
|
165
|
-
/**
|
166
|
-
* Audio concealment ration (conceled duration / total duration)
|
167
|
-
*/
|
168
|
-
public setAudioConcealment(concealedAudioDuration: number, totalAudioDuration: number): void {
|
169
|
-
this.audioConcealment.concealedAudio = concealedAudioDuration;
|
170
|
-
this.audioConcealment.totalAudioDuration = totalAudioDuration;
|
171
|
-
}
|
172
|
-
|
173
|
-
public getAudioConcealment(): AudioConcealment {
|
174
|
-
return this.audioConcealment;
|
175
|
-
}
|
176
|
-
}
|
@@ -1,90 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
*/
|
16
|
-
import { TrackID } from "../statsReport.ts";
|
17
|
-
import { MediaTrackStats } from "./mediaTrackStats.ts";
|
18
|
-
import { MediaTrackHandler, TrackId } from "./mediaTrackHandler.ts";
|
19
|
-
import { MediaSsrcHandler } from "./mediaSsrcHandler.ts";
|
20
|
-
|
21
|
-
export class MediaTrackStatsHandler {
|
22
|
-
private readonly track2stats = new Map<TrackID, MediaTrackStats>();
|
23
|
-
|
24
|
-
public constructor(
|
25
|
-
public readonly mediaSsrcHandler: MediaSsrcHandler,
|
26
|
-
public readonly mediaTrackHandler: MediaTrackHandler,
|
27
|
-
) {}
|
28
|
-
|
29
|
-
/**
|
30
|
-
* Find tracks by rtc stats
|
31
|
-
* Argument report is any because the stats api is not consistent:
|
32
|
-
* For example `trackIdentifier`, `mid` not existing in every implementations
|
33
|
-
* https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats
|
34
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats
|
35
|
-
*/
|
36
|
-
public findTrack2Stats(report: any, type: "remote" | "local"): MediaTrackStats | undefined {
|
37
|
-
let trackID;
|
38
|
-
if (report.trackIdentifier) {
|
39
|
-
trackID = report.trackIdentifier;
|
40
|
-
} else if (report.mid) {
|
41
|
-
trackID =
|
42
|
-
type === "remote"
|
43
|
-
? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)
|
44
|
-
: this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);
|
45
|
-
} else if (report.ssrc) {
|
46
|
-
const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);
|
47
|
-
if (!mid) {
|
48
|
-
return undefined;
|
49
|
-
}
|
50
|
-
trackID =
|
51
|
-
type === "remote"
|
52
|
-
? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)
|
53
|
-
: this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);
|
54
|
-
}
|
55
|
-
|
56
|
-
if (!trackID) {
|
57
|
-
return undefined;
|
58
|
-
}
|
59
|
-
|
60
|
-
let trackStats = this.track2stats.get(trackID);
|
61
|
-
|
62
|
-
if (!trackStats) {
|
63
|
-
const track = this.mediaTrackHandler.getTackById(trackID);
|
64
|
-
if (track !== undefined) {
|
65
|
-
const kind: "audio" | "video" = track.kind === "audio" ? track.kind : "video";
|
66
|
-
trackStats = new MediaTrackStats(trackID, type, kind);
|
67
|
-
this.track2stats.set(trackID, trackStats);
|
68
|
-
} else {
|
69
|
-
return undefined;
|
70
|
-
}
|
71
|
-
}
|
72
|
-
return trackStats;
|
73
|
-
}
|
74
|
-
|
75
|
-
public findLocalVideoTrackStats(report: any): MediaTrackStats | undefined {
|
76
|
-
const localVideoTracks = this.mediaTrackHandler.getLocalTracks("video");
|
77
|
-
if (localVideoTracks.length === 0) {
|
78
|
-
return undefined;
|
79
|
-
}
|
80
|
-
return this.findTrack2Stats(report, "local");
|
81
|
-
}
|
82
|
-
|
83
|
-
public getTrack2stats(): Map<TrackID, MediaTrackStats> {
|
84
|
-
return this.track2stats;
|
85
|
-
}
|
86
|
-
|
87
|
-
public findTransceiverByTrackId(trackID: TrackId): undefined | RTCRtpTransceiver {
|
88
|
-
return this.mediaTrackHandler.getTransceiverByTrackId(trackID);
|
89
|
-
}
|
90
|
-
}
|
@@ -1,133 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
*/
|
16
|
-
|
17
|
-
import { ConnectionStatsBandwidth, ConnectionStatsBitrate, PacketLoss } from "./connectionStats.ts";
|
18
|
-
import { TransportStats } from "./transportStats.ts";
|
19
|
-
import { Resolution } from "./media/mediaTrackStats.ts";
|
20
|
-
|
21
|
-
export enum StatsReport {
|
22
|
-
CONNECTION_STATS = "StatsReport.connection_stats",
|
23
|
-
CALL_FEED_REPORT = "StatsReport.call_feed_report",
|
24
|
-
BYTE_SENT_STATS = "StatsReport.byte_sent_stats",
|
25
|
-
SUMMARY_STATS = "StatsReport.summary_stats",
|
26
|
-
}
|
27
|
-
|
28
|
-
/// ByteSentStatsReport ################################################################################################
|
29
|
-
export interface ByteSentStatsReport extends Map<TrackID, ByteSend> {
|
30
|
-
callId?: string;
|
31
|
-
opponentMemberId?: string;
|
32
|
-
// is a map: `local trackID` => byte send
|
33
|
-
}
|
34
|
-
|
35
|
-
export type TrackID = string;
|
36
|
-
export type ByteSend = number;
|
37
|
-
|
38
|
-
/// ConnectionStatsReport ##############################################################################################
|
39
|
-
export interface ConnectionStatsReport {
|
40
|
-
callId?: string;
|
41
|
-
opponentMemberId?: string;
|
42
|
-
bandwidth: ConnectionStatsBandwidth;
|
43
|
-
bitrate: ConnectionStatsBitrate;
|
44
|
-
packetLoss: PacketLoss;
|
45
|
-
audioConcealment: Map<TrackID, AudioConcealment>;
|
46
|
-
totalAudioConcealment: AudioConcealment;
|
47
|
-
resolution: ResolutionMap;
|
48
|
-
framerate: FramerateMap;
|
49
|
-
codec: CodecMap;
|
50
|
-
jitter: Map<TrackID, number>;
|
51
|
-
transport: TransportStats[];
|
52
|
-
}
|
53
|
-
|
54
|
-
export interface AudioConcealment {
|
55
|
-
concealedAudio: number;
|
56
|
-
totalAudioDuration: number;
|
57
|
-
}
|
58
|
-
|
59
|
-
export interface ResolutionMap {
|
60
|
-
local: Map<TrackID, Resolution>;
|
61
|
-
remote: Map<TrackID, Resolution>;
|
62
|
-
}
|
63
|
-
|
64
|
-
export interface FramerateMap {
|
65
|
-
local: Map<TrackID, number>;
|
66
|
-
remote: Map<TrackID, number>;
|
67
|
-
}
|
68
|
-
|
69
|
-
export interface CodecMap {
|
70
|
-
local: Map<TrackID, string>;
|
71
|
-
remote: Map<TrackID, string>;
|
72
|
-
}
|
73
|
-
|
74
|
-
/// SummaryStatsReport #################################################################################################
|
75
|
-
export interface SummaryStatsReport {
|
76
|
-
/**
|
77
|
-
* Aggregated the information for percentage of received media
|
78
|
-
*
|
79
|
-
* This measure whether the current user receive data from a call participants.
|
80
|
-
* As soon as a participant sends at least a byte media to this user, this counts as one measurement unit.
|
81
|
-
* The units of measure divided by the total number of participants is a value between 0 and 1.
|
82
|
-
*/
|
83
|
-
percentageReceivedMedia: number;
|
84
|
-
percentageReceivedAudioMedia: number;
|
85
|
-
percentageReceivedVideoMedia: number;
|
86
|
-
maxJitter: number;
|
87
|
-
maxPacketLoss: number;
|
88
|
-
percentageConcealedAudio: number;
|
89
|
-
peerConnections: number;
|
90
|
-
opponentUsersInCall?: number;
|
91
|
-
opponentDevicesInCall?: number;
|
92
|
-
diffDevicesToPeerConnections?: number;
|
93
|
-
ratioPeerConnectionToDevices?: number;
|
94
|
-
// Todo: Decide if we want an index (or a timestamp) of this report in relation to the group call, to help differenciate when issues occur and ignore/track initial connection delays.
|
95
|
-
}
|
96
|
-
|
97
|
-
/// CallFeedReport #####################################################################################################
|
98
|
-
export interface CallFeedReport {
|
99
|
-
callId: string;
|
100
|
-
opponentMemberId: string;
|
101
|
-
transceiver: TransceiverStats[];
|
102
|
-
callFeeds: CallFeedStats[];
|
103
|
-
}
|
104
|
-
|
105
|
-
export interface CallFeedStats {
|
106
|
-
stream: string;
|
107
|
-
type: "remote" | "local";
|
108
|
-
audio: TrackStats | null;
|
109
|
-
video: TrackStats | null;
|
110
|
-
purpose: string;
|
111
|
-
prefix: string;
|
112
|
-
isVideoMuted: boolean;
|
113
|
-
isAudioMuted: boolean;
|
114
|
-
}
|
115
|
-
|
116
|
-
export interface TransceiverStats {
|
117
|
-
readonly mid: string;
|
118
|
-
readonly sender: TrackStats | null;
|
119
|
-
readonly receiver: TrackStats | null;
|
120
|
-
readonly direction: string;
|
121
|
-
readonly currentDirection: string;
|
122
|
-
}
|
123
|
-
|
124
|
-
export interface TrackStats {
|
125
|
-
readonly id: string;
|
126
|
-
readonly kind: "audio" | "video";
|
127
|
-
readonly settingDeviceId: string;
|
128
|
-
readonly constrainDeviceId: string;
|
129
|
-
readonly muted: boolean;
|
130
|
-
readonly enabled: boolean;
|
131
|
-
readonly readyState: "ended" | "live";
|
132
|
-
readonly label: string;
|
133
|
-
}
|
@@ -1,49 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
you may not use this file except in compliance with the License.
|
6
|
-
You may obtain a copy of the License at
|
7
|
-
|
8
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
|
10
|
-
Unless required by applicable law or agreed to in writing, software
|
11
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
See the License for the specific language governing permissions and
|
14
|
-
limitations under the License.
|
15
|
-
*/
|
16
|
-
|
17
|
-
import { TypedEventEmitter } from "../../models/typed-event-emitter.ts";
|
18
|
-
import {
|
19
|
-
ByteSentStatsReport,
|
20
|
-
CallFeedReport,
|
21
|
-
ConnectionStatsReport,
|
22
|
-
StatsReport,
|
23
|
-
SummaryStatsReport,
|
24
|
-
} from "./statsReport.ts";
|
25
|
-
|
26
|
-
export type StatsReportHandlerMap = {
|
27
|
-
[StatsReport.BYTE_SENT_STATS]: (report: ByteSentStatsReport) => void;
|
28
|
-
[StatsReport.CONNECTION_STATS]: (report: ConnectionStatsReport) => void;
|
29
|
-
[StatsReport.CALL_FEED_REPORT]: (report: CallFeedReport) => void;
|
30
|
-
[StatsReport.SUMMARY_STATS]: (report: SummaryStatsReport) => void;
|
31
|
-
};
|
32
|
-
|
33
|
-
export class StatsReportEmitter extends TypedEventEmitter<StatsReport, StatsReportHandlerMap> {
|
34
|
-
public emitByteSendReport(byteSentStats: ByteSentStatsReport): void {
|
35
|
-
this.emit(StatsReport.BYTE_SENT_STATS, byteSentStats);
|
36
|
-
}
|
37
|
-
|
38
|
-
public emitConnectionStatsReport(report: ConnectionStatsReport): void {
|
39
|
-
this.emit(StatsReport.CONNECTION_STATS, report);
|
40
|
-
}
|
41
|
-
|
42
|
-
public emitCallFeedReport(report: CallFeedReport): void {
|
43
|
-
this.emit(StatsReport.CALL_FEED_REPORT, report);
|
44
|
-
}
|
45
|
-
|
46
|
-
public emitSummaryStatsReport(report: SummaryStatsReport): void {
|
47
|
-
this.emit(StatsReport.SUMMARY_STATS, report);
|
48
|
-
}
|
49
|
-
}
|
@@ -1,148 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
Copyright 2023 The Matrix.org Foundation C.I.C.
|
3
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
-
you may not use this file except in compliance with the License.
|
5
|
-
You may obtain a copy of the License at
|
6
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
7
|
-
Unless required by applicable law or agreed to in writing, software
|
8
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
9
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
10
|
-
See the License for the specific language governing permissions and
|
11
|
-
limitations under the License.
|
12
|
-
*/
|
13
|
-
import { StatsReportEmitter } from "./statsReportEmitter.ts";
|
14
|
-
import { CallStatsReportSummary } from "./callStatsReportSummary.ts";
|
15
|
-
import { SummaryStatsReport } from "./statsReport.ts";
|
16
|
-
import { ParticipantState } from "../groupCall.ts";
|
17
|
-
import { RoomMember } from "../../matrix.ts";
|
18
|
-
|
19
|
-
interface CallStatsReportSummaryCounter {
|
20
|
-
receivedAudio: number;
|
21
|
-
receivedVideo: number;
|
22
|
-
receivedMedia: number;
|
23
|
-
concealedAudio: number;
|
24
|
-
totalAudio: number;
|
25
|
-
}
|
26
|
-
|
27
|
-
export class SummaryStatsReportGatherer {
|
28
|
-
public constructor(private emitter: StatsReportEmitter) {}
|
29
|
-
|
30
|
-
public build(allSummary: CallStatsReportSummary[]): void {
|
31
|
-
// Filter all stats which collect the first time webrtc stats.
|
32
|
-
// Because stats based on time interval and the first collection of a summery stats has no previous
|
33
|
-
// webrtcStats as basement all the calculation are 0. We don't want track the 0 stats.
|
34
|
-
const summary = allSummary.filter((s) => !s.isFirstCollection);
|
35
|
-
const summaryTotalCount = summary.length;
|
36
|
-
// For counting the peer connections we also want to consider the ignored summaries
|
37
|
-
const peerConnectionsCount = allSummary.length;
|
38
|
-
if (summaryTotalCount === 0) {
|
39
|
-
return;
|
40
|
-
}
|
41
|
-
|
42
|
-
const summaryCounter: CallStatsReportSummaryCounter = {
|
43
|
-
receivedAudio: 0,
|
44
|
-
receivedVideo: 0,
|
45
|
-
receivedMedia: 0,
|
46
|
-
concealedAudio: 0,
|
47
|
-
totalAudio: 0,
|
48
|
-
};
|
49
|
-
let maxJitter = 0;
|
50
|
-
let maxPacketLoss = 0;
|
51
|
-
summary.forEach((stats) => {
|
52
|
-
this.countTrackListReceivedMedia(summaryCounter, stats);
|
53
|
-
this.countConcealedAudio(summaryCounter, stats);
|
54
|
-
maxJitter = this.buildMaxJitter(maxJitter, stats);
|
55
|
-
maxPacketLoss = this.buildMaxPacketLoss(maxPacketLoss, stats);
|
56
|
-
});
|
57
|
-
const decimalPlaces = 5;
|
58
|
-
const report = {
|
59
|
-
percentageReceivedMedia: Number((summaryCounter.receivedMedia / summaryTotalCount).toFixed(decimalPlaces)),
|
60
|
-
percentageReceivedVideoMedia: Number(
|
61
|
-
(summaryCounter.receivedVideo / summaryTotalCount).toFixed(decimalPlaces),
|
62
|
-
),
|
63
|
-
percentageReceivedAudioMedia: Number(
|
64
|
-
(summaryCounter.receivedAudio / summaryTotalCount).toFixed(decimalPlaces),
|
65
|
-
),
|
66
|
-
maxJitter,
|
67
|
-
maxPacketLoss,
|
68
|
-
percentageConcealedAudio: Number(
|
69
|
-
summaryCounter.totalAudio > 0
|
70
|
-
? (summaryCounter.concealedAudio / summaryCounter.totalAudio).toFixed(decimalPlaces)
|
71
|
-
: 0,
|
72
|
-
),
|
73
|
-
peerConnections: peerConnectionsCount,
|
74
|
-
} as SummaryStatsReport;
|
75
|
-
this.emitter.emitSummaryStatsReport(report);
|
76
|
-
}
|
77
|
-
|
78
|
-
public static extendSummaryReport(
|
79
|
-
report: SummaryStatsReport,
|
80
|
-
callParticipants: Map<RoomMember, Map<string, ParticipantState>>,
|
81
|
-
): void {
|
82
|
-
// Calculate the actual number of devices based on the participants state event
|
83
|
-
// (this is used, to compare the expected participant count from the room state with the acutal peer connections)
|
84
|
-
// const devices = callParticipants.()
|
85
|
-
const devices: [string, ParticipantState][] = [];
|
86
|
-
const users: [RoomMember, Map<string, ParticipantState>][] = [];
|
87
|
-
for (const userEntry of callParticipants) {
|
88
|
-
users.push(userEntry);
|
89
|
-
for (const device of userEntry[1]) {
|
90
|
-
devices.push(device);
|
91
|
-
}
|
92
|
-
}
|
93
|
-
report.opponentDevicesInCall = Math.max(0, devices.length - 1);
|
94
|
-
report.opponentUsersInCall = Math.max(0, users.length - 1);
|
95
|
-
report.diffDevicesToPeerConnections = Math.max(0, devices.length - 1) - report.peerConnections;
|
96
|
-
report.ratioPeerConnectionToDevices =
|
97
|
-
Math.max(0, devices.length - 1) == 0 ? 0 : report.peerConnections / (devices.length - 1);
|
98
|
-
}
|
99
|
-
|
100
|
-
private countTrackListReceivedMedia(counter: CallStatsReportSummaryCounter, stats: CallStatsReportSummary): void {
|
101
|
-
let hasReceivedAudio = false;
|
102
|
-
let hasReceivedVideo = false;
|
103
|
-
if (stats.receivedAudioMedia > 0 || stats.audioTrackSummary.count === 0) {
|
104
|
-
counter.receivedAudio++;
|
105
|
-
hasReceivedAudio = true;
|
106
|
-
}
|
107
|
-
if (stats.receivedVideoMedia > 0 || stats.videoTrackSummary.count === 0) {
|
108
|
-
counter.receivedVideo++;
|
109
|
-
hasReceivedVideo = true;
|
110
|
-
} else {
|
111
|
-
if (stats.videoTrackSummary.muted > 0 && stats.videoTrackSummary.muted === stats.videoTrackSummary.count) {
|
112
|
-
counter.receivedVideo++;
|
113
|
-
hasReceivedVideo = true;
|
114
|
-
}
|
115
|
-
}
|
116
|
-
|
117
|
-
if (hasReceivedVideo && hasReceivedAudio) {
|
118
|
-
counter.receivedMedia++;
|
119
|
-
}
|
120
|
-
}
|
121
|
-
|
122
|
-
private buildMaxJitter(maxJitter: number, stats: CallStatsReportSummary): number {
|
123
|
-
if (maxJitter < stats.videoTrackSummary.maxJitter) {
|
124
|
-
maxJitter = stats.videoTrackSummary.maxJitter;
|
125
|
-
}
|
126
|
-
|
127
|
-
if (maxJitter < stats.audioTrackSummary.maxJitter) {
|
128
|
-
maxJitter = stats.audioTrackSummary.maxJitter;
|
129
|
-
}
|
130
|
-
return maxJitter;
|
131
|
-
}
|
132
|
-
|
133
|
-
private buildMaxPacketLoss(maxPacketLoss: number, stats: CallStatsReportSummary): number {
|
134
|
-
if (maxPacketLoss < stats.videoTrackSummary.maxPacketLoss) {
|
135
|
-
maxPacketLoss = stats.videoTrackSummary.maxPacketLoss;
|
136
|
-
}
|
137
|
-
|
138
|
-
if (maxPacketLoss < stats.audioTrackSummary.maxPacketLoss) {
|
139
|
-
maxPacketLoss = stats.audioTrackSummary.maxPacketLoss;
|
140
|
-
}
|
141
|
-
return maxPacketLoss;
|
142
|
-
}
|
143
|
-
|
144
|
-
private countConcealedAudio(summaryCounter: CallStatsReportSummaryCounter, stats: CallStatsReportSummary): void {
|
145
|
-
summaryCounter.concealedAudio += stats.audioTrackSummary.concealedAudio;
|
146
|
-
summaryCounter.totalAudio += stats.audioTrackSummary.totalAudio;
|
147
|
-
}
|
148
|
-
}
|