matrix-js-sdk 41.5.0 → 41.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/lib/ReEmitter.js +1 -1
  3. package/lib/ReEmitter.js.map +1 -1
  4. package/lib/ToDeviceMessageQueue.js +2 -2
  5. package/lib/ToDeviceMessageQueue.js.map +1 -1
  6. package/lib/autodiscovery.js +0 -1
  7. package/lib/autodiscovery.js.map +1 -1
  8. package/lib/client.js +112 -165
  9. package/lib/client.js.map +1 -1
  10. package/lib/common-crypto/CryptoBackend.js +0 -2
  11. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  12. package/lib/content-helpers.js +3 -5
  13. package/lib/content-helpers.js.map +1 -1
  14. package/lib/content-repo.js +7 -1
  15. package/lib/content-repo.js.map +1 -1
  16. package/lib/crypto/store/indexeddb-crypto-store-backend.js +9 -11
  17. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  18. package/lib/crypto/store/indexeddb-crypto-store.js +0 -2
  19. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  20. package/lib/crypto/store/localStorage-crypto-store.js +11 -9
  21. package/lib/crypto/store/localStorage-crypto-store.js.map +1 -1
  22. package/lib/crypto/store/memory-crypto-store.js +11 -9
  23. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  24. package/lib/crypto-api/index.js +58 -58
  25. package/lib/crypto-api/index.js.map +1 -1
  26. package/lib/embedded.js +29 -45
  27. package/lib/embedded.js.map +1 -1
  28. package/lib/extensible_events_v1/MessageEvent.js +15 -15
  29. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  30. package/lib/extensible_events_v1/PollEndEvent.js +8 -8
  31. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  32. package/lib/extensible_events_v1/PollResponseEvent.js +0 -1
  33. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  34. package/lib/extensible_events_v1/PollStartEvent.js +28 -28
  35. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  36. package/lib/feature.js +5 -1
  37. package/lib/feature.js.map +1 -1
  38. package/lib/filter-component.js +4 -1
  39. package/lib/filter-component.js.map +1 -1
  40. package/lib/filter.js +1 -3
  41. package/lib/filter.js.map +1 -1
  42. package/lib/http-api/errors.js +20 -16
  43. package/lib/http-api/errors.js.map +1 -1
  44. package/lib/http-api/fetch.js +4 -6
  45. package/lib/http-api/fetch.js.map +1 -1
  46. package/lib/http-api/refresh.js +10 -12
  47. package/lib/http-api/refresh.js.map +1 -1
  48. package/lib/interactive-auth.js +1 -11
  49. package/lib/interactive-auth.js.map +1 -1
  50. package/lib/logger.js +0 -2
  51. package/lib/logger.js.map +1 -1
  52. package/lib/matrixrtc/CallMembership.js +43 -57
  53. package/lib/matrixrtc/CallMembership.js.map +1 -1
  54. package/lib/matrixrtc/MatrixRTCSession.js +19 -24
  55. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  56. package/lib/matrixrtc/MatrixRTCSessionManager.js +2 -3
  57. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  58. package/lib/matrixrtc/MembershipManager.js +23 -30
  59. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  60. package/lib/matrixrtc/MembershipManagerActionScheduler.js +1 -2
  61. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  62. package/lib/matrixrtc/RTCEncryptionManager.js +8 -11
  63. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  64. package/lib/matrixrtc/ToDeviceKeyTransport.js +4 -4
  65. package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
  66. package/lib/matrixrtc/utils.js +7 -1
  67. package/lib/matrixrtc/utils.js.map +1 -1
  68. package/lib/models/MSC3089TreeSpace.js +5 -7
  69. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  70. package/lib/models/beacon.js +5 -11
  71. package/lib/models/beacon.js.map +1 -1
  72. package/lib/models/device.js +0 -7
  73. package/lib/models/device.js.map +1 -1
  74. package/lib/models/event-context.js +1 -2
  75. package/lib/models/event-context.js.map +1 -1
  76. package/lib/models/event-timeline-set.js +16 -26
  77. package/lib/models/event-timeline-set.js.map +1 -1
  78. package/lib/models/event-timeline.js +8 -15
  79. package/lib/models/event-timeline.js.map +1 -1
  80. package/lib/models/event.js +20 -37
  81. package/lib/models/event.js.map +1 -1
  82. package/lib/models/invites-ignorer.js +8 -12
  83. package/lib/models/invites-ignorer.js.map +1 -1
  84. package/lib/models/poll.js +7 -13
  85. package/lib/models/poll.js.map +1 -1
  86. package/lib/models/read-receipt.js +8 -4
  87. package/lib/models/read-receipt.js.map +1 -1
  88. package/lib/models/related-relations.js +0 -2
  89. package/lib/models/related-relations.js.map +1 -1
  90. package/lib/models/relations-container.js +4 -6
  91. package/lib/models/relations-container.js.map +1 -1
  92. package/lib/models/relations.js +7 -10
  93. package/lib/models/relations.js.map +1 -1
  94. package/lib/models/room-member.js +2 -24
  95. package/lib/models/room-member.js.map +1 -1
  96. package/lib/models/room-receipts.js +25 -22
  97. package/lib/models/room-receipts.js.map +1 -1
  98. package/lib/models/room-state.js +2 -2
  99. package/lib/models/room-state.js.map +1 -1
  100. package/lib/models/room-sticky-events.js +20 -5
  101. package/lib/models/room-sticky-events.js.map +1 -1
  102. package/lib/models/room.js +82 -105
  103. package/lib/models/room.js.map +1 -1
  104. package/lib/models/thread.js +12 -57
  105. package/lib/models/thread.js.map +1 -1
  106. package/lib/models/user.js +1 -20
  107. package/lib/models/user.js.map +1 -1
  108. package/lib/oidc/authorize.js +23 -32
  109. package/lib/oidc/authorize.js.map +1 -1
  110. package/lib/oidc/tokenRefresher.js +8 -11
  111. package/lib/oidc/tokenRefresher.js.map +1 -1
  112. package/lib/pushprocessor.js +8 -5
  113. package/lib/pushprocessor.js.map +1 -1
  114. package/lib/receipt-accumulator.js +12 -3
  115. package/lib/receipt-accumulator.js.map +1 -1
  116. package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +1 -1
  117. package/lib/rendezvous/MSC4108SignInWithQR.js +10 -23
  118. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
  119. package/lib/rendezvous/channels/MSC4108SecureChannel.js +5 -10
  120. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  121. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +5 -15
  122. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
  123. package/lib/room-hierarchy.js +7 -12
  124. package/lib/room-hierarchy.js.map +1 -1
  125. package/lib/rust-crypto/DehydratedDeviceManager.js +2 -3
  126. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
  127. package/lib/rust-crypto/KeyClaimManager.js +1 -2
  128. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  129. package/lib/rust-crypto/OutgoingRequestProcessor.js +11 -4
  130. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  131. package/lib/rust-crypto/OutgoingRequestsManager.js +12 -12
  132. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  133. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +3 -5
  134. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
  135. package/lib/rust-crypto/RoomEncryptor.js +6 -6
  136. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  137. package/lib/rust-crypto/backup.js +22 -16
  138. package/lib/rust-crypto/backup.js.map +1 -1
  139. package/lib/rust-crypto/device-converter.js +13 -4
  140. package/lib/rust-crypto/device-converter.js.map +1 -1
  141. package/lib/rust-crypto/index.js +1 -3
  142. package/lib/rust-crypto/index.js.map +1 -1
  143. package/lib/rust-crypto/libolm_migration.js +13 -15
  144. package/lib/rust-crypto/libolm_migration.js.map +1 -1
  145. package/lib/rust-crypto/rust-crypto.js +52 -59
  146. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  147. package/lib/rust-crypto/verification.js +10 -10
  148. package/lib/rust-crypto/verification.js.map +1 -1
  149. package/lib/scheduler.js +2 -2
  150. package/lib/scheduler.js.map +1 -1
  151. package/lib/secret-storage.js +16 -10
  152. package/lib/secret-storage.js.map +1 -1
  153. package/lib/serverCapabilities.js +2 -5
  154. package/lib/serverCapabilities.js.map +1 -1
  155. package/lib/sliding-sync-sdk.js +4 -9
  156. package/lib/sliding-sync-sdk.js.map +1 -1
  157. package/lib/sliding-sync.js +4 -9
  158. package/lib/sliding-sync.js.map +1 -1
  159. package/lib/store/indexeddb-local-backend.js +13 -8
  160. package/lib/store/indexeddb-local-backend.js.map +1 -1
  161. package/lib/store/indexeddb-remote-backend.js +6 -7
  162. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  163. package/lib/store/indexeddb-store-worker.js +1 -2
  164. package/lib/store/indexeddb-store-worker.js.map +1 -1
  165. package/lib/store/indexeddb.js +4 -2
  166. package/lib/store/indexeddb.js.map +1 -1
  167. package/lib/store/memory.js +0 -4
  168. package/lib/store/memory.js.map +1 -1
  169. package/lib/sync-accumulator.js +2 -4
  170. package/lib/sync-accumulator.js.map +1 -1
  171. package/lib/sync.js +36 -43
  172. package/lib/sync.js.map +1 -1
  173. package/lib/timeline-window.js +2 -6
  174. package/lib/timeline-window.js.map +1 -1
  175. package/lib/utils/decryptAESSecretStorageItem.js +5 -1
  176. package/lib/utils/decryptAESSecretStorageItem.js.map +1 -1
  177. package/lib/utils/encryptAESSecretStorageItem.js +5 -1
  178. package/lib/utils/encryptAESSecretStorageItem.js.map +1 -1
  179. package/lib/utils.js +35 -20
  180. package/lib/utils.js.map +1 -1
  181. package/lib/webrtc/call.js +13 -45
  182. package/lib/webrtc/call.js.map +1 -1
  183. package/lib/webrtc/callEventHandler.js +0 -5
  184. package/lib/webrtc/callEventHandler.js.map +1 -1
  185. package/lib/webrtc/callFeed.js +0 -15
  186. package/lib/webrtc/callFeed.js.map +1 -1
  187. package/lib/webrtc/groupCall.js +82 -89
  188. package/lib/webrtc/groupCall.js.map +1 -1
  189. package/lib/webrtc/groupCallEventHandler.js +6 -7
  190. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  191. package/lib/webrtc/mediaHandler.js +8 -15
  192. package/lib/webrtc/mediaHandler.js.map +1 -1
  193. package/lib/webrtc/stats/callStatsReportGatherer.js +2 -5
  194. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  195. package/lib/webrtc/stats/connectionStatsReportBuilder.js +5 -1
  196. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -1
  197. package/lib/webrtc/stats/groupCallStats.js +3 -4
  198. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  199. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  200. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  201. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
  202. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  203. package/package.json +3 -3
  204. package/src/rendezvous/MSC4108SignInWithQR.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MSC4108SignInWithQR.js","names":["QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MatrixError","sleep","generateScope","OAuthGrantType","startDeviceAuthorization","waitForDeviceAuthorization","PayloadType","isDeviceAuthorizationGrantProtocolPayload","payload","protocol","MSC4108SignInWithQR","checkCode","_this$channel","channel","getCheckCode","constructor","didScanCode","client","onFailure","_defineProperty","ourIntent","Reciprocate","Login","code","_code","generateCode","_this","_asyncToGenerator","getDomain","isExistingDevice","isNewDevice","negotiateProtocols","_this2","info","concat","connect","_oidcClientConfig","oidcClientConfig","getAuthMetadata","e","error","grant_types_supported","includes","DeviceAuthorization","send","type","Protocols","protocols","homeserver","Failure","reason","UnsupportedProtocol","receive","UnexpectedMessageReceived","serverName","deviceAuthorizationGrant","input","_this3","_dagResponse$verifica","Error","metadata","clientId","deviceId","scope","dagResponse","grantInProgress","Protocol","device_id","device_authorization_grant","verification_uri","verification_uri_complete","verificationUri","userCode","user_code","dag","expectingNewDeviceId","verificationUriComplete","deviceAlreadyExists","_this3$client","getDevice","err","httpStatus","DeviceAlreadyExists","completeLoginOnNewDevice","_ref","_this4","ProtocolAccepted","res","session","Unknown","AuthorizationExpired","UserCancelled","undefined","shareSecrets","_this5","Success","Secrets","secrets","Declined","UserDeclined","timeout","Date","now","_this5$client","device","secretsBundle","getCrypto","exportSecretsBundle","cancelled","_objectSpread","DeviceNotFound","_this6","secureReceive","_this7","secureSend","declineLoginOnExistingDevice","_this8","cancel","_this9","_this9$onFailure","call","close","_this0"],"sources":["../../src/rendezvous/MSC4108SignInWithQR.ts"],"sourcesContent":["/*\nCopyright 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 { QrCodeIntent } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"./index.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { logger } from \"../logger.ts\";\nimport { type MSC4108SecureChannel } from \"./channels/MSC4108SecureChannel.ts\";\nimport { MatrixError } from \"../http-api/index.ts\";\nimport { sleep } from \"../utils.ts\";\nimport {\n type DeviceAccessTokenResponse,\n type DeviceAuthorizationResponse,\n generateScope,\n OAuthGrantType,\n startDeviceAuthorization,\n type ValidatedAuthMetadata,\n waitForDeviceAuthorization,\n type OidcClientConfig,\n} from \"../oidc/index.ts\";\nimport { type CryptoApi } from \"../crypto-api/index.ts\";\n\n/**\n * Enum representing the payload types transmissible over [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure channels.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport enum PayloadType {\n Protocols = \"m.login.protocols\",\n Protocol = \"m.login.protocol\",\n Failure = \"m.login.failure\",\n Success = \"m.login.success\",\n Secrets = \"m.login.secrets\",\n ProtocolAccepted = \"m.login.protocol_accepted\",\n Declined = \"m.login.declined\",\n}\n\n/**\n * Type representing the base payload format for [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * messages sent over the secure channel.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport interface MSC4108Payload {\n type: PayloadType;\n}\n\ninterface ProtocolsPayload extends MSC4108Payload {\n type: PayloadType.Protocols;\n protocols: string[];\n homeserver: string;\n}\n\ninterface ProtocolPayload extends MSC4108Payload {\n type: PayloadType.Protocol;\n protocol: Exclude<string, \"device_authorization_grant\">;\n device_id: string;\n}\n\ninterface DeviceAuthorizationGrantProtocolPayload extends ProtocolPayload {\n protocol: \"device_authorization_grant\";\n device_authorization_grant: {\n verification_uri: string;\n verification_uri_complete?: string;\n };\n}\n\nfunction isDeviceAuthorizationGrantProtocolPayload(\n payload: ProtocolPayload,\n): payload is DeviceAuthorizationGrantProtocolPayload {\n return payload.protocol === \"device_authorization_grant\";\n}\n\ninterface FailurePayload extends MSC4108Payload {\n type: PayloadType.Failure;\n reason: MSC4108FailureReason;\n homeserver?: string;\n}\n\ninterface DeclinedPayload extends MSC4108Payload {\n type: PayloadType.Declined;\n}\n\ninterface SuccessPayload extends MSC4108Payload {\n type: PayloadType.Success;\n}\n\ninterface AcceptedPayload extends MSC4108Payload {\n type: PayloadType.ProtocolAccepted;\n}\n\ninterface SecretsPayload extends MSC4108Payload, Awaited<ReturnType<NonNullable<CryptoApi[\"exportSecretsBundle\"]>>> {\n type: PayloadType.Secrets;\n}\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * sign in with QR + OIDC flow.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC4108SignInWithQR {\n private readonly ourIntent: QrCodeIntent;\n private _code?: Uint8Array;\n private expectingNewDeviceId?: string;\n private metadata?: ValidatedAuthMetadata;\n private grantInProgress?: DeviceAuthorizationResponse;\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public get checkCode(): string | undefined {\n return this.channel?.getCheckCode();\n }\n\n /**\n * @param channel - The secure channel used for communication\n * @param client - The Matrix client in used on the device already logged in\n * @param didScanCode - Whether this side of the channel scanned the QR code from the other party\n * @param onFailure - Callback for when the rendezvous fails\n */\n public constructor(\n private readonly channel: MSC4108SecureChannel,\n private readonly didScanCode: boolean,\n private readonly client?: MatrixClient,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.ourIntent = client ? QrCodeIntent.Reciprocate : QrCodeIntent.Login;\n }\n\n /**\n * Returns the code representing the rendezvous suitable for rendering in a QR code or undefined if not generated yet.\n */\n public get code(): Uint8Array | undefined {\n return this._code;\n }\n\n /**\n * Generate the code including doing partial set up of the channel where required.\n */\n public async generateCode(): Promise<void> {\n if (this._code) {\n return;\n }\n\n if (this.ourIntent === QrCodeIntent.Reciprocate && this.client) {\n this._code = await this.channel.generateCode(this.ourIntent, this.client.getDomain()!);\n } else if (this.ourIntent === QrCodeIntent.Login) {\n this._code = await this.channel.generateCode(this.ourIntent);\n }\n }\n\n /**\n * Returns true if the device is the already logged in device reciprocating a new login on the other side of the channel.\n */\n public get isExistingDevice(): boolean {\n return this.ourIntent === QrCodeIntent.Reciprocate;\n }\n\n /**\n * Returns true if the device is the new device logging in being reciprocated by the device on the other side of the channel.\n */\n public get isNewDevice(): boolean {\n return !this.isExistingDevice;\n }\n\n /**\n * The first step in the OIDC QR login process.\n * To be called after the QR code has been rendered or scanned.\n * The scanning device has to discover the homeserver details, if they scanned the code then they already have it.\n * If the new device is the one rendering the QR code then it has to wait be sent the homeserver details via the rendezvous channel.\n */\n public async negotiateProtocols(): Promise<{ serverName?: string }> {\n logger.info(`negotiateProtocols(isNewDevice=${this.isNewDevice} didScanCode=${this.didScanCode})`);\n await this.channel.connect();\n\n if (this.didScanCode) {\n // Secure Channel step 6 completed, we trust the channel\n\n if (this.isNewDevice) {\n // MSC4108-Flow: ExistingScanned - take homeserver from QR code which should already be set\n } else {\n // MSC4108-Flow: NewScanned -send protocols message\n let oidcClientConfig: OidcClientConfig | undefined;\n try {\n oidcClientConfig = await this.client!.getAuthMetadata();\n } catch (e) {\n logger.error(\"Failed to discover OIDC metadata\", e);\n }\n\n if (oidcClientConfig?.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n await this.send<ProtocolsPayload>({\n type: PayloadType.Protocols,\n protocols: [\"device_authorization_grant\"],\n homeserver: this.client!.getDomain()!,\n });\n } else {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnsupportedProtocol,\n });\n throw new RendezvousError(\n \"Device code grant unsupported\",\n MSC4108FailureReason.UnsupportedProtocol,\n );\n }\n }\n } else if (this.isNewDevice) {\n // MSC4108-Flow: ExistingScanned - wait for protocols message\n logger.info(\"Waiting for protocols message\");\n const payload = await this.receive<ProtocolsPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Protocols) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n return { serverName: payload.homeserver };\n } else {\n // MSC4108-Flow: NewScanned - nothing to do\n }\n return {};\n }\n\n /**\n * The second & third step in the OIDC QR login process.\n * To be called after `negotiateProtocols` for the existing device.\n * To be called after OIDC negotiation for the new device.\n *\n * @param input - Required for the new device to start the device authorization grant, not required for the existing device reciprocating the login\n */\n public async deviceAuthorizationGrant(input?: {\n metadata: ValidatedAuthMetadata;\n clientId: string;\n deviceId: string;\n }): Promise<{\n verificationUri?: string;\n userCode?: string;\n }> {\n if (this.isNewDevice) {\n if (!input) {\n throw new Error(\"Input must be provided for new device\");\n }\n\n const { metadata, clientId, deviceId } = input;\n\n const scope = generateScope(deviceId);\n\n // MSC4108-Flow: NewDevice - start device authorization grant\n const dagResponse = await startDeviceAuthorization({\n clientId,\n scope,\n metadata,\n });\n\n this.metadata = metadata;\n this.grantInProgress = dagResponse;\n\n const protocol: DeviceAuthorizationGrantProtocolPayload = {\n type: PayloadType.Protocol,\n protocol: \"device_authorization_grant\",\n device_id: deviceId,\n device_authorization_grant: {\n verification_uri: dagResponse.verification_uri,\n verification_uri_complete: dagResponse.verification_uri_complete,\n },\n };\n\n await this.send(protocol);\n\n return {\n verificationUri: dagResponse.verification_uri_complete ?? dagResponse.verification_uri,\n userCode: dagResponse.user_code,\n };\n } else {\n // The user needs to do step 7 for the out-of-band confirmation\n // but, first we receive the protocol chosen by the other device so that\n // the confirmation_uri is ready to go\n logger.info(\"Waiting for protocol message\");\n const payload = await this.receive<ProtocolPayload | DeviceAuthorizationGrantProtocolPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Protocol) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n if (isDeviceAuthorizationGrantProtocolPayload(payload)) {\n const { device_authorization_grant: dag, device_id: expectingNewDeviceId } = payload;\n const { verification_uri: verificationUri, verification_uri_complete: verificationUriComplete } = dag;\n\n let deviceAlreadyExists = true;\n try {\n await this.client?.getDevice(expectingNewDeviceId);\n } catch (err: MatrixError | unknown) {\n if (err instanceof MatrixError && err.httpStatus === 404) {\n deviceAlreadyExists = false;\n }\n }\n\n if (deviceAlreadyExists) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.DeviceAlreadyExists,\n });\n throw new RendezvousError(\n \"Specified device ID already exists\",\n MSC4108FailureReason.DeviceAlreadyExists,\n );\n }\n\n this.expectingNewDeviceId = expectingNewDeviceId;\n\n return { verificationUri: verificationUriComplete ?? verificationUri };\n }\n\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnsupportedProtocol,\n });\n throw new RendezvousError(\n \"Received a request for an unsupported protocol\",\n MSC4108FailureReason.UnsupportedProtocol,\n );\n }\n }\n\n /**\n * The fourth step in the OIDC QR login process.\n * The reciprocating device must perform step 5 for this method to resolve.\n * To be called after {@link deviceAuthorizationGrant} only on the new device.\n */\n public async completeLoginOnNewDevice({\n clientId,\n }: {\n clientId: string;\n }): Promise<DeviceAccessTokenResponse | undefined> {\n if (!this.isNewDevice || !this.grantInProgress || !this.metadata) {\n throw new Error(\"Can only complete login on new device\");\n }\n\n logger.info(\"Waiting for protocol accepted message\");\n // wait for accepted message\n const payload = await this.receive<AcceptedPayload | FailurePayload>();\n\n if (!payload) {\n throw new RendezvousError(\n \"No response from existing device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n if (payload.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", (payload as FailurePayload).reason);\n }\n if (payload.type !== PayloadType.ProtocolAccepted) {\n throw new RendezvousError(\"Unexpected message received\", MSC4108FailureReason.UnexpectedMessageReceived);\n }\n\n // poll for DAG\n const res = await waitForDeviceAuthorization({\n session: this.grantInProgress,\n metadata: this.metadata,\n clientId,\n });\n\n if (!res) {\n throw new RendezvousError(\n \"No response from device authorization endpoint\",\n ClientRendezvousFailureReason.Unknown,\n );\n }\n\n if (\"error\" in res) {\n let reason: MSC4108FailureReason = MSC4108FailureReason.UnexpectedMessageReceived;\n if (res.error === \"expired_token\") {\n reason = MSC4108FailureReason.AuthorizationExpired;\n } else if (res.error === \"access_denied\") {\n reason = MSC4108FailureReason.UserCancelled;\n }\n const payload: FailurePayload = {\n type: PayloadType.Failure,\n reason,\n };\n await this.send(payload);\n return undefined;\n }\n\n return res;\n }\n\n /**\n * The fifth (and final) step in the OIDC QR login process.\n * To be called after the new device has completed authentication.\n */\n public async shareSecrets(): Promise<{ secrets?: Omit<SecretsPayload, \"type\"> }> {\n if (this.isNewDevice) {\n await this.send<SuccessPayload>({\n type: PayloadType.Success,\n });\n // then wait for secrets\n logger.info(\"Waiting for secrets message\");\n const payload = await this.receive<SecretsPayload>();\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Secrets) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n return { secrets: payload };\n // then done?\n } else {\n if (!this.expectingNewDeviceId) {\n throw new Error(\"No new device ID expected\");\n }\n await this.send<AcceptedPayload>({\n type: PayloadType.ProtocolAccepted,\n });\n\n logger.info(\"Waiting for outcome message\");\n const payload = await this.receive<SuccessPayload | DeclinedPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type === PayloadType.Declined) {\n throw new RendezvousError(\"User declined\", ClientRendezvousFailureReason.UserDeclined);\n }\n\n if (payload?.type !== PayloadType.Success) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\"Unexpected message\", MSC4108FailureReason.UnexpectedMessageReceived);\n }\n\n const timeout = Date.now() + 10000; // wait up to 10 seconds\n do {\n // is the device visible via the Homeserver?\n try {\n const device = await this.client?.getDevice(this.expectingNewDeviceId);\n\n if (device) {\n // if so, return the secrets\n const secretsBundle = await this.client!.getCrypto()!.exportSecretsBundle!();\n if (this.channel.cancelled) {\n throw new RendezvousError(\"User cancelled\", MSC4108FailureReason.UserCancelled);\n }\n // send secrets\n await this.send<SecretsPayload>({\n type: PayloadType.Secrets,\n ...secretsBundle,\n });\n return { secrets: secretsBundle };\n // let the other side close the rendezvous session\n }\n } catch (err: MatrixError | unknown) {\n if (err instanceof MatrixError && err.httpStatus === 404) {\n // not found, so keep waiting until timeout\n } else {\n throw err;\n }\n }\n await sleep(1000);\n } while (Date.now() < timeout);\n\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.DeviceNotFound,\n });\n throw new RendezvousError(\"New device not found\", MSC4108FailureReason.DeviceNotFound);\n }\n }\n\n private async receive<T extends MSC4108Payload>(): Promise<T | FailurePayload | undefined> {\n return (await this.channel.secureReceive()) as T | undefined;\n }\n\n private async send<T extends MSC4108Payload>(payload: T): Promise<void> {\n await this.channel.secureSend(payload);\n }\n\n /**\n * Decline the login on the existing device.\n */\n public async declineLoginOnExistingDevice(): Promise<void> {\n if (!this.isExistingDevice) {\n throw new Error(\"Can only decline login on existing device\");\n }\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UserCancelled,\n });\n }\n\n /**\n * Cancels the rendezvous session.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n this.onFailure?.(reason);\n await this.channel.cancel(reason);\n }\n\n /**\n * Closes the rendezvous session.\n */\n public async close(): Promise<void> {\n await this.channel.close();\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MSC4108SignInWithQR.js","names":["QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MatrixError","sleep","generateScope","OAuthGrantType","startDeviceAuthorization","waitForDeviceAuthorization","PayloadType","isDeviceAuthorizationGrantProtocolPayload","payload","protocol","MSC4108SignInWithQR","checkCode","_this$channel","channel","getCheckCode","constructor","didScanCode","client","onFailure","ourIntent","Reciprocate","Login","code","_code","generateCode","_this","_asyncToGenerator","getDomain","isExistingDevice","isNewDevice","negotiateProtocols","_this2","info","concat","connect","_oidcClientConfig","oidcClientConfig","getAuthMetadata","e","error","grant_types_supported","includes","DeviceAuthorization","send","type","Protocols","protocols","homeserver","Failure","reason","UnsupportedProtocol","receive","UnexpectedMessageReceived","serverName","deviceAuthorizationGrant","input","_this3","_dagResponse$verifica","Error","metadata","clientId","deviceId","scope","dagResponse","grantInProgress","Protocol","device_id","device_authorization_grant","verification_uri","verification_uri_complete","verificationUri","userCode","user_code","dag","expectingNewDeviceId","verificationUriComplete","deviceAlreadyExists","_this3$client","getDevice","err","httpStatus","DeviceAlreadyExists","completeLoginOnNewDevice","_ref","_this4","ProtocolAccepted","res","session","Unknown","AuthorizationExpired","UserCancelled","shareSecrets","_this5","Success","Secrets","secrets","Declined","UserDeclined","timeout","Date","now","_this5$client","device","secretsBundle","getCrypto","exportSecretsBundle","cancelled","_objectSpread","DeviceNotFound","_this6","secureReceive","_this7","secureSend","declineLoginOnExistingDevice","_this8","cancel","_this9","_this9$onFailure","call","close","_this0"],"sources":["../../src/rendezvous/MSC4108SignInWithQR.ts"],"sourcesContent":["/*\nCopyright 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 { QrCodeIntent } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"./index.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { logger } from \"../logger.ts\";\nimport { type MSC4108SecureChannel } from \"./channels/MSC4108SecureChannel.ts\";\nimport { MatrixError } from \"../http-api/index.ts\";\nimport { sleep } from \"../utils.ts\";\nimport {\n type DeviceAccessTokenResponse,\n type DeviceAuthorizationResponse,\n generateScope,\n OAuthGrantType,\n startDeviceAuthorization,\n type ValidatedAuthMetadata,\n waitForDeviceAuthorization,\n type OidcClientConfig,\n} from \"../oidc/index.ts\";\nimport { type CryptoApi } from \"../crypto-api/index.ts\";\n\n/**\n * Enum representing the payload types transmissible over [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure channels.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport enum PayloadType {\n Protocols = \"m.login.protocols\",\n Protocol = \"m.login.protocol\",\n Failure = \"m.login.failure\",\n Success = \"m.login.success\",\n Secrets = \"m.login.secrets\",\n ProtocolAccepted = \"m.login.protocol_accepted\",\n Declined = \"m.login.declined\",\n}\n\n/**\n * Type representing the base payload format for [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * messages sent over the secure channel.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport interface MSC4108Payload {\n type: PayloadType;\n}\n\ninterface ProtocolsPayload extends MSC4108Payload {\n type: PayloadType.Protocols;\n protocols: string[];\n homeserver: string;\n}\n\ninterface ProtocolPayload extends MSC4108Payload {\n type: PayloadType.Protocol;\n protocol: Exclude<string, \"device_authorization_grant\">;\n device_id: string;\n}\n\ninterface DeviceAuthorizationGrantProtocolPayload extends ProtocolPayload {\n protocol: \"device_authorization_grant\";\n device_authorization_grant: {\n verification_uri: string;\n verification_uri_complete?: string;\n };\n}\n\nfunction isDeviceAuthorizationGrantProtocolPayload(\n payload: ProtocolPayload,\n): payload is DeviceAuthorizationGrantProtocolPayload {\n return payload.protocol === \"device_authorization_grant\";\n}\n\ninterface FailurePayload extends MSC4108Payload {\n type: PayloadType.Failure;\n reason: MSC4108FailureReason;\n homeserver?: string;\n}\n\ninterface DeclinedPayload extends MSC4108Payload {\n type: PayloadType.Declined;\n}\n\ninterface SuccessPayload extends MSC4108Payload {\n type: PayloadType.Success;\n}\n\ninterface AcceptedPayload extends MSC4108Payload {\n type: PayloadType.ProtocolAccepted;\n}\n\ninterface SecretsPayload extends MSC4108Payload, Awaited<ReturnType<NonNullable<CryptoApi[\"exportSecretsBundle\"]>>> {\n type: PayloadType.Secrets;\n}\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * sign in with QR + OIDC flow.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC4108SignInWithQR {\n private readonly ourIntent: QrCodeIntent;\n private _code?: Uint8Array;\n private expectingNewDeviceId?: string;\n private metadata?: ValidatedAuthMetadata;\n private grantInProgress?: DeviceAuthorizationResponse;\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public get checkCode(): string | undefined {\n return this.channel?.getCheckCode();\n }\n\n /**\n * @param channel - The secure channel used for communication\n * @param client - The Matrix client in used on the device already logged in\n * @param didScanCode - Whether this side of the channel scanned the QR code from the other party\n * @param onFailure - Callback for when the rendezvous fails\n */\n public constructor(\n private readonly channel: MSC4108SecureChannel,\n private readonly didScanCode: boolean,\n private readonly client?: MatrixClient,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.ourIntent = client ? QrCodeIntent.Reciprocate : QrCodeIntent.Login;\n }\n\n /**\n * Returns the code representing the rendezvous suitable for rendering in a QR code or undefined if not generated yet.\n */\n public get code(): Uint8Array | undefined {\n return this._code;\n }\n\n /**\n * Generate the code including doing partial set up of the channel where required.\n */\n public async generateCode(): Promise<void> {\n if (this._code) {\n return;\n }\n\n if (this.ourIntent === QrCodeIntent.Reciprocate && this.client) {\n this._code = await this.channel.generateCode(this.ourIntent, this.client.getDomain()!);\n } else if (this.ourIntent === QrCodeIntent.Login) {\n this._code = await this.channel.generateCode(this.ourIntent);\n }\n }\n\n /**\n * Returns true if the device is the already logged in device reciprocating a new login on the other side of the channel.\n */\n public get isExistingDevice(): boolean {\n return this.ourIntent === QrCodeIntent.Reciprocate;\n }\n\n /**\n * Returns true if the device is the new device logging in being reciprocated by the device on the other side of the channel.\n */\n public get isNewDevice(): boolean {\n return !this.isExistingDevice;\n }\n\n /**\n * The first step in the OIDC QR login process.\n * To be called after the QR code has been rendered or scanned.\n * The scanning device has to discover the homeserver details, if they scanned the code then they already have it.\n * If the new device is the one rendering the QR code then it has to wait be sent the homeserver details via the rendezvous channel.\n */\n public async negotiateProtocols(): Promise<{ serverName?: string }> {\n logger.info(`negotiateProtocols(isNewDevice=${this.isNewDevice} didScanCode=${this.didScanCode})`);\n await this.channel.connect();\n\n if (this.didScanCode) {\n // Secure Channel step 6 completed, we trust the channel\n\n if (this.isNewDevice) {\n // MSC4108-Flow: ExistingScanned - take homeserver from QR code which should already be set\n } else {\n // MSC4108-Flow: NewScanned -send protocols message\n let oidcClientConfig: OidcClientConfig | undefined;\n try {\n oidcClientConfig = await this.client!.getAuthMetadata();\n } catch (e) {\n logger.error(\"Failed to discover OIDC metadata\", e);\n }\n\n if (oidcClientConfig?.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n await this.send<ProtocolsPayload>({\n type: PayloadType.Protocols,\n protocols: [\"device_authorization_grant\"],\n homeserver: this.client!.getDomain()!,\n });\n } else {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnsupportedProtocol,\n });\n throw new RendezvousError(\n \"Device code grant unsupported\",\n MSC4108FailureReason.UnsupportedProtocol,\n );\n }\n }\n } else if (this.isNewDevice) {\n // MSC4108-Flow: ExistingScanned - wait for protocols message\n logger.info(\"Waiting for protocols message\");\n const payload = await this.receive<ProtocolsPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Protocols) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n return { serverName: payload.homeserver };\n } else {\n // MSC4108-Flow: NewScanned - nothing to do\n }\n return {};\n }\n\n /**\n * The second & third step in the OIDC QR login process.\n * To be called after `negotiateProtocols` for the existing device.\n * To be called after OIDC negotiation for the new device.\n *\n * @param input - Required for the new device to start the device authorization grant, not required for the existing device reciprocating the login\n */\n public async deviceAuthorizationGrant(input?: {\n metadata: ValidatedAuthMetadata;\n clientId: string;\n deviceId: string;\n }): Promise<{\n verificationUri?: string;\n userCode?: string;\n }> {\n if (this.isNewDevice) {\n if (!input) {\n throw new Error(\"Input must be provided for new device\");\n }\n\n const { metadata, clientId, deviceId } = input;\n\n const scope = generateScope(deviceId);\n\n // MSC4108-Flow: NewDevice - start device authorization grant\n const dagResponse = await startDeviceAuthorization({\n clientId,\n scope,\n metadata,\n });\n\n this.metadata = metadata;\n this.grantInProgress = dagResponse;\n\n const protocol: DeviceAuthorizationGrantProtocolPayload = {\n type: PayloadType.Protocol,\n protocol: \"device_authorization_grant\",\n device_id: deviceId,\n device_authorization_grant: {\n verification_uri: dagResponse.verification_uri,\n verification_uri_complete: dagResponse.verification_uri_complete,\n },\n };\n\n await this.send(protocol);\n\n return {\n verificationUri: dagResponse.verification_uri_complete ?? dagResponse.verification_uri,\n userCode: dagResponse.user_code,\n };\n } else {\n // The user needs to do step 7 for the out-of-band confirmation\n // but, first we receive the protocol chosen by the other device so that\n // the confirmation_uri is ready to go\n logger.info(\"Waiting for protocol message\");\n const payload = await this.receive<ProtocolPayload | DeviceAuthorizationGrantProtocolPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Protocol) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n if (isDeviceAuthorizationGrantProtocolPayload(payload)) {\n const { device_authorization_grant: dag, device_id: expectingNewDeviceId } = payload;\n const { verification_uri: verificationUri, verification_uri_complete: verificationUriComplete } = dag;\n\n let deviceAlreadyExists = true;\n try {\n await this.client?.getDevice(expectingNewDeviceId);\n } catch (err: MatrixError | unknown) {\n if (err instanceof MatrixError && err.httpStatus === 404) {\n deviceAlreadyExists = false;\n }\n }\n\n if (deviceAlreadyExists) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.DeviceAlreadyExists,\n });\n throw new RendezvousError(\n \"Specified device ID already exists\",\n MSC4108FailureReason.DeviceAlreadyExists,\n );\n }\n\n this.expectingNewDeviceId = expectingNewDeviceId;\n\n return { verificationUri: verificationUriComplete ?? verificationUri };\n }\n\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnsupportedProtocol,\n });\n throw new RendezvousError(\n \"Received a request for an unsupported protocol\",\n MSC4108FailureReason.UnsupportedProtocol,\n );\n }\n }\n\n /**\n * The fourth step in the OIDC QR login process.\n * The reciprocating device must perform step 5 for this method to resolve.\n * To be called after {@link deviceAuthorizationGrant} only on the new device.\n */\n public async completeLoginOnNewDevice({\n clientId,\n }: {\n clientId: string;\n }): Promise<DeviceAccessTokenResponse | undefined> {\n if (!this.isNewDevice || !this.grantInProgress || !this.metadata) {\n throw new Error(\"Can only complete login on new device\");\n }\n\n logger.info(\"Waiting for protocol accepted message\");\n // wait for accepted message\n const payload = await this.receive<AcceptedPayload | FailurePayload>();\n\n if (!payload) {\n throw new RendezvousError(\n \"No response from existing device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n if (payload.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", (payload as FailurePayload).reason);\n }\n if (payload.type !== PayloadType.ProtocolAccepted) {\n throw new RendezvousError(\"Unexpected message received\", MSC4108FailureReason.UnexpectedMessageReceived);\n }\n\n // poll for DAG\n const res = await waitForDeviceAuthorization({\n session: this.grantInProgress,\n metadata: this.metadata,\n clientId,\n });\n\n if (!res) {\n throw new RendezvousError(\n \"No response from device authorization endpoint\",\n ClientRendezvousFailureReason.Unknown,\n );\n }\n\n if (\"error\" in res) {\n let reason: MSC4108FailureReason = MSC4108FailureReason.UnexpectedMessageReceived;\n if (res.error === \"expired_token\") {\n reason = MSC4108FailureReason.AuthorizationExpired;\n } else if (res.error === \"access_denied\") {\n reason = MSC4108FailureReason.UserCancelled;\n }\n const payload: FailurePayload = {\n type: PayloadType.Failure,\n reason,\n };\n await this.send(payload);\n\n throw new RendezvousError(\"Rejection from device authorization endpoint\", reason);\n }\n\n return res;\n }\n\n /**\n * The fifth (and final) step in the OIDC QR login process.\n * To be called after the new device has completed authentication.\n */\n public async shareSecrets(): Promise<{ secrets?: Omit<SecretsPayload, \"type\"> }> {\n if (this.isNewDevice) {\n await this.send<SuccessPayload>({\n type: PayloadType.Success,\n });\n // then wait for secrets\n logger.info(\"Waiting for secrets message\");\n const payload = await this.receive<SecretsPayload>();\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type !== PayloadType.Secrets) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\n \"Unexpected message received\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n return { secrets: payload };\n // then done?\n } else {\n if (!this.expectingNewDeviceId) {\n throw new Error(\"No new device ID expected\");\n }\n await this.send<AcceptedPayload>({\n type: PayloadType.ProtocolAccepted,\n });\n\n logger.info(\"Waiting for outcome message\");\n const payload = await this.receive<SuccessPayload | DeclinedPayload>();\n\n if (payload?.type === PayloadType.Failure) {\n throw new RendezvousError(\"Failed\", payload.reason);\n }\n\n if (payload?.type === PayloadType.Declined) {\n throw new RendezvousError(\"User declined\", ClientRendezvousFailureReason.UserDeclined);\n }\n\n if (payload?.type !== PayloadType.Success) {\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UnexpectedMessageReceived,\n });\n throw new RendezvousError(\"Unexpected message\", MSC4108FailureReason.UnexpectedMessageReceived);\n }\n\n const timeout = Date.now() + 10000; // wait up to 10 seconds\n do {\n // is the device visible via the Homeserver?\n try {\n const device = await this.client?.getDevice(this.expectingNewDeviceId);\n\n if (device) {\n // if so, return the secrets\n const secretsBundle = await this.client!.getCrypto()!.exportSecretsBundle!();\n if (this.channel.cancelled) {\n throw new RendezvousError(\"User cancelled\", MSC4108FailureReason.UserCancelled);\n }\n // send secrets\n await this.send<SecretsPayload>({\n type: PayloadType.Secrets,\n ...secretsBundle,\n });\n return { secrets: secretsBundle };\n // let the other side close the rendezvous session\n }\n } catch (err: MatrixError | unknown) {\n if (err instanceof MatrixError && err.httpStatus === 404) {\n // not found, so keep waiting until timeout\n } else {\n throw err;\n }\n }\n await sleep(1000);\n } while (Date.now() < timeout);\n\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.DeviceNotFound,\n });\n throw new RendezvousError(\"New device not found\", MSC4108FailureReason.DeviceNotFound);\n }\n }\n\n private async receive<T extends MSC4108Payload>(): Promise<T | FailurePayload | undefined> {\n return (await this.channel.secureReceive()) as T | undefined;\n }\n\n private async send<T extends MSC4108Payload>(payload: T): Promise<void> {\n await this.channel.secureSend(payload);\n }\n\n /**\n * Decline the login on the existing device.\n */\n public async declineLoginOnExistingDevice(): Promise<void> {\n if (!this.isExistingDevice) {\n throw new Error(\"Can only decline login on existing device\");\n }\n await this.send<FailurePayload>({\n type: PayloadType.Failure,\n reason: MSC4108FailureReason.UserCancelled,\n });\n }\n\n /**\n * Cancels the rendezvous session.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n this.onFailure?.(reason);\n await this.channel.cancel(reason);\n }\n\n /**\n * Closes the rendezvous session.\n */\n public async close(): Promise<void> {\n await this.channel.close();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -28,12 +28,10 @@ import { logger } from "../../logger.js";
28
28
  */
29
29
  export class MSC4108SecureChannel {
30
30
  constructor(rendezvousSession, theirPublicKey, onFailure) {
31
+ _defineProperty(this, "connected", false);
31
32
  this.rendezvousSession = rendezvousSession;
32
33
  this.theirPublicKey = theirPublicKey;
33
34
  this.onFailure = onFailure;
34
- _defineProperty(this, "secureChannel", void 0);
35
- _defineProperty(this, "establishedChannel", void 0);
36
- _defineProperty(this, "connected", false);
37
35
  this.secureChannel = new Ecies();
38
36
  }
39
37
 
@@ -46,9 +44,7 @@ export class MSC4108SecureChannel {
46
44
  generateCode(mode, serverName) {
47
45
  var _this = this;
48
46
  return _asyncToGenerator(function* () {
49
- var {
50
- url
51
- } = _this.rendezvousSession;
47
+ var url = _this.rendezvousSession.url;
52
48
  if (!url) {
53
49
  throw new Error("No rendezvous session URL");
54
50
  }
@@ -134,10 +130,9 @@ export class MSC4108SecureChannel {
134
130
  if (!loginInitiateMessage) {
135
131
  throw new RendezvousError("No response from other device", MSC4108FailureReason.UnexpectedMessageReceived);
136
132
  }
137
- var {
138
- channel,
139
- message: candidateLoginInitiateMessage
140
- } = _this2.secureChannel.establish_inbound_channel(loginInitiateMessage);
133
+ var _this2$secureChannel$ = _this2.secureChannel.establish_inbound_channel(loginInitiateMessage),
134
+ channel = _this2$secureChannel$.channel,
135
+ candidateLoginInitiateMessage = _this2$secureChannel$.message;
141
136
  _this2.establishedChannel = channel;
142
137
  if (candidateLoginInitiateMessage !== "MATRIX_QR_CODE_LOGIN_INITIATE") {
143
138
  throw new RendezvousError("Invalid response from other device", ClientRendezvousFailureReason.InsecureChannelDetected);
@@ -1 +1 @@
1
- {"version":3,"file":"MSC4108SecureChannel.js","names":["Ecies","QrCodeData","QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MSC4108SecureChannel","constructor","rendezvousSession","theirPublicKey","onFailure","_defineProperty","secureChannel","generateCode","mode","serverName","_this","_asyncToGenerator","url","Error","public_key","Reciprocate","undefined","toBytes","getCheckCode","_this$establishedChan","x","establishedChannel","check_code","Array","from","as_bytes","map","b","concat","join","connect","_this2","connected","result","establish_outbound_channel","channel","info","send","initial_message","ciphertext","receive","UnexpectedMessageReceived","candidateLoginOkMessage","decrypt","InsecureChannelDetected","loginInitiateMessage","message","candidateLoginInitiateMessage","establish_inbound_channel","loginOkMessage","encrypt","_this3","plaintext","_this4","secureSend","payload","_this5","stringifiedPayload","JSON","stringify","debug","type","secureReceive","_this6","json","parse","close","_this7","cancel","reason","_this8","_this8$onFailure","call","UserDeclined","UserCancelled","cancelled"],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 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 {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAEIA,KAAK,EAELC,UAAU,EACVC,YAAY,QACT,oCAAoC;AAE3C,SACIC,6BAA6B,EAC7BC,oBAAoB,EAEpBC,eAAe,QAEZ,aAAa;AAEpB,SAASC,MAAM,QAAQ,iBAAiB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,CAAC;EAKvBC,WAAWA,CACNC,iBAA2C,EAC3CC,cAAoC,EACrCC,SAAqC,EAC9C;IAAA,KAHUF,iBAA2C,GAA3CA,iBAA2C;IAAA,KAC3CC,cAAoC,GAApCA,cAAoC;IAAA,KACrCC,SAAqC,GAArCA,SAAqC;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA,oBAL5B,KAAK;IAOrB,IAAI,CAACC,aAAa,GAAG,IAAIb,KAAK,CAAC,CAAC;EACpC;;EAEA;AACJ;AACA;AACA;AACA;;EAGiBc,YAAYA,CAACC,IAAkB,EAAEC,UAAmB,EAAuB;IAAA,IAAAC,KAAA;IAAA,OAAAC,iBAAA;MACpF,IAAM;QAAEC;MAAI,CAAC,GAAGF,KAAI,CAACR,iBAAiB;MAEtC,IAAI,CAACU,GAAG,EAAE;QACN,MAAM,IAAIC,KAAK,CAAC,2BAA2B,CAAC;MAChD;MAEA,OAAO,IAAInB,UAAU,CACjBgB,KAAI,CAACJ,aAAa,CAACQ,UAAU,CAAC,CAAC,EAC/BF,GAAG,EACHJ,IAAI,KAAKb,YAAY,CAACoB,WAAW,GAAGN,UAAU,GAAGO,SACrD,CAAC,CAACC,OAAO,CAAC,CAAC;IAAC;EAChB;;EAEA;AACJ;AACA;EACWC,YAAYA,CAAA,EAAuB;IAAA,IAAAC,qBAAA;IACtC,IAAMC,CAAC,IAAAD,qBAAA,GAAG,IAAI,CAACE,kBAAkB,cAAAF,qBAAA,uBAAvBA,qBAAA,CAAyBG,UAAU,CAAC,CAAC;IAE/C,IAAI,CAACF,CAAC,EAAE;MACJ,OAAOJ,SAAS;IACpB;IACA,OAAOO,KAAK,CAACC,IAAI,CAACJ,CAAC,CAACK,QAAQ,CAAC,CAAC,CAAC,CAC1BC,GAAG,CAAEC,CAAC,OAAAC,MAAA,CAAQD,CAAC,GAAG,EAAE,CAAE,CAAC,CACvBE,IAAI,CAAC,EAAE,CAAC;EACjB;;EAEA;AACJ;AACA;EACiBC,OAAOA,CAAA,EAAkB;IAAA,IAAAC,MAAA;IAAA,OAAApB,iBAAA;MAClC,IAAIoB,MAAI,CAACC,SAAS,EAAE;QAChB,MAAM,IAAInB,KAAK,CAAC,2BAA2B,CAAC;MAChD;MAEA,IAAIkB,MAAI,CAAC5B,cAAc,EAAE;QACrB;QACA,IAAM8B,MAAM,GAAGF,MAAI,CAACzB,aAAa,CAAC4B,0BAA0B,CACxDH,MAAI,CAAC5B,cAAc,EACnB,+BACJ,CAAC;QACD4B,MAAI,CAACV,kBAAkB,GAAGY,MAAM,CAACE,OAAO;;QAExC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;QAEY;UACIpC,MAAM,CAACqC,IAAI,CAAC,8BAA8B,CAAC;UAC3C,MAAML,MAAI,CAAC7B,iBAAiB,CAACmC,IAAI,CAACJ,MAAM,CAACK,eAAe,CAAC;QAC7D;;QAEA;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;QAGY;UACIvC,MAAM,CAACqC,IAAI,CAAC,4BAA4B,CAAC;UACzC,IAAMG,UAAU,SAASR,MAAI,CAAC7B,iBAAiB,CAACsC,OAAO,CAAC,CAAC;UAEzD,IAAI,CAACD,UAAU,EAAE;YACb,MAAM,IAAIzC,eAAe,CACrB,+BAA+B,EAC/BD,oBAAoB,CAAC4C,yBACzB,CAAC;UACL;UACA,IAAMC,uBAAuB,SAASX,MAAI,CAACY,OAAO,CAACJ,UAAU,CAAC;UAE9D,IAAIG,uBAAuB,KAAK,yBAAyB,EAAE;YACvD,MAAM,IAAI5C,eAAe,CACrB,oCAAoC,EACpCF,6BAA6B,CAACgD,uBAClC,CAAC;UACL;;UAEA;QACJ;MACJ,CAAC,MAAM;QACH;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;QAEY;QACA7C,MAAM,CAACqC,IAAI,CAAC,kCAAkC,CAAC;QAC/C,IAAMS,oBAAoB,SAASd,MAAI,CAAC7B,iBAAiB,CAACsC,OAAO,CAAC,CAAC;QACnE,IAAI,CAACK,oBAAoB,EAAE;UACvB,MAAM,IAAI/C,eAAe,CACrB,+BAA+B,EAC/BD,oBAAoB,CAAC4C,yBACzB,CAAC;QACL;QAEA,IAAM;UAAEN,OAAO;UAAEW,OAAO,EAAEC;QAA8B,CAAC,GACrDhB,MAAI,CAACzB,aAAa,CAAC0C,yBAAyB,CAACH,oBAAoB,CAAC;QACtEd,MAAI,CAACV,kBAAkB,GAAGc,OAAO;QAEjC,IAAIY,6BAA6B,KAAK,+BAA+B,EAAE;UACnE,MAAM,IAAIjD,eAAe,CACrB,oCAAoC,EACpCF,6BAA6B,CAACgD,uBAClC,CAAC;QACL;QACA7C,MAAM,CAACqC,IAAI,CAAC,+BAA+B,CAAC;QAE5CrC,MAAM,CAACqC,IAAI,CAAC,wBAAwB,CAAC;QACrC,IAAMa,cAAc,SAASlB,MAAI,CAACmB,OAAO,CAAC,yBAAyB,CAAC;QACpE,MAAMnB,MAAI,CAAC7B,iBAAiB,CAACmC,IAAI,CAACY,cAAc,CAAC;;QAEjD;;QAEA;MACJ;MAEAlB,MAAI,CAACC,SAAS,GAAG,IAAI;IAAC;EAC1B;EAEcW,OAAOA,CAACJ,UAAkB,EAAmB;IAAA,IAAAY,MAAA;IAAA,OAAAxC,iBAAA;MACvD,IAAI,CAACwC,MAAI,CAAC9B,kBAAkB,EAAE;QAC1B,MAAM,IAAIR,KAAK,CAAC,gBAAgB,CAAC;MACrC;MAEA,OAAOsC,MAAI,CAAC9B,kBAAkB,CAACsB,OAAO,CAACJ,UAAU,CAAC;IAAC;EACvD;EAEcW,OAAOA,CAACE,SAAiB,EAAmB;IAAA,IAAAC,MAAA;IAAA,OAAA1C,iBAAA;MACtD,IAAI,CAAC0C,MAAI,CAAChC,kBAAkB,EAAE;QAC1B,MAAM,IAAIR,KAAK,CAAC,gBAAgB,CAAC;MACrC;MAEA,OAAOwC,MAAI,CAAChC,kBAAkB,CAAC6B,OAAO,CAACE,SAAS,CAAC;IAAC;EACtD;;EAEA;AACJ;AACA;AACA;EACiBE,UAAUA,CAA2BC,OAAU,EAAiB;IAAA,IAAAC,MAAA;IAAA,OAAA7C,iBAAA;MACzE,IAAI,CAAC6C,MAAI,CAACxB,SAAS,EAAE;QACjB,MAAM,IAAInB,KAAK,CAAC,gBAAgB,CAAC;MACrC;MAEA,IAAM4C,kBAAkB,GAAGC,IAAI,CAACC,SAAS,CAACJ,OAAO,CAAC;MAClDxD,MAAM,CAAC6D,KAAK,kBAAAhC,MAAA,CAAgB8B,IAAI,CAACC,SAAS,CAACJ,OAAO,CAACM,IAAI,CAAC,WAAQ,CAAC;MAEjE,MAAML,MAAI,CAACtD,iBAAiB,CAACmC,IAAI,OAAOmB,MAAI,CAACN,OAAO,CAACO,kBAAkB,CAAC,CAAC;IAAC;EAC9E;;EAEA;AACJ;AACA;EACiBK,aAAaA,CAAA,EAA8D;IAAA,IAAAC,MAAA;IAAA,OAAApD,iBAAA;MACpF,IAAI,CAACoD,MAAI,CAAC1C,kBAAkB,EAAE;QAC1B,MAAM,IAAIR,KAAK,CAAC,gBAAgB,CAAC;MACrC;MAEA,IAAM0B,UAAU,SAASwB,MAAI,CAAC7D,iBAAiB,CAACsC,OAAO,CAAC,CAAC;MACzD,IAAI,CAACD,UAAU,EAAE;QACb,OAAOvB,SAAS;MACpB;MACA,IAAMoC,SAAS,SAASW,MAAI,CAACpB,OAAO,CAACJ,UAAU,CAAC;MAChD,IAAMyB,IAAI,GAAGN,IAAI,CAACO,KAAK,CAACb,SAAS,CAAC;MAElCrD,MAAM,CAAC6D,KAAK,kBAAAhC,MAAA,CAAgB8B,IAAI,CAACC,SAAS,CAACK,IAAI,CAACH,IAAI,CAAC,WAAQ,CAAC;MAC9D,OAAOG,IAAI;IAA2B;EAC1C;;EAEA;AACJ;AACA;EACiBE,KAAKA,CAAA,EAAkB;IAAA,IAAAC,MAAA;IAAA,OAAAxD,iBAAA;MAChC,MAAMwD,MAAI,CAACjE,iBAAiB,CAACgE,KAAK,CAAC,CAAC;IAAC;EACzC;;EAEA;AACJ;AACA;AACA;EACiBE,MAAMA,CAACC,MAA4D,EAAiB;IAAA,IAAAC,MAAA;IAAA,OAAA3D,iBAAA;MAC7F,IAAI;QAAA,IAAA4D,gBAAA;QACA,MAAMD,MAAI,CAACpE,iBAAiB,CAACkE,MAAM,CAACC,MAAM,CAAC;QAC3C,CAAAE,gBAAA,GAAAD,MAAI,CAAClE,SAAS,cAAAmE,gBAAA,eAAdA,gBAAA,CAAAC,IAAA,CAAAF,MAAI,EAAaD,MAAM,CAAC;MAC5B,CAAC,SAAS;QACN,IACIA,MAAM,KAAKzE,6BAA6B,CAAC6E,YAAY,IACrDJ,MAAM,KAAKxE,oBAAoB,CAAC6E,aAAa,EAC/C;UACE,MAAMJ,MAAI,CAACJ,KAAK,CAAC,CAAC;QACtB;MACJ;IAAC;EACL;;EAEA;AACJ;AACA;EACI,IAAWS,SAASA,CAAA,EAAY;IAC5B,OAAO,IAAI,CAACzE,iBAAiB,CAACyE,SAAS;EAC3C;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"MSC4108SecureChannel.js","names":["Ecies","QrCodeData","QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MSC4108SecureChannel","constructor","rendezvousSession","theirPublicKey","onFailure","_defineProperty","secureChannel","generateCode","mode","serverName","_this","_asyncToGenerator","url","Error","public_key","Reciprocate","undefined","toBytes","getCheckCode","_this$establishedChan","x","establishedChannel","check_code","Array","from","as_bytes","map","b","concat","join","connect","_this2","connected","result","establish_outbound_channel","channel","info","send","initial_message","ciphertext","receive","UnexpectedMessageReceived","candidateLoginOkMessage","decrypt","InsecureChannelDetected","loginInitiateMessage","_this2$secureChannel$","establish_inbound_channel","candidateLoginInitiateMessage","message","loginOkMessage","encrypt","_this3","plaintext","_this4","secureSend","payload","_this5","stringifiedPayload","JSON","stringify","debug","type","secureReceive","_this6","json","parse","close","_this7","cancel","reason","_this8","_this8$onFailure","call","UserDeclined","UserCancelled","cancelled"],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 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 {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -29,21 +29,11 @@ import { ClientPrefix } from "../../http-api/index.js";
29
29
  */
30
30
  export class MSC4108RendezvousSession {
31
31
  constructor(_ref) {
32
- var {
33
- fetchFn,
34
- onFailure,
35
- url,
36
- client,
37
- fallbackRzServer
38
- } = _ref;
39
- _defineProperty(this, "url", void 0);
40
- _defineProperty(this, "client", void 0);
41
- _defineProperty(this, "fallbackRzServer", void 0);
42
- _defineProperty(this, "fetchFn", void 0);
43
- _defineProperty(this, "onFailure", void 0);
44
- _defineProperty(this, "etag", void 0);
45
- _defineProperty(this, "expiresAt", void 0);
46
- _defineProperty(this, "expiresTimer", void 0);
32
+ var fetchFn = _ref.fetchFn,
33
+ onFailure = _ref.onFailure,
34
+ url = _ref.url,
35
+ client = _ref.client,
36
+ fallbackRzServer = _ref.fallbackRzServer;
47
37
  _defineProperty(this, "_cancelled", false);
48
38
  _defineProperty(this, "_ready", false);
49
39
  this.fetchFn = fetchFn;
@@ -1 +1 @@
1
- {"version":3,"file":"MSC4108RendezvousSession.js","names":["logger","sleep","ClientRendezvousFailureReason","MSC4108FailureReason","Method","ClientPrefix","MSC4108RendezvousSession","constructor","_ref","fetchFn","onFailure","url","client","fallbackRzServer","_defineProperty","ready","_ready","cancelled","_cancelled","fetch","resource","options","globalThis","getPostEndpoint","_this","_asyncToGenerator","doesServerSupportUnstableFeature","http","getUrl","undefined","Unstable","toString","err","warn","send","data","_this2","_this2$url","_res$headers$get","method","Put","Post","uri","Error","headers","etag","receive","info","concat","res","body","redirect","status","cancel","Unknown","get","expires","expiresTimer","clearTimeout","expiresAt","Date","setTimeout","Expired","getTime","now","json","_this3","_poll$headers$get","poll","Get","ETagMissing","text","reason","_this4","_this4$onFailure","call","UserDeclined","UserCancelled","close","_this5","Delete","e"],"sources":["../../../src/rendezvous/transports/MSC4108RendezvousSession.ts"],"sourcesContent":["/*\nCopyright 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 } from \"../../logger.ts\";\nimport { sleep } from \"../../utils.ts\";\nimport { ClientRendezvousFailureReason, MSC4108FailureReason, type RendezvousFailureListener } from \"../index.ts\";\nimport { type MatrixClient, Method } from \"../../matrix.ts\";\nimport { ClientPrefix } from \"../../http-api/index.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * insecure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC4108RendezvousSession {\n public url?: string;\n private readonly client?: MatrixClient;\n private readonly fallbackRzServer?: string;\n private readonly fetchFn?: typeof globalThis.fetch;\n public onFailure?: RendezvousFailureListener;\n private etag?: string;\n private expiresAt?: Date;\n private expiresTimer?: ReturnType<typeof setTimeout>;\n private _cancelled = false;\n private _ready = false;\n\n public constructor({\n onFailure,\n url,\n fetchFn,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n url: string;\n });\n public constructor({\n onFailure,\n client,\n fallbackRzServer,\n fetchFn,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n client?: MatrixClient;\n fallbackRzServer?: string;\n });\n public constructor({\n fetchFn,\n onFailure,\n url,\n client,\n fallbackRzServer,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n url?: string;\n client?: MatrixClient;\n fallbackRzServer?: string;\n }) {\n this.fetchFn = fetchFn;\n this.onFailure = onFailure;\n this.client = client;\n this.fallbackRzServer = fallbackRzServer;\n this.url = url;\n }\n\n /**\n * Returns whether the channel is ready to be used.\n */\n public get ready(): boolean {\n return this._ready;\n }\n\n /**\n * Returns whether the channel has been cancelled.\n */\n public get cancelled(): boolean {\n return this._cancelled;\n }\n\n private fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.fetchFn) {\n return this.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n private async getPostEndpoint(): Promise<string | undefined> {\n if (this.client) {\n try {\n if (await this.client.doesServerSupportUnstableFeature(\"org.matrix.msc4108\")) {\n return this.client.http\n .getUrl(\"/org.matrix.msc4108/rendezvous\", undefined, ClientPrefix.Unstable)\n .toString();\n }\n } catch (err) {\n logger.warn(\"Failed to get unstable features\", err);\n }\n }\n\n return this.fallbackRzServer;\n }\n\n /**\n * Sends data via the rendezvous channel.\n * @param data the payload to send\n */\n public async send(data: string): Promise<void> {\n if (this._cancelled) {\n return;\n }\n const method = this.url ? Method.Put : Method.Post;\n const uri = this.url ?? (await this.getPostEndpoint());\n\n if (!uri) {\n throw new Error(\"Invalid rendezvous URI\");\n }\n\n const headers: Record<string, string> = { \"content-type\": \"text/plain\" };\n\n // if we didn't create the rendezvous channel, we need to fetch the first etag if needed\n if (!this.etag && this.url) {\n await this.receive();\n }\n\n if (this.etag) {\n headers[\"if-match\"] = this.etag;\n }\n\n logger.info(`=> ${method} ${uri} with ${data} if-match: ${this.etag}`);\n\n const res = await this.fetch(uri, { method, headers, body: data, redirect: \"follow\" });\n if (res.status === 404) {\n return this.cancel(ClientRendezvousFailureReason.Unknown);\n }\n this.etag = res.headers.get(\"etag\") ?? undefined;\n\n logger.info(`Received etag: ${this.etag}`);\n\n if (method === Method.Post) {\n const expires = res.headers.get(\"expires\");\n if (expires) {\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n this.expiresAt = new Date(expires);\n this.expiresTimer = setTimeout(() => {\n this.expiresTimer = undefined;\n this.cancel(ClientRendezvousFailureReason.Expired);\n }, this.expiresAt.getTime() - Date.now());\n }\n // MSC4108: we expect a JSON response with a rendezvous URL\n const json = await res.json();\n if (typeof json.url !== \"string\") {\n throw new Error(\"No rendezvous URL given\");\n }\n this.url = json.url;\n this._ready = true;\n }\n }\n\n /**\n * Receives data from the rendezvous channel.\n * @return the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.\n */\n public async receive(): Promise<string | undefined> {\n if (!this.url) {\n throw new Error(\"Rendezvous not set up\");\n }\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (this._cancelled) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n if (this.etag) {\n headers[\"if-none-match\"] = this.etag;\n }\n\n logger.info(`=> GET ${this.url} if-none-match: ${this.etag}`);\n const poll = await this.fetch(this.url, { method: Method.Get, headers });\n\n if (poll.status === 404) {\n await this.cancel(ClientRendezvousFailureReason.Unknown);\n return undefined;\n }\n\n // rely on server expiring the channel rather than checking ourselves\n\n const etag = poll.headers.get(\"etag\") ?? undefined;\n if (poll.headers.get(\"content-type\") !== \"text/plain\") {\n this.etag = etag;\n } else if (poll.status === 200) {\n if (!etag) {\n // Some browsers & extensions block the ETag header for anti-tracking purposes\n // We try and detect this so the client can give the user a somewhat helpful message\n await this.cancel(ClientRendezvousFailureReason.ETagMissing);\n return undefined;\n }\n\n this.etag = etag;\n const text = await poll.text();\n logger.info(`Received: ${text} with etag ${this.etag}`);\n return text;\n }\n await sleep(1000);\n }\n }\n\n /**\n * Cancels the rendezvous channel.\n * If the reason is user_declined or user_cancelled then the channel will also be closed.\n * @param reason the reason to cancel with\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n if (this._cancelled) return;\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n\n if (\n reason === ClientRendezvousFailureReason.Unknown &&\n this.expiresAt &&\n this.expiresAt.getTime() < Date.now()\n ) {\n reason = ClientRendezvousFailureReason.Expired;\n }\n\n this._cancelled = true;\n this._ready = false;\n this.onFailure?.(reason);\n\n if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {\n await this.close();\n }\n }\n\n /**\n * Closes the rendezvous channel.\n */\n public async close(): Promise<void> {\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n\n if (!this.url) return;\n try {\n const method = Method.Delete;\n logger.info(`=> ${method} ${this.url}`);\n await this.fetch(this.url, { method });\n } catch (e) {\n logger.warn(e);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MSC4108RendezvousSession.js","names":["logger","sleep","ClientRendezvousFailureReason","MSC4108FailureReason","Method","ClientPrefix","MSC4108RendezvousSession","constructor","_ref","fetchFn","onFailure","url","client","fallbackRzServer","_defineProperty","ready","_ready","cancelled","_cancelled","fetch","resource","options","globalThis","getPostEndpoint","_this","_asyncToGenerator","doesServerSupportUnstableFeature","http","getUrl","undefined","Unstable","toString","err","warn","send","data","_this2","_this2$url","_res$headers$get","method","Put","Post","uri","Error","headers","etag","receive","info","concat","res","body","redirect","status","cancel","Unknown","get","expires","expiresTimer","clearTimeout","expiresAt","Date","setTimeout","Expired","getTime","now","json","_this3","_poll$headers$get","poll","Get","ETagMissing","text","reason","_this4","_this4$onFailure","call","UserDeclined","UserCancelled","close","_this5","Delete","e"],"sources":["../../../src/rendezvous/transports/MSC4108RendezvousSession.ts"],"sourcesContent":["/*\nCopyright 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 } from \"../../logger.ts\";\nimport { sleep } from \"../../utils.ts\";\nimport { ClientRendezvousFailureReason, MSC4108FailureReason, type RendezvousFailureListener } from \"../index.ts\";\nimport { type MatrixClient, Method } from \"../../matrix.ts\";\nimport { ClientPrefix } from \"../../http-api/index.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * insecure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC4108RendezvousSession {\n public url?: string;\n private readonly client?: MatrixClient;\n private readonly fallbackRzServer?: string;\n private readonly fetchFn?: typeof globalThis.fetch;\n public onFailure?: RendezvousFailureListener;\n private etag?: string;\n private expiresAt?: Date;\n private expiresTimer?: ReturnType<typeof setTimeout>;\n private _cancelled = false;\n private _ready = false;\n\n public constructor({\n onFailure,\n url,\n fetchFn,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n url: string;\n });\n public constructor({\n onFailure,\n client,\n fallbackRzServer,\n fetchFn,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n client?: MatrixClient;\n fallbackRzServer?: string;\n });\n public constructor({\n fetchFn,\n onFailure,\n url,\n client,\n fallbackRzServer,\n }: {\n fetchFn?: typeof globalThis.fetch;\n onFailure?: RendezvousFailureListener;\n url?: string;\n client?: MatrixClient;\n fallbackRzServer?: string;\n }) {\n this.fetchFn = fetchFn;\n this.onFailure = onFailure;\n this.client = client;\n this.fallbackRzServer = fallbackRzServer;\n this.url = url;\n }\n\n /**\n * Returns whether the channel is ready to be used.\n */\n public get ready(): boolean {\n return this._ready;\n }\n\n /**\n * Returns whether the channel has been cancelled.\n */\n public get cancelled(): boolean {\n return this._cancelled;\n }\n\n private fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.fetchFn) {\n return this.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n private async getPostEndpoint(): Promise<string | undefined> {\n if (this.client) {\n try {\n if (await this.client.doesServerSupportUnstableFeature(\"org.matrix.msc4108\")) {\n return this.client.http\n .getUrl(\"/org.matrix.msc4108/rendezvous\", undefined, ClientPrefix.Unstable)\n .toString();\n }\n } catch (err) {\n logger.warn(\"Failed to get unstable features\", err);\n }\n }\n\n return this.fallbackRzServer;\n }\n\n /**\n * Sends data via the rendezvous channel.\n * @param data the payload to send\n */\n public async send(data: string): Promise<void> {\n if (this._cancelled) {\n return;\n }\n const method = this.url ? Method.Put : Method.Post;\n const uri = this.url ?? (await this.getPostEndpoint());\n\n if (!uri) {\n throw new Error(\"Invalid rendezvous URI\");\n }\n\n const headers: Record<string, string> = { \"content-type\": \"text/plain\" };\n\n // if we didn't create the rendezvous channel, we need to fetch the first etag if needed\n if (!this.etag && this.url) {\n await this.receive();\n }\n\n if (this.etag) {\n headers[\"if-match\"] = this.etag;\n }\n\n logger.info(`=> ${method} ${uri} with ${data} if-match: ${this.etag}`);\n\n const res = await this.fetch(uri, { method, headers, body: data, redirect: \"follow\" });\n if (res.status === 404) {\n return this.cancel(ClientRendezvousFailureReason.Unknown);\n }\n this.etag = res.headers.get(\"etag\") ?? undefined;\n\n logger.info(`Received etag: ${this.etag}`);\n\n if (method === Method.Post) {\n const expires = res.headers.get(\"expires\");\n if (expires) {\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n this.expiresAt = new Date(expires);\n this.expiresTimer = setTimeout(() => {\n this.expiresTimer = undefined;\n this.cancel(ClientRendezvousFailureReason.Expired);\n }, this.expiresAt.getTime() - Date.now());\n }\n // MSC4108: we expect a JSON response with a rendezvous URL\n const json = await res.json();\n if (typeof json.url !== \"string\") {\n throw new Error(\"No rendezvous URL given\");\n }\n this.url = json.url;\n this._ready = true;\n }\n }\n\n /**\n * Receives data from the rendezvous channel.\n * @return the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.\n */\n public async receive(): Promise<string | undefined> {\n if (!this.url) {\n throw new Error(\"Rendezvous not set up\");\n }\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (this._cancelled) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n if (this.etag) {\n headers[\"if-none-match\"] = this.etag;\n }\n\n logger.info(`=> GET ${this.url} if-none-match: ${this.etag}`);\n const poll = await this.fetch(this.url, { method: Method.Get, headers });\n\n if (poll.status === 404) {\n await this.cancel(ClientRendezvousFailureReason.Unknown);\n return undefined;\n }\n\n // rely on server expiring the channel rather than checking ourselves\n\n const etag = poll.headers.get(\"etag\") ?? undefined;\n if (poll.headers.get(\"content-type\") !== \"text/plain\") {\n this.etag = etag;\n } else if (poll.status === 200) {\n if (!etag) {\n // Some browsers & extensions block the ETag header for anti-tracking purposes\n // We try and detect this so the client can give the user a somewhat helpful message\n await this.cancel(ClientRendezvousFailureReason.ETagMissing);\n return undefined;\n }\n\n this.etag = etag;\n const text = await poll.text();\n logger.info(`Received: ${text} with etag ${this.etag}`);\n return text;\n }\n await sleep(1000);\n }\n }\n\n /**\n * Cancels the rendezvous channel.\n * If the reason is user_declined or user_cancelled then the channel will also be closed.\n * @param reason the reason to cancel with\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n if (this._cancelled) return;\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n\n if (\n reason === ClientRendezvousFailureReason.Unknown &&\n this.expiresAt &&\n this.expiresAt.getTime() < Date.now()\n ) {\n reason = ClientRendezvousFailureReason.Expired;\n }\n\n this._cancelled = true;\n this._ready = false;\n this.onFailure?.(reason);\n\n if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {\n await this.close();\n }\n }\n\n /**\n * Closes the rendezvous channel.\n */\n public async close(): Promise<void> {\n if (this.expiresTimer) {\n clearTimeout(this.expiresTimer);\n this.expiresTimer = undefined;\n }\n\n if (!this.url) return;\n try {\n const method = Method.Delete;\n logger.info(`=> ${method} ${this.url}`);\n await this.fetch(this.url, { method });\n } catch (e) {\n logger.warn(e);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,20 +30,16 @@ export class RoomHierarchy {
30
30
  */
31
31
  constructor(root, pageSize, maxDepth) {
32
32
  var suggestedOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
33
- this.root = root;
34
- this.pageSize = pageSize;
35
- this.maxDepth = maxDepth;
36
- this.suggestedOnly = suggestedOnly;
37
33
  // Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy
38
34
  _defineProperty(this, "viaMap", new Map());
39
35
  // Map from room id to list of rooms which claim this room as their child
40
36
  _defineProperty(this, "backRefs", new Map());
41
37
  // Map from room id to object
42
38
  _defineProperty(this, "roomMap", new Map());
43
- _defineProperty(this, "loadRequest", void 0);
44
- _defineProperty(this, "nextBatch", void 0);
45
- _defineProperty(this, "_rooms", void 0);
46
- _defineProperty(this, "serverSupportError", void 0);
39
+ this.root = root;
40
+ this.pageSize = pageSize;
41
+ this.maxDepth = maxDepth;
42
+ this.suggestedOnly = suggestedOnly;
47
43
  }
48
44
  get noSupport() {
49
45
  return !!this.serverSupportError;
@@ -66,10 +62,9 @@ export class RoomHierarchy {
66
62
  _this.loadRequest = _this.root.client.getRoomHierarchy(_this.root.roomId, pageSize, _this.maxDepth, _this.suggestedOnly, _this.nextBatch);
67
63
  var rooms;
68
64
  try {
69
- ({
70
- rooms,
71
- next_batch: _this.nextBatch
72
- } = yield _this.loadRequest);
65
+ var _yield$_this$loadRequ = yield _this.loadRequest;
66
+ rooms = _yield$_this$loadRequ.rooms;
67
+ _this.nextBatch = _yield$_this$loadRequ.next_batch;
73
68
  } catch (e) {
74
69
  if (e.errcode === "M_UNRECOGNIZED") {
75
70
  _this.serverSupportError = e;
@@ -1 +1 @@
1
- {"version":3,"file":"room-hierarchy.js","names":["EventType","RoomHierarchy","constructor","root","pageSize","maxDepth","suggestedOnly","arguments","length","undefined","_defineProperty","Map","noSupport","serverSupportError","canLoadMore","nextBatch","_rooms","loading","loadRequest","rooms","load","_arguments","_this","_asyncToGenerator","then","r","client","getRoomHierarchy","roomId","next_batch","e","errcode","concat","forEach","room","roomMap","set","room_id","children_state","ev","type","SpaceChild","childRoomId","state_key","backRefs","has","get","push","Array","isArray","content","via","viaMap","Set","vias","add","getRelation","parentId","childId","_this$roomMap$get","find","isSuggested","_this$getRelation","suggested","removeRelation","delete","filter","ref"],"sources":["../src/room-hierarchy.ts"],"sourcesContent":["/*\nCopyright 2021 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 { type Room } from \"./models/room.ts\";\nimport { type IHierarchyRoom, type IHierarchyRelation } from \"./@types/spaces.ts\";\nimport { type MatrixClient } from \"./client.ts\";\nimport { EventType } from \"./@types/event.ts\";\nimport { type MatrixError } from \"./http-api/index.ts\";\n\nexport class RoomHierarchy {\n // Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy\n public readonly viaMap = new Map<string, Set<string>>();\n // Map from room id to list of rooms which claim this room as their child\n public readonly backRefs = new Map<string, string[]>();\n // Map from room id to object\n public readonly roomMap = new Map<string, IHierarchyRoom>();\n private loadRequest?: ReturnType<MatrixClient[\"getRoomHierarchy\"]>;\n private nextBatch?: string;\n private _rooms?: IHierarchyRoom[];\n private serverSupportError?: Error;\n\n /**\n * Construct a new RoomHierarchy\n *\n * A RoomHierarchy instance allows you to easily make use of the /hierarchy API and paginate it.\n *\n * @param root - the root of this hierarchy\n * @param pageSize - the maximum number of rooms to return per page, can be overridden per load request.\n * @param maxDepth - the maximum depth to traverse the hierarchy to\n * @param suggestedOnly - whether to only return rooms with suggested=true.\n */\n public constructor(\n public readonly root: Room,\n private readonly pageSize?: number,\n private readonly maxDepth?: number,\n private readonly suggestedOnly = false,\n ) {}\n\n public get noSupport(): boolean {\n return !!this.serverSupportError;\n }\n\n public get canLoadMore(): boolean {\n return !!this.serverSupportError || !!this.nextBatch || !this._rooms;\n }\n\n public get loading(): boolean {\n return !!this.loadRequest;\n }\n\n public get rooms(): IHierarchyRoom[] | undefined {\n return this._rooms;\n }\n\n public async load(pageSize = this.pageSize): Promise<IHierarchyRoom[]> {\n if (this.loadRequest) return this.loadRequest.then((r) => r.rooms);\n\n this.loadRequest = this.root.client.getRoomHierarchy(\n this.root.roomId,\n pageSize,\n this.maxDepth,\n this.suggestedOnly,\n this.nextBatch,\n );\n\n let rooms: IHierarchyRoom[];\n try {\n ({ rooms, next_batch: this.nextBatch } = await this.loadRequest);\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_UNRECOGNIZED\") {\n this.serverSupportError = <MatrixError>e;\n } else {\n throw e;\n }\n\n return [];\n } finally {\n this.loadRequest = undefined;\n }\n\n if (this._rooms) {\n this._rooms = this._rooms.concat(rooms);\n } else {\n this._rooms = rooms;\n }\n\n rooms.forEach((room) => {\n this.roomMap.set(room.room_id, room);\n\n room.children_state.forEach((ev) => {\n if (ev.type !== EventType.SpaceChild) return;\n const childRoomId = ev.state_key;\n\n // track backrefs for quicker hierarchy navigation\n if (!this.backRefs.has(childRoomId)) {\n this.backRefs.set(childRoomId, []);\n }\n this.backRefs.get(childRoomId)!.push(room.room_id);\n\n // fill viaMap\n if (Array.isArray(ev.content.via)) {\n if (!this.viaMap.has(childRoomId)) {\n this.viaMap.set(childRoomId, new Set());\n }\n const vias = this.viaMap.get(childRoomId)!;\n ev.content.via.forEach((via) => vias.add(via));\n }\n });\n });\n\n return rooms;\n }\n\n public getRelation(parentId: string, childId: string): IHierarchyRelation | undefined {\n return this.roomMap.get(parentId)?.children_state.find((e) => e.state_key === childId);\n }\n\n public isSuggested(parentId: string, childId: string): boolean | undefined {\n return this.getRelation(parentId, childId)?.content.suggested;\n }\n\n // locally remove a relation as a form of local echo\n public removeRelation(parentId: string, childId: string): void {\n const backRefs = this.backRefs.get(childId);\n if (backRefs?.length === 1) {\n this.backRefs.delete(childId);\n } else if (backRefs?.length) {\n this.backRefs.set(\n childId,\n backRefs.filter((ref) => ref !== parentId),\n );\n }\n\n const room = this.roomMap.get(parentId);\n if (room) {\n room.children_state = room.children_state.filter((ev) => ev.state_key !== childId);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"room-hierarchy.js","names":["EventType","RoomHierarchy","constructor","root","pageSize","maxDepth","suggestedOnly","arguments","length","undefined","_defineProperty","Map","noSupport","serverSupportError","canLoadMore","nextBatch","_rooms","loading","loadRequest","rooms","load","_arguments","_this","_asyncToGenerator","then","r","client","getRoomHierarchy","roomId","_yield$_this$loadRequ","next_batch","e","errcode","concat","forEach","room","roomMap","set","room_id","children_state","ev","type","SpaceChild","childRoomId","state_key","backRefs","has","get","push","Array","isArray","content","via","viaMap","Set","vias","add","getRelation","parentId","childId","_this$roomMap$get","find","isSuggested","_this$getRelation","suggested","removeRelation","delete","filter","ref"],"sources":["../src/room-hierarchy.ts"],"sourcesContent":["/*\nCopyright 2021 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 { type Room } from \"./models/room.ts\";\nimport { type IHierarchyRoom, type IHierarchyRelation } from \"./@types/spaces.ts\";\nimport { type MatrixClient } from \"./client.ts\";\nimport { EventType } from \"./@types/event.ts\";\nimport { type MatrixError } from \"./http-api/index.ts\";\n\nexport class RoomHierarchy {\n // Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy\n public readonly viaMap = new Map<string, Set<string>>();\n // Map from room id to list of rooms which claim this room as their child\n public readonly backRefs = new Map<string, string[]>();\n // Map from room id to object\n public readonly roomMap = new Map<string, IHierarchyRoom>();\n private loadRequest?: ReturnType<MatrixClient[\"getRoomHierarchy\"]>;\n private nextBatch?: string;\n private _rooms?: IHierarchyRoom[];\n private serverSupportError?: Error;\n\n /**\n * Construct a new RoomHierarchy\n *\n * A RoomHierarchy instance allows you to easily make use of the /hierarchy API and paginate it.\n *\n * @param root - the root of this hierarchy\n * @param pageSize - the maximum number of rooms to return per page, can be overridden per load request.\n * @param maxDepth - the maximum depth to traverse the hierarchy to\n * @param suggestedOnly - whether to only return rooms with suggested=true.\n */\n public constructor(\n public readonly root: Room,\n private readonly pageSize?: number,\n private readonly maxDepth?: number,\n private readonly suggestedOnly = false,\n ) {}\n\n public get noSupport(): boolean {\n return !!this.serverSupportError;\n }\n\n public get canLoadMore(): boolean {\n return !!this.serverSupportError || !!this.nextBatch || !this._rooms;\n }\n\n public get loading(): boolean {\n return !!this.loadRequest;\n }\n\n public get rooms(): IHierarchyRoom[] | undefined {\n return this._rooms;\n }\n\n public async load(pageSize = this.pageSize): Promise<IHierarchyRoom[]> {\n if (this.loadRequest) return this.loadRequest.then((r) => r.rooms);\n\n this.loadRequest = this.root.client.getRoomHierarchy(\n this.root.roomId,\n pageSize,\n this.maxDepth,\n this.suggestedOnly,\n this.nextBatch,\n );\n\n let rooms: IHierarchyRoom[];\n try {\n ({ rooms, next_batch: this.nextBatch } = await this.loadRequest);\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_UNRECOGNIZED\") {\n this.serverSupportError = <MatrixError>e;\n } else {\n throw e;\n }\n\n return [];\n } finally {\n this.loadRequest = undefined;\n }\n\n if (this._rooms) {\n this._rooms = this._rooms.concat(rooms);\n } else {\n this._rooms = rooms;\n }\n\n rooms.forEach((room) => {\n this.roomMap.set(room.room_id, room);\n\n room.children_state.forEach((ev) => {\n if (ev.type !== EventType.SpaceChild) return;\n const childRoomId = ev.state_key;\n\n // track backrefs for quicker hierarchy navigation\n if (!this.backRefs.has(childRoomId)) {\n this.backRefs.set(childRoomId, []);\n }\n this.backRefs.get(childRoomId)!.push(room.room_id);\n\n // fill viaMap\n if (Array.isArray(ev.content.via)) {\n if (!this.viaMap.has(childRoomId)) {\n this.viaMap.set(childRoomId, new Set());\n }\n const vias = this.viaMap.get(childRoomId)!;\n ev.content.via.forEach((via) => vias.add(via));\n }\n });\n });\n\n return rooms;\n }\n\n public getRelation(parentId: string, childId: string): IHierarchyRelation | undefined {\n return this.roomMap.get(parentId)?.children_state.find((e) => e.state_key === childId);\n }\n\n public isSuggested(parentId: string, childId: string): boolean | undefined {\n return this.getRelation(parentId, childId)?.content.suggested;\n }\n\n // locally remove a relation as a form of local echo\n public removeRelation(parentId: string, childId: string): void {\n const backRefs = this.backRefs.get(childId);\n if (backRefs?.length === 1) {\n this.backRefs.delete(childId);\n } else if (backRefs?.length) {\n this.backRefs.set(\n childId,\n backRefs.filter((ref) => ref !== parentId),\n );\n }\n\n const room = this.roomMap.get(parentId);\n if (room) {\n room.children_state = room.children_state.filter((ev) => ev.state_key !== childId);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,4 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
2
  /*
4
3
  Copyright 2024 The Matrix.org Foundation C.I.C.
5
4
 
@@ -58,6 +57,8 @@ var DEHYDRATION_INTERVAL = 7 * 24 * 60 * 60 * 1000;
58
57
  * @internal
59
58
  */
60
59
  export class DehydratedDeviceManager extends TypedEventEmitter {
60
+ /** the ID of the interval for periodically replacing the dehydrated device */
61
+
61
62
  constructor(logger, olmMachine, http, outgoingRequestProcessor, secretStorage) {
62
63
  super();
63
64
  this.logger = logger;
@@ -65,8 +66,6 @@ export class DehydratedDeviceManager extends TypedEventEmitter {
65
66
  this.http = http;
66
67
  this.outgoingRequestProcessor = outgoingRequestProcessor;
67
68
  this.secretStorage = secretStorage;
68
- /** the ID of the interval for periodically replacing the dehydrated device */
69
- _defineProperty(this, "intervalId", void 0);
70
69
  }
71
70
  cacheKey(key) {
72
71
  var _this = this;