matrix-js-sdk 41.0.0 → 41.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/@types/event.d.ts +1 -1
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js +1 -1
  5. package/lib/@types/event.js.map +1 -1
  6. package/lib/client.d.ts.map +1 -1
  7. package/lib/client.js +250 -246
  8. package/lib/client.js.map +1 -1
  9. package/lib/crypto-api/index.d.ts +13 -2
  10. package/lib/crypto-api/index.d.ts.map +1 -1
  11. package/lib/crypto-api/index.js +11 -0
  12. package/lib/crypto-api/index.js.map +1 -1
  13. package/lib/logger.d.ts +5 -5
  14. package/lib/logger.d.ts.map +1 -1
  15. package/lib/logger.js.map +1 -1
  16. package/lib/matrixrtc/CallMembership.d.ts +49 -145
  17. package/lib/matrixrtc/CallMembership.d.ts.map +1 -1
  18. package/lib/matrixrtc/CallMembership.js +157 -265
  19. package/lib/matrixrtc/CallMembership.js.map +1 -1
  20. package/lib/matrixrtc/EncryptionManager.d.ts +1 -85
  21. package/lib/matrixrtc/EncryptionManager.d.ts.map +1 -1
  22. package/lib/matrixrtc/EncryptionManager.js +0 -317
  23. package/lib/matrixrtc/EncryptionManager.js.map +1 -1
  24. package/lib/matrixrtc/MatrixRTCSession.d.ts +18 -22
  25. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
  26. package/lib/matrixrtc/MatrixRTCSession.js +48 -76
  27. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  28. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +2 -1
  29. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -1
  30. package/lib/matrixrtc/MatrixRTCSessionManager.js +3 -2
  31. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  32. package/lib/matrixrtc/MembershipManager.d.ts +10 -4
  33. package/lib/matrixrtc/MembershipManager.d.ts.map +1 -1
  34. package/lib/matrixrtc/MembershipManager.js +10 -4
  35. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  36. package/lib/matrixrtc/RTCEncryptionManager.d.ts +6 -7
  37. package/lib/matrixrtc/RTCEncryptionManager.d.ts.map +1 -1
  38. package/lib/matrixrtc/RTCEncryptionManager.js +4 -7
  39. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  40. package/lib/matrixrtc/index.d.ts +1 -0
  41. package/lib/matrixrtc/index.d.ts.map +1 -1
  42. package/lib/matrixrtc/index.js.map +1 -1
  43. package/lib/matrixrtc/membershipData/common.d.ts +8 -0
  44. package/lib/matrixrtc/membershipData/common.d.ts.map +1 -0
  45. package/lib/matrixrtc/membershipData/common.js +26 -0
  46. package/lib/matrixrtc/membershipData/common.js.map +1 -0
  47. package/lib/matrixrtc/membershipData/index.d.ts +4 -0
  48. package/lib/matrixrtc/membershipData/index.d.ts.map +1 -0
  49. package/lib/matrixrtc/membershipData/index.js +20 -0
  50. package/lib/matrixrtc/membershipData/index.js.map +1 -0
  51. package/lib/matrixrtc/membershipData/rtc.d.ts +33 -0
  52. package/lib/matrixrtc/membershipData/rtc.d.ts.map +1 -0
  53. package/lib/matrixrtc/membershipData/rtc.js +137 -0
  54. package/lib/matrixrtc/membershipData/rtc.js.map +1 -0
  55. package/lib/matrixrtc/membershipData/session.d.ts +77 -0
  56. package/lib/matrixrtc/membershipData/session.d.ts.map +1 -0
  57. package/lib/matrixrtc/membershipData/session.js +62 -0
  58. package/lib/matrixrtc/membershipData/session.js.map +1 -0
  59. package/lib/matrixrtc/types.d.ts +23 -0
  60. package/lib/matrixrtc/types.d.ts.map +1 -1
  61. package/lib/matrixrtc/types.js +9 -1
  62. package/lib/matrixrtc/types.js.map +1 -1
  63. package/lib/matrixrtc/utils.d.ts +11 -1
  64. package/lib/matrixrtc/utils.d.ts.map +1 -1
  65. package/lib/matrixrtc/utils.js +24 -1
  66. package/lib/matrixrtc/utils.js.map +1 -1
  67. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  68. package/lib/rust-crypto/rust-crypto.js +2 -2
  69. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  70. package/package.json +5 -7
  71. package/src/@types/event.ts +2 -2
  72. package/src/client.ts +5 -3
  73. package/src/crypto-api/index.ts +17 -2
  74. package/src/logger.ts +5 -5
  75. package/src/matrixrtc/CallMembership.ts +159 -373
  76. package/src/matrixrtc/EncryptionManager.ts +1 -417
  77. package/src/matrixrtc/MatrixRTCSession.ts +82 -122
  78. package/src/matrixrtc/MatrixRTCSessionManager.ts +5 -3
  79. package/src/matrixrtc/MembershipManager.ts +14 -17
  80. package/src/matrixrtc/RTCEncryptionManager.ts +7 -10
  81. package/src/matrixrtc/index.ts +1 -0
  82. package/src/matrixrtc/membershipData/common.ts +27 -0
  83. package/src/matrixrtc/membershipData/index.ts +19 -0
  84. package/src/matrixrtc/membershipData/rtc.ts +156 -0
  85. package/src/matrixrtc/membershipData/session.ts +146 -0
  86. package/src/matrixrtc/types.ts +27 -1
  87. package/src/matrixrtc/utils.ts +24 -2
  88. package/src/rust-crypto/rust-crypto.ts +4 -1
  89. package/lib/matrixrtc/RoomKeyTransport.d.ts +0 -25
  90. package/lib/matrixrtc/RoomKeyTransport.d.ts.map +0 -1
  91. package/lib/matrixrtc/RoomKeyTransport.js +0 -152
  92. package/lib/matrixrtc/RoomKeyTransport.js.map +0 -1
  93. package/src/matrixrtc/RoomKeyTransport.ts +0 -189
@@ -1,7 +1,7 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  /*
4
- Copyright 2023 The Matrix.org Foundation C.I.C.
4
+ Copyright 2023-2026 The Matrix.org Foundation C.I.C.
5
5
 
6
6
  Licensed under the Apache License, Version 2.0 (the "License");
7
7
  you may not use this file except in compliance with the License.
@@ -16,145 +16,95 @@ See the License for the specific language governing permissions and
16
16
  limitations under the License.
17
17
  */
18
18
 
19
- import { MXID_PATTERN } from "../models/room-member.js";
20
19
  import { deepCompare } from "../utils.js";
21
- import { slotDescriptionToId, slotIdToDescription } from "./MatrixRTCSession.js";
22
- import { sha256 } from "../digest.js";
23
- import { encodeUnpaddedBase64 } from "../base64.js";
20
+ import { logger } from "../logger.js";
21
+ import { computeSlotId, slotIdToDescription } from "./utils.js";
22
+ import { checkRtcMembershipData, computeRtcIdentityRaw, checkSessionsMembershipData, MatrixRTCMembershipParseError } from "./membershipData/index.js";
23
+ import { EventType } from "../@types/event.js";
24
+
24
25
  /**
25
26
  * The default duration in milliseconds that a membership is considered valid for.
26
27
  * Ordinarily the client responsible for the session will update the membership before it expires.
27
28
  * We use this duration as the fallback case where stale sessions are present for some reason.
28
29
  */
29
30
  export var DEFAULT_EXPIRE_DURATION = 1000 * 60 * 60 * 4;
30
- var checkRtcMembershipData = (data, errors, referenceUserId) => {
31
- var _data$sticky_key;
32
- var prefix = " - ";
33
31
 
34
- // required fields
35
- if (typeof data.slot_id !== "string") {
36
- errors.push(prefix + "slot_id must be string");
37
- } else {
38
- if (data.slot_id.split("#").length !== 2) errors.push(prefix + 'slot_id must include exactly one "#"');
39
- }
40
- if (typeof data.member !== "object" || data.member === null) {
41
- errors.push(prefix + "member must be an object");
42
- } else {
43
- if (typeof data.member.user_id !== "string") errors.push(prefix + "member.user_id must be string");else if (!MXID_PATTERN.test(data.member.user_id)) errors.push(prefix + "member.user_id must be a valid mxid");
44
- // This is not what the spec enforces but there currently are no rules what power levels are required to
45
- // send a m.rtc.member event for a other user. So we add this check for simplicity and to avoid possible attacks until there
46
- // is a proper definition when this is allowed.
47
- else if (data.member.user_id !== referenceUserId) errors.push(prefix + "member.user_id must match the sender");
48
- if (typeof data.member.device_id !== "string") errors.push(prefix + "member.device_id must be string");
49
- if (typeof data.member.id !== "string") errors.push(prefix + "member.id must be string");
50
- }
51
- if (typeof data.application !== "object" || data.application === null) {
52
- errors.push(prefix + "application must be an object");
53
- } else {
54
- if (typeof data.application.type !== "string") {
55
- errors.push(prefix + "application.type must be a string");
56
- } else {
57
- if (data.application.type.includes("#")) errors.push(prefix + 'application.type must not include "#"');
58
- }
59
- }
60
- if (data.rtc_transports === undefined || !Array.isArray(data.rtc_transports)) {
61
- errors.push(prefix + "rtc_transports must be an array");
62
- } else {
63
- // validate that each transport has at least a string 'type'
64
- for (var t of data.rtc_transports) {
65
- if (typeof t !== "object" || t === null || typeof t.type !== "string") {
66
- errors.push(prefix + "rtc_transports entries must be objects with a string type");
67
- break;
32
+ /**
33
+ * Describes the source event type that provided the membership data.
34
+ */
35
+ var MembershipKind = /*#__PURE__*/function (MembershipKind) {
36
+ /**
37
+ * The modern MSC4143 format event.
38
+ */
39
+ MembershipKind["RTC"] = "rtc";
40
+ /**
41
+ * The legacy call event type.
42
+ */
43
+ MembershipKind["Session"] = "session";
44
+ return MembershipKind;
45
+ }(MembershipKind || {});
46
+ // TODO: Rename to RtcMembership once we removed the legacy SessionMembership is removed, to avoid confusion.
47
+ export class CallMembership {
48
+ /**
49
+ * Parse the membershipdata from a call membership event.
50
+ * @param matrixEvent The Matrix event to read.
51
+ * @returns MembershipData in either MembershipKind.RTC or MembershipKind.Session format.
52
+ * @throws If the content is neither format.
53
+ */
54
+ static membershipDataFromMatrixEvent(matrixEvent) {
55
+ var sender = matrixEvent.getSender();
56
+ var evType = matrixEvent.getType();
57
+ var data = matrixEvent.getContent();
58
+ if (sender === undefined) throw new Error("matrixEvent is missing sender field");
59
+ try {
60
+ // Event types are strictly checked here.
61
+ if (evType === EventType.RTCMembership && checkRtcMembershipData(data, sender)) {
62
+ return {
63
+ kind: MembershipKind.RTC,
64
+ data
65
+ };
66
+ } else if (evType === EventType.GroupCallMemberPrefix && checkSessionsMembershipData(data)) {
67
+ return {
68
+ kind: MembershipKind.Session,
69
+ data
70
+ };
71
+ } else {
72
+ throw Error("'".concat(evType, " is not a known call membership type"));
68
73
  }
74
+ } catch (ex) {
75
+ if (ex instanceof MatrixRTCMembershipParseError) {
76
+ logger.debug("CallMembership.MatrixRTCMembershipParseError provided invalid data", data);
77
+ }
78
+ throw ex;
69
79
  }
70
80
  }
71
- if (data.versions === undefined || !Array.isArray(data.versions)) {
72
- errors.push(prefix + "versions must be an array");
73
- } else if (!data.versions.every(v => typeof v === "string")) {
74
- errors.push(prefix + "versions must be an array of strings");
75
- }
76
-
77
- // optional fields
78
- if (((_data$sticky_key = data.sticky_key) !== null && _data$sticky_key !== void 0 ? _data$sticky_key : data.msc4354_sticky_key) === undefined) {
79
- errors.push(prefix + "sticky_key or msc4354_sticky_key must be a defined");
80
- }
81
- if (data.sticky_key !== undefined && typeof data.sticky_key !== "string") {
82
- errors.push(prefix + "sticky_key must be a string");
83
- }
84
- if (data.msc4354_sticky_key !== undefined && typeof data.msc4354_sticky_key !== "string") {
85
- errors.push(prefix + "msc4354_sticky_key must be a string");
86
- }
87
- if (data.sticky_key !== undefined && data.msc4354_sticky_key !== undefined && data.sticky_key !== data.msc4354_sticky_key) {
88
- errors.push(prefix + "sticky_key and msc4354_sticky_key must be equal if both are defined");
89
- }
90
- if (data["m.relates_to"] !== undefined) {
91
- var rel = data["m.relates_to"];
92
- if (typeof rel !== "object" || rel === null) {
93
- errors.push(prefix + "m.relates_to must be an object if provided");
94
- } else {
95
- if (typeof rel.event_id !== "string") errors.push(prefix + "m.relates_to.event_id must be a string");
96
- if (rel.rel_type !== "m.reference") errors.push(prefix + "m.relates_to.rel_type must be m.reference");
97
- }
98
- }
99
- return errors.length === 0;
100
- };
101
-
102
- /**
103
- * MSC4143 (MatrixRTC) session membership data.
104
- * Represents the `session` in the memberships section of an m.call.member event as it is on the wire.
105
- **/
106
-
107
- var checkSessionsMembershipData = (data, errors) => {
108
- var _data$focus_active;
109
- var prefix = " - ";
110
- if (typeof data.device_id !== "string") errors.push(prefix + "device_id must be string");
111
- if (typeof data.call_id !== "string") errors.push(prefix + "call_id must be string");
112
- if (typeof data.application !== "string") errors.push(prefix + "application must be a string");
113
- if (typeof ((_data$focus_active = data.focus_active) === null || _data$focus_active === void 0 ? void 0 : _data$focus_active.type) !== "string") errors.push(prefix + "focus_active.type must be a string");
114
- if (data.focus_active === undefined) {
115
- errors.push(prefix + "focus_active has an invalid type");
116
- }
117
- if (data.foci_preferred !== undefined && !(Array.isArray(data.foci_preferred) && data.foci_preferred.every(f => typeof f === "object" && f !== null && typeof f.type === "string"))) {
118
- errors.push(prefix + "foci_preferred must be an array of transport objects");
119
- }
120
- // optional parameters
121
- if (data.created_ts !== undefined && typeof data.created_ts !== "number") {
122
- errors.push(prefix + "created_ts must be number");
123
- }
124
81
 
125
- // application specific data (we first need to check if they exist)
126
- if (data.scope !== undefined && typeof data.scope !== "string") errors.push(prefix + "scope must be string");
127
- if (data["m.call.intent"] !== undefined && typeof data["m.call.intent"] !== "string") {
128
- errors.push(prefix + "m.call.intent must be a string");
82
+ /**
83
+ * Parse the contents of a MatrixEvent and create a CallMembership instance.
84
+ * @param matrixEvent The Matrix event to read.
85
+ */
86
+ static parseFromEvent(matrixEvent) {
87
+ var _this = this;
88
+ return _asyncToGenerator(function* () {
89
+ var membershipData = _this.membershipDataFromMatrixEvent(matrixEvent);
90
+ var rtcBackendIdentity = membershipData.kind === MembershipKind.RTC ? yield computeRtcIdentityRaw(membershipData.data.member.user_id, membershipData.data.member.device_id, membershipData.data.member.id) : "".concat(matrixEvent.getSender(), ":").concat(membershipData.data.device_id);
91
+ return new CallMembership(matrixEvent, membershipData, rtcBackendIdentity);
92
+ })();
129
93
  }
130
- return errors.length === 0;
131
- };
132
- // TODO: Rename to RtcMembership once we removed the legacy SessionMembership from this file.
133
- export class CallMembership {
134
94
  static equal(a, b) {
135
95
  return deepCompare(a === null || a === void 0 ? void 0 : a.membershipData, b === null || b === void 0 ? void 0 : b.membershipData);
136
96
  }
137
- constructor(/** The required parts of the Matrix event that this membership is based on */
138
- matrixEvent,
139
97
  /**
140
- * The type checked membership data {data: (content of the matrix event), kind: (type hint)}
141
- *
142
- */
143
- membershipData,
144
- /**
145
- *
146
- * Anonymized identity to use with the RTC backend.
147
- *
148
- * The rtcBackendIdentity is a hashed version of all the identity parts:
149
- * `sha256(${this.userId}|${this.deviceId}|${this.memberId})`
150
- *
151
- * It is used to anonymize the identity of the user in the RTC backend.
152
- */
153
- rtcBackendIdentity,
154
- /**
155
- * The constructor will automatically create a properly tagged child logger instance.
98
+ * Use `parseFromEvent`.
99
+ * Constructor should only be used by tests.
100
+ * @private
101
+ * @param matrixEvent
102
+ * @param membershipData
103
+ * @param rtcBackendIdentity
156
104
  */
157
- logger) {
105
+ constructor(/** The Matrix event that this membership is based on */
106
+ matrixEvent, membershipData, rtcBackendIdentity) {
107
+ this.matrixEvent = matrixEvent;
158
108
  this.membershipData = membershipData;
159
109
  this.rtcBackendIdentity = rtcBackendIdentity;
160
110
  _defineProperty(this, "logger", void 0);
@@ -162,63 +112,15 @@ export class CallMembership {
162
112
  * To access checked eventId and sender from the matrixEvent.
163
113
  * Class construction will fail if these values cannot get obtained. */
164
114
  _defineProperty(this, "matrixEventData", void 0);
165
- var [eventId, sender, ts] = [matrixEvent.getId(), matrixEvent.getSender(), matrixEvent.getTs()];
115
+ var eventId = matrixEvent.getId();
116
+ var sender = matrixEvent.getSender();
166
117
  if (eventId === undefined) throw new Error("parentEvent is missing eventId field");
167
118
  if (sender === undefined) throw new Error("parentEvent is missing sender field");
119
+ this.logger = logger.getChild("[CallMembership ".concat(sender, ":").concat(this.deviceId, "]"));
168
120
  this.matrixEventData = {
169
121
  eventId,
170
- sender,
171
- ts
122
+ sender
172
123
  };
173
- this.logger = logger === null || logger === void 0 ? void 0 : logger.getChild("[CallMembership ".concat(sender, ":").concat(this.deviceId, "]"));
174
- }
175
-
176
- /**
177
- * sha256(`${this.userId}|${this.deviceId}|${this.memberId}`) for sticky events (kind = rtc)
178
- * `${this.userId}:${this.deviceId}` for state events (kind = session)
179
- */
180
- static computeRtcBackendIdentity(matrixEvent, membershipData) {
181
- return _asyncToGenerator(function* () {
182
- var {
183
- kind,
184
- data
185
- } = membershipData;
186
- switch (kind) {
187
- case "rtc":
188
- {
189
- return CallMembership.computeRtcIdentityRaw(data.member.user_id, data.member.device_id, data.member.id);
190
- }
191
- case "session":
192
- return "".concat(matrixEvent.getSender(), ":").concat(data.device_id);
193
- }
194
- })();
195
- }
196
- static computeRtcIdentityRaw(userId, deviceId, memberId) {
197
- return _asyncToGenerator(function* () {
198
- return encodeUnpaddedBase64(yield sha256("".concat(userId, "|").concat(deviceId, "|").concat(memberId)));
199
- })();
200
- }
201
- static membershipDataFromMatrixEvent(matrixEvent) {
202
- var [eventId, sender, content] = [matrixEvent.getId(), matrixEvent.getSender(), matrixEvent.getContent()];
203
- if (eventId === undefined) throw new Error("parentEvent is missing eventId field");
204
- if (sender === undefined) throw new Error("parentEvent is missing sender field");
205
- var sessionErrors = [];
206
- var rtcErrors = [];
207
- if (checkSessionsMembershipData(content, sessionErrors)) {
208
- return {
209
- kind: "session",
210
- data: content
211
- };
212
- } else if (checkRtcMembershipData(content, rtcErrors, sender)) {
213
- return {
214
- kind: "rtc",
215
- data: content
216
- };
217
- } else {
218
- var details = sessionErrors.length < rtcErrors.length ? "Does not match MSC4143 m.call.member:\n".concat(sessionErrors.join("\n"), "\n\n") : "Does not match MSC4143 m.rtc.member:\n".concat(rtcErrors.join("\n"), "\n\n");
219
- var json = "\nevent:\n" + JSON.stringify(content).replaceAll('"', "'");
220
- throw Error("unknown CallMembership data.\n" + details + json);
221
- }
222
124
  }
223
125
 
224
126
  /** @deprecated use userId instead */
@@ -231,9 +133,9 @@ export class CallMembership {
231
133
  data
232
134
  } = this.membershipData;
233
135
  switch (kind) {
234
- case "rtc":
136
+ case MembershipKind.RTC:
235
137
  return data.member.user_id;
236
- case "session":
138
+ case MembershipKind.Session:
237
139
  default:
238
140
  return this.matrixEventData.sender;
239
141
  }
@@ -254,12 +156,12 @@ export class CallMembership {
254
156
  } = this.membershipData;
255
157
  if (data.application === "m.call") {
256
158
  switch (kind) {
257
- case "rtc":
159
+ case MembershipKind.RTC:
258
160
  return data.slot_id;
259
- case "session":
161
+ case MembershipKind.Session:
260
162
  default:
261
163
  {
262
- var [application, id] = [this.application, data.call_id];
164
+ var [application, id] = [data.application, data.call_id];
263
165
 
264
166
  // INFO_SLOT_ID_LEGACY_CASE (search for all occurances of this INFO to get the full picture)
265
167
  // The spec got changed to use `"ROOM"` instead of `""` empyt string for the implicit default call.
@@ -282,7 +184,7 @@ export class CallMembership {
282
184
  } else {
283
185
  compatibilityAdaptedId = id;
284
186
  }
285
- return slotDescriptionToId({
187
+ return computeSlotId({
286
188
  application,
287
189
  id: compatibilityAdaptedId
288
190
  });
@@ -293,17 +195,14 @@ export class CallMembership {
293
195
  // This is what the function should look like for any other application that did not
294
196
  // go through a `""`=> `"ROOM"` rename
295
197
  switch (kind) {
296
- case "rtc":
198
+ case MembershipKind.RTC:
297
199
  return data.slot_id;
298
- case "session":
200
+ case MembershipKind.Session:
299
201
  default:
300
- {
301
- var [_application, _id] = [this.application, data.call_id];
302
- return slotDescriptionToId({
303
- application: _application,
304
- id: _id
305
- });
306
- }
202
+ return computeSlotId({
203
+ application: data.application,
204
+ id: data.call_id
205
+ });
307
206
  }
308
207
  }
309
208
  get deviceId() {
@@ -312,64 +211,64 @@ export class CallMembership {
312
211
  data
313
212
  } = this.membershipData;
314
213
  switch (kind) {
315
- case "rtc":
214
+ case MembershipKind.RTC:
316
215
  return data.member.device_id;
317
- case "session":
216
+ case MembershipKind.Session:
318
217
  default:
319
218
  return data.device_id;
320
219
  }
321
220
  }
322
221
  get callIntent() {
323
- var {
324
- kind,
325
- data
326
- } = this.membershipData;
327
- switch (kind) {
328
- case "rtc":
329
- {
330
- var _this$logger3;
331
- var intent = data.application["m.call.intent"];
332
- if (typeof intent === "string") {
333
- return intent;
334
- }
335
- (_this$logger3 = this.logger) === null || _this$logger3 === void 0 || _this$logger3.warn("RTC membership has invalid m.call.intent");
336
- return undefined;
337
- }
338
- case "session":
339
- default:
340
- return data["m.call.intent"];
222
+ var intent = this.applicationData["m.call.intent"];
223
+ if (typeof intent === "string") {
224
+ return intent;
341
225
  }
226
+ this.logger.warn("RTC membership has invalid m.call.intent");
227
+ return undefined;
342
228
  }
343
229
 
344
230
  /**
345
231
  * Parsed `slot_id` (format `{application}#{id}`) into its components (application and id).
346
232
  */
347
233
  get slotDescription() {
348
- return slotIdToDescription(this.slotId);
349
- }
350
- get application() {
351
234
  var {
352
235
  kind,
353
236
  data
354
237
  } = this.membershipData;
355
- switch (kind) {
356
- case "rtc":
357
- return data.application.type;
358
- case "session":
359
- default:
360
- return data.application;
238
+ if (kind === MembershipKind.RTC) {
239
+ var id = data.slot_id.slice("".concat(data.application.type, "#").length);
240
+ return {
241
+ application: data.application.type,
242
+ id
243
+ };
361
244
  }
245
+ return slotIdToDescription(this.slotId);
246
+ }
247
+
248
+ /**
249
+ * The application `type`.
250
+ * @deprecated Use @see applicationData
251
+ */
252
+ get application() {
253
+ return this.applicationData.type;
362
254
  }
255
+
256
+ /**
257
+ * Information about the application being used for the RTC session.
258
+ * May contain extra keys specific to the application.
259
+ */
363
260
  get applicationData() {
364
261
  var {
365
262
  kind,
366
263
  data
367
264
  } = this.membershipData;
368
265
  switch (kind) {
369
- case "rtc":
266
+ case MembershipKind.RTC:
370
267
  return data.application;
371
- case "session":
268
+ case MembershipKind.Session:
372
269
  default:
270
+ // SessionData does not have application data as such. We return specific
271
+ // properties in use by other getters in this class, for compatibility.
373
272
  return {
374
273
  "type": data.application,
375
274
  "m.call.intent": data["m.call.intent"]
@@ -384,19 +283,13 @@ export class CallMembership {
384
283
  data
385
284
  } = this.membershipData;
386
285
  switch (kind) {
387
- case "rtc":
286
+ case MembershipKind.RTC:
388
287
  return undefined;
389
- case "session":
288
+ case MembershipKind.Session:
390
289
  default:
391
290
  return data.scope;
392
291
  }
393
292
  }
394
- /**
395
- * @deprecated renamed to `memberId`
396
- */
397
- get membershipID() {
398
- return this.memberId;
399
- }
400
293
 
401
294
  /**
402
295
  * This computes the membership ID for the membership.
@@ -425,13 +318,21 @@ export class CallMembership {
425
318
  case "rtc":
426
319
  return data.member.id;
427
320
  case "session":
428
- default:
429
321
  return (// best case we have a client already publishing the right custom membershipId
430
322
  (_data$membershipID = data.membershipID) !== null && _data$membershipID !== void 0 ? _data$membershipID : // alternativly we use the hard coded jwt id defuatl value (used until version 0.16.0)
431
323
  "".concat(this.matrixEventData.sender, ":").concat(data.device_id)
432
324
  );
325
+ default:
326
+ throw Error("Not possible to get memberID without knowing the membership event kind");
433
327
  }
434
328
  }
329
+
330
+ /**
331
+ * @deprecated renamed to `memberId`
332
+ */
333
+ get membershipID() {
334
+ return this.memberId;
335
+ }
435
336
  createdTs() {
436
337
  var _data$created_ts;
437
338
  var {
@@ -439,12 +340,12 @@ export class CallMembership {
439
340
  data
440
341
  } = this.membershipData;
441
342
  switch (kind) {
442
- case "rtc":
343
+ case MembershipKind.RTC:
443
344
  // TODO we need to read the referenced (relation) event if available to get the real created_ts
444
- return this.matrixEventData.ts;
445
- case "session":
345
+ return this.matrixEvent.getTs();
346
+ case MembershipKind.Session:
446
347
  default:
447
- return (_data$created_ts = data.created_ts) !== null && _data$created_ts !== void 0 ? _data$created_ts : this.matrixEventData.ts;
348
+ return (_data$created_ts = data.created_ts) !== null && _data$created_ts !== void 0 ? _data$created_ts : this.matrixEvent.getTs();
448
349
  }
449
350
  }
450
351
 
@@ -459,9 +360,9 @@ export class CallMembership {
459
360
  data
460
361
  } = this.membershipData;
461
362
  switch (kind) {
462
- case "rtc":
363
+ case MembershipKind.RTC:
463
364
  return undefined;
464
- case "session":
365
+ case MembershipKind.Session:
465
366
  default:
466
367
  // TODO: calculate this from the MatrixRTCSession join configuration directly
467
368
  return this.createdTs() + ((_data$expires = data.expires) !== null && _data$expires !== void 0 ? _data$expires : DEFAULT_EXPIRE_DURATION);
@@ -470,21 +371,22 @@ export class CallMembership {
470
371
 
471
372
  /**
472
373
  * @returns The number of milliseconds until the membership expires or undefined if applicable
374
+ * @deprecated Not used by RTC events.
473
375
  */
474
376
  getMsUntilExpiry() {
475
377
  var {
476
378
  kind
477
379
  } = this.membershipData;
478
- switch (kind) {
479
- case "rtc":
480
- return undefined;
481
- case "session":
482
- default:
380
+ if (kind === MembershipKind.Session) {
381
+ var absExpiry = this.getAbsoluteExpiry();
382
+ if (absExpiry) {
483
383
  // Assume that local clock is sufficiently in sync with other clocks in the distributed system.
484
384
  // We used to try and adjust for the local clock being skewed, but there are cases where this is not accurate.
485
385
  // The current implementation allows for the local clock to be -infinity to +MatrixRTCSession.MEMBERSHIP_EXPIRY_TIME/2
486
- return this.getAbsoluteExpiry() - Date.now();
386
+ return absExpiry - Date.now();
387
+ }
487
388
  }
389
+ return undefined;
488
390
  }
489
391
 
490
392
  /**
@@ -495,9 +397,9 @@ export class CallMembership {
495
397
  kind
496
398
  } = this.membershipData;
497
399
  switch (kind) {
498
- case "rtc":
400
+ case MembershipKind.RTC:
499
401
  return false;
500
- case "session":
402
+ case MembershipKind.Session:
501
403
  default:
502
404
  return this.getMsUntilExpiry() <= 0;
503
405
  }
@@ -526,33 +428,26 @@ export class CallMembership {
526
428
  data
527
429
  } = this.membershipData;
528
430
  switch (kind) {
529
- case "rtc":
431
+ case MembershipKind.RTC:
530
432
  return data.rtc_transports[0];
531
- case "session":
433
+ case MembershipKind.Session:
532
434
  switch (data.focus_active.focus_selection) {
533
- case "multi_sfu":
534
- return data.foci_preferred[0];
535
435
  case "oldest_membership":
536
436
  if (CallMembership.equal(this, oldestMembership)) return data.foci_preferred[0];
537
437
  if (oldestMembership !== undefined) return oldestMembership.getTransport(oldestMembership);
538
438
  break;
439
+ case "multi_sfu":
440
+ return data.foci_preferred[0];
441
+ default:
442
+ // `focus_selection` not understood.
443
+ return undefined;
539
444
  }
445
+ break;
446
+ default:
447
+ return undefined;
540
448
  }
541
- return undefined;
542
449
  }
543
450
 
544
- /**
545
- * The focus_active filed of the session membership (m.call.member).
546
- * @deprecated focus_active is not used and will be removed in future versions.
547
- */
548
- getFocusActive() {
549
- var {
550
- kind,
551
- data
552
- } = this.membershipData;
553
- if (kind === "session") return data.focus_active;
554
- return undefined;
555
- }
556
451
  /**
557
452
  * The value of the `rtc_transports` field for RTC memberships (m.rtc.member).
558
453
  * Or the value of the `foci_preferred` field for legacy session memberships (m.call.member).
@@ -563,15 +458,12 @@ export class CallMembership {
563
458
  data
564
459
  } = this.membershipData;
565
460
  switch (kind) {
566
- case "rtc":
461
+ case MembershipKind.RTC:
567
462
  return data.rtc_transports;
568
- case "session":
463
+ case MembershipKind.Session:
569
464
  default:
570
465
  return data.foci_preferred;
571
466
  }
572
467
  }
573
- get kind() {
574
- return this.membershipData.kind;
575
- }
576
468
  }
577
469
  //# sourceMappingURL=CallMembership.js.map