@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.
Files changed (185) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/@types/event.d.ts +0 -19
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js.map +1 -1
  5. package/lib/client.d.ts +2 -50
  6. package/lib/client.d.ts.map +1 -1
  7. package/lib/client.js +391 -501
  8. package/lib/client.js.map +1 -1
  9. package/lib/embedded.d.ts.map +1 -1
  10. package/lib/embedded.js +0 -1
  11. package/lib/embedded.js.map +1 -1
  12. package/lib/matrix.d.ts +0 -6
  13. package/lib/matrix.d.ts.map +1 -1
  14. package/lib/matrix.js +1 -5
  15. package/lib/matrix.js.map +1 -1
  16. package/package.json +1 -1
  17. package/src/@types/event.ts +2 -36
  18. package/src/client.ts +1 -150
  19. package/src/embedded.ts +0 -2
  20. package/src/matrix.ts +0 -13
  21. package/lib/matrixrtc/CallMembership.d.ts +0 -66
  22. package/lib/matrixrtc/CallMembership.d.ts.map +0 -1
  23. package/lib/matrixrtc/CallMembership.js +0 -197
  24. package/lib/matrixrtc/CallMembership.js.map +0 -1
  25. package/lib/matrixrtc/LivekitFocus.d.ts +0 -16
  26. package/lib/matrixrtc/LivekitFocus.d.ts.map +0 -1
  27. package/lib/matrixrtc/LivekitFocus.js +0 -20
  28. package/lib/matrixrtc/LivekitFocus.js.map +0 -1
  29. package/lib/matrixrtc/MatrixRTCSession.d.ts +0 -295
  30. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +0 -1
  31. package/lib/matrixrtc/MatrixRTCSession.js +0 -1043
  32. package/lib/matrixrtc/MatrixRTCSession.js.map +0 -1
  33. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +0 -40
  34. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +0 -1
  35. package/lib/matrixrtc/MatrixRTCSessionManager.js +0 -146
  36. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +0 -1
  37. package/lib/matrixrtc/focus.d.ts +0 -10
  38. package/lib/matrixrtc/focus.d.ts.map +0 -1
  39. package/lib/matrixrtc/focus.js +0 -1
  40. package/lib/matrixrtc/focus.js.map +0 -1
  41. package/lib/matrixrtc/index.d.ts +0 -7
  42. package/lib/matrixrtc/index.d.ts.map +0 -1
  43. package/lib/matrixrtc/index.js +0 -21
  44. package/lib/matrixrtc/index.js.map +0 -1
  45. package/lib/matrixrtc/types.d.ts +0 -19
  46. package/lib/matrixrtc/types.d.ts.map +0 -1
  47. package/lib/matrixrtc/types.js +0 -1
  48. package/lib/matrixrtc/types.js.map +0 -1
  49. package/lib/webrtc/audioContext.d.ts +0 -15
  50. package/lib/webrtc/audioContext.d.ts.map +0 -1
  51. package/lib/webrtc/audioContext.js +0 -46
  52. package/lib/webrtc/audioContext.js.map +0 -1
  53. package/lib/webrtc/call.d.ts +0 -560
  54. package/lib/webrtc/call.d.ts.map +0 -1
  55. package/lib/webrtc/call.js +0 -2541
  56. package/lib/webrtc/call.js.map +0 -1
  57. package/lib/webrtc/callEventHandler.d.ts +0 -37
  58. package/lib/webrtc/callEventHandler.d.ts.map +0 -1
  59. package/lib/webrtc/callEventHandler.js +0 -344
  60. package/lib/webrtc/callEventHandler.js.map +0 -1
  61. package/lib/webrtc/callEventTypes.d.ts +0 -73
  62. package/lib/webrtc/callEventTypes.d.ts.map +0 -1
  63. package/lib/webrtc/callEventTypes.js +0 -13
  64. package/lib/webrtc/callEventTypes.js.map +0 -1
  65. package/lib/webrtc/callFeed.d.ts +0 -128
  66. package/lib/webrtc/callFeed.d.ts.map +0 -1
  67. package/lib/webrtc/callFeed.js +0 -289
  68. package/lib/webrtc/callFeed.js.map +0 -1
  69. package/lib/webrtc/groupCall.d.ts +0 -323
  70. package/lib/webrtc/groupCall.d.ts.map +0 -1
  71. package/lib/webrtc/groupCall.js +0 -1337
  72. package/lib/webrtc/groupCall.js.map +0 -1
  73. package/lib/webrtc/groupCallEventHandler.d.ts +0 -31
  74. package/lib/webrtc/groupCallEventHandler.d.ts.map +0 -1
  75. package/lib/webrtc/groupCallEventHandler.js +0 -178
  76. package/lib/webrtc/groupCallEventHandler.js.map +0 -1
  77. package/lib/webrtc/mediaHandler.d.ts +0 -89
  78. package/lib/webrtc/mediaHandler.d.ts.map +0 -1
  79. package/lib/webrtc/mediaHandler.js +0 -437
  80. package/lib/webrtc/mediaHandler.js.map +0 -1
  81. package/lib/webrtc/stats/callFeedStatsReporter.d.ts +0 -8
  82. package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +0 -1
  83. package/lib/webrtc/stats/callFeedStatsReporter.js +0 -82
  84. package/lib/webrtc/stats/callFeedStatsReporter.js.map +0 -1
  85. package/lib/webrtc/stats/callStatsReportGatherer.d.ts +0 -25
  86. package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +0 -1
  87. package/lib/webrtc/stats/callStatsReportGatherer.js +0 -199
  88. package/lib/webrtc/stats/callStatsReportGatherer.js.map +0 -1
  89. package/lib/webrtc/stats/callStatsReportSummary.d.ts +0 -17
  90. package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +0 -1
  91. package/lib/webrtc/stats/callStatsReportSummary.js +0 -1
  92. package/lib/webrtc/stats/callStatsReportSummary.js.map +0 -1
  93. package/lib/webrtc/stats/connectionStats.d.ts +0 -28
  94. package/lib/webrtc/stats/connectionStats.d.ts.map +0 -1
  95. package/lib/webrtc/stats/connectionStats.js +0 -26
  96. package/lib/webrtc/stats/connectionStats.js.map +0 -1
  97. package/lib/webrtc/stats/connectionStatsBuilder.d.ts +0 -5
  98. package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +0 -1
  99. package/lib/webrtc/stats/connectionStatsBuilder.js +0 -27
  100. package/lib/webrtc/stats/connectionStatsBuilder.js.map +0 -1
  101. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +0 -7
  102. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +0 -1
  103. package/lib/webrtc/stats/connectionStatsReportBuilder.js +0 -121
  104. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +0 -1
  105. package/lib/webrtc/stats/groupCallStats.d.ts +0 -22
  106. package/lib/webrtc/stats/groupCallStats.d.ts.map +0 -1
  107. package/lib/webrtc/stats/groupCallStats.js +0 -78
  108. package/lib/webrtc/stats/groupCallStats.js.map +0 -1
  109. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +0 -10
  110. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +0 -1
  111. package/lib/webrtc/stats/media/mediaSsrcHandler.js +0 -57
  112. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +0 -1
  113. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +0 -12
  114. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +0 -1
  115. package/lib/webrtc/stats/media/mediaTrackHandler.js +0 -62
  116. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +0 -1
  117. package/lib/webrtc/stats/media/mediaTrackStats.d.ts +0 -86
  118. package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +0 -1
  119. package/lib/webrtc/stats/media/mediaTrackStats.js +0 -142
  120. package/lib/webrtc/stats/media/mediaTrackStats.js.map +0 -1
  121. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +0 -22
  122. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +0 -1
  123. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +0 -76
  124. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +0 -1
  125. package/lib/webrtc/stats/statsReport.d.ts +0 -99
  126. package/lib/webrtc/stats/statsReport.d.ts.map +0 -1
  127. package/lib/webrtc/stats/statsReport.js +0 -32
  128. package/lib/webrtc/stats/statsReport.js.map +0 -1
  129. package/lib/webrtc/stats/statsReportEmitter.d.ts +0 -15
  130. package/lib/webrtc/stats/statsReportEmitter.d.ts.map +0 -1
  131. package/lib/webrtc/stats/statsReportEmitter.js +0 -33
  132. package/lib/webrtc/stats/statsReportEmitter.js.map +0 -1
  133. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +0 -16
  134. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +0 -1
  135. package/lib/webrtc/stats/summaryStatsReportGatherer.js +0 -116
  136. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +0 -1
  137. package/lib/webrtc/stats/trackStatsBuilder.d.ts +0 -19
  138. package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +0 -1
  139. package/lib/webrtc/stats/trackStatsBuilder.js +0 -168
  140. package/lib/webrtc/stats/trackStatsBuilder.js.map +0 -1
  141. package/lib/webrtc/stats/transportStats.d.ts +0 -11
  142. package/lib/webrtc/stats/transportStats.d.ts.map +0 -1
  143. package/lib/webrtc/stats/transportStats.js +0 -1
  144. package/lib/webrtc/stats/transportStats.js.map +0 -1
  145. package/lib/webrtc/stats/transportStatsBuilder.d.ts +0 -5
  146. package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +0 -1
  147. package/lib/webrtc/stats/transportStatsBuilder.js +0 -34
  148. package/lib/webrtc/stats/transportStatsBuilder.js.map +0 -1
  149. package/lib/webrtc/stats/valueFormatter.d.ts +0 -4
  150. package/lib/webrtc/stats/valueFormatter.d.ts.map +0 -1
  151. package/lib/webrtc/stats/valueFormatter.js +0 -25
  152. package/lib/webrtc/stats/valueFormatter.js.map +0 -1
  153. package/src/matrixrtc/CallMembership.ts +0 -247
  154. package/src/matrixrtc/LivekitFocus.ts +0 -39
  155. package/src/matrixrtc/MatrixRTCSession.ts +0 -1319
  156. package/src/matrixrtc/MatrixRTCSessionManager.ts +0 -166
  157. package/src/matrixrtc/focus.ts +0 -25
  158. package/src/matrixrtc/index.ts +0 -22
  159. package/src/matrixrtc/types.ts +0 -36
  160. package/src/webrtc/audioContext.ts +0 -44
  161. package/src/webrtc/call.ts +0 -3074
  162. package/src/webrtc/callEventHandler.ts +0 -425
  163. package/src/webrtc/callEventTypes.ts +0 -93
  164. package/src/webrtc/callFeed.ts +0 -364
  165. package/src/webrtc/groupCall.ts +0 -1735
  166. package/src/webrtc/groupCallEventHandler.ts +0 -234
  167. package/src/webrtc/mediaHandler.ts +0 -484
  168. package/src/webrtc/stats/callFeedStatsReporter.ts +0 -94
  169. package/src/webrtc/stats/callStatsReportGatherer.ts +0 -219
  170. package/src/webrtc/stats/callStatsReportSummary.ts +0 -30
  171. package/src/webrtc/stats/connectionStats.ts +0 -47
  172. package/src/webrtc/stats/connectionStatsBuilder.ts +0 -28
  173. package/src/webrtc/stats/connectionStatsReportBuilder.ts +0 -140
  174. package/src/webrtc/stats/groupCallStats.ts +0 -93
  175. package/src/webrtc/stats/media/mediaSsrcHandler.ts +0 -57
  176. package/src/webrtc/stats/media/mediaTrackHandler.ts +0 -76
  177. package/src/webrtc/stats/media/mediaTrackStats.ts +0 -176
  178. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +0 -90
  179. package/src/webrtc/stats/statsReport.ts +0 -133
  180. package/src/webrtc/stats/statsReportEmitter.ts +0 -49
  181. package/src/webrtc/stats/summaryStatsReportGatherer.ts +0 -148
  182. package/src/webrtc/stats/trackStatsBuilder.ts +0 -207
  183. package/src/webrtc/stats/transportStats.ts +0 -26
  184. package/src/webrtc/stats/transportStatsBuilder.ts +0 -48
  185. package/src/webrtc/stats/valueFormatter.ts +0 -27
@@ -1,484 +0,0 @@
1
- /*
2
- Copyright 2015, 2016 OpenMarket Ltd
3
- Copyright 2017 New Vector Ltd
4
- Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
5
- Copyright 2021 - 2022 Šimon Brandner <simon.bra.ag@gmail.com>
6
-
7
- Licensed under the Apache License, Version 2.0 (the "License");
8
- you may not use this file except in compliance with the License.
9
- You may obtain a copy of the License at
10
-
11
- http://www.apache.org/licenses/LICENSE-2.0
12
-
13
- Unless required by applicable law or agreed to in writing, software
14
- distributed under the License is distributed on an "AS IS" BASIS,
15
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- See the License for the specific language governing permissions and
17
- limitations under the License.
18
- */
19
-
20
- import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
21
- import { GroupCallType, GroupCallState } from "../webrtc/groupCall.ts";
22
- import { logger } from "../logger.ts";
23
- import { MatrixClient } from "../client.ts";
24
-
25
- export enum MediaHandlerEvent {
26
- LocalStreamsChanged = "local_streams_changed",
27
- }
28
-
29
- export type MediaHandlerEventHandlerMap = {
30
- [MediaHandlerEvent.LocalStreamsChanged]: () => void;
31
- };
32
-
33
- export interface IScreensharingOpts {
34
- /**
35
- * sourceId for Electron DesktopCapturer
36
- */
37
- desktopCapturerSourceId?: string;
38
- audio?: boolean;
39
- // For electron screen capture, there are very few options for detecting electron
40
- // apart from inspecting the user agent or just trying getDisplayMedia() and
41
- // catching the failure, so we do the latter - this flag tells the function to just
42
- // throw an error so we can catch it in this case, rather than logging and emitting.
43
- throwOnFail?: boolean;
44
- }
45
-
46
- export interface AudioSettings {
47
- autoGainControl: boolean;
48
- echoCancellation: boolean;
49
- noiseSuppression: boolean;
50
- }
51
-
52
- export class MediaHandler extends TypedEventEmitter<
53
- MediaHandlerEvent.LocalStreamsChanged,
54
- MediaHandlerEventHandlerMap
55
- > {
56
- private audioInput?: string;
57
- private audioSettings?: AudioSettings;
58
- private videoInput?: string;
59
- private localUserMediaStream?: MediaStream;
60
- public userMediaStreams: MediaStream[] = [];
61
- public screensharingStreams: MediaStream[] = [];
62
-
63
- // Promise chain to serialise calls to getMediaStream
64
- private getMediaStreamPromise?: Promise<MediaStream>;
65
-
66
- public constructor(private client: MatrixClient) {
67
- super();
68
- }
69
-
70
- public restoreMediaSettings(audioInput: string, videoInput: string): void {
71
- this.audioInput = audioInput;
72
- this.videoInput = videoInput;
73
- }
74
-
75
- /**
76
- * Set an audio input device to use for MatrixCalls
77
- * @param deviceId - the identifier for the device
78
- * undefined treated as unset
79
- */
80
- public async setAudioInput(deviceId: string): Promise<void> {
81
- logger.info(`MediaHandler setAudioInput() running (deviceId=${deviceId})`);
82
-
83
- if (this.audioInput === deviceId) return;
84
-
85
- this.audioInput = deviceId;
86
- await this.updateLocalUsermediaStreams();
87
- }
88
-
89
- /**
90
- * Set audio settings for MatrixCalls
91
- * @param opts - audio options to set
92
- */
93
- public async setAudioSettings(opts: AudioSettings): Promise<void> {
94
- logger.info(`MediaHandler setAudioSettings() running (opts=${JSON.stringify(opts)})`);
95
-
96
- this.audioSettings = Object.assign({}, opts) as AudioSettings;
97
- await this.updateLocalUsermediaStreams();
98
- }
99
-
100
- /**
101
- * Set a video input device to use for MatrixCalls
102
- * @param deviceId - the identifier for the device
103
- * undefined treated as unset
104
- */
105
- public async setVideoInput(deviceId: string): Promise<void> {
106
- logger.info(`MediaHandler setVideoInput() running (deviceId=${deviceId})`);
107
-
108
- if (this.videoInput === deviceId) return;
109
-
110
- this.videoInput = deviceId;
111
- await this.updateLocalUsermediaStreams();
112
- }
113
-
114
- /**
115
- * Set media input devices to use for MatrixCalls
116
- * @param audioInput - the identifier for the audio device
117
- * @param videoInput - the identifier for the video device
118
- * undefined treated as unset
119
- */
120
- public async setMediaInputs(audioInput: string, videoInput: string): Promise<void> {
121
- logger.log(`MediaHandler setMediaInputs() running (audioInput: ${audioInput} videoInput: ${videoInput})`);
122
- this.audioInput = audioInput;
123
- this.videoInput = videoInput;
124
- await this.updateLocalUsermediaStreams();
125
- }
126
-
127
- /*
128
- * Requests new usermedia streams and replace the old ones
129
- */
130
- public async updateLocalUsermediaStreams(): Promise<void> {
131
- if (this.userMediaStreams.length === 0) return;
132
-
133
- const callMediaStreamParams: Map<string, { audio: boolean; video: boolean }> = new Map();
134
- for (const call of this.client.callEventHandler!.calls.values()) {
135
- callMediaStreamParams.set(call.callId, {
136
- audio: call.hasLocalUserMediaAudioTrack,
137
- video: call.hasLocalUserMediaVideoTrack,
138
- });
139
- }
140
-
141
- for (const stream of this.userMediaStreams) {
142
- logger.log(`MediaHandler updateLocalUsermediaStreams() stopping all tracks (streamId=${stream.id})`);
143
- for (const track of stream.getTracks()) {
144
- track.stop();
145
- }
146
- }
147
-
148
- this.userMediaStreams = [];
149
- this.localUserMediaStream = undefined;
150
-
151
- for (const call of this.client.callEventHandler!.calls.values()) {
152
- if (call.callHasEnded() || !callMediaStreamParams.has(call.callId)) {
153
- continue;
154
- }
155
-
156
- const { audio, video } = callMediaStreamParams.get(call.callId)!;
157
-
158
- logger.log(
159
- `MediaHandler updateLocalUsermediaStreams() calling getUserMediaStream() (callId=${call.callId})`,
160
- );
161
- const stream = await this.getUserMediaStream(audio, video);
162
-
163
- if (call.callHasEnded()) {
164
- continue;
165
- }
166
-
167
- await call.updateLocalUsermediaStream(stream);
168
- }
169
-
170
- for (const groupCall of this.client.groupCallEventHandler!.groupCalls.values()) {
171
- if (!groupCall.localCallFeed) {
172
- continue;
173
- }
174
-
175
- logger.log(
176
- `MediaHandler updateLocalUsermediaStreams() calling getUserMediaStream() (groupCallId=${groupCall.groupCallId})`,
177
- );
178
- const stream = await this.getUserMediaStream(true, groupCall.type === GroupCallType.Video);
179
-
180
- if (groupCall.state === GroupCallState.Ended) {
181
- continue;
182
- }
183
-
184
- await groupCall.updateLocalUsermediaStream(stream);
185
- }
186
-
187
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
188
- }
189
-
190
- public async hasAudioDevice(): Promise<boolean> {
191
- try {
192
- const devices = await navigator.mediaDevices.enumerateDevices();
193
- return devices.filter((device) => device.kind === "audioinput").length > 0;
194
- } catch (err) {
195
- logger.log(`MediaHandler hasAudioDevice() calling navigator.mediaDevices.enumerateDevices with error`, err);
196
- return false;
197
- }
198
- }
199
-
200
- public async hasVideoDevice(): Promise<boolean> {
201
- try {
202
- const devices = await navigator.mediaDevices.enumerateDevices();
203
- return devices.filter((device) => device.kind === "videoinput").length > 0;
204
- } catch (err) {
205
- logger.log(`MediaHandler hasVideoDevice() calling navigator.mediaDevices.enumerateDevices with error`, err);
206
- return false;
207
- }
208
- }
209
-
210
- /**
211
- * @param audio - should have an audio track
212
- * @param video - should have a video track
213
- * @param reusable - is allowed to be reused by the MediaHandler
214
- * @returns based on passed parameters
215
- */
216
- public async getUserMediaStream(audio: boolean, video: boolean, reusable = true): Promise<MediaStream> {
217
- // Serialise calls, othertwise we can't sensibly re-use the stream
218
- if (this.getMediaStreamPromise) {
219
- this.getMediaStreamPromise = this.getMediaStreamPromise.then(() => {
220
- return this.getUserMediaStreamInternal(audio, video, reusable);
221
- });
222
- } else {
223
- this.getMediaStreamPromise = this.getUserMediaStreamInternal(audio, video, reusable);
224
- }
225
-
226
- return this.getMediaStreamPromise;
227
- }
228
-
229
- private async getUserMediaStreamInternal(audio: boolean, video: boolean, reusable: boolean): Promise<MediaStream> {
230
- const shouldRequestAudio = audio && (await this.hasAudioDevice());
231
- const shouldRequestVideo = video && (await this.hasVideoDevice());
232
-
233
- let stream: MediaStream;
234
-
235
- let canReuseStream = true;
236
- if (this.localUserMediaStream) {
237
- // This figures out if we can reuse the current localUsermediaStream
238
- // based on whether or not the "mute state" (presence of tracks of a
239
- // given kind) matches what is being requested
240
- if (shouldRequestAudio !== this.localUserMediaStream.getAudioTracks().length > 0) {
241
- canReuseStream = false;
242
- }
243
- if (shouldRequestVideo !== this.localUserMediaStream.getVideoTracks().length > 0) {
244
- canReuseStream = false;
245
- }
246
-
247
- // This code checks that the device ID is the same as the localUserMediaStream stream, but we update
248
- // the localUserMediaStream whenever the device ID changes (apart from when restoring) so it's not
249
- // clear why this would ever be different, unless there's a race.
250
- if (
251
- shouldRequestAudio &&
252
- this.localUserMediaStream.getAudioTracks()[0]?.getSettings()?.deviceId !== this.audioInput
253
- ) {
254
- canReuseStream = false;
255
- }
256
- if (
257
- shouldRequestVideo &&
258
- this.localUserMediaStream.getVideoTracks()[0]?.getSettings()?.deviceId !== this.videoInput
259
- ) {
260
- canReuseStream = false;
261
- }
262
- } else {
263
- canReuseStream = false;
264
- }
265
-
266
- if (!canReuseStream) {
267
- const constraints = this.getUserMediaContraints(shouldRequestAudio, shouldRequestVideo);
268
- stream = await navigator.mediaDevices.getUserMedia(constraints);
269
- logger.log(
270
- `MediaHandler getUserMediaStreamInternal() calling getUserMediaStream (streamId=${
271
- stream.id
272
- }, shouldRequestAudio=${shouldRequestAudio}, shouldRequestVideo=${shouldRequestVideo}, constraints=${JSON.stringify(
273
- constraints,
274
- )})`,
275
- );
276
-
277
- for (const track of stream.getTracks()) {
278
- const settings = track.getSettings();
279
-
280
- if (track.kind === "audio") {
281
- this.audioInput = settings.deviceId!;
282
- } else if (track.kind === "video") {
283
- this.videoInput = settings.deviceId!;
284
- }
285
- }
286
-
287
- if (reusable) {
288
- this.localUserMediaStream = stream;
289
- }
290
- } else {
291
- stream = this.localUserMediaStream!.clone();
292
- logger.log(
293
- `MediaHandler getUserMediaStreamInternal() cloning (oldStreamId=${this.localUserMediaStream?.id} newStreamId=${stream.id} shouldRequestAudio=${shouldRequestAudio} shouldRequestVideo=${shouldRequestVideo})`,
294
- );
295
-
296
- if (!shouldRequestAudio) {
297
- for (const track of stream.getAudioTracks()) {
298
- stream.removeTrack(track);
299
- }
300
- }
301
-
302
- if (!shouldRequestVideo) {
303
- for (const track of stream.getVideoTracks()) {
304
- stream.removeTrack(track);
305
- }
306
- }
307
- }
308
-
309
- if (reusable) {
310
- this.userMediaStreams.push(stream);
311
- }
312
-
313
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
314
-
315
- return stream;
316
- }
317
-
318
- /**
319
- * Stops all tracks on the provided usermedia stream
320
- */
321
- public stopUserMediaStream(mediaStream: MediaStream): void {
322
- logger.log(`MediaHandler stopUserMediaStream() stopping (streamId=${mediaStream.id})`);
323
- for (const track of mediaStream.getTracks()) {
324
- track.stop();
325
- }
326
-
327
- const index = this.userMediaStreams.indexOf(mediaStream);
328
-
329
- if (index !== -1) {
330
- logger.debug(
331
- `MediaHandler stopUserMediaStream() splicing usermedia stream out stream array (streamId=${mediaStream.id})`,
332
- mediaStream.id,
333
- );
334
- this.userMediaStreams.splice(index, 1);
335
- }
336
-
337
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
338
-
339
- if (this.localUserMediaStream === mediaStream) {
340
- // if we have this stream cahced, remove it, because we've stopped it
341
- this.localUserMediaStream = undefined;
342
- } else {
343
- // If it's not the same stream. remove any tracks from the cached stream that
344
- // we have just stopped, and if we do stop any, call the same method on the
345
- // cached stream too in order to stop all its tracks (in case they are different)
346
- // and un-cache it.
347
- for (const track of mediaStream.getTracks()) {
348
- if (this.localUserMediaStream?.getTrackById(track.id)) {
349
- this.stopUserMediaStream(this.localUserMediaStream);
350
- break;
351
- }
352
- }
353
- }
354
- }
355
-
356
- /**
357
- * @param opts - screensharing stream options
358
- * @param reusable - is allowed to be reused by the MediaHandler
359
- * @returns based on passed parameters
360
- */
361
- public async getScreensharingStream(opts: IScreensharingOpts = {}, reusable = true): Promise<MediaStream> {
362
- let stream: MediaStream;
363
-
364
- if (this.screensharingStreams.length === 0) {
365
- const screenshareConstraints = this.getScreenshareContraints(opts);
366
-
367
- if (opts.desktopCapturerSourceId) {
368
- // We are using Electron
369
- logger.debug(
370
- `MediaHandler getScreensharingStream() calling getUserMedia() (opts=${JSON.stringify(opts)})`,
371
- );
372
- stream = await navigator.mediaDevices.getUserMedia(screenshareConstraints);
373
- } else {
374
- // We are not using Electron
375
- logger.debug(
376
- `MediaHandler getScreensharingStream() calling getDisplayMedia() (opts=${JSON.stringify(opts)})`,
377
- );
378
- stream = await navigator.mediaDevices.getDisplayMedia(screenshareConstraints);
379
- }
380
- } else {
381
- const matchingStream = this.screensharingStreams[this.screensharingStreams.length - 1];
382
- logger.log(`MediaHandler getScreensharingStream() cloning (streamId=${matchingStream.id})`);
383
- stream = matchingStream.clone();
384
- }
385
-
386
- if (reusable) {
387
- this.screensharingStreams.push(stream);
388
- }
389
-
390
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
391
-
392
- return stream;
393
- }
394
-
395
- /**
396
- * Stops all tracks on the provided screensharing stream
397
- */
398
- public stopScreensharingStream(mediaStream: MediaStream): void {
399
- logger.debug(`MediaHandler stopScreensharingStream() stopping stream (streamId=${mediaStream.id})`);
400
- for (const track of mediaStream.getTracks()) {
401
- track.stop();
402
- }
403
-
404
- const index = this.screensharingStreams.indexOf(mediaStream);
405
-
406
- if (index !== -1) {
407
- logger.debug(`MediaHandler stopScreensharingStream() splicing stream out (streamId=${mediaStream.id})`);
408
- this.screensharingStreams.splice(index, 1);
409
- }
410
-
411
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
412
- }
413
-
414
- /**
415
- * Stops all local media tracks
416
- */
417
- public stopAllStreams(): void {
418
- for (const stream of this.userMediaStreams) {
419
- logger.log(`MediaHandler stopAllStreams() stopping (streamId=${stream.id})`);
420
- for (const track of stream.getTracks()) {
421
- track.stop();
422
- }
423
- }
424
-
425
- for (const stream of this.screensharingStreams) {
426
- for (const track of stream.getTracks()) {
427
- track.stop();
428
- }
429
- }
430
-
431
- this.userMediaStreams = [];
432
- this.screensharingStreams = [];
433
- this.localUserMediaStream = undefined;
434
-
435
- this.emit(MediaHandlerEvent.LocalStreamsChanged);
436
- }
437
-
438
- private getUserMediaContraints(audio: boolean, video: boolean): MediaStreamConstraints {
439
- const isWebkit = !!navigator.webkitGetUserMedia;
440
-
441
- return {
442
- audio: audio
443
- ? {
444
- deviceId: this.audioInput ? { ideal: this.audioInput } : undefined,
445
- autoGainControl: this.audioSettings ? { ideal: this.audioSettings.autoGainControl } : undefined,
446
- echoCancellation: this.audioSettings ? { ideal: this.audioSettings.echoCancellation } : undefined,
447
- noiseSuppression: this.audioSettings ? { ideal: this.audioSettings.noiseSuppression } : undefined,
448
- }
449
- : false,
450
- video: video
451
- ? {
452
- deviceId: this.videoInput ? { ideal: this.videoInput } : undefined,
453
- /* We want 640x360. Chrome will give it only if we ask exactly,
454
- FF refuses entirely if we ask exactly, so have to ask for ideal
455
- instead
456
- XXX: Is this still true?
457
- */
458
- width: isWebkit ? { exact: 640 } : { ideal: 640 },
459
- height: isWebkit ? { exact: 360 } : { ideal: 360 },
460
- }
461
- : false,
462
- };
463
- }
464
-
465
- private getScreenshareContraints(opts: IScreensharingOpts): DesktopCapturerConstraints {
466
- const { desktopCapturerSourceId, audio } = opts;
467
- if (desktopCapturerSourceId) {
468
- return {
469
- audio: audio ?? false,
470
- video: {
471
- mandatory: {
472
- chromeMediaSource: "desktop",
473
- chromeMediaSourceId: desktopCapturerSourceId,
474
- },
475
- },
476
- };
477
- } else {
478
- return {
479
- audio: audio ?? false,
480
- video: true,
481
- };
482
- }
483
- }
484
- }
@@ -1,94 +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 { CallFeedReport, CallFeedStats, TrackStats, TransceiverStats } from "./statsReport.ts";
17
- import { CallFeed } from "../callFeed.ts";
18
-
19
- export class CallFeedStatsReporter {
20
- public static buildCallFeedReport(callId: string, opponentMemberId: string, pc: RTCPeerConnection): CallFeedReport {
21
- const rtpTransceivers = pc.getTransceivers();
22
- const transceiver: TransceiverStats[] = [];
23
- const callFeeds: CallFeedStats[] = [];
24
-
25
- rtpTransceivers.forEach((t) => {
26
- const sender = t.sender?.track ? CallFeedStatsReporter.buildTrackStats(t.sender.track, "sender") : null;
27
- const receiver = CallFeedStatsReporter.buildTrackStats(t.receiver.track, "receiver");
28
- transceiver.push({
29
- mid: t.mid == null ? "null" : t.mid,
30
- direction: t.direction,
31
- currentDirection: t.currentDirection == null ? "null" : t.currentDirection,
32
- sender,
33
- receiver,
34
- });
35
- });
36
-
37
- return {
38
- callId,
39
- opponentMemberId,
40
- transceiver,
41
- callFeeds,
42
- };
43
- }
44
-
45
- private static buildTrackStats(track: MediaStreamTrack, label = "--"): TrackStats {
46
- const settingDeviceId = track.getSettings()?.deviceId;
47
- const constrainDeviceId = track.getConstraints()?.deviceId;
48
-
49
- return {
50
- id: track.id,
51
- kind: track.kind,
52
- settingDeviceId: settingDeviceId ? settingDeviceId : "unknown",
53
- constrainDeviceId: constrainDeviceId ? constrainDeviceId : "unknown",
54
- muted: track.muted,
55
- enabled: track.enabled,
56
- readyState: track.readyState,
57
- label,
58
- } as TrackStats;
59
- }
60
-
61
- public static expandCallFeedReport(
62
- report: CallFeedReport,
63
- callFeeds: CallFeed[],
64
- prefix = "unknown",
65
- ): CallFeedReport {
66
- if (!report.callFeeds) {
67
- report.callFeeds = [];
68
- }
69
- callFeeds.forEach((feed) => {
70
- const audioTracks = feed.stream.getAudioTracks();
71
- const videoTracks = feed.stream.getVideoTracks();
72
- const audio =
73
- audioTracks.length > 0
74
- ? CallFeedStatsReporter.buildTrackStats(feed.stream.getAudioTracks()[0], feed.purpose)
75
- : null;
76
- const video =
77
- videoTracks.length > 0
78
- ? CallFeedStatsReporter.buildTrackStats(feed.stream.getVideoTracks()[0], feed.purpose)
79
- : null;
80
- const feedStats = {
81
- stream: feed.stream.id,
82
- type: feed.isLocal() ? "local" : "remote",
83
- audio,
84
- video,
85
- purpose: feed.purpose,
86
- prefix,
87
- isVideoMuted: feed.isVideoMuted(),
88
- isAudioMuted: feed.isAudioMuted(),
89
- } as CallFeedStats;
90
- report.callFeeds.push(feedStats);
91
- });
92
- return report;
93
- }
94
- }