@unwanted/matrix-sdk-mini 34.12.0-1 → 34.12.0-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 */