matrix-js-sdk 37.2.0 → 37.3.0-rc.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/git-revision.txt +1 -1
- package/lib/client.d.ts +8 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +11 -3
- package/lib/client.js.map +1 -1
- package/lib/common-crypto/CryptoBackend.d.ts +8 -0
- package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
- package/lib/common-crypto/CryptoBackend.js.map +1 -1
- package/lib/http-api/errors.d.ts +8 -0
- package/lib/http-api/errors.d.ts.map +1 -1
- package/lib/http-api/errors.js +14 -0
- package/lib/http-api/errors.js.map +1 -1
- package/lib/http-api/fetch.d.ts.map +1 -1
- package/lib/http-api/fetch.js +3 -3
- package/lib/http-api/fetch.js.map +1 -1
- package/lib/matrixrtc/LegacyMembershipManager.d.ts +9 -1
- package/lib/matrixrtc/LegacyMembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/LegacyMembershipManager.js +20 -0
- package/lib/matrixrtc/LegacyMembershipManager.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/NewMembershipManager.d.ts +7 -58
- package/lib/matrixrtc/NewMembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/NewMembershipManager.js +130 -137
- package/lib/matrixrtc/NewMembershipManager.js.map +1 -1
- package/lib/matrixrtc/NewMembershipManagerActionScheduler.js +3 -3
- package/lib/matrixrtc/NewMembershipManagerActionScheduler.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 +1 -0
- package/lib/matrixrtc/index.js.map +1 -1
- package/lib/matrixrtc/types.d.ts +77 -1
- package/lib/matrixrtc/types.d.ts.map +1 -1
- package/lib/matrixrtc/types.js +40 -1
- package/lib/matrixrtc/types.js.map +1 -1
- package/lib/models/room-summary.d.ts +30 -0
- package/lib/models/room-summary.d.ts.map +1 -1
- package/lib/models/room-summary.js +11 -0
- package/lib/models/room-summary.js.map +1 -1
- package/lib/models/room.d.ts +37 -1
- package/lib/models/room.d.ts.map +1 -1
- package/lib/models/room.js +133 -28
- package/lib/models/room.js.map +1 -1
- package/lib/oidc/tokenRefresher.d.ts.map +1 -1
- package/lib/oidc/tokenRefresher.js +8 -1
- package/lib/oidc/tokenRefresher.js.map +1 -1
- package/lib/pushprocessor.d.ts +10 -1
- package/lib/pushprocessor.d.ts.map +1 -1
- package/lib/pushprocessor.js +24 -9
- package/lib/pushprocessor.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js +6 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts +4 -1
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +55 -46
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/sliding-sync-sdk.d.ts.map +1 -1
- package/lib/sliding-sync-sdk.js +86 -75
- package/lib/sliding-sync-sdk.js.map +1 -1
- package/lib/sliding-sync.d.ts +23 -60
- package/lib/sliding-sync.d.ts.map +1 -1
- package/lib/sliding-sync.js +62 -321
- package/lib/sliding-sync.js.map +1 -1
- package/package.json +6 -6
- package/src/client.ts +12 -5
- package/src/common-crypto/CryptoBackend.ts +9 -0
- package/src/http-api/errors.ts +14 -0
- package/src/http-api/fetch.ts +3 -4
- package/src/matrixrtc/LegacyMembershipManager.ts +27 -1
- package/src/matrixrtc/MatrixRTCSession.ts +2 -1
- package/src/matrixrtc/NewMembershipManager.ts +120 -165
- package/src/matrixrtc/NewMembershipManagerActionScheduler.ts +3 -3
- package/src/matrixrtc/index.ts +1 -0
- package/src/matrixrtc/types.ts +84 -1
- package/src/models/room-summary.ts +31 -0
- package/src/models/room.ts +133 -23
- package/src/oidc/tokenRefresher.ts +8 -2
- package/src/pushprocessor.ts +25 -16
- package/src/rust-crypto/OutgoingRequestProcessor.ts +6 -0
- package/src/rust-crypto/rust-crypto.ts +7 -1
- package/src/sliding-sync-sdk.ts +28 -28
- package/src/sliding-sync.ts +38 -329
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegacyMembershipManager.js","names":["EventType","UpdateDelayedEventAction","HTTPError","MatrixError","logger","EventTimeline","sleep","DEFAULT_EXPIRE_DURATION","isLivekitFocusActive","LegacyMembershipManager","callMemberEventRetryDelayMinimum","_this$joinConfig$call","_this$joinConfig","joinConfig","membershipExpiryTimeout","_this$joinConfig$memb","_this$joinConfig2","membershipServerSideExpiryTimeout","_ref","_this$membershipServe","_this$joinConfig3","membershipServerSideExpiryTimeoutOverride","membershipKeepAlivePeriod","_this$joinConfig$memb2","_this$joinConfig4","callMemberEventRetryJitter","_this$joinConfig$call2","_this$joinConfig5","constructor","room","client","getOldestMembership","_this","_defineProperty","_asyncToGenerator","updateCallMembershipRunning","needCallMembershipUpdate","updateCallMembershipEvent","knownDisconnectDelayId","disconnectDelayId","resendIfRateLimited","_unstable_updateDelayedEvent","Restart","scheduleDelayDisconnection","e","error","isJoined","relativeExpiry","undefined","join","fociPreferred","fociActive","ownFocusActive","ownFociPreferred","triggerCallMembershipEventUpdate","leave","_arguments","arguments","_this2","timeout","length","memberEventTimeout","clearTimeout","raceResult","Promise","race","onRTCSessionMemberUpdate","memberships","_this3","isMyMembership","m","sender","getUserId","deviceId","getDeviceId","some","warn","getActiveFocus","focus_selection","oldestMembership","getPreferredFoci","makeNewMembership","makeMyMembership","_this$ownFociPreferre","call_id","scope","application","device_id","expires","focus_active","type","foci_preferred","_this4","roomState","getLiveTimeline","getState","FORWARDS","Error","roomId","localUserId","localDeviceId","newContent","stateKey","makeMembershipStateKey","prepareDelayedDisconnection","_ref4","res","_unstable_sendDelayedStateEvent","delay","GroupCallMemberPrefix","delay_id","errcode","data","maxDelayAllowed","apply","sendStateEvent","sentDelayedDisconnect","Send","info","resendDelay","Math","random","concat","setTimeout","delayDisconnection","exec","getVersion","_x","_resendIfRateLimited","func","numRetriesAllowed","isRateLimitError","defaultMs","_e$getRetryAfterMs","getRetryAfterMs"],"sources":["../../src/matrixrtc/LegacyMembershipManager.ts"],"sourcesContent":["/*\nCopyright 2025 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { EventType } from \"../@types/event.ts\";\nimport { UpdateDelayedEventAction } from \"../@types/requests.ts\";\nimport type { MatrixClient } from \"../client.ts\";\nimport { HTTPError, MatrixError } from \"../http-api/errors.ts\";\nimport { logger } from \"../logger.ts\";\nimport { EventTimeline } from \"../models/event-timeline.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { sleep } from \"../utils.ts\";\nimport { type CallMembership, DEFAULT_EXPIRE_DURATION, type SessionMembershipData } from \"./CallMembership.ts\";\nimport { type Focus } from \"./focus.ts\";\nimport { isLivekitFocusActive } from \"./LivekitFocus.ts\";\nimport { type MembershipConfig } from \"./MatrixRTCSession.ts\";\nimport { type EmptyObject } from \"../@types/common.ts\";\nimport { type IMembershipManager } from \"./NewMembershipManager.ts\";\n\n/**\n * This internal class is used by the MatrixRTCSession to manage the local user's own membership of the session.\n *\n * Its responsibitiy is to manage the locals user membership:\n * - send that sate event\n * - send the delayed leave event\n * - update the delayed leave event while connected\n * - update the state event when it times out (for calls longer than membershipExpiryTimeout ~ 4h)\n *\n * It is possible to test this class on its own. The api surface (to use for tests) is\n * defined in `MembershipManagerInterface`.\n *\n * It is recommended to only use this interface for testing to allow replacing this class.\n *\n * @internal\n * @deprecated Use {@link MembershipManager} instead\n */\nexport class LegacyMembershipManager implements IMembershipManager {\n private relativeExpiry: number | undefined;\n\n private memberEventTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * This is a Foci array that contains the Focus objects this user is aware of and proposes to use.\n */\n private ownFociPreferred?: Focus[];\n /**\n * This is a Focus with the specified fields for an ActiveFocus (e.g. LivekitFocusActive for type=\"livekit\")\n */\n private ownFocusActive?: Focus;\n\n private updateCallMembershipRunning = false;\n private needCallMembershipUpdate = false;\n /**\n * If the server disallows the configured {@link membershipServerSideExpiryTimeout},\n * this stores a delay that the server does allow.\n */\n private membershipServerSideExpiryTimeoutOverride?: number;\n private disconnectDelayId: string | undefined;\n\n private get callMemberEventRetryDelayMinimum(): number {\n return this.joinConfig?.callMemberEventRetryDelayMinimum ?? 3_000;\n }\n private get membershipExpiryTimeout(): number {\n return this.joinConfig?.membershipExpiryTimeout ?? DEFAULT_EXPIRE_DURATION;\n }\n private get membershipServerSideExpiryTimeout(): number {\n return (\n this.membershipServerSideExpiryTimeoutOverride ??\n this.joinConfig?.membershipServerSideExpiryTimeout ??\n 8_000\n );\n }\n private get membershipKeepAlivePeriod(): number {\n return this.joinConfig?.membershipKeepAlivePeriod ?? 5_000;\n }\n private get callMemberEventRetryJitter(): number {\n return this.joinConfig?.callMemberEventRetryJitter ?? 2_000;\n }\n\n public constructor(\n private joinConfig: MembershipConfig | undefined,\n private room: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"getVersion\">,\n private client: Pick<\n MatrixClient,\n | \"getUserId\"\n | \"getDeviceId\"\n | \"sendStateEvent\"\n | \"_unstable_sendDelayedStateEvent\"\n | \"_unstable_updateDelayedEvent\"\n >,\n private getOldestMembership: () => CallMembership | undefined,\n ) {}\n\n public isJoined(): boolean {\n return this.relativeExpiry !== undefined;\n }\n\n public join(fociPreferred: Focus[], fociActive?: Focus): void {\n this.ownFocusActive = fociActive;\n this.ownFociPreferred = fociPreferred;\n this.relativeExpiry = this.membershipExpiryTimeout;\n // We don't wait for this, mostly because it may fail and schedule a retry, so this\n // function returning doesn't really mean anything at all.\n void this.triggerCallMembershipEventUpdate();\n }\n\n public async leave(timeout: number | undefined = undefined): Promise<boolean> {\n this.relativeExpiry = undefined;\n this.ownFocusActive = undefined;\n\n if (this.memberEventTimeout) {\n clearTimeout(this.memberEventTimeout);\n this.memberEventTimeout = undefined;\n }\n if (timeout) {\n // The sleep promise returns the string 'timeout' and the membership update void\n // A success implies that the membership update was quicker then the timeout.\n const raceResult = await Promise.race([this.triggerCallMembershipEventUpdate(), sleep(timeout, \"timeout\")]);\n return raceResult !== \"timeout\";\n } else {\n await this.triggerCallMembershipEventUpdate();\n return true;\n }\n }\n\n public async onRTCSessionMemberUpdate(memberships: CallMembership[]): Promise<void> {\n const isMyMembership = (m: CallMembership): boolean =>\n m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();\n\n if (this.isJoined() && !memberships.some(isMyMembership)) {\n logger.warn(\"Missing own membership: force re-join\");\n // TODO: Should this be awaited? And is there anything to tell the focus?\n return this.triggerCallMembershipEventUpdate();\n }\n }\n\n public getActiveFocus(): Focus | undefined {\n if (this.ownFocusActive) {\n // A livekit active focus\n if (isLivekitFocusActive(this.ownFocusActive)) {\n if (this.ownFocusActive.focus_selection === \"oldest_membership\") {\n const oldestMembership = this.getOldestMembership();\n return oldestMembership?.getPreferredFoci()[0];\n }\n } else {\n logger.warn(\"Unknown own ActiveFocus type. This makes it impossible to connect to an SFU.\");\n }\n } else {\n // We do not understand the membership format (could be legacy). We default to oldestMembership\n // Once there are other methods this is a hard error!\n const oldestMembership = this.getOldestMembership();\n return oldestMembership?.getPreferredFoci()[0];\n }\n }\n\n private triggerCallMembershipEventUpdate = async (): Promise<void> => {\n // TODO: Should this await on a shared promise?\n if (this.updateCallMembershipRunning) {\n this.needCallMembershipUpdate = true;\n return;\n }\n\n this.updateCallMembershipRunning = true;\n try {\n // if anything triggers an update while the update is running, do another update afterwards\n do {\n this.needCallMembershipUpdate = false;\n await this.updateCallMembershipEvent();\n } while (this.needCallMembershipUpdate);\n } finally {\n this.updateCallMembershipRunning = false;\n }\n };\n private makeNewMembership(deviceId: string): SessionMembershipData | EmptyObject {\n // If we're joined, add our own\n if (this.isJoined()) {\n return this.makeMyMembership(deviceId);\n }\n return {};\n }\n\n /**\n * Constructs our own membership\n */\n private makeMyMembership(deviceId: string): SessionMembershipData {\n return {\n call_id: \"\",\n scope: \"m.room\",\n application: \"m.call\",\n device_id: deviceId,\n expires: this.relativeExpiry,\n focus_active: { type: \"livekit\", focus_selection: \"oldest_membership\" },\n foci_preferred: this.ownFociPreferred ?? [],\n };\n }\n\n private async updateCallMembershipEvent(): Promise<void> {\n if (this.memberEventTimeout) {\n clearTimeout(this.memberEventTimeout);\n this.memberEventTimeout = undefined;\n }\n\n const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);\n if (!roomState) throw new Error(\"Couldn't get room state for room \" + this.room.roomId);\n\n const localUserId = this.client.getUserId();\n const localDeviceId = this.client.getDeviceId();\n if (!localUserId || !localDeviceId) throw new Error(\"User ID or device ID was null!\");\n\n let newContent: EmptyObject | SessionMembershipData = {};\n // TODO: add back expiary logic to non-legacy events\n // previously we checked here if the event is timed out and scheduled a check if not.\n // maybe there is a better way.\n newContent = this.makeNewMembership(localDeviceId);\n\n try {\n if (this.isJoined()) {\n const stateKey = this.makeMembershipStateKey(localUserId, localDeviceId);\n const prepareDelayedDisconnection = async (): Promise<void> => {\n try {\n const res = await resendIfRateLimited(() =>\n this.client._unstable_sendDelayedStateEvent(\n this.room.roomId,\n {\n delay: this.membershipServerSideExpiryTimeout,\n },\n EventType.GroupCallMemberPrefix,\n {}, // leave event\n stateKey,\n ),\n );\n this.disconnectDelayId = res.delay_id;\n } catch (e) {\n if (\n e instanceof MatrixError &&\n e.errcode === \"M_UNKNOWN\" &&\n e.data[\"org.matrix.msc4140.errcode\"] === \"M_MAX_DELAY_EXCEEDED\"\n ) {\n const maxDelayAllowed = e.data[\"org.matrix.msc4140.max_delay\"];\n if (\n typeof maxDelayAllowed === \"number\" &&\n this.membershipServerSideExpiryTimeout > maxDelayAllowed\n ) {\n this.membershipServerSideExpiryTimeoutOverride = maxDelayAllowed;\n return prepareDelayedDisconnection();\n }\n }\n logger.error(\"Failed to prepare delayed disconnection event:\", e);\n }\n };\n\n await prepareDelayedDisconnection();\n // Send join event _after_ preparing the delayed disconnection event\n await resendIfRateLimited(() =>\n this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, newContent, stateKey),\n );\n // If sending state cancels your own delayed state, prepare another delayed state\n // TODO: Remove this once MSC4140 is stable & doesn't cancel own delayed state\n if (this.disconnectDelayId !== undefined) {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(\n knownDisconnectDelayId,\n UpdateDelayedEventAction.Restart,\n ),\n );\n } catch (e) {\n if (e instanceof MatrixError && e.errcode === \"M_NOT_FOUND\") {\n // If we get a M_NOT_FOUND we prepare a new delayed event.\n // In other error cases we do not want to prepare anything since we do not have the guarantee, that the\n // future is not still running.\n logger.warn(\"Failed to update delayed disconnection event, prepare it again:\", e);\n this.disconnectDelayId = undefined;\n await prepareDelayedDisconnection();\n }\n }\n }\n if (this.disconnectDelayId !== undefined) {\n this.scheduleDelayDisconnection();\n }\n // TODO throw or log an error if this.disconnectDelayId === undefined\n } else {\n // Not joined\n let sentDelayedDisconnect = false;\n if (this.disconnectDelayId !== undefined) {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(\n knownDisconnectDelayId,\n UpdateDelayedEventAction.Send,\n ),\n );\n sentDelayedDisconnect = true;\n } catch (e) {\n logger.error(\"Failed to send our delayed disconnection event:\", e);\n }\n this.disconnectDelayId = undefined;\n }\n if (!sentDelayedDisconnect) {\n await resendIfRateLimited(() =>\n this.client.sendStateEvent(\n this.room.roomId,\n EventType.GroupCallMemberPrefix,\n {},\n this.makeMembershipStateKey(localUserId, localDeviceId),\n ),\n );\n }\n }\n logger.info(\"Sent updated call member event.\");\n } catch (e) {\n const resendDelay = this.callMemberEventRetryDelayMinimum + Math.random() * this.callMemberEventRetryJitter;\n logger.warn(`Failed to send call member event (retrying in ${resendDelay}): ${e}`);\n await sleep(resendDelay);\n await this.triggerCallMembershipEventUpdate();\n }\n }\n\n private scheduleDelayDisconnection(): void {\n this.memberEventTimeout = setTimeout(() => void this.delayDisconnection(), this.membershipKeepAlivePeriod);\n }\n\n private readonly delayDisconnection = async (): Promise<void> => {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId!;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(knownDisconnectDelayId, UpdateDelayedEventAction.Restart),\n );\n this.scheduleDelayDisconnection();\n } catch (e) {\n logger.error(\"Failed to delay our disconnection event:\", e);\n }\n };\n\n private makeMembershipStateKey(localUserId: string, localDeviceId: string): string {\n const stateKey = `${localUserId}_${localDeviceId}`;\n if (/^org\\.matrix\\.msc(3757|3779)\\b/.exec(this.room.getVersion())) {\n return stateKey;\n } else {\n return `_${stateKey}`;\n }\n }\n}\n\nasync function resendIfRateLimited<T>(func: () => Promise<T>, numRetriesAllowed: number = 1): Promise<T> {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n return await func();\n } catch (e) {\n if (numRetriesAllowed > 0 && e instanceof HTTPError && e.isRateLimitError()) {\n numRetriesAllowed--;\n let resendDelay: number;\n const defaultMs = 5000;\n try {\n resendDelay = e.getRetryAfterMs() ?? defaultMs;\n logger.info(`Rate limited by server, retrying in ${resendDelay}ms`);\n } catch (e) {\n logger.warn(\n `Error while retrieving a rate-limit retry delay, retrying after default delay of ${defaultMs}`,\n e,\n );\n resendDelay = defaultMs;\n }\n await sleep(resendDelay);\n } else {\n throw e;\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LegacyMembershipManager.js","names":["EventType","UpdateDelayedEventAction","HTTPError","MatrixError","logger","EventTimeline","sleep","DEFAULT_EXPIRE_DURATION","isLivekitFocusActive","Status","LegacyMembershipManager","callMemberEventRetryDelayMinimum","_this$joinConfig$call","_this$joinConfig","joinConfig","membershipExpiryTimeout","_this$joinConfig$memb","_this$joinConfig2","membershipServerSideExpiryTimeout","_ref","_this$membershipServe","_this$joinConfig3","membershipServerSideExpiryTimeoutOverride","membershipKeepAlivePeriod","_this$joinConfig$memb2","_this$joinConfig4","callMemberEventRetryJitter","_this$joinConfig$call2","_this$joinConfig5","constructor","room","client","getOldestMembership","_this","_defineProperty","_asyncToGenerator","updateCallMembershipRunning","needCallMembershipUpdate","updateCallMembershipEvent","knownDisconnectDelayId","disconnectDelayId","resendIfRateLimited","_unstable_updateDelayedEvent","Restart","scheduleDelayDisconnection","e","error","off","event","listener","on","isJoined","relativeExpiry","undefined","isActivated","status","Unknown","join","fociPreferred","fociActive","ownFocusActive","ownFociPreferred","triggerCallMembershipEventUpdate","leave","_arguments","arguments","_this2","timeout","length","memberEventTimeout","clearTimeout","raceResult","Promise","race","onRTCSessionMemberUpdate","memberships","_this3","isMyMembership","m","sender","getUserId","deviceId","getDeviceId","some","warn","getActiveFocus","focus_selection","oldestMembership","getPreferredFoci","makeNewMembership","makeMyMembership","_this$ownFociPreferre","call_id","scope","application","device_id","expires","focus_active","type","foci_preferred","_this4","roomState","getLiveTimeline","getState","FORWARDS","Error","roomId","localUserId","localDeviceId","newContent","stateKey","makeMembershipStateKey","prepareDelayedDisconnection","_ref4","res","_unstable_sendDelayedStateEvent","delay","GroupCallMemberPrefix","delay_id","errcode","data","maxDelayAllowed","apply","sendStateEvent","sentDelayedDisconnect","Send","info","resendDelay","Math","random","concat","setTimeout","delayDisconnection","exec","getVersion","_x","_resendIfRateLimited","func","numRetriesAllowed","isRateLimitError","defaultMs","_e$getRetryAfterMs","getRetryAfterMs"],"sources":["../../src/matrixrtc/LegacyMembershipManager.ts"],"sourcesContent":["/*\nCopyright 2025 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { EventType } from \"../@types/event.ts\";\nimport { UpdateDelayedEventAction } from \"../@types/requests.ts\";\nimport type { MatrixClient } from \"../client.ts\";\nimport { HTTPError, MatrixError } from \"../http-api/errors.ts\";\nimport { logger } from \"../logger.ts\";\nimport { EventTimeline } from \"../models/event-timeline.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { sleep } from \"../utils.ts\";\nimport { type CallMembership, DEFAULT_EXPIRE_DURATION, type SessionMembershipData } from \"./CallMembership.ts\";\nimport { type Focus } from \"./focus.ts\";\nimport { isLivekitFocusActive } from \"./LivekitFocus.ts\";\nimport { type MembershipConfig } from \"./MatrixRTCSession.ts\";\nimport { type EmptyObject } from \"../@types/common.ts\";\nimport { type IMembershipManager, type MembershipManagerEvent, Status } from \"./types.ts\";\n\n/**\n * This internal class is used by the MatrixRTCSession to manage the local user's own membership of the session.\n *\n * Its responsibitiy is to manage the locals user membership:\n * - send that sate event\n * - send the delayed leave event\n * - update the delayed leave event while connected\n * - update the state event when it times out (for calls longer than membershipExpiryTimeout ~ 4h)\n *\n * It is possible to test this class on its own. The api surface (to use for tests) is\n * defined in `MembershipManagerInterface`.\n *\n * It is recommended to only use this interface for testing to allow replacing this class.\n *\n * @internal\n * @deprecated Use {@link MembershipManager} instead\n */\nexport class LegacyMembershipManager implements IMembershipManager {\n private relativeExpiry: number | undefined;\n\n private memberEventTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * This is a Foci array that contains the Focus objects this user is aware of and proposes to use.\n */\n private ownFociPreferred?: Focus[];\n /**\n * This is a Focus with the specified fields for an ActiveFocus (e.g. LivekitFocusActive for type=\"livekit\")\n */\n private ownFocusActive?: Focus;\n\n private updateCallMembershipRunning = false;\n private needCallMembershipUpdate = false;\n /**\n * If the server disallows the configured {@link membershipServerSideExpiryTimeout},\n * this stores a delay that the server does allow.\n */\n private membershipServerSideExpiryTimeoutOverride?: number;\n private disconnectDelayId: string | undefined;\n\n private get callMemberEventRetryDelayMinimum(): number {\n return this.joinConfig?.callMemberEventRetryDelayMinimum ?? 3_000;\n }\n private get membershipExpiryTimeout(): number {\n return this.joinConfig?.membershipExpiryTimeout ?? DEFAULT_EXPIRE_DURATION;\n }\n private get membershipServerSideExpiryTimeout(): number {\n return (\n this.membershipServerSideExpiryTimeoutOverride ??\n this.joinConfig?.membershipServerSideExpiryTimeout ??\n 8_000\n );\n }\n private get membershipKeepAlivePeriod(): number {\n return this.joinConfig?.membershipKeepAlivePeriod ?? 5_000;\n }\n private get callMemberEventRetryJitter(): number {\n return this.joinConfig?.callMemberEventRetryJitter ?? 2_000;\n }\n\n public constructor(\n private joinConfig: MembershipConfig | undefined,\n private room: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"getVersion\">,\n private client: Pick<\n MatrixClient,\n | \"getUserId\"\n | \"getDeviceId\"\n | \"sendStateEvent\"\n | \"_unstable_sendDelayedStateEvent\"\n | \"_unstable_updateDelayedEvent\"\n >,\n private getOldestMembership: () => CallMembership | undefined,\n ) {}\n\n public off(\n event: MembershipManagerEvent.StatusChanged,\n listener: (oldStatus: Status, newStatus: Status) => void,\n ): this {\n logger.error(\"off is not implemented on LegacyMembershipManager\");\n return this;\n }\n\n public on(\n event: MembershipManagerEvent.StatusChanged,\n listener: (oldStatus: Status, newStatus: Status) => void,\n ): this {\n logger.error(\"on is not implemented on LegacyMembershipManager\");\n return this;\n }\n\n public isJoined(): boolean {\n return this.relativeExpiry !== undefined;\n }\n public isActivated(): boolean {\n return this.isJoined();\n }\n /**\n * Unimplemented\n * @returns Status.Unknown\n */\n public get status(): Status {\n return Status.Unknown;\n }\n\n public join(fociPreferred: Focus[], fociActive?: Focus): void {\n this.ownFocusActive = fociActive;\n this.ownFociPreferred = fociPreferred;\n this.relativeExpiry = this.membershipExpiryTimeout;\n // We don't wait for this, mostly because it may fail and schedule a retry, so this\n // function returning doesn't really mean anything at all.\n void this.triggerCallMembershipEventUpdate();\n }\n\n public async leave(timeout: number | undefined = undefined): Promise<boolean> {\n this.relativeExpiry = undefined;\n this.ownFocusActive = undefined;\n\n if (this.memberEventTimeout) {\n clearTimeout(this.memberEventTimeout);\n this.memberEventTimeout = undefined;\n }\n if (timeout) {\n // The sleep promise returns the string 'timeout' and the membership update void\n // A success implies that the membership update was quicker then the timeout.\n const raceResult = await Promise.race([this.triggerCallMembershipEventUpdate(), sleep(timeout, \"timeout\")]);\n return raceResult !== \"timeout\";\n } else {\n await this.triggerCallMembershipEventUpdate();\n return true;\n }\n }\n\n public async onRTCSessionMemberUpdate(memberships: CallMembership[]): Promise<void> {\n const isMyMembership = (m: CallMembership): boolean =>\n m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();\n\n if (this.isJoined() && !memberships.some(isMyMembership)) {\n logger.warn(\"Missing own membership: force re-join\");\n // TODO: Should this be awaited? And is there anything to tell the focus?\n return this.triggerCallMembershipEventUpdate();\n }\n }\n\n public getActiveFocus(): Focus | undefined {\n if (this.ownFocusActive) {\n // A livekit active focus\n if (isLivekitFocusActive(this.ownFocusActive)) {\n if (this.ownFocusActive.focus_selection === \"oldest_membership\") {\n const oldestMembership = this.getOldestMembership();\n return oldestMembership?.getPreferredFoci()[0];\n }\n } else {\n logger.warn(\"Unknown own ActiveFocus type. This makes it impossible to connect to an SFU.\");\n }\n } else {\n // We do not understand the membership format (could be legacy). We default to oldestMembership\n // Once there are other methods this is a hard error!\n const oldestMembership = this.getOldestMembership();\n return oldestMembership?.getPreferredFoci()[0];\n }\n }\n\n private triggerCallMembershipEventUpdate = async (): Promise<void> => {\n // TODO: Should this await on a shared promise?\n if (this.updateCallMembershipRunning) {\n this.needCallMembershipUpdate = true;\n return;\n }\n\n this.updateCallMembershipRunning = true;\n try {\n // if anything triggers an update while the update is running, do another update afterwards\n do {\n this.needCallMembershipUpdate = false;\n await this.updateCallMembershipEvent();\n } while (this.needCallMembershipUpdate);\n } finally {\n this.updateCallMembershipRunning = false;\n }\n };\n private makeNewMembership(deviceId: string): SessionMembershipData | EmptyObject {\n // If we're joined, add our own\n if (this.isJoined()) {\n return this.makeMyMembership(deviceId);\n }\n return {};\n }\n\n /**\n * Constructs our own membership\n */\n private makeMyMembership(deviceId: string): SessionMembershipData {\n return {\n call_id: \"\",\n scope: \"m.room\",\n application: \"m.call\",\n device_id: deviceId,\n expires: this.relativeExpiry,\n focus_active: { type: \"livekit\", focus_selection: \"oldest_membership\" },\n foci_preferred: this.ownFociPreferred ?? [],\n };\n }\n\n private async updateCallMembershipEvent(): Promise<void> {\n if (this.memberEventTimeout) {\n clearTimeout(this.memberEventTimeout);\n this.memberEventTimeout = undefined;\n }\n\n const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);\n if (!roomState) throw new Error(\"Couldn't get room state for room \" + this.room.roomId);\n\n const localUserId = this.client.getUserId();\n const localDeviceId = this.client.getDeviceId();\n if (!localUserId || !localDeviceId) throw new Error(\"User ID or device ID was null!\");\n\n let newContent: EmptyObject | SessionMembershipData = {};\n // TODO: add back expiary logic to non-legacy events\n // previously we checked here if the event is timed out and scheduled a check if not.\n // maybe there is a better way.\n newContent = this.makeNewMembership(localDeviceId);\n\n try {\n if (this.isJoined()) {\n const stateKey = this.makeMembershipStateKey(localUserId, localDeviceId);\n const prepareDelayedDisconnection = async (): Promise<void> => {\n try {\n const res = await resendIfRateLimited(() =>\n this.client._unstable_sendDelayedStateEvent(\n this.room.roomId,\n {\n delay: this.membershipServerSideExpiryTimeout,\n },\n EventType.GroupCallMemberPrefix,\n {}, // leave event\n stateKey,\n ),\n );\n this.disconnectDelayId = res.delay_id;\n } catch (e) {\n if (\n e instanceof MatrixError &&\n e.errcode === \"M_UNKNOWN\" &&\n e.data[\"org.matrix.msc4140.errcode\"] === \"M_MAX_DELAY_EXCEEDED\"\n ) {\n const maxDelayAllowed = e.data[\"org.matrix.msc4140.max_delay\"];\n if (\n typeof maxDelayAllowed === \"number\" &&\n this.membershipServerSideExpiryTimeout > maxDelayAllowed\n ) {\n this.membershipServerSideExpiryTimeoutOverride = maxDelayAllowed;\n return prepareDelayedDisconnection();\n }\n }\n logger.error(\"Failed to prepare delayed disconnection event:\", e);\n }\n };\n\n await prepareDelayedDisconnection();\n // Send join event _after_ preparing the delayed disconnection event\n await resendIfRateLimited(() =>\n this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, newContent, stateKey),\n );\n // If sending state cancels your own delayed state, prepare another delayed state\n // TODO: Remove this once MSC4140 is stable & doesn't cancel own delayed state\n if (this.disconnectDelayId !== undefined) {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(\n knownDisconnectDelayId,\n UpdateDelayedEventAction.Restart,\n ),\n );\n } catch (e) {\n if (e instanceof MatrixError && e.errcode === \"M_NOT_FOUND\") {\n // If we get a M_NOT_FOUND we prepare a new delayed event.\n // In other error cases we do not want to prepare anything since we do not have the guarantee, that the\n // future is not still running.\n logger.warn(\"Failed to update delayed disconnection event, prepare it again:\", e);\n this.disconnectDelayId = undefined;\n await prepareDelayedDisconnection();\n }\n }\n }\n if (this.disconnectDelayId !== undefined) {\n this.scheduleDelayDisconnection();\n }\n // TODO throw or log an error if this.disconnectDelayId === undefined\n } else {\n // Not joined\n let sentDelayedDisconnect = false;\n if (this.disconnectDelayId !== undefined) {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(\n knownDisconnectDelayId,\n UpdateDelayedEventAction.Send,\n ),\n );\n sentDelayedDisconnect = true;\n } catch (e) {\n logger.error(\"Failed to send our delayed disconnection event:\", e);\n }\n this.disconnectDelayId = undefined;\n }\n if (!sentDelayedDisconnect) {\n await resendIfRateLimited(() =>\n this.client.sendStateEvent(\n this.room.roomId,\n EventType.GroupCallMemberPrefix,\n {},\n this.makeMembershipStateKey(localUserId, localDeviceId),\n ),\n );\n }\n }\n logger.info(\"Sent updated call member event.\");\n } catch (e) {\n const resendDelay = this.callMemberEventRetryDelayMinimum + Math.random() * this.callMemberEventRetryJitter;\n logger.warn(`Failed to send call member event (retrying in ${resendDelay}): ${e}`);\n await sleep(resendDelay);\n await this.triggerCallMembershipEventUpdate();\n }\n }\n\n private scheduleDelayDisconnection(): void {\n this.memberEventTimeout = setTimeout(() => void this.delayDisconnection(), this.membershipKeepAlivePeriod);\n }\n\n private readonly delayDisconnection = async (): Promise<void> => {\n try {\n const knownDisconnectDelayId = this.disconnectDelayId!;\n await resendIfRateLimited(() =>\n this.client._unstable_updateDelayedEvent(knownDisconnectDelayId, UpdateDelayedEventAction.Restart),\n );\n this.scheduleDelayDisconnection();\n } catch (e) {\n logger.error(\"Failed to delay our disconnection event:\", e);\n }\n };\n\n private makeMembershipStateKey(localUserId: string, localDeviceId: string): string {\n const stateKey = `${localUserId}_${localDeviceId}`;\n if (/^org\\.matrix\\.msc(3757|3779)\\b/.exec(this.room.getVersion())) {\n return stateKey;\n } else {\n return `_${stateKey}`;\n }\n }\n}\n\nasync function resendIfRateLimited<T>(func: () => Promise<T>, numRetriesAllowed: number = 1): Promise<T> {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n return await func();\n } catch (e) {\n if (numRetriesAllowed > 0 && e instanceof HTTPError && e.isRateLimitError()) {\n numRetriesAllowed--;\n let resendDelay: number;\n const defaultMs = 5000;\n try {\n resendDelay = e.getRetryAfterMs() ?? defaultMs;\n logger.info(`Rate limited by server, retrying in ${resendDelay}ms`);\n } catch (e) {\n logger.warn(\n `Error while retrieving a rate-limit retry delay, retrying after default delay of ${defaultMs}`,\n e,\n );\n resendDelay = defaultMs;\n }\n await sleep(resendDelay);\n } else {\n throw e;\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixRTCSession.d.ts","sourceRoot":"","sources":["../../src/matrixrtc/MatrixRTCSession.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"MatrixRTCSession.d.ts","sourceRoot":"","sources":["../../src/matrixrtc/MatrixRTCSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixRTCSession.js","names":["logger","rootLogger","TypedEventEmitter","EventTimeline","EventType","CallMembership","RoomStateEvent","KnownMembership","MembershipManager","EncryptionManager","LegacyMembershipManager","logDurationSync","getChild","MatrixRTCSessionEvent","MatrixRTCSession","statistics","encryptionManager","callId","_callId","callMembershipsForRoom","room","roomState","getLiveTimeline","getState","FORWARDS","warn","roomId","Error","callMemberEvents","getStateEvents","GroupCallMemberPrefix","callMemberships","memberEvent","content","getContent","eventKeysCount","Object","keys","length","membershipContents","push","membershipData","_membership$sender","membership","scope","info","isExpired","concat","sender","deviceId","hasMembershipState","Join","e","sort","a","b","createdTs","debug","map","m","roomSessionForRoom","client","roomSubset","constructor","memberships","_memberships$","_defineProperty","event","onCallEncryptionEventReceived","recalculateSessionMembers","_this$_callId","_this$memberships$","oldMemberships","changed","some","i","equal","_this$membershipManag","emit","MembershipsChanged","membershipManager","onRTCSessionMemberUpdate","onMembershipsUpdate","setExpiryTimer","on","Members","onRoomMemberUpdate","keyBin","encryptionKeyIndex","participantId","EncryptionKeyChanged","isJoined","_this$membershipManag2","_this$membershipManag3","stop","_this","_asyncToGenerator","_this$membershipManag4","leave","expiryTimeout","clearTimeout","undefined","off","joinRoomSession","fociPreferred","fociActive","joinConfig","_joinConfig$useNewMem","useNewMembershipManager","getOldestMembership","join","error","MembershipManagerError","JoinStateChanged","leaveRoomSession","_arguments","arguments","_this2","timeout","leavePromise","getActiveFocus","_this$membershipManag5","getFocusInUse","oldestMembership","getFocusSelection","getPreferredFoci","reemitEncryptionKeys","getEncryptionKeys","forEach","key","index","_this$encryptionManag","Map","Array","from","entries","_ref","k","values","soonestExpiry","thisExpiry","getMsUntilExpiry","setTimeout"],"sources":["../../src/matrixrtc/MatrixRTCSession.ts"],"sourcesContent":["/*\nCopyright 2023 - 2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { logger as rootLogger } from \"../logger.ts\";\nimport { TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { EventTimeline } from \"../models/event-timeline.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport { CallMembership } from \"./CallMembership.ts\";\nimport { RoomStateEvent } from \"../models/room-state.ts\";\nimport { type Focus } from \"./focus.ts\";\nimport { KnownMembership } from \"../@types/membership.ts\";\nimport { type MatrixEvent } from \"../models/event.ts\";\nimport { MembershipManager, type IMembershipManager } from \"./NewMembershipManager.ts\";\nimport { EncryptionManager, type IEncryptionManager, type Statistics } from \"./EncryptionManager.ts\";\nimport { LegacyMembershipManager } from \"./LegacyMembershipManager.ts\";\nimport { logDurationSync } from \"../utils.ts\";\n\nconst logger = rootLogger.getChild(\"MatrixRTCSession\");\n\nexport enum MatrixRTCSessionEvent {\n // A member joined, left, or updated a property of their membership.\n MembershipsChanged = \"memberships_changed\",\n // We joined or left the session: our own local idea of whether we are joined,\n // separate from MembershipsChanged, ie. independent of whether our member event\n // has successfully gone through.\n JoinStateChanged = \"join_state_changed\",\n // The key used to encrypt media has changed\n EncryptionKeyChanged = \"encryption_key_changed\",\n /** The membership manager had to shut down caused by an unrecoverable error */\n MembershipManagerError = \"membership_manager_error\",\n}\n\nexport type MatrixRTCSessionEventHandlerMap = {\n [MatrixRTCSessionEvent.MembershipsChanged]: (\n oldMemberships: CallMembership[],\n newMemberships: CallMembership[],\n ) => void;\n [MatrixRTCSessionEvent.JoinStateChanged]: (isJoined: boolean) => void;\n [MatrixRTCSessionEvent.EncryptionKeyChanged]: (\n key: Uint8Array,\n encryptionKeyIndex: number,\n participantId: string,\n ) => void;\n [MatrixRTCSessionEvent.MembershipManagerError]: (error: unknown) => void;\n};\n\nexport interface MembershipConfig {\n /**\n * Use the new Manager.\n *\n * Default: `false`.\n */\n useNewMembershipManager?: boolean;\n\n /**\n * The timeout (in milliseconds) after we joined the call, that our membership should expire\n * unless we have explicitly updated it.\n *\n * This is what goes into the m.rtc.member event expiry field and is typically set to a number of hours.\n */\n membershipExpiryTimeout?: number;\n\n /**\n * The time in (in milliseconds) which the manager will prematurely send the updated state event before the membership `expires` time to make sure it\n * sends the updated state event early enough.\n *\n * A headroom of 1000ms and a `membershipExpiryTimeout` of 10000ms would result in the first membership event update after 9s and\n * a membership event that would be considered expired after 10s.\n *\n * This value does not have an effect on the value of `SessionMembershipData.expires`.\n */\n membershipExpiryTimeoutHeadroom?: number;\n\n /**\n * The period (in milliseconds) with which we check that our membership event still exists on the\n * server. If it is not found we create it again.\n */\n memberEventCheckPeriod?: number;\n\n /**\n * The minimum delay (in milliseconds) after which we will retry sending the membership event if it\n * failed to send.\n */\n callMemberEventRetryDelayMinimum?: number;\n\n /**\n * The timeout (in milliseconds) with which the deleayed leave event on the server is configured.\n * After this time the server will set the event to the disconnected stat if it has not received a keep-alive from the client.\n */\n membershipServerSideExpiryTimeout?: number;\n\n /**\n * The interval (in milliseconds) in which the client will send membership keep-alives to the server.\n */\n membershipKeepAlivePeriod?: number;\n\n /**\n * @deprecated It should be possible to make it stable without this.\n */\n callMemberEventRetryJitter?: number;\n\n /**\n * The maximum number of retries that the manager will do for delayed event sending/updating and state event sending when a server rate limit has been hit.\n */\n maximumRateLimitRetryCount?: number;\n\n /**\n * The maximum number of retries that the manager will do for delayed event sending/updating and state event sending when a network error occurs.\n */\n maximumNetworkErrorRetryCount?: number;\n}\n\nexport interface EncryptionConfig {\n /**\n * If true, generate and share a media key for this participant,\n * and emit MatrixRTCSessionEvent.EncryptionKeyChanged when\n * media keys for other participants become available.\n */\n manageMediaKeys?: boolean;\n /**\n * The minimum time (in milliseconds) between each attempt to send encryption key(s).\n * e.g. if this is set to 1000, then we will send at most one key event every second.\n */\n updateEncryptionKeyThrottle?: number;\n /**\n * The delay (in milliseconds) after a member leaves before we create and publish a new key, because people\n * tend to leave calls at the same time.\n */\n makeKeyDelay?: number;\n /**\n * The delay (in milliseconds) between creating and sending a new key and starting to encrypt with it. This\n * gives other a chance to receive the new key to minimise the chance they don't get media they can't decrypt.\n * The total time between a member leaving and the call switching to new keys is therefore:\n * makeKeyDelay + useKeyDelay\n */\n useKeyDelay?: number;\n}\nexport type JoinSessionConfig = MembershipConfig & EncryptionConfig;\n\n/**\n * A MatrixRTCSession manages the membership & properties of a MatrixRTC session.\n * This class doesn't deal with media at all, just membership & properties of a session.\n */\nexport class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, MatrixRTCSessionEventHandlerMap> {\n private membershipManager?: IMembershipManager;\n private encryptionManager: IEncryptionManager;\n // The session Id of the call, this is the call_id of the call Member event.\n private _callId: string | undefined;\n\n /**\n * This timeout is responsible to track any expiration. We need to know when we have to start\n * to ignore other call members. There is no callback for this. This timeout will always be configured to\n * emit when the next membership expires.\n */\n private expiryTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * The statistics for this session.\n */\n public get statistics(): Statistics {\n return this.encryptionManager.statistics;\n }\n\n /**\n * The callId (sessionId) of the call.\n *\n * It can be undefined since the callId is only known once the first membership joins.\n * The callId is the property that, per definition, groups memberships into one call.\n */\n public get callId(): string | undefined {\n return this._callId;\n }\n\n /**\n * Returns all the call memberships for a room, oldest first\n */\n public static callMembershipsForRoom(\n room: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"hasMembershipState\">,\n ): CallMembership[] {\n const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS);\n if (!roomState) {\n logger.warn(\"Couldn't get state for room \" + room.roomId);\n throw new Error(\"Could't get state for room \" + room.roomId);\n }\n const callMemberEvents = roomState.getStateEvents(EventType.GroupCallMemberPrefix);\n\n const callMemberships: CallMembership[] = [];\n for (const memberEvent of callMemberEvents) {\n const content = memberEvent.getContent();\n const eventKeysCount = Object.keys(content).length;\n // Dont even bother about empty events (saves us from costly type/\"key in\" checks in bigger rooms)\n if (eventKeysCount === 0) continue;\n\n const membershipContents: any[] = [];\n\n // We first decide if its a MSC4143 event (per device state key)\n if (eventKeysCount > 1 && \"focus_active\" in content) {\n // We have a MSC4143 event membership event\n membershipContents.push(content);\n } else if (eventKeysCount === 1 && \"memberships\" in content) {\n logger.warn(`Legacy event found. Those are ignored, they do not contribute to the MatrixRTC session`);\n }\n\n if (membershipContents.length === 0) continue;\n\n for (const membershipData of membershipContents) {\n try {\n const membership = new CallMembership(memberEvent, membershipData);\n\n if (membership.callId !== \"\" || membership.scope !== \"m.room\") {\n // for now, just ignore anything that isn't a room scope call\n logger.info(`Ignoring user-scoped call`);\n continue;\n }\n\n if (membership.isExpired()) {\n logger.info(`Ignoring expired device membership ${membership.sender}/${membership.deviceId}`);\n continue;\n }\n if (!room.hasMembershipState(membership.sender ?? \"\", KnownMembership.Join)) {\n logger.info(`Ignoring membership of user ${membership.sender} who is not in the room.`);\n continue;\n }\n callMemberships.push(membership);\n } catch (e) {\n logger.warn(\"Couldn't construct call membership: \", e);\n }\n }\n }\n\n callMemberships.sort((a, b) => a.createdTs() - b.createdTs());\n if (callMemberships.length > 1) {\n logger.debug(\n `Call memberships in room ${room.roomId}, in order: `,\n callMemberships.map((m) => [m.createdTs(), m.sender]),\n );\n }\n\n return callMemberships;\n }\n\n /**\n * Return the MatrixRTC session for the room, whether there are currently active members or not\n */\n public static roomSessionForRoom(client: MatrixClient, room: Room): MatrixRTCSession {\n const callMemberships = MatrixRTCSession.callMembershipsForRoom(room);\n\n return new MatrixRTCSession(client, room, callMemberships);\n }\n\n /**\n * WARN: this can in theory only be a subset of the room with the properties required by\n * this class.\n * Outside of tests this most likely will be a full room, however.\n * @deprecated Relying on a full Room object being available here is an anti-pattern. You should be tracking\n * the room object in your own code and passing it in when needed.\n */\n public get room(): Room {\n return this.roomSubset as Room;\n }\n\n /**\n * This constructs a room session. When using MatrixRTC inside the js-sdk this is expected\n * to be used with the MatrixRTCSessionManager exclusively.\n *\n * In cases where you don't use the js-sdk but build on top of another Matrix stack this class can be used standalone\n * to manage a joined MatrixRTC session.\n *\n * @param client A subset of the {@link MatrixClient} that lets the session interact with the Matrix room.\n * @param roomSubset The room this session is attached to. A subset of a js-sdk Room that the session needs.\n * @param memberships The list of memberships this session currently has.\n */\n public constructor(\n private readonly client: Pick<\n MatrixClient,\n | \"getUserId\"\n | \"getDeviceId\"\n | \"sendStateEvent\"\n | \"_unstable_sendDelayedStateEvent\"\n | \"_unstable_updateDelayedEvent\"\n | \"sendEvent\"\n | \"cancelPendingEvent\"\n >,\n private roomSubset: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"getVersion\" | \"hasMembershipState\">,\n public memberships: CallMembership[],\n ) {\n super();\n this._callId = memberships[0]?.callId;\n const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS);\n // TODO: double check if this is actually needed. Should be covered by refreshRoom in MatrixRTCSessionManager\n roomState?.on(RoomStateEvent.Members, this.onRoomMemberUpdate);\n this.setExpiryTimer();\n this.encryptionManager = new EncryptionManager(\n this.client,\n this.roomSubset,\n () => this.memberships,\n (keyBin: Uint8Array<ArrayBufferLike>, encryptionKeyIndex: number, participantId: string) => {\n this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, keyBin, encryptionKeyIndex, participantId);\n },\n );\n }\n\n /*\n * Returns true if we intend to be participating in the MatrixRTC session.\n * This is determined by checking if the relativeExpiry has been set.\n */\n public isJoined(): boolean {\n return this.membershipManager?.isJoined() ?? false;\n }\n\n /**\n * Performs cleanup & removes timers for client shutdown\n */\n public async stop(): Promise<void> {\n await this.membershipManager?.leave(1000);\n if (this.expiryTimeout) {\n clearTimeout(this.expiryTimeout);\n this.expiryTimeout = undefined;\n }\n const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS);\n roomState?.off(RoomStateEvent.Members, this.onRoomMemberUpdate);\n }\n\n /**\n * Announces this user and device as joined to the MatrixRTC session,\n * and continues to update the membership event to keep it valid until\n * leaveRoomSession() is called\n * This will not subscribe to updates: remember to call subscribe() separately if\n * desired.\n * This method will return immediately and the session will be joined in the background.\n *\n * @param fociActive - The object representing the active focus. (This depends on the focus type.)\n * @param fociPreferred - The list of preferred foci this member proposes to use/knows/has access to.\n * For the livekit case this is a list of foci generated from the homeserver well-known, the current rtc session,\n * or optionally other room members homeserver well known.\n * @param joinConfig - Additional configuration for the joined session.\n */\n public joinRoomSession(fociPreferred: Focus[], fociActive?: Focus, joinConfig?: JoinSessionConfig): void {\n if (this.isJoined()) {\n logger.info(`Already joined to session in room ${this.roomSubset.roomId}: ignoring join call`);\n return;\n } else {\n // Create MembershipManager\n if (joinConfig?.useNewMembershipManager ?? false) {\n this.membershipManager = new MembershipManager(joinConfig, this.roomSubset, this.client, () =>\n this.getOldestMembership(),\n );\n } else {\n this.membershipManager = new LegacyMembershipManager(joinConfig, this.roomSubset, this.client, () =>\n this.getOldestMembership(),\n );\n }\n }\n\n // Join!\n this.membershipManager!.join(fociPreferred, fociActive, (e) => {\n logger.error(\"MembershipManager encountered an unrecoverable error: \", e);\n this.emit(MatrixRTCSessionEvent.MembershipManagerError, e);\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, this.isJoined());\n });\n this.encryptionManager!.join(joinConfig);\n\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, true);\n }\n\n /**\n * Announces this user and device as having left the MatrixRTC session\n * and stops scheduled updates.\n * This will not unsubscribe from updates: remember to call unsubscribe() separately if\n * desired.\n * The membership update required to leave the session will retry if it fails.\n * Without network connection the promise will never resolve.\n * A timeout can be provided so that there is a guarantee for the promise to resolve.\n * @returns Whether the membership update was attempted and did not time out.\n */\n public async leaveRoomSession(timeout: number | undefined = undefined): Promise<boolean> {\n if (!this.isJoined()) {\n logger.info(`Not joined to session in room ${this.roomSubset.roomId}: ignoring leave call`);\n return false;\n }\n\n logger.info(`Leaving call session in room ${this.roomSubset.roomId}`);\n\n this.encryptionManager.leave();\n\n const leavePromise = this.membershipManager!.leave(timeout);\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, false);\n\n return await leavePromise;\n }\n\n /**\n * Get the active focus from the current CallMemberState event\n * @returns The focus that is currently in use to connect to this session. This is undefined\n * if the client is not connected to this session.\n */\n public getActiveFocus(): Focus | undefined {\n return this.membershipManager?.getActiveFocus();\n }\n\n public getOldestMembership(): CallMembership | undefined {\n return this.memberships[0];\n }\n\n /**\n * This method is used when the user is not yet connected to the Session but wants to know what focus\n * the users in the session are using to make a decision how it wants/should connect.\n *\n * See also `getActiveFocus`\n * @returns The focus which should be used when joining this session.\n */\n public getFocusInUse(): Focus | undefined {\n const oldestMembership = this.getOldestMembership();\n if (oldestMembership?.getFocusSelection() === \"oldest_membership\") {\n return oldestMembership.getPreferredFoci()[0];\n }\n }\n\n /**\n * Re-emit an EncryptionKeyChanged event for each tracked encryption key. This can be used to export\n * the keys.\n */\n public reemitEncryptionKeys(): void {\n this.encryptionManager.getEncryptionKeys().forEach((keys, participantId) => {\n keys.forEach((key, index) => {\n this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, key.key, index, participantId);\n });\n });\n }\n\n /**\n * A map of keys used to encrypt and decrypt (we are using a symmetric\n * cipher) given participant's media. This also includes our own key\n *\n * @deprecated This will be made private in a future release.\n */\n public getEncryptionKeys(): IterableIterator<[string, Array<Uint8Array>]> {\n const keys =\n this.encryptionManager.getEncryptionKeys() ??\n new Map<string, Array<{ key: Uint8Array; timestamp: number }>>();\n // the returned array doesn't contain the timestamps\n return Array.from(keys.entries())\n .map(([participantId, keys]): [string, Uint8Array[]] => [participantId, keys.map((k) => k.key)])\n .values();\n }\n\n /**\n * Sets a timer for the soonest membership expiry\n */\n private setExpiryTimer(): void {\n if (this.expiryTimeout) {\n clearTimeout(this.expiryTimeout);\n this.expiryTimeout = undefined;\n }\n\n let soonestExpiry;\n for (const membership of this.memberships) {\n const thisExpiry = membership.getMsUntilExpiry();\n // If getMsUntilExpiry is undefined we have a MSC4143 (MatrixRTC) compliant event - it never expires\n // but will be reliably resent on disconnect.\n if (thisExpiry !== undefined && (soonestExpiry === undefined || thisExpiry < soonestExpiry)) {\n soonestExpiry = thisExpiry;\n }\n }\n\n if (soonestExpiry != undefined) {\n this.expiryTimeout = setTimeout(this.onRTCSessionMemberUpdate, soonestExpiry);\n }\n }\n\n /**\n * Process `m.call.encryption_keys` events to track the encryption keys for call participants.\n * This should be called each time the relevant event is received from a room timeline.\n * If the event is malformed then it will be logged and ignored.\n *\n * @param event the event to process\n */\n public onCallEncryption = (event: MatrixEvent): void => {\n this.encryptionManager.onCallEncryptionEventReceived(event);\n };\n\n /**\n * @deprecated use onRoomMemberUpdate or onRTCSessionMemberUpdate instead. this should be called when any membership in the call is updated\n * the old name might have implied to only need to call this when your own membership changes.\n */\n public onMembershipUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when the Matrix room members have changed.\n */\n public onRoomMemberUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when something changed that may impacts the current MatrixRTC members in this session.\n */\n public onRTCSessionMemberUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when anything that could impact rtc memberships has changed: Room Members or RTC members.\n *\n * Examines the latest call memberships and handles any encryption key sending or rotation that is needed.\n *\n * This function should be called when the room members or call memberships might have changed.\n */\n private recalculateSessionMembers = (): void => {\n const oldMemberships = this.memberships;\n this.memberships = MatrixRTCSession.callMembershipsForRoom(this.room);\n\n this._callId = this._callId ?? this.memberships[0]?.callId;\n\n const changed =\n oldMemberships.length != this.memberships.length ||\n oldMemberships.some((m, i) => !CallMembership.equal(m, this.memberships[i]));\n\n if (changed) {\n logger.info(`Memberships for call in room ${this.roomSubset.roomId} have changed: emitting`);\n logDurationSync(logger, \"emit MatrixRTCSessionEvent.MembershipsChanged\", () => {\n this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);\n });\n\n void this.membershipManager?.onRTCSessionMemberUpdate(this.memberships);\n }\n // This also needs to be done if `changed` = false\n // A member might have updated their fingerprint (created_ts)\n void this.encryptionManager.onMembershipsUpdate(oldMemberships);\n\n this.setExpiryTimer();\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MatrixRTCSession.js","names":["logger","rootLogger","TypedEventEmitter","EventTimeline","EventType","CallMembership","RoomStateEvent","KnownMembership","MembershipManager","EncryptionManager","LegacyMembershipManager","logDurationSync","getChild","MatrixRTCSessionEvent","MatrixRTCSession","statistics","encryptionManager","callId","_callId","callMembershipsForRoom","room","roomState","getLiveTimeline","getState","FORWARDS","warn","roomId","Error","callMemberEvents","getStateEvents","GroupCallMemberPrefix","callMemberships","memberEvent","content","getContent","eventKeysCount","Object","keys","length","membershipContents","push","membershipData","_membership$sender","membership","scope","info","isExpired","concat","sender","deviceId","hasMembershipState","Join","e","sort","a","b","createdTs","debug","map","m","roomSessionForRoom","client","roomSubset","constructor","memberships","_memberships$","_defineProperty","event","onCallEncryptionEventReceived","recalculateSessionMembers","_this$_callId","_this$memberships$","oldMemberships","changed","some","i","equal","_this$membershipManag","emit","MembershipsChanged","membershipManager","onRTCSessionMemberUpdate","onMembershipsUpdate","setExpiryTimer","on","Members","onRoomMemberUpdate","keyBin","encryptionKeyIndex","participantId","EncryptionKeyChanged","isJoined","_this$membershipManag2","_this$membershipManag3","stop","_this","_asyncToGenerator","_this$membershipManag4","leave","expiryTimeout","clearTimeout","undefined","off","joinRoomSession","fociPreferred","fociActive","joinConfig","_joinConfig$useNewMem","useNewMembershipManager","getOldestMembership","join","error","MembershipManagerError","JoinStateChanged","leaveRoomSession","_arguments","arguments","_this2","timeout","leavePromise","getActiveFocus","_this$membershipManag5","getFocusInUse","oldestMembership","getFocusSelection","getPreferredFoci","reemitEncryptionKeys","getEncryptionKeys","forEach","key","index","_this$encryptionManag","Map","Array","from","entries","_ref","k","values","soonestExpiry","thisExpiry","getMsUntilExpiry","setTimeout"],"sources":["../../src/matrixrtc/MatrixRTCSession.ts"],"sourcesContent":["/*\nCopyright 2023 - 2024 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { logger as rootLogger } from \"../logger.ts\";\nimport { TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { EventTimeline } from \"../models/event-timeline.ts\";\nimport { type Room } from \"../models/room.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport { CallMembership } from \"./CallMembership.ts\";\nimport { RoomStateEvent } from \"../models/room-state.ts\";\nimport { type Focus } from \"./focus.ts\";\nimport { KnownMembership } from \"../@types/membership.ts\";\nimport { type MatrixEvent } from \"../models/event.ts\";\nimport { MembershipManager } from \"./NewMembershipManager.ts\";\nimport { EncryptionManager, type IEncryptionManager, type Statistics } from \"./EncryptionManager.ts\";\nimport { LegacyMembershipManager } from \"./LegacyMembershipManager.ts\";\nimport { logDurationSync } from \"../utils.ts\";\nimport type { IMembershipManager } from \"./types.ts\";\n\nconst logger = rootLogger.getChild(\"MatrixRTCSession\");\n\nexport enum MatrixRTCSessionEvent {\n // A member joined, left, or updated a property of their membership.\n MembershipsChanged = \"memberships_changed\",\n // We joined or left the session: our own local idea of whether we are joined,\n // separate from MembershipsChanged, ie. independent of whether our member event\n // has successfully gone through.\n JoinStateChanged = \"join_state_changed\",\n // The key used to encrypt media has changed\n EncryptionKeyChanged = \"encryption_key_changed\",\n /** The membership manager had to shut down caused by an unrecoverable error */\n MembershipManagerError = \"membership_manager_error\",\n}\n\nexport type MatrixRTCSessionEventHandlerMap = {\n [MatrixRTCSessionEvent.MembershipsChanged]: (\n oldMemberships: CallMembership[],\n newMemberships: CallMembership[],\n ) => void;\n [MatrixRTCSessionEvent.JoinStateChanged]: (isJoined: boolean) => void;\n [MatrixRTCSessionEvent.EncryptionKeyChanged]: (\n key: Uint8Array,\n encryptionKeyIndex: number,\n participantId: string,\n ) => void;\n [MatrixRTCSessionEvent.MembershipManagerError]: (error: unknown) => void;\n};\n\nexport interface MembershipConfig {\n /**\n * Use the new Manager.\n *\n * Default: `false`.\n */\n useNewMembershipManager?: boolean;\n\n /**\n * The timeout (in milliseconds) after we joined the call, that our membership should expire\n * unless we have explicitly updated it.\n *\n * This is what goes into the m.rtc.member event expiry field and is typically set to a number of hours.\n */\n membershipExpiryTimeout?: number;\n\n /**\n * The time in (in milliseconds) which the manager will prematurely send the updated state event before the membership `expires` time to make sure it\n * sends the updated state event early enough.\n *\n * A headroom of 1000ms and a `membershipExpiryTimeout` of 10000ms would result in the first membership event update after 9s and\n * a membership event that would be considered expired after 10s.\n *\n * This value does not have an effect on the value of `SessionMembershipData.expires`.\n */\n membershipExpiryTimeoutHeadroom?: number;\n\n /**\n * The period (in milliseconds) with which we check that our membership event still exists on the\n * server. If it is not found we create it again.\n */\n memberEventCheckPeriod?: number;\n\n /**\n * The minimum delay (in milliseconds) after which we will retry sending the membership event if it\n * failed to send.\n */\n callMemberEventRetryDelayMinimum?: number;\n\n /**\n * The timeout (in milliseconds) with which the deleayed leave event on the server is configured.\n * After this time the server will set the event to the disconnected stat if it has not received a keep-alive from the client.\n */\n membershipServerSideExpiryTimeout?: number;\n\n /**\n * The interval (in milliseconds) in which the client will send membership keep-alives to the server.\n */\n membershipKeepAlivePeriod?: number;\n\n /**\n * @deprecated It should be possible to make it stable without this.\n */\n callMemberEventRetryJitter?: number;\n\n /**\n * The maximum number of retries that the manager will do for delayed event sending/updating and state event sending when a server rate limit has been hit.\n */\n maximumRateLimitRetryCount?: number;\n\n /**\n * The maximum number of retries that the manager will do for delayed event sending/updating and state event sending when a network error occurs.\n */\n maximumNetworkErrorRetryCount?: number;\n}\n\nexport interface EncryptionConfig {\n /**\n * If true, generate and share a media key for this participant,\n * and emit MatrixRTCSessionEvent.EncryptionKeyChanged when\n * media keys for other participants become available.\n */\n manageMediaKeys?: boolean;\n /**\n * The minimum time (in milliseconds) between each attempt to send encryption key(s).\n * e.g. if this is set to 1000, then we will send at most one key event every second.\n */\n updateEncryptionKeyThrottle?: number;\n /**\n * The delay (in milliseconds) after a member leaves before we create and publish a new key, because people\n * tend to leave calls at the same time.\n */\n makeKeyDelay?: number;\n /**\n * The delay (in milliseconds) between creating and sending a new key and starting to encrypt with it. This\n * gives other a chance to receive the new key to minimise the chance they don't get media they can't decrypt.\n * The total time between a member leaving and the call switching to new keys is therefore:\n * makeKeyDelay + useKeyDelay\n */\n useKeyDelay?: number;\n}\nexport type JoinSessionConfig = MembershipConfig & EncryptionConfig;\n\n/**\n * A MatrixRTCSession manages the membership & properties of a MatrixRTC session.\n * This class doesn't deal with media at all, just membership & properties of a session.\n */\nexport class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, MatrixRTCSessionEventHandlerMap> {\n private membershipManager?: IMembershipManager;\n private encryptionManager: IEncryptionManager;\n // The session Id of the call, this is the call_id of the call Member event.\n private _callId: string | undefined;\n\n /**\n * This timeout is responsible to track any expiration. We need to know when we have to start\n * to ignore other call members. There is no callback for this. This timeout will always be configured to\n * emit when the next membership expires.\n */\n private expiryTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * The statistics for this session.\n */\n public get statistics(): Statistics {\n return this.encryptionManager.statistics;\n }\n\n /**\n * The callId (sessionId) of the call.\n *\n * It can be undefined since the callId is only known once the first membership joins.\n * The callId is the property that, per definition, groups memberships into one call.\n */\n public get callId(): string | undefined {\n return this._callId;\n }\n\n /**\n * Returns all the call memberships for a room, oldest first\n */\n public static callMembershipsForRoom(\n room: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"hasMembershipState\">,\n ): CallMembership[] {\n const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS);\n if (!roomState) {\n logger.warn(\"Couldn't get state for room \" + room.roomId);\n throw new Error(\"Could't get state for room \" + room.roomId);\n }\n const callMemberEvents = roomState.getStateEvents(EventType.GroupCallMemberPrefix);\n\n const callMemberships: CallMembership[] = [];\n for (const memberEvent of callMemberEvents) {\n const content = memberEvent.getContent();\n const eventKeysCount = Object.keys(content).length;\n // Dont even bother about empty events (saves us from costly type/\"key in\" checks in bigger rooms)\n if (eventKeysCount === 0) continue;\n\n const membershipContents: any[] = [];\n\n // We first decide if its a MSC4143 event (per device state key)\n if (eventKeysCount > 1 && \"focus_active\" in content) {\n // We have a MSC4143 event membership event\n membershipContents.push(content);\n } else if (eventKeysCount === 1 && \"memberships\" in content) {\n logger.warn(`Legacy event found. Those are ignored, they do not contribute to the MatrixRTC session`);\n }\n\n if (membershipContents.length === 0) continue;\n\n for (const membershipData of membershipContents) {\n try {\n const membership = new CallMembership(memberEvent, membershipData);\n\n if (membership.callId !== \"\" || membership.scope !== \"m.room\") {\n // for now, just ignore anything that isn't a room scope call\n logger.info(`Ignoring user-scoped call`);\n continue;\n }\n\n if (membership.isExpired()) {\n logger.info(`Ignoring expired device membership ${membership.sender}/${membership.deviceId}`);\n continue;\n }\n if (!room.hasMembershipState(membership.sender ?? \"\", KnownMembership.Join)) {\n logger.info(`Ignoring membership of user ${membership.sender} who is not in the room.`);\n continue;\n }\n callMemberships.push(membership);\n } catch (e) {\n logger.warn(\"Couldn't construct call membership: \", e);\n }\n }\n }\n\n callMemberships.sort((a, b) => a.createdTs() - b.createdTs());\n if (callMemberships.length > 1) {\n logger.debug(\n `Call memberships in room ${room.roomId}, in order: `,\n callMemberships.map((m) => [m.createdTs(), m.sender]),\n );\n }\n\n return callMemberships;\n }\n\n /**\n * Return the MatrixRTC session for the room, whether there are currently active members or not\n */\n public static roomSessionForRoom(client: MatrixClient, room: Room): MatrixRTCSession {\n const callMemberships = MatrixRTCSession.callMembershipsForRoom(room);\n\n return new MatrixRTCSession(client, room, callMemberships);\n }\n\n /**\n * WARN: this can in theory only be a subset of the room with the properties required by\n * this class.\n * Outside of tests this most likely will be a full room, however.\n * @deprecated Relying on a full Room object being available here is an anti-pattern. You should be tracking\n * the room object in your own code and passing it in when needed.\n */\n public get room(): Room {\n return this.roomSubset as Room;\n }\n\n /**\n * This constructs a room session. When using MatrixRTC inside the js-sdk this is expected\n * to be used with the MatrixRTCSessionManager exclusively.\n *\n * In cases where you don't use the js-sdk but build on top of another Matrix stack this class can be used standalone\n * to manage a joined MatrixRTC session.\n *\n * @param client A subset of the {@link MatrixClient} that lets the session interact with the Matrix room.\n * @param roomSubset The room this session is attached to. A subset of a js-sdk Room that the session needs.\n * @param memberships The list of memberships this session currently has.\n */\n public constructor(\n private readonly client: Pick<\n MatrixClient,\n | \"getUserId\"\n | \"getDeviceId\"\n | \"sendStateEvent\"\n | \"_unstable_sendDelayedStateEvent\"\n | \"_unstable_updateDelayedEvent\"\n | \"sendEvent\"\n | \"cancelPendingEvent\"\n >,\n private roomSubset: Pick<Room, \"getLiveTimeline\" | \"roomId\" | \"getVersion\" | \"hasMembershipState\">,\n public memberships: CallMembership[],\n ) {\n super();\n this._callId = memberships[0]?.callId;\n const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS);\n // TODO: double check if this is actually needed. Should be covered by refreshRoom in MatrixRTCSessionManager\n roomState?.on(RoomStateEvent.Members, this.onRoomMemberUpdate);\n this.setExpiryTimer();\n this.encryptionManager = new EncryptionManager(\n this.client,\n this.roomSubset,\n () => this.memberships,\n (keyBin: Uint8Array<ArrayBufferLike>, encryptionKeyIndex: number, participantId: string) => {\n this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, keyBin, encryptionKeyIndex, participantId);\n },\n );\n }\n\n /*\n * Returns true if we intend to be participating in the MatrixRTC session.\n * This is determined by checking if the relativeExpiry has been set.\n */\n public isJoined(): boolean {\n return this.membershipManager?.isJoined() ?? false;\n }\n\n /**\n * Performs cleanup & removes timers for client shutdown\n */\n public async stop(): Promise<void> {\n await this.membershipManager?.leave(1000);\n if (this.expiryTimeout) {\n clearTimeout(this.expiryTimeout);\n this.expiryTimeout = undefined;\n }\n const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS);\n roomState?.off(RoomStateEvent.Members, this.onRoomMemberUpdate);\n }\n\n /**\n * Announces this user and device as joined to the MatrixRTC session,\n * and continues to update the membership event to keep it valid until\n * leaveRoomSession() is called\n * This will not subscribe to updates: remember to call subscribe() separately if\n * desired.\n * This method will return immediately and the session will be joined in the background.\n *\n * @param fociActive - The object representing the active focus. (This depends on the focus type.)\n * @param fociPreferred - The list of preferred foci this member proposes to use/knows/has access to.\n * For the livekit case this is a list of foci generated from the homeserver well-known, the current rtc session,\n * or optionally other room members homeserver well known.\n * @param joinConfig - Additional configuration for the joined session.\n */\n public joinRoomSession(fociPreferred: Focus[], fociActive?: Focus, joinConfig?: JoinSessionConfig): void {\n if (this.isJoined()) {\n logger.info(`Already joined to session in room ${this.roomSubset.roomId}: ignoring join call`);\n return;\n } else {\n // Create MembershipManager\n if (joinConfig?.useNewMembershipManager ?? false) {\n this.membershipManager = new MembershipManager(joinConfig, this.roomSubset, this.client, () =>\n this.getOldestMembership(),\n );\n } else {\n this.membershipManager = new LegacyMembershipManager(joinConfig, this.roomSubset, this.client, () =>\n this.getOldestMembership(),\n );\n }\n }\n\n // Join!\n this.membershipManager!.join(fociPreferred, fociActive, (e) => {\n logger.error(\"MembershipManager encountered an unrecoverable error: \", e);\n this.emit(MatrixRTCSessionEvent.MembershipManagerError, e);\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, this.isJoined());\n });\n this.encryptionManager!.join(joinConfig);\n\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, true);\n }\n\n /**\n * Announces this user and device as having left the MatrixRTC session\n * and stops scheduled updates.\n * This will not unsubscribe from updates: remember to call unsubscribe() separately if\n * desired.\n * The membership update required to leave the session will retry if it fails.\n * Without network connection the promise will never resolve.\n * A timeout can be provided so that there is a guarantee for the promise to resolve.\n * @returns Whether the membership update was attempted and did not time out.\n */\n public async leaveRoomSession(timeout: number | undefined = undefined): Promise<boolean> {\n if (!this.isJoined()) {\n logger.info(`Not joined to session in room ${this.roomSubset.roomId}: ignoring leave call`);\n return false;\n }\n\n logger.info(`Leaving call session in room ${this.roomSubset.roomId}`);\n\n this.encryptionManager.leave();\n\n const leavePromise = this.membershipManager!.leave(timeout);\n this.emit(MatrixRTCSessionEvent.JoinStateChanged, false);\n\n return await leavePromise;\n }\n\n /**\n * Get the active focus from the current CallMemberState event\n * @returns The focus that is currently in use to connect to this session. This is undefined\n * if the client is not connected to this session.\n */\n public getActiveFocus(): Focus | undefined {\n return this.membershipManager?.getActiveFocus();\n }\n\n public getOldestMembership(): CallMembership | undefined {\n return this.memberships[0];\n }\n\n /**\n * This method is used when the user is not yet connected to the Session but wants to know what focus\n * the users in the session are using to make a decision how it wants/should connect.\n *\n * See also `getActiveFocus`\n * @returns The focus which should be used when joining this session.\n */\n public getFocusInUse(): Focus | undefined {\n const oldestMembership = this.getOldestMembership();\n if (oldestMembership?.getFocusSelection() === \"oldest_membership\") {\n return oldestMembership.getPreferredFoci()[0];\n }\n }\n\n /**\n * Re-emit an EncryptionKeyChanged event for each tracked encryption key. This can be used to export\n * the keys.\n */\n public reemitEncryptionKeys(): void {\n this.encryptionManager.getEncryptionKeys().forEach((keys, participantId) => {\n keys.forEach((key, index) => {\n this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, key.key, index, participantId);\n });\n });\n }\n\n /**\n * A map of keys used to encrypt and decrypt (we are using a symmetric\n * cipher) given participant's media. This also includes our own key\n *\n * @deprecated This will be made private in a future release.\n */\n public getEncryptionKeys(): IterableIterator<[string, Array<Uint8Array>]> {\n const keys =\n this.encryptionManager.getEncryptionKeys() ??\n new Map<string, Array<{ key: Uint8Array; timestamp: number }>>();\n // the returned array doesn't contain the timestamps\n return Array.from(keys.entries())\n .map(([participantId, keys]): [string, Uint8Array[]] => [participantId, keys.map((k) => k.key)])\n .values();\n }\n\n /**\n * Sets a timer for the soonest membership expiry\n */\n private setExpiryTimer(): void {\n if (this.expiryTimeout) {\n clearTimeout(this.expiryTimeout);\n this.expiryTimeout = undefined;\n }\n\n let soonestExpiry;\n for (const membership of this.memberships) {\n const thisExpiry = membership.getMsUntilExpiry();\n // If getMsUntilExpiry is undefined we have a MSC4143 (MatrixRTC) compliant event - it never expires\n // but will be reliably resent on disconnect.\n if (thisExpiry !== undefined && (soonestExpiry === undefined || thisExpiry < soonestExpiry)) {\n soonestExpiry = thisExpiry;\n }\n }\n\n if (soonestExpiry != undefined) {\n this.expiryTimeout = setTimeout(this.onRTCSessionMemberUpdate, soonestExpiry);\n }\n }\n\n /**\n * Process `m.call.encryption_keys` events to track the encryption keys for call participants.\n * This should be called each time the relevant event is received from a room timeline.\n * If the event is malformed then it will be logged and ignored.\n *\n * @param event the event to process\n */\n public onCallEncryption = (event: MatrixEvent): void => {\n this.encryptionManager.onCallEncryptionEventReceived(event);\n };\n\n /**\n * @deprecated use onRoomMemberUpdate or onRTCSessionMemberUpdate instead. this should be called when any membership in the call is updated\n * the old name might have implied to only need to call this when your own membership changes.\n */\n public onMembershipUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when the Matrix room members have changed.\n */\n public onRoomMemberUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when something changed that may impacts the current MatrixRTC members in this session.\n */\n public onRTCSessionMemberUpdate = (): void => {\n this.recalculateSessionMembers();\n };\n\n /**\n * Call this when anything that could impact rtc memberships has changed: Room Members or RTC members.\n *\n * Examines the latest call memberships and handles any encryption key sending or rotation that is needed.\n *\n * This function should be called when the room members or call memberships might have changed.\n */\n private recalculateSessionMembers = (): void => {\n const oldMemberships = this.memberships;\n this.memberships = MatrixRTCSession.callMembershipsForRoom(this.room);\n\n this._callId = this._callId ?? this.memberships[0]?.callId;\n\n const changed =\n oldMemberships.length != this.memberships.length ||\n oldMemberships.some((m, i) => !CallMembership.equal(m, this.memberships[i]));\n\n if (changed) {\n logger.info(`Memberships for call in room ${this.roomSubset.roomId} have changed: emitting`);\n logDurationSync(logger, \"emit MatrixRTCSessionEvent.MembershipsChanged\", () => {\n this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);\n });\n\n void this.membershipManager?.onRTCSessionMemberUpdate(this.memberships);\n }\n // This also needs to be done if `changed` = false\n // A member might have updated their fingerprint (created_ts)\n void this.encryptionManager.onMembershipsUpdate(oldMemberships);\n\n this.setExpiryTimer();\n };\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,IAAIC,UAAU,QAAQ,cAAc;AACnD,SAASC,iBAAiB,QAAQ,kCAAkC;AACpE,SAASC,aAAa,QAAQ,6BAA6B;AAG3D,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,cAAc,QAAQ,yBAAyB;AAExD,SAASC,eAAe,QAAQ,yBAAyB;AAEzD,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,iBAAiB,QAAkD,wBAAwB;AACpG,SAASC,uBAAuB,QAAQ,8BAA8B;AACtE,SAASC,eAAe,QAAQ,aAAa;AAG7C,IAAMX,MAAM,GAAGC,UAAU,CAACW,QAAQ,CAAC,kBAAkB,CAAC;AAEtD,WAAYC,qBAAqB,0BAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAArBA,qBAAqB;EAAA,OAArBA,qBAAqB;AAAA;AAwHjC;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,SAASZ,iBAAiB,CAAyD;EAa5G;AACJ;AACA;EACI,IAAWa,UAAUA,CAAA,EAAe;IAChC,OAAO,IAAI,CAACC,iBAAiB,CAACD,UAAU;EAC5C;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACI,IAAWE,MAAMA,CAAA,EAAuB;IACpC,OAAO,IAAI,CAACC,OAAO;EACvB;;EAEA;AACJ;AACA;EACI,OAAcC,sBAAsBA,CAChCC,IAAqE,EACrD;IAChB,IAAMC,SAAS,GAAGD,IAAI,CAACE,eAAe,CAAC,CAAC,CAACC,QAAQ,CAACpB,aAAa,CAACqB,QAAQ,CAAC;IACzE,IAAI,CAACH,SAAS,EAAE;MACZrB,MAAM,CAACyB,IAAI,CAAC,8BAA8B,GAAGL,IAAI,CAACM,MAAM,CAAC;MACzD,MAAM,IAAIC,KAAK,CAAC,6BAA6B,GAAGP,IAAI,CAACM,MAAM,CAAC;IAChE;IACA,IAAME,gBAAgB,GAAGP,SAAS,CAACQ,cAAc,CAACzB,SAAS,CAAC0B,qBAAqB,CAAC;IAElF,IAAMC,eAAiC,GAAG,EAAE;IAC5C,KAAK,IAAMC,WAAW,IAAIJ,gBAAgB,EAAE;MACxC,IAAMK,OAAO,GAAGD,WAAW,CAACE,UAAU,CAAC,CAAC;MACxC,IAAMC,cAAc,GAAGC,MAAM,CAACC,IAAI,CAACJ,OAAO,CAAC,CAACK,MAAM;MAClD;MACA,IAAIH,cAAc,KAAK,CAAC,EAAE;MAE1B,IAAMI,kBAAyB,GAAG,EAAE;;MAEpC;MACA,IAAIJ,cAAc,GAAG,CAAC,IAAI,cAAc,IAAIF,OAAO,EAAE;QACjD;QACAM,kBAAkB,CAACC,IAAI,CAACP,OAAO,CAAC;MACpC,CAAC,MAAM,IAAIE,cAAc,KAAK,CAAC,IAAI,aAAa,IAAIF,OAAO,EAAE;QACzDjC,MAAM,CAACyB,IAAI,yFAAyF,CAAC;MACzG;MAEA,IAAIc,kBAAkB,CAACD,MAAM,KAAK,CAAC,EAAE;MAErC,KAAK,IAAMG,cAAc,IAAIF,kBAAkB,EAAE;QAC7C,IAAI;UAAA,IAAAG,kBAAA;UACA,IAAMC,UAAU,GAAG,IAAItC,cAAc,CAAC2B,WAAW,EAAES,cAAc,CAAC;UAElE,IAAIE,UAAU,CAAC1B,MAAM,KAAK,EAAE,IAAI0B,UAAU,CAACC,KAAK,KAAK,QAAQ,EAAE;YAC3D;YACA5C,MAAM,CAAC6C,IAAI,4BAA4B,CAAC;YACxC;UACJ;UAEA,IAAIF,UAAU,CAACG,SAAS,CAAC,CAAC,EAAE;YACxB9C,MAAM,CAAC6C,IAAI,uCAAAE,MAAA,CAAuCJ,UAAU,CAACK,MAAM,OAAAD,MAAA,CAAIJ,UAAU,CAACM,QAAQ,CAAE,CAAC;YAC7F;UACJ;UACA,IAAI,CAAC7B,IAAI,CAAC8B,kBAAkB,EAAAR,kBAAA,GAACC,UAAU,CAACK,MAAM,cAAAN,kBAAA,cAAAA,kBAAA,GAAI,EAAE,EAAEnC,eAAe,CAAC4C,IAAI,CAAC,EAAE;YACzEnD,MAAM,CAAC6C,IAAI,gCAAAE,MAAA,CAAgCJ,UAAU,CAACK,MAAM,6BAA0B,CAAC;YACvF;UACJ;UACAjB,eAAe,CAACS,IAAI,CAACG,UAAU,CAAC;QACpC,CAAC,CAAC,OAAOS,CAAC,EAAE;UACRpD,MAAM,CAACyB,IAAI,CAAC,sCAAsC,EAAE2B,CAAC,CAAC;QAC1D;MACJ;IACJ;IAEArB,eAAe,CAACsB,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,SAAS,CAAC,CAAC,GAAGD,CAAC,CAACC,SAAS,CAAC,CAAC,CAAC;IAC7D,IAAIzB,eAAe,CAACO,MAAM,GAAG,CAAC,EAAE;MAC5BtC,MAAM,CAACyD,KAAK,6BAAAV,MAAA,CACoB3B,IAAI,CAACM,MAAM,mBACvCK,eAAe,CAAC2B,GAAG,CAAEC,CAAC,IAAK,CAACA,CAAC,CAACH,SAAS,CAAC,CAAC,EAAEG,CAAC,CAACX,MAAM,CAAC,CACxD,CAAC;IACL;IAEA,OAAOjB,eAAe;EAC1B;;EAEA;AACJ;AACA;EACI,OAAc6B,kBAAkBA,CAACC,MAAoB,EAAEzC,IAAU,EAAoB;IACjF,IAAMW,eAAe,GAAGjB,gBAAgB,CAACK,sBAAsB,CAACC,IAAI,CAAC;IAErE,OAAO,IAAIN,gBAAgB,CAAC+C,MAAM,EAAEzC,IAAI,EAAEW,eAAe,CAAC;EAC9D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,IAAWX,IAAIA,CAAA,EAAS;IACpB,OAAO,IAAI,CAAC0C,UAAU;EAC1B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACWC,WAAWA,CACGF,MAShB,EACOC,UAA0F,EAC3FE,WAA6B,EACtC;IAAA,IAAAC,aAAA;IACE,KAAK,CAAC,CAAC;IAAC,KAbSJ,MAShB,GATgBA,MAShB;IAAA,KACOC,UAA0F,GAA1FA,UAA0F;IAAA,KAC3FE,WAA6B,GAA7BA,WAA6B;IAAAE,eAAA;IAAAA,eAAA;IA1IxC;IAAAA,eAAA;IAGA;AACJ;AACA;AACA;AACA;IAJIA,eAAA;IAiUA;AACJ;AACA;AACA;AACA;AACA;AACA;IANIA,eAAA,2BAO2BC,KAAkB,IAAW;MACpD,IAAI,CAACnD,iBAAiB,CAACoD,6BAA6B,CAACD,KAAK,CAAC;IAC/D,CAAC;IAED;AACJ;AACA;AACA;IAHID,eAAA,6BAI4B,MAAY;MACpC,IAAI,CAACG,yBAAyB,CAAC,CAAC;IACpC,CAAC;IAED;AACJ;AACA;IAFIH,eAAA,6BAG4B,MAAY;MACpC,IAAI,CAACG,yBAAyB,CAAC,CAAC;IACpC,CAAC;IAED;AACJ;AACA;IAFIH,eAAA,mCAGkC,MAAY;MAC1C,IAAI,CAACG,yBAAyB,CAAC,CAAC;IACpC,CAAC;IAED;AACJ;AACA;AACA;AACA;AACA;AACA;IANIH,eAAA,oCAOoC,MAAY;MAAA,IAAAI,aAAA,EAAAC,kBAAA;MAC5C,IAAMC,cAAc,GAAG,IAAI,CAACR,WAAW;MACvC,IAAI,CAACA,WAAW,GAAGlD,gBAAgB,CAACK,sBAAsB,CAAC,IAAI,CAACC,IAAI,CAAC;MAErE,IAAI,CAACF,OAAO,IAAAoD,aAAA,GAAG,IAAI,CAACpD,OAAO,cAAAoD,aAAA,cAAAA,aAAA,IAAAC,kBAAA,GAAI,IAAI,CAACP,WAAW,CAAC,CAAC,CAAC,cAAAO,kBAAA,uBAAnBA,kBAAA,CAAqBtD,MAAM;MAE1D,IAAMwD,OAAO,GACTD,cAAc,CAAClC,MAAM,IAAI,IAAI,CAAC0B,WAAW,CAAC1B,MAAM,IAChDkC,cAAc,CAACE,IAAI,CAAC,CAACf,CAAC,EAAEgB,CAAC,KAAK,CAACtE,cAAc,CAACuE,KAAK,CAACjB,CAAC,EAAE,IAAI,CAACK,WAAW,CAACW,CAAC,CAAC,CAAC,CAAC;MAEhF,IAAIF,OAAO,EAAE;QAAA,IAAAI,qBAAA;QACT7E,MAAM,CAAC6C,IAAI,iCAAAE,MAAA,CAAiC,IAAI,CAACe,UAAU,CAACpC,MAAM,4BAAyB,CAAC;QAC5Ff,eAAe,CAACX,MAAM,EAAE,+CAA+C,EAAE,MAAM;UAC3E,IAAI,CAAC8E,IAAI,CAACjE,qBAAqB,CAACkE,kBAAkB,EAAEP,cAAc,EAAE,IAAI,CAACR,WAAW,CAAC;QACzF,CAAC,CAAC;QAEF,OAAAa,qBAAA,GAAK,IAAI,CAACG,iBAAiB,cAAAH,qBAAA,uBAAtBA,qBAAA,CAAwBI,wBAAwB,CAAC,IAAI,CAACjB,WAAW,CAAC;MAC3E;MACA;MACA;MACA,KAAK,IAAI,CAAChD,iBAAiB,CAACkE,mBAAmB,CAACV,cAAc,CAAC;MAE/D,IAAI,CAACW,cAAc,CAAC,CAAC;IACzB,CAAC;IAtPG,IAAI,CAACjE,OAAO,IAAA+C,aAAA,GAAGD,WAAW,CAAC,CAAC,CAAC,cAAAC,aAAA,uBAAdA,aAAA,CAAgBhD,MAAM;IACrC,IAAMI,SAAS,GAAG,IAAI,CAACyC,UAAU,CAACxC,eAAe,CAAC,CAAC,CAACC,QAAQ,CAACpB,aAAa,CAACqB,QAAQ,CAAC;IACpF;IACAH,SAAS,aAATA,SAAS,eAATA,SAAS,CAAE+D,EAAE,CAAC9E,cAAc,CAAC+E,OAAO,EAAE,IAAI,CAACC,kBAAkB,CAAC;IAC9D,IAAI,CAACH,cAAc,CAAC,CAAC;IACrB,IAAI,CAACnE,iBAAiB,GAAG,IAAIP,iBAAiB,CAC1C,IAAI,CAACoD,MAAM,EACX,IAAI,CAACC,UAAU,EACf,MAAM,IAAI,CAACE,WAAW,EACtB,CAACuB,MAAmC,EAAEC,kBAA0B,EAAEC,aAAqB,KAAK;MACxF,IAAI,CAACX,IAAI,CAACjE,qBAAqB,CAAC6E,oBAAoB,EAAEH,MAAM,EAAEC,kBAAkB,EAAEC,aAAa,CAAC;IACpG,CACJ,CAAC;EACL;;EAEA;AACJ;AACA;AACA;EACWE,QAAQA,CAAA,EAAY;IAAA,IAAAC,sBAAA,EAAAC,sBAAA;IACvB,QAAAD,sBAAA,IAAAC,sBAAA,GAAO,IAAI,CAACb,iBAAiB,cAAAa,sBAAA,uBAAtBA,sBAAA,CAAwBF,QAAQ,CAAC,CAAC,cAAAC,sBAAA,cAAAA,sBAAA,GAAI,KAAK;EACtD;;EAEA;AACJ;AACA;EACiBE,IAAIA,CAAA,EAAkB;IAAA,IAAAC,KAAA;IAAA,OAAAC,iBAAA;MAAA,IAAAC,sBAAA;MAC/B,OAAAA,sBAAA,GAAMF,KAAI,CAACf,iBAAiB,cAAAiB,sBAAA,uBAAtBA,sBAAA,CAAwBC,KAAK,CAAC,IAAI,CAAC;MACzC,IAAIH,KAAI,CAACI,aAAa,EAAE;QACpBC,YAAY,CAACL,KAAI,CAACI,aAAa,CAAC;QAChCJ,KAAI,CAACI,aAAa,GAAGE,SAAS;MAClC;MACA,IAAMhF,SAAS,GAAG0E,KAAI,CAACjC,UAAU,CAACxC,eAAe,CAAC,CAAC,CAACC,QAAQ,CAACpB,aAAa,CAACqB,QAAQ,CAAC;MACpFH,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEiF,GAAG,CAAChG,cAAc,CAAC+E,OAAO,EAAEU,KAAI,CAACT,kBAAkB,CAAC;IAAC;EACpE;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACWiB,eAAeA,CAACC,aAAsB,EAAEC,UAAkB,EAAEC,UAA8B,EAAQ;IACrG,IAAI,IAAI,CAACf,QAAQ,CAAC,CAAC,EAAE;MACjB3F,MAAM,CAAC6C,IAAI,sCAAAE,MAAA,CAAsC,IAAI,CAACe,UAAU,CAACpC,MAAM,yBAAsB,CAAC;MAC9F;IACJ,CAAC,MAAM;MAAA,IAAAiF,qBAAA;MACH;MACA,KAAAA,qBAAA,GAAID,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEE,uBAAuB,cAAAD,qBAAA,cAAAA,qBAAA,GAAI,KAAK,EAAE;QAC9C,IAAI,CAAC3B,iBAAiB,GAAG,IAAIxE,iBAAiB,CAACkG,UAAU,EAAE,IAAI,CAAC5C,UAAU,EAAE,IAAI,CAACD,MAAM,EAAE,MACrF,IAAI,CAACgD,mBAAmB,CAAC,CAC7B,CAAC;MACL,CAAC,MAAM;QACH,IAAI,CAAC7B,iBAAiB,GAAG,IAAItE,uBAAuB,CAACgG,UAAU,EAAE,IAAI,CAAC5C,UAAU,EAAE,IAAI,CAACD,MAAM,EAAE,MAC3F,IAAI,CAACgD,mBAAmB,CAAC,CAC7B,CAAC;MACL;IACJ;;IAEA;IACA,IAAI,CAAC7B,iBAAiB,CAAE8B,IAAI,CAACN,aAAa,EAAEC,UAAU,EAAGrD,CAAC,IAAK;MAC3DpD,MAAM,CAAC+G,KAAK,CAAC,wDAAwD,EAAE3D,CAAC,CAAC;MACzE,IAAI,CAAC0B,IAAI,CAACjE,qBAAqB,CAACmG,sBAAsB,EAAE5D,CAAC,CAAC;MAC1D,IAAI,CAAC0B,IAAI,CAACjE,qBAAqB,CAACoG,gBAAgB,EAAE,IAAI,CAACtB,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;IACF,IAAI,CAAC3E,iBAAiB,CAAE8F,IAAI,CAACJ,UAAU,CAAC;IAExC,IAAI,CAAC5B,IAAI,CAACjE,qBAAqB,CAACoG,gBAAgB,EAAE,IAAI,CAAC;EAC3D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACiBC,gBAAgBA,CAAA,EAA4D;IAAA,IAAAC,UAAA,GAAAC,SAAA;MAAAC,MAAA;IAAA,OAAArB,iBAAA;MAAA,IAA3DsB,OAA2B,GAAAH,UAAA,CAAA7E,MAAA,QAAA6E,UAAA,QAAAd,SAAA,GAAAc,UAAA,MAAGd,SAAS;MACjE,IAAI,CAACgB,MAAI,CAAC1B,QAAQ,CAAC,CAAC,EAAE;QAClB3F,MAAM,CAAC6C,IAAI,kCAAAE,MAAA,CAAkCsE,MAAI,CAACvD,UAAU,CAACpC,MAAM,0BAAuB,CAAC;QAC3F,OAAO,KAAK;MAChB;MAEA1B,MAAM,CAAC6C,IAAI,iCAAAE,MAAA,CAAiCsE,MAAI,CAACvD,UAAU,CAACpC,MAAM,CAAE,CAAC;MAErE2F,MAAI,CAACrG,iBAAiB,CAACkF,KAAK,CAAC,CAAC;MAE9B,IAAMqB,YAAY,GAAGF,MAAI,CAACrC,iBAAiB,CAAEkB,KAAK,CAACoB,OAAO,CAAC;MAC3DD,MAAI,CAACvC,IAAI,CAACjE,qBAAqB,CAACoG,gBAAgB,EAAE,KAAK,CAAC;MAExD,aAAaM,YAAY;IAAC;EAC9B;;EAEA;AACJ;AACA;AACA;AACA;EACWC,cAAcA,CAAA,EAAsB;IAAA,IAAAC,sBAAA;IACvC,QAAAA,sBAAA,GAAO,IAAI,CAACzC,iBAAiB,cAAAyC,sBAAA,uBAAtBA,sBAAA,CAAwBD,cAAc,CAAC,CAAC;EACnD;EAEOX,mBAAmBA,CAAA,EAA+B;IACrD,OAAO,IAAI,CAAC7C,WAAW,CAAC,CAAC,CAAC;EAC9B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACW0D,aAAaA,CAAA,EAAsB;IACtC,IAAMC,gBAAgB,GAAG,IAAI,CAACd,mBAAmB,CAAC,CAAC;IACnD,IAAI,CAAAc,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAEC,iBAAiB,CAAC,CAAC,MAAK,mBAAmB,EAAE;MAC/D,OAAOD,gBAAgB,CAACE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD;EACJ;;EAEA;AACJ;AACA;AACA;EACWC,oBAAoBA,CAAA,EAAS;IAChC,IAAI,CAAC9G,iBAAiB,CAAC+G,iBAAiB,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC3F,IAAI,EAAEoD,aAAa,KAAK;MACxEpD,IAAI,CAAC2F,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KAAK;QACzB,IAAI,CAACpD,IAAI,CAACjE,qBAAqB,CAAC6E,oBAAoB,EAAEuC,GAAG,CAACA,GAAG,EAAEC,KAAK,EAAEzC,aAAa,CAAC;MACxF,CAAC,CAAC;IACN,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACWsC,iBAAiBA,CAAA,EAAkD;IAAA,IAAAI,qBAAA;IACtE,IAAM9F,IAAI,IAAA8F,qBAAA,GACN,IAAI,CAACnH,iBAAiB,CAAC+G,iBAAiB,CAAC,CAAC,cAAAI,qBAAA,cAAAA,qBAAA,GAC1C,IAAIC,GAAG,CAAwD,CAAC;IACpE;IACA,OAAOC,KAAK,CAACC,IAAI,CAACjG,IAAI,CAACkG,OAAO,CAAC,CAAC,CAAC,CAC5B7E,GAAG,CAAC8E,IAAA;MAAA,IAAC,CAAC/C,aAAa,EAAEpD,IAAI,CAAC,GAAAmG,IAAA;MAAA,OAA6B,CAAC/C,aAAa,EAAEpD,IAAI,CAACqB,GAAG,CAAE+E,CAAC,IAAKA,CAAC,CAACR,GAAG,CAAC,CAAC;IAAA,EAAC,CAC/FS,MAAM,CAAC,CAAC;EACjB;;EAEA;AACJ;AACA;EACYvD,cAAcA,CAAA,EAAS;IAC3B,IAAI,IAAI,CAACgB,aAAa,EAAE;MACpBC,YAAY,CAAC,IAAI,CAACD,aAAa,CAAC;MAChC,IAAI,CAACA,aAAa,GAAGE,SAAS;IAClC;IAEA,IAAIsC,aAAa;IACjB,KAAK,IAAMhG,UAAU,IAAI,IAAI,CAACqB,WAAW,EAAE;MACvC,IAAM4E,UAAU,GAAGjG,UAAU,CAACkG,gBAAgB,CAAC,CAAC;MAChD;MACA;MACA,IAAID,UAAU,KAAKvC,SAAS,KAAKsC,aAAa,KAAKtC,SAAS,IAAIuC,UAAU,GAAGD,aAAa,CAAC,EAAE;QACzFA,aAAa,GAAGC,UAAU;MAC9B;IACJ;IAEA,IAAID,aAAa,IAAItC,SAAS,EAAE;MAC5B,IAAI,CAACF,aAAa,GAAG2C,UAAU,CAAC,IAAI,CAAC7D,wBAAwB,EAAE0D,aAAa,CAAC;IACjF;EACJ;AAkEJ","ignoreList":[]}
|
|
@@ -2,65 +2,25 @@ import { type MatrixClient } from "../client.ts";
|
|
|
2
2
|
import { type Room } from "../models/room.ts";
|
|
3
3
|
import { type CallMembership } from "./CallMembership.ts";
|
|
4
4
|
import { type Focus } from "./focus.ts";
|
|
5
|
+
import { type IMembershipManager, type MembershipManagerEventHandlerMap, MembershipManagerEvent, Status } from "./types.ts";
|
|
5
6
|
import { type MembershipConfig } from "./MatrixRTCSession.ts";
|
|
6
|
-
|
|
7
|
-
* This interface defines what a MembershipManager uses and exposes.
|
|
8
|
-
* This interface is what we use to write tests and allows changing the actual implementation
|
|
9
|
-
* without breaking tests because of some internal method renaming.
|
|
10
|
-
*
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
export interface IMembershipManager {
|
|
14
|
-
/**
|
|
15
|
-
* If we are trying to join, or have successfully joined the session.
|
|
16
|
-
* It does not reflect if the room state is already configured to represent us being joined.
|
|
17
|
-
* It only means that the Manager should be trying to connect or to disconnect running.
|
|
18
|
-
* The Manager is still running right after isJoined becomes false to send the disconnect events.
|
|
19
|
-
* (A more accurate name would be `isActivated`)
|
|
20
|
-
* @returns true if we intend to be participating in the MatrixRTC session
|
|
21
|
-
*/
|
|
22
|
-
isJoined(): boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Start sending all necessary events to make this user participate in the RTC session.
|
|
25
|
-
* @param fociPreferred the list of preferred foci to use in the joined RTC membership event.
|
|
26
|
-
* @param fociActive the active focus to use in the joined RTC membership event.
|
|
27
|
-
* @throws can throw if it exceeds a configured maximum retry.
|
|
28
|
-
*/
|
|
29
|
-
join(fociPreferred: Focus[], fociActive?: Focus, onError?: (error: unknown) => void): void;
|
|
30
|
-
/**
|
|
31
|
-
* Send all necessary events to make this user leave the RTC session.
|
|
32
|
-
* @param timeout the maximum duration in ms until the promise is forced to resolve.
|
|
33
|
-
* @returns It resolves with true in case the leave was sent successfully.
|
|
34
|
-
* It resolves with false in case we hit the timeout before sending successfully.
|
|
35
|
-
*/
|
|
36
|
-
leave(timeout?: number): Promise<boolean>;
|
|
37
|
-
/**
|
|
38
|
-
* Call this if the MatrixRTC session members have changed.
|
|
39
|
-
*/
|
|
40
|
-
onRTCSessionMemberUpdate(memberships: CallMembership[]): Promise<void>;
|
|
41
|
-
/**
|
|
42
|
-
* The used active focus in the currently joined session.
|
|
43
|
-
* @returns the used active focus in the currently joined session or undefined if not joined.
|
|
44
|
-
*/
|
|
45
|
-
getActiveFocus(): Focus | undefined;
|
|
46
|
-
}
|
|
7
|
+
import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
|
|
47
8
|
/**
|
|
48
9
|
* The different types of actions the MembershipManager can take.
|
|
49
10
|
* @internal
|
|
50
11
|
*/
|
|
51
12
|
export declare enum MembershipActionType {
|
|
52
|
-
|
|
13
|
+
SendDelayedEvent = "SendDelayedEvent",
|
|
53
14
|
SendJoinEvent = "SendJoinEvent",
|
|
54
15
|
RestartDelayedEvent = "RestartDelayedEvent",
|
|
55
16
|
UpdateExpiry = "UpdateExpiry",
|
|
56
|
-
SendMainDelayedEvent = "SendMainDelayedEvent",
|
|
57
17
|
SendScheduledDelayedLeaveEvent = "SendScheduledDelayedLeaveEvent",
|
|
58
18
|
SendLeaveEvent = "SendLeaveEvent"
|
|
59
19
|
}
|
|
60
20
|
/**
|
|
61
21
|
* @internal
|
|
62
22
|
*/
|
|
63
|
-
export interface
|
|
23
|
+
export interface MembershipManagerState {
|
|
64
24
|
/** The delayId we got when successfully sending the delayed leave event.
|
|
65
25
|
* Gets set to undefined if the server claims it cannot find the delayed event anymore. */
|
|
66
26
|
delayId?: string;
|
|
@@ -77,16 +37,6 @@ export interface ActionSchedulerState {
|
|
|
77
37
|
/** Retry counter for other errors */
|
|
78
38
|
networkErrorRetries: Map<MembershipActionType, number>;
|
|
79
39
|
}
|
|
80
|
-
declare enum Status {
|
|
81
|
-
Disconnected = "Disconnected",
|
|
82
|
-
Connecting = "Connecting",
|
|
83
|
-
ConnectingFailed = "ConnectingFailed",
|
|
84
|
-
Connected = "Connected",
|
|
85
|
-
Reconnecting = "Reconnecting",
|
|
86
|
-
Disconnecting = "Disconnecting",
|
|
87
|
-
Stuck = "Stuck",
|
|
88
|
-
Unknown = "Unknown"
|
|
89
|
-
}
|
|
90
40
|
/**
|
|
91
41
|
* This class is responsible for sending all events relating to the own membership of a matrixRTC call.
|
|
92
42
|
* It has the following tasks:
|
|
@@ -100,12 +50,13 @@ declare enum Status {
|
|
|
100
50
|
* - Stop the timer for the delay refresh
|
|
101
51
|
* - Stop the timer for updating the state event
|
|
102
52
|
*/
|
|
103
|
-
export declare class MembershipManager implements IMembershipManager {
|
|
53
|
+
export declare class MembershipManager extends TypedEventEmitter<MembershipManagerEvent, MembershipManagerEventHandlerMap> implements IMembershipManager {
|
|
104
54
|
private joinConfig;
|
|
105
55
|
private room;
|
|
106
56
|
private client;
|
|
107
57
|
private getOldestMembership;
|
|
108
58
|
private activated;
|
|
59
|
+
isActivated(): boolean;
|
|
109
60
|
isJoined(): boolean;
|
|
110
61
|
/**
|
|
111
62
|
* Puts the MembershipManager in a state where it tries to be joined.
|
|
@@ -151,10 +102,9 @@ export declare class MembershipManager implements IMembershipManager {
|
|
|
151
102
|
private oldStatus?;
|
|
152
103
|
private scheduler;
|
|
153
104
|
private membershipLoopHandler;
|
|
154
|
-
private
|
|
105
|
+
private sendOrResendDelayedLeaveEvent;
|
|
155
106
|
private cancelKnownDelayIdBeforeSendFirstDelayedEvent;
|
|
156
107
|
private restartDelayedEvent;
|
|
157
|
-
private sendMainDelayedEvent;
|
|
158
108
|
private sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent;
|
|
159
109
|
private sendJoinEvent;
|
|
160
110
|
private updateExpiryOnJoinedEvent;
|
|
@@ -206,5 +156,4 @@ export declare class MembershipManager implements IMembershipManager {
|
|
|
206
156
|
private resetRateLimitCounter;
|
|
207
157
|
get status(): Status;
|
|
208
158
|
}
|
|
209
|
-
export {};
|
|
210
159
|
//# sourceMappingURL=NewMembershipManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewMembershipManager.d.ts","sourceRoot":"","sources":["../../src/matrixrtc/NewMembershipManager.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,KAAK,cAAc,EAAuD,MAAM,qBAAqB,CAAC;AAC/G,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"NewMembershipManager.d.ts","sourceRoot":"","sources":["../../src/matrixrtc/NewMembershipManager.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,KAAK,cAAc,EAAuD,MAAM,qBAAqB,CAAC;AAC/G,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,gCAAgC,EACrC,sBAAsB,EACtB,MAAM,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA8CrE;;;GAGG;AACH,oBAAY,oBAAoB;IAC5B,gBAAgB,qBAAqB;IAIrC,aAAa,kBAAkB;IAI/B,mBAAmB,wBAAwB;IAI3C,YAAY,iBAAiB;IAE7B,8BAA8B,mCAAmC;IAGjE,cAAc,mBAAmB;CAEpC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC;8FAC0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;+HAC2H;IAC3H,sBAAsB,EAAE,MAAM,CAAC;IAC/B;2HACuH;IACvH,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,mBAAmB,EAAE,OAAO,CAAC;IAG7B,oCAAoC;IACpC,gBAAgB,EAAE,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACpD,qCAAqC;IACrC,mBAAmB,EAAE,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;CAC1D;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,iBACT,SAAQ,iBAAiB,CAAC,sBAAsB,EAAE,gCAAgC,CAClF,YAAW,kBAAkB;IAgIzB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,mBAAmB;IAxI/B,OAAO,CAAC,SAAS,CAAS;IACnB,WAAW,IAAI,OAAO;IAItB,QAAQ,IAAI,OAAO;IAI1B;;;;;;;OAOG;IACI,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAgClG;;;;OAIG;IACI,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBhD,OAAO,CAAC,iBAAiB,CAAC,CAAqB;IAElC,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5E,cAAc,IAAI,KAAK,GAAG,SAAS;IAmB1C;;;;;;OAMG;gBAES,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,QAAQ,GAAG,YAAY,CAAC,EAC7D,MAAM,EAAE,IAAI,CAChB,YAAY,EACV,WAAW,GACX,aAAa,GACb,gBAAgB,GAChB,iCAAiC,GACjC,8BAA8B,CACnC,EACO,mBAAmB,EAAE,MAAM,cAAc,GAAG,SAAS;IAYjE,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,KAAK,YAAY,GAU9B;IAED,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAC,CAAU;IAChC,OAAO,CAAC,WAAW,CAAC,CAAQ;IAG5B,OAAO,CAAC,yCAAyC,CAAC,CAAS;IAE3D,OAAO,KAAK,gCAAgC,GAE3C;IACD,OAAO,KAAK,4BAA4B,GAEvC;IACD,OAAO,KAAK,oCAAoC,GAE/C;IACD,OAAO,CAAC,yBAAyB;IAOjC,OAAO,KAAK,iCAAiC,GAM5C;IACD,OAAO,KAAK,yBAAyB,GAEpC;IACD,OAAO,KAAK,0BAA0B,GAErC;IACD,OAAO,KAAK,6BAA6B,GAExC;IAGD,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAad;YAGW,qBAAqB;YAsDrB,6BAA6B;YA4D7B,6CAA6C;YAmC7C,mBAAmB;YA4BnB,wDAAwD;YA4BxD,aAAa;YA+Bb,yBAAyB;YA6BzB,sBAAsB;IAgBpC,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IAgBvC,OAAO,CAAC,sBAAsB;IAU9B;;;;;;;;OAQG;IACH,OAAO,CAAC,8BAA8B;IAgCtC;;;;;;;;OAQG;IACH,OAAO,CAAC,iCAAiC;IA8DzC;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,qBAAqB;IAK7B,IAAW,MAAM,IAAI,MAAM,CA4C1B;CACJ"}
|