@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,425 +0,0 @@
1
- /*
2
- Copyright 2020 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 { MatrixEvent } from "../models/event.ts";
18
- import { logger } from "../logger.ts";
19
- import { CallDirection, CallError, CallErrorCode, CallState, createNewMatrixCall, MatrixCall } from "./call.ts";
20
- import { EventType } from "../@types/event.ts";
21
- import { ClientEvent, MatrixClient } from "../client.ts";
22
- import { MCallAnswer, MCallHangupReject } from "./callEventTypes.ts";
23
- import { GroupCall, GroupCallErrorCode, GroupCallEvent, GroupCallUnknownDeviceError } from "./groupCall.ts";
24
- import { RoomEvent } from "../models/room.ts";
25
-
26
- // Don't ring unless we'd be ringing for at least 3 seconds: the user needs some
27
- // time to press the 'accept' button
28
- const RING_GRACE_PERIOD = 3000;
29
-
30
- export enum CallEventHandlerEvent {
31
- Incoming = "Call.incoming",
32
- }
33
-
34
- export type CallEventHandlerEventHandlerMap = {
35
- /**
36
- * Fires whenever an incoming call arrives.
37
- * @param call - The incoming call.
38
- * @example
39
- * ```
40
- * matrixClient.on("Call.incoming", function(call){
41
- * call.answer(); // auto-answer
42
- * });
43
- * ```
44
- */
45
- [CallEventHandlerEvent.Incoming]: (call: MatrixCall) => void;
46
- };
47
-
48
- export class CallEventHandler {
49
- // XXX: Most of these are only public because of the tests
50
- public calls: Map<string, MatrixCall>;
51
- public callEventBuffer: MatrixEvent[];
52
- public nextSeqByCall: Map<string, number> = new Map();
53
- public toDeviceEventBuffers: Map<string, Array<MatrixEvent>> = new Map();
54
-
55
- private client: MatrixClient;
56
- private candidateEventsByCall: Map<string, Array<MatrixEvent>>;
57
- private eventBufferPromiseChain?: Promise<void>;
58
-
59
- public constructor(client: MatrixClient) {
60
- this.client = client;
61
- this.calls = new Map<string, MatrixCall>();
62
- // The sync code always emits one event at a time, so it will patiently
63
- // wait for us to finish processing a call invite before delivering the
64
- // next event, even if that next event is a hangup. We therefore accumulate
65
- // all our call events and then process them on the 'sync' event, ie.
66
- // each time a sync has completed. This way, we can avoid emitting incoming
67
- // call events if we get both the invite and answer/hangup in the same sync.
68
- // This happens quite often, eg. replaying sync from storage, catchup sync
69
- // after loading and after we've been offline for a bit.
70
- this.callEventBuffer = [];
71
- this.candidateEventsByCall = new Map<string, Array<MatrixEvent>>();
72
- }
73
-
74
- public start(): void {
75
- this.client.on(ClientEvent.Sync, this.onSync);
76
- this.client.on(RoomEvent.Timeline, this.onRoomTimeline);
77
- this.client.on(ClientEvent.ToDeviceEvent, this.onToDeviceEvent);
78
- }
79
-
80
- public stop(): void {
81
- this.client.removeListener(ClientEvent.Sync, this.onSync);
82
- this.client.removeListener(RoomEvent.Timeline, this.onRoomTimeline);
83
- this.client.removeListener(ClientEvent.ToDeviceEvent, this.onToDeviceEvent);
84
- }
85
-
86
- private onSync = (): void => {
87
- // Process the current event buffer and start queuing into a new one.
88
- const currentEventBuffer = this.callEventBuffer;
89
- this.callEventBuffer = [];
90
-
91
- // Ensure correct ordering by only processing this queue after the previous one has finished processing
92
- if (this.eventBufferPromiseChain) {
93
- this.eventBufferPromiseChain = this.eventBufferPromiseChain.then(() =>
94
- this.evaluateEventBuffer(currentEventBuffer),
95
- );
96
- } else {
97
- this.eventBufferPromiseChain = this.evaluateEventBuffer(currentEventBuffer);
98
- }
99
- };
100
-
101
- private async evaluateEventBuffer(eventBuffer: MatrixEvent[]): Promise<void> {
102
- await Promise.all(eventBuffer.map((event) => this.client.decryptEventIfNeeded(event)));
103
-
104
- const callEvents = eventBuffer.filter((event) => {
105
- const eventType = event.getType();
106
- return eventType.startsWith("m.call.") || eventType.startsWith("org.matrix.call.");
107
- });
108
-
109
- const ignoreCallIds = new Set<string>();
110
-
111
- // inspect the buffer and mark all calls which have been answered
112
- // or hung up before passing them to the call event handler.
113
- for (const event of callEvents) {
114
- const eventType = event.getType();
115
-
116
- if (eventType === EventType.CallAnswer || eventType === EventType.CallHangup) {
117
- ignoreCallIds.add(event.getContent().call_id);
118
- }
119
- }
120
-
121
- // Process call events in the order that they were received
122
- for (const event of callEvents) {
123
- const eventType = event.getType();
124
- const callId = event.getContent().call_id;
125
-
126
- if (eventType === EventType.CallInvite && ignoreCallIds.has(callId)) {
127
- // This call has previously been answered or hung up: ignore it
128
- continue;
129
- }
130
-
131
- try {
132
- await this.handleCallEvent(event);
133
- } catch (e) {
134
- logger.error("CallEventHandler evaluateEventBuffer() caught exception handling call event", e);
135
- }
136
- }
137
- }
138
-
139
- private onRoomTimeline = (event: MatrixEvent): void => {
140
- this.callEventBuffer.push(event);
141
- };
142
-
143
- private onToDeviceEvent = (event: MatrixEvent): void => {
144
- const content = event.getContent();
145
-
146
- if (!content.call_id) {
147
- this.callEventBuffer.push(event);
148
- return;
149
- }
150
-
151
- if (!this.nextSeqByCall.has(content.call_id)) {
152
- this.nextSeqByCall.set(content.call_id, 0);
153
- }
154
-
155
- if (content.seq === undefined) {
156
- this.callEventBuffer.push(event);
157
- return;
158
- }
159
-
160
- const nextSeq = this.nextSeqByCall.get(content.call_id) || 0;
161
-
162
- if (content.seq !== nextSeq) {
163
- if (!this.toDeviceEventBuffers.has(content.call_id)) {
164
- this.toDeviceEventBuffers.set(content.call_id, []);
165
- }
166
-
167
- const buffer = this.toDeviceEventBuffers.get(content.call_id)!;
168
- const index = buffer.findIndex((e) => e.getContent().seq > content.seq);
169
-
170
- if (index === -1) {
171
- buffer.push(event);
172
- } else {
173
- buffer.splice(index, 0, event);
174
- }
175
- } else {
176
- const callId = content.call_id;
177
- this.callEventBuffer.push(event);
178
- this.nextSeqByCall.set(callId, content.seq + 1);
179
-
180
- const buffer = this.toDeviceEventBuffers.get(callId);
181
-
182
- let nextEvent = buffer && buffer.shift();
183
-
184
- while (nextEvent && nextEvent.getContent().seq === this.nextSeqByCall.get(callId)) {
185
- this.callEventBuffer.push(nextEvent);
186
- this.nextSeqByCall.set(callId, nextEvent.getContent().seq + 1);
187
- nextEvent = buffer!.shift();
188
- }
189
- }
190
- };
191
-
192
- private async handleCallEvent(event: MatrixEvent): Promise<void> {
193
- this.client.emit(ClientEvent.ReceivedVoipEvent, event);
194
-
195
- const content = event.getContent();
196
- const callRoomId =
197
- event.getRoomId() || this.client.groupCallEventHandler!.getGroupCallById(content.conf_id)?.room?.roomId;
198
- const groupCallId = content.conf_id;
199
- const type = event.getType() as EventType;
200
- const senderId = event.getSender()!;
201
- let call = content.call_id ? this.calls.get(content.call_id) : undefined;
202
-
203
- let opponentDeviceId: string | undefined;
204
-
205
- let groupCall: GroupCall | undefined;
206
- if (groupCallId) {
207
- groupCall = this.client.groupCallEventHandler!.getGroupCallById(groupCallId);
208
-
209
- if (!groupCall) {
210
- logger.warn(
211
- `CallEventHandler handleCallEvent() could not find a group call - ignoring event (groupCallId=${groupCallId}, type=${type})`,
212
- );
213
- return;
214
- }
215
-
216
- opponentDeviceId = content.device_id;
217
-
218
- if (!opponentDeviceId) {
219
- logger.warn(
220
- `CallEventHandler handleCallEvent() could not find a device id - ignoring event (senderId=${senderId})`,
221
- );
222
- groupCall.emit(GroupCallEvent.Error, new GroupCallUnknownDeviceError(senderId));
223
- return;
224
- }
225
-
226
- if (content.dest_session_id !== this.client.getSessionId()) {
227
- logger.warn(
228
- "CallEventHandler handleCallEvent() call event does not match current session id - ignoring",
229
- );
230
- return;
231
- }
232
- }
233
-
234
- const weSentTheEvent =
235
- senderId === this.client.credentials.userId &&
236
- (opponentDeviceId === undefined || opponentDeviceId === this.client.getDeviceId()!);
237
-
238
- if (!callRoomId) return;
239
-
240
- if (type === EventType.CallInvite) {
241
- // ignore invites you send
242
- if (weSentTheEvent) return;
243
- // expired call
244
- if (event.getLocalAge() > content.lifetime - RING_GRACE_PERIOD) return;
245
- // stale/old invite event
246
- if (call && call.state === CallState.Ended) return;
247
-
248
- if (call) {
249
- logger.warn(
250
- `CallEventHandler handleCallEvent() already has a call but got an invite - clobbering (callId=${content.call_id})`,
251
- );
252
- }
253
-
254
- if (content.invitee && content.invitee !== this.client.getUserId()) {
255
- return; // This invite was meant for another user in the room
256
- }
257
-
258
- const timeUntilTurnCresExpire = (this.client.getTurnServersExpiry() ?? 0) - Date.now();
259
- logger.info(
260
- "CallEventHandler handleCallEvent() current turn creds expire in " + timeUntilTurnCresExpire + " ms",
261
- );
262
- call =
263
- createNewMatrixCall(this.client, callRoomId, {
264
- forceTURN: this.client.forceTURN,
265
- opponentDeviceId,
266
- groupCallId,
267
- opponentSessionId: content.sender_session_id,
268
- }) ?? undefined;
269
- if (!call) {
270
- logger.log(
271
- `CallEventHandler handleCallEvent() this client does not support WebRTC (callId=${content.call_id})`,
272
- );
273
- // don't hang up the call: there could be other clients
274
- // connected that do support WebRTC and declining the
275
- // the call on their behalf would be really annoying.
276
- return;
277
- }
278
-
279
- call.callId = content.call_id;
280
- const stats = groupCall?.getGroupCallStats();
281
- if (stats) {
282
- call.initStats(stats);
283
- }
284
-
285
- try {
286
- await call.initWithInvite(event);
287
- } catch (e) {
288
- if (e instanceof CallError) {
289
- if (e.code === GroupCallErrorCode.UnknownDevice) {
290
- groupCall?.emit(GroupCallEvent.Error, e);
291
- } else {
292
- logger.error(e);
293
- }
294
- }
295
- }
296
- this.calls.set(call.callId, call);
297
-
298
- // if we stashed candidate events for that call ID, play them back now
299
- if (this.candidateEventsByCall.get(call.callId)) {
300
- for (const ev of this.candidateEventsByCall.get(call.callId)!) {
301
- call.onRemoteIceCandidatesReceived(ev);
302
- }
303
- }
304
-
305
- // Were we trying to call that user (room)?
306
- let existingCall: MatrixCall | undefined;
307
- for (const thisCall of this.calls.values()) {
308
- const isCalling = [CallState.WaitLocalMedia, CallState.CreateOffer, CallState.InviteSent].includes(
309
- thisCall.state,
310
- );
311
-
312
- if (
313
- call.roomId === thisCall.roomId &&
314
- thisCall.direction === CallDirection.Outbound &&
315
- call.getOpponentMember()?.userId === thisCall.invitee &&
316
- isCalling
317
- ) {
318
- existingCall = thisCall;
319
- break;
320
- }
321
- }
322
-
323
- if (existingCall) {
324
- if (existingCall.callId > call.callId) {
325
- logger.log(
326
- `CallEventHandler handleCallEvent() detected glare - answering incoming call and canceling outgoing call (incomingId=${call.callId}, outgoingId=${existingCall.callId})`,
327
- );
328
- existingCall.replacedBy(call);
329
- } else {
330
- logger.log(
331
- `CallEventHandler handleCallEvent() detected glare - hanging up incoming call (incomingId=${call.callId}, outgoingId=${existingCall.callId})`,
332
- );
333
- call.hangup(CallErrorCode.Replaced, true);
334
- }
335
- } else {
336
- this.client.emit(CallEventHandlerEvent.Incoming, call);
337
- }
338
- return;
339
- } else if (type === EventType.CallCandidates) {
340
- if (weSentTheEvent) return;
341
-
342
- if (!call) {
343
- // store the candidates; we may get a call eventually.
344
- if (!this.candidateEventsByCall.has(content.call_id)) {
345
- this.candidateEventsByCall.set(content.call_id, []);
346
- }
347
- this.candidateEventsByCall.get(content.call_id)!.push(event);
348
- } else {
349
- call.onRemoteIceCandidatesReceived(event);
350
- }
351
- return;
352
- } else if ([EventType.CallHangup, EventType.CallReject].includes(type)) {
353
- // Note that we also observe our own hangups here so we can see
354
- // if we've already rejected a call that would otherwise be valid
355
- if (!call) {
356
- // if not live, store the fact that the call has ended because
357
- // we're probably getting events backwards so
358
- // the hangup will come before the invite
359
- call =
360
- createNewMatrixCall(this.client, callRoomId, {
361
- opponentDeviceId,
362
- opponentSessionId: content.sender_session_id,
363
- }) ?? undefined;
364
- if (call) {
365
- call.callId = content.call_id;
366
- call.initWithHangup(event);
367
- this.calls.set(content.call_id, call);
368
- }
369
- } else {
370
- if (call.state !== CallState.Ended) {
371
- if (type === EventType.CallHangup) {
372
- call.onHangupReceived(content as MCallHangupReject);
373
- } else {
374
- call.onRejectReceived(content as MCallHangupReject);
375
- }
376
-
377
- // @ts-expect-error typescript thinks the state can't be 'ended' because we're
378
- // inside the if block where it wasn't, but it could have changed because
379
- // on[Hangup|Reject]Received are side-effecty.
380
- if (call.state === CallState.Ended) this.calls.delete(content.call_id);
381
- }
382
- }
383
- return;
384
- }
385
-
386
- // The following events need a call and a peer connection
387
- if (!call || !call.hasPeerConnection) {
388
- logger.info(
389
- `CallEventHandler handleCallEvent() discarding possible call event as we don't have a call (type=${type})`,
390
- );
391
- return;
392
- }
393
- // Ignore remote echo
394
- if (event.getContent().party_id === call.ourPartyId) return;
395
-
396
- switch (type) {
397
- case EventType.CallAnswer:
398
- if (weSentTheEvent) {
399
- if (call.state === CallState.Ringing) {
400
- call.onAnsweredElsewhere(content as MCallAnswer);
401
- }
402
- } else {
403
- call.onAnswerReceived(event);
404
- }
405
- break;
406
- case EventType.CallSelectAnswer:
407
- call.onSelectAnswerReceived(event);
408
- break;
409
-
410
- case EventType.CallNegotiate:
411
- call.onNegotiateReceived(event);
412
- break;
413
-
414
- case EventType.CallAssertedIdentity:
415
- case EventType.CallAssertedIdentityPrefix:
416
- call.onAssertedIdentityReceived(event);
417
- break;
418
-
419
- case EventType.CallSDPStreamMetadataChanged:
420
- case EventType.CallSDPStreamMetadataChangedPrefix:
421
- call.onSDPStreamMetadataChangedReceived(event);
422
- break;
423
- }
424
- }
425
- }
@@ -1,93 +0,0 @@
1
- // allow non-camelcase as these are events type that go onto the wire
2
- /* eslint-disable camelcase */
3
-
4
- import { CallErrorCode } from "./call.ts";
5
-
6
- // TODO: Change to "sdp_stream_metadata" when MSC3077 is merged
7
- export const SDPStreamMetadataKey = "org.matrix.msc3077.sdp_stream_metadata";
8
-
9
- export enum SDPStreamMetadataPurpose {
10
- Usermedia = "m.usermedia",
11
- Screenshare = "m.screenshare",
12
- }
13
-
14
- export interface SDPStreamMetadataObject {
15
- purpose: SDPStreamMetadataPurpose;
16
- audio_muted: boolean;
17
- video_muted: boolean;
18
- }
19
-
20
- export interface SDPStreamMetadata {
21
- [key: string]: SDPStreamMetadataObject;
22
- }
23
-
24
- export interface CallCapabilities {
25
- "m.call.transferee": boolean;
26
- "m.call.dtmf": boolean;
27
- }
28
-
29
- export interface CallReplacesTarget {
30
- id: string;
31
- display_name: string;
32
- avatar_url: string;
33
- }
34
-
35
- export interface MCallBase {
36
- call_id: string;
37
- conf_id?: string;
38
- version: string | number;
39
- party_id?: string;
40
- sender_session_id?: string;
41
- dest_session_id?: string;
42
- }
43
-
44
- export interface MCallAnswer extends MCallBase {
45
- answer: RTCSessionDescription;
46
- capabilities?: CallCapabilities;
47
- [SDPStreamMetadataKey]: SDPStreamMetadata;
48
- }
49
-
50
- export interface MCallSelectAnswer extends MCallBase {
51
- selected_party_id: string;
52
- }
53
-
54
- export interface MCallInviteNegotiate extends MCallBase {
55
- offer: RTCSessionDescription;
56
- description: RTCSessionDescription;
57
- lifetime: number;
58
- capabilities?: CallCapabilities;
59
- invitee?: string;
60
- sender_session_id?: string;
61
- dest_session_id?: string;
62
- [SDPStreamMetadataKey]: SDPStreamMetadata;
63
- }
64
-
65
- export interface MCallSDPStreamMetadataChanged extends MCallBase {
66
- [SDPStreamMetadataKey]: SDPStreamMetadata;
67
- }
68
-
69
- export interface MCallReplacesEvent extends MCallBase {
70
- replacement_id: string;
71
- target_user: CallReplacesTarget;
72
- create_call: string;
73
- await_call: string;
74
- target_room: string;
75
- }
76
-
77
- export interface MCAllAssertedIdentity extends MCallBase {
78
- asserted_identity: {
79
- id: string;
80
- display_name: string;
81
- avatar_url: string;
82
- };
83
- }
84
-
85
- export interface MCallCandidates extends MCallBase {
86
- candidates: Omit<RTCIceCandidateInit, "usernameFragment">[];
87
- }
88
-
89
- export interface MCallHangupReject extends MCallBase {
90
- reason?: CallErrorCode;
91
- }
92
-
93
- /* eslint-enable camelcase */