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.
- package/CHANGELOG.md +8 -0
- package/lib/@types/event.d.ts +1 -1
- package/lib/@types/event.d.ts.map +1 -1
- package/lib/@types/event.js +1 -1
- package/lib/@types/event.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +250 -246
- package/lib/client.js.map +1 -1
- package/lib/crypto-api/index.d.ts +13 -2
- package/lib/crypto-api/index.d.ts.map +1 -1
- package/lib/crypto-api/index.js +11 -0
- package/lib/crypto-api/index.js.map +1 -1
- package/lib/logger.d.ts +5 -5
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js.map +1 -1
- package/lib/matrixrtc/CallMembership.d.ts +49 -145
- package/lib/matrixrtc/CallMembership.d.ts.map +1 -1
- package/lib/matrixrtc/CallMembership.js +157 -265
- package/lib/matrixrtc/CallMembership.js.map +1 -1
- package/lib/matrixrtc/EncryptionManager.d.ts +1 -85
- package/lib/matrixrtc/EncryptionManager.d.ts.map +1 -1
- package/lib/matrixrtc/EncryptionManager.js +0 -317
- package/lib/matrixrtc/EncryptionManager.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts +18 -22
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js +48 -76
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +2 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSessionManager.js +3 -2
- package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
- package/lib/matrixrtc/MembershipManager.d.ts +10 -4
- package/lib/matrixrtc/MembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/MembershipManager.js +10 -4
- package/lib/matrixrtc/MembershipManager.js.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.d.ts +6 -7
- package/lib/matrixrtc/RTCEncryptionManager.d.ts.map +1 -1
- package/lib/matrixrtc/RTCEncryptionManager.js +4 -7
- package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
- package/lib/matrixrtc/index.d.ts +1 -0
- package/lib/matrixrtc/index.d.ts.map +1 -1
- package/lib/matrixrtc/index.js.map +1 -1
- package/lib/matrixrtc/membershipData/common.d.ts +8 -0
- package/lib/matrixrtc/membershipData/common.d.ts.map +1 -0
- package/lib/matrixrtc/membershipData/common.js +26 -0
- package/lib/matrixrtc/membershipData/common.js.map +1 -0
- package/lib/matrixrtc/membershipData/index.d.ts +4 -0
- package/lib/matrixrtc/membershipData/index.d.ts.map +1 -0
- package/lib/matrixrtc/membershipData/index.js +20 -0
- package/lib/matrixrtc/membershipData/index.js.map +1 -0
- package/lib/matrixrtc/membershipData/rtc.d.ts +33 -0
- package/lib/matrixrtc/membershipData/rtc.d.ts.map +1 -0
- package/lib/matrixrtc/membershipData/rtc.js +137 -0
- package/lib/matrixrtc/membershipData/rtc.js.map +1 -0
- package/lib/matrixrtc/membershipData/session.d.ts +77 -0
- package/lib/matrixrtc/membershipData/session.d.ts.map +1 -0
- package/lib/matrixrtc/membershipData/session.js +62 -0
- package/lib/matrixrtc/membershipData/session.js.map +1 -0
- package/lib/matrixrtc/types.d.ts +23 -0
- package/lib/matrixrtc/types.d.ts.map +1 -1
- package/lib/matrixrtc/types.js +9 -1
- package/lib/matrixrtc/types.js.map +1 -1
- package/lib/matrixrtc/utils.d.ts +11 -1
- package/lib/matrixrtc/utils.d.ts.map +1 -1
- package/lib/matrixrtc/utils.js +24 -1
- package/lib/matrixrtc/utils.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +2 -2
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/package.json +5 -7
- package/src/@types/event.ts +2 -2
- package/src/client.ts +5 -3
- package/src/crypto-api/index.ts +17 -2
- package/src/logger.ts +5 -5
- package/src/matrixrtc/CallMembership.ts +159 -373
- package/src/matrixrtc/EncryptionManager.ts +1 -417
- package/src/matrixrtc/MatrixRTCSession.ts +82 -122
- package/src/matrixrtc/MatrixRTCSessionManager.ts +5 -3
- package/src/matrixrtc/MembershipManager.ts +14 -17
- package/src/matrixrtc/RTCEncryptionManager.ts +7 -10
- package/src/matrixrtc/index.ts +1 -0
- package/src/matrixrtc/membershipData/common.ts +27 -0
- package/src/matrixrtc/membershipData/index.ts +19 -0
- package/src/matrixrtc/membershipData/rtc.ts +156 -0
- package/src/matrixrtc/membershipData/session.ts +146 -0
- package/src/matrixrtc/types.ts +27 -1
- package/src/matrixrtc/utils.ts +24 -2
- package/src/rust-crypto/rust-crypto.ts +4 -1
- package/lib/matrixrtc/RoomKeyTransport.d.ts +0 -25
- package/lib/matrixrtc/RoomKeyTransport.d.ts.map +0 -1
- package/lib/matrixrtc/RoomKeyTransport.js +0 -152
- package/lib/matrixrtc/RoomKeyTransport.js.map +0 -1
- 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 {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
*
|
|
141
|
-
*
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
136
|
+
case MembershipKind.RTC:
|
|
235
137
|
return data.member.user_id;
|
|
236
|
-
case
|
|
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
|
|
159
|
+
case MembershipKind.RTC:
|
|
258
160
|
return data.slot_id;
|
|
259
|
-
case
|
|
161
|
+
case MembershipKind.Session:
|
|
260
162
|
default:
|
|
261
163
|
{
|
|
262
|
-
var [application, 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
|
|
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
|
|
198
|
+
case MembershipKind.RTC:
|
|
297
199
|
return data.slot_id;
|
|
298
|
-
case
|
|
200
|
+
case MembershipKind.Session:
|
|
299
201
|
default:
|
|
300
|
-
{
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
|
214
|
+
case MembershipKind.RTC:
|
|
316
215
|
return data.member.device_id;
|
|
317
|
-
case
|
|
216
|
+
case MembershipKind.Session:
|
|
318
217
|
default:
|
|
319
218
|
return data.device_id;
|
|
320
219
|
}
|
|
321
220
|
}
|
|
322
221
|
get callIntent() {
|
|
323
|
-
var
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
|
266
|
+
case MembershipKind.RTC:
|
|
370
267
|
return data.application;
|
|
371
|
-
case
|
|
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
|
|
286
|
+
case MembershipKind.RTC:
|
|
388
287
|
return undefined;
|
|
389
|
-
case
|
|
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
|
|
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.
|
|
445
|
-
case
|
|
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.
|
|
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
|
|
363
|
+
case MembershipKind.RTC:
|
|
463
364
|
return undefined;
|
|
464
|
-
case
|
|
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
|
-
|
|
479
|
-
|
|
480
|
-
|
|
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
|
|
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
|
|
400
|
+
case MembershipKind.RTC:
|
|
499
401
|
return false;
|
|
500
|
-
case
|
|
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
|
|
431
|
+
case MembershipKind.RTC:
|
|
530
432
|
return data.rtc_transports[0];
|
|
531
|
-
case
|
|
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
|
|
461
|
+
case MembershipKind.RTC:
|
|
567
462
|
return data.rtc_transports;
|
|
568
|
-
case
|
|
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
|