matrix-js-sdk 41.6.0 → 41.7.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/lib/ReEmitter.js +1 -1
  2. package/lib/ReEmitter.js.map +1 -1
  3. package/lib/ToDeviceMessageQueue.js +2 -2
  4. package/lib/ToDeviceMessageQueue.js.map +1 -1
  5. package/lib/autodiscovery.js +1 -0
  6. package/lib/autodiscovery.js.map +1 -1
  7. package/lib/client.d.ts.map +1 -1
  8. package/lib/client.js +77 -3
  9. package/lib/client.js.map +1 -1
  10. package/lib/common-crypto/CryptoBackend.js +2 -0
  11. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  12. package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
  13. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  14. package/lib/crypto/store/indexeddb-crypto-store.js +2 -0
  15. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  16. package/lib/crypto-api/index.js +58 -58
  17. package/lib/crypto-api/index.js.map +1 -1
  18. package/lib/embedded.js +13 -9
  19. package/lib/embedded.js.map +1 -1
  20. package/lib/extensible_events_v1/MessageEvent.js +15 -15
  21. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  22. package/lib/extensible_events_v1/PollEndEvent.js +8 -8
  23. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  24. package/lib/extensible_events_v1/PollResponseEvent.js +1 -0
  25. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  26. package/lib/extensible_events_v1/PollStartEvent.js +28 -28
  27. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  28. package/lib/filter.js +3 -1
  29. package/lib/filter.js.map +1 -1
  30. package/lib/http-api/errors.js +16 -16
  31. package/lib/http-api/errors.js.map +1 -1
  32. package/lib/http-api/fetch.js +2 -1
  33. package/lib/http-api/fetch.js.map +1 -1
  34. package/lib/http-api/refresh.js +7 -6
  35. package/lib/http-api/refresh.js.map +1 -1
  36. package/lib/http-api/utils.d.ts.map +1 -1
  37. package/lib/http-api/utils.js +1 -5
  38. package/lib/http-api/utils.js.map +1 -1
  39. package/lib/interactive-auth.js +11 -1
  40. package/lib/interactive-auth.js.map +1 -1
  41. package/lib/logger.js +2 -0
  42. package/lib/logger.js.map +1 -1
  43. package/lib/matrixrtc/CallMembership.js +6 -5
  44. package/lib/matrixrtc/CallMembership.js.map +1 -1
  45. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
  46. package/lib/matrixrtc/MatrixRTCSession.js +15 -5
  47. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  48. package/lib/matrixrtc/MatrixRTCSessionManager.js +3 -2
  49. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  50. package/lib/matrixrtc/MembershipManager.js +24 -17
  51. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  52. package/lib/matrixrtc/MembershipManagerActionScheduler.js +2 -1
  53. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  54. package/lib/matrixrtc/RTCEncryptionManager.js +6 -4
  55. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  56. package/lib/matrixrtc/ToDeviceKeyTransport.js +4 -4
  57. package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
  58. package/lib/models/MSC3089TreeSpace.js +2 -1
  59. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  60. package/lib/models/beacon.js +8 -4
  61. package/lib/models/beacon.js.map +1 -1
  62. package/lib/models/device.js +7 -0
  63. package/lib/models/device.js.map +1 -1
  64. package/lib/models/event-context.js +2 -1
  65. package/lib/models/event-context.js.map +1 -1
  66. package/lib/models/event-timeline-set.js +7 -1
  67. package/lib/models/event-timeline-set.js.map +1 -1
  68. package/lib/models/event-timeline.js +5 -1
  69. package/lib/models/event-timeline.js.map +1 -1
  70. package/lib/models/event.js +35 -11
  71. package/lib/models/event.js.map +1 -1
  72. package/lib/models/poll.js +7 -3
  73. package/lib/models/poll.js.map +1 -1
  74. package/lib/models/related-relations.js +2 -0
  75. package/lib/models/related-relations.js.map +1 -1
  76. package/lib/models/relations-container.js +2 -2
  77. package/lib/models/relations-container.js.map +1 -1
  78. package/lib/models/relations.js +4 -3
  79. package/lib/models/relations.js.map +1 -1
  80. package/lib/models/room-member.js +24 -2
  81. package/lib/models/room-member.js.map +1 -1
  82. package/lib/models/room-receipts.js +19 -12
  83. package/lib/models/room-receipts.js.map +1 -1
  84. package/lib/models/room-state.js +2 -2
  85. package/lib/models/room-state.js.map +1 -1
  86. package/lib/models/room-sticky-events.js +1 -0
  87. package/lib/models/room-sticky-events.js.map +1 -1
  88. package/lib/models/room.js +35 -4
  89. package/lib/models/room.js.map +1 -1
  90. package/lib/models/thread.js +46 -2
  91. package/lib/models/thread.js.map +1 -1
  92. package/lib/models/user.js +20 -1
  93. package/lib/models/user.js.map +1 -1
  94. package/lib/oidc/tokenRefresher.js +11 -8
  95. package/lib/oidc/tokenRefresher.js.map +1 -1
  96. package/lib/pushprocessor.js +1 -1
  97. package/lib/pushprocessor.js.map +1 -1
  98. package/lib/rendezvous/MSC4108SignInWithQR.js +6 -1
  99. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
  100. package/lib/rendezvous/channels/MSC4108SecureChannel.js +3 -1
  101. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  102. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +8 -0
  103. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
  104. package/lib/room-hierarchy.js +8 -4
  105. package/lib/room-hierarchy.js.map +1 -1
  106. package/lib/rust-crypto/DehydratedDeviceManager.js +3 -2
  107. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
  108. package/lib/rust-crypto/KeyClaimManager.js +2 -1
  109. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  110. package/lib/rust-crypto/OutgoingRequestsManager.js +12 -12
  111. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  112. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +5 -3
  113. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
  114. package/lib/rust-crypto/RoomEncryptor.js +6 -6
  115. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  116. package/lib/rust-crypto/backup.js +6 -4
  117. package/lib/rust-crypto/backup.js.map +1 -1
  118. package/lib/rust-crypto/rust-crypto.js +18 -10
  119. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  120. package/lib/rust-crypto/verification.js +9 -7
  121. package/lib/rust-crypto/verification.js.map +1 -1
  122. package/lib/scheduler.js +2 -2
  123. package/lib/scheduler.js.map +1 -1
  124. package/lib/serverCapabilities.js +5 -2
  125. package/lib/serverCapabilities.js.map +1 -1
  126. package/lib/sliding-sync-sdk.js +6 -3
  127. package/lib/sliding-sync-sdk.js.map +1 -1
  128. package/lib/sliding-sync.js +9 -4
  129. package/lib/sliding-sync.js.map +1 -1
  130. package/lib/store/indexeddb-local-backend.js +5 -1
  131. package/lib/store/indexeddb-local-backend.js.map +1 -1
  132. package/lib/store/indexeddb-remote-backend.js +7 -6
  133. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  134. package/lib/store/indexeddb-store-worker.js +2 -1
  135. package/lib/store/indexeddb-store-worker.js.map +1 -1
  136. package/lib/store/indexeddb.js +1 -0
  137. package/lib/store/indexeddb.js.map +1 -1
  138. package/lib/store/memory.js +4 -0
  139. package/lib/store/memory.js.map +1 -1
  140. package/lib/sync-accumulator.js +1 -1
  141. package/lib/sync-accumulator.js.map +1 -1
  142. package/lib/sync.d.ts.map +1 -1
  143. package/lib/sync.js +32 -16
  144. package/lib/sync.js.map +1 -1
  145. package/lib/timeline-window.js +6 -2
  146. package/lib/timeline-window.js.map +1 -1
  147. package/lib/webrtc/call.js +42 -6
  148. package/lib/webrtc/call.js.map +1 -1
  149. package/lib/webrtc/callEventHandler.js +5 -0
  150. package/lib/webrtc/callEventHandler.js.map +1 -1
  151. package/lib/webrtc/callFeed.js +15 -0
  152. package/lib/webrtc/callFeed.js.map +1 -1
  153. package/lib/webrtc/groupCall.js +24 -8
  154. package/lib/webrtc/groupCall.js.map +1 -1
  155. package/lib/webrtc/groupCallEventHandler.js +1 -1
  156. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  157. package/lib/webrtc/mediaHandler.js +7 -3
  158. package/lib/webrtc/mediaHandler.js.map +1 -1
  159. package/lib/webrtc/stats/callStatsReportGatherer.js +5 -2
  160. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  161. package/lib/webrtc/stats/groupCallStats.js +4 -3
  162. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  163. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  164. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  165. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
  166. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  167. package/package.json +125 -138
  168. package/src/client.ts +4 -1
  169. package/src/http-api/utils.ts +4 -9
  170. package/src/matrixrtc/MatrixRTCSession.ts +4 -3
  171. package/src/sync.ts +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tokenRefresher.js","names":["OidcClient","WebStorageStateStore","ErrorResponse","TokenRefreshLogoutError","generateScope","discoverAndValidateOIDCIssuerWellKnown","logger","OidcTokenRefresher","constructor","issuer","clientId","redirectUri","deviceId","idTokenClaims","oidcClientReady","Promise","resolve","ensureInit","_this","_asyncToGenerator","oidcClient","initPromise","initialiseOidcClient","undefined","_this2","_config$signingKeys","config","scope","metadata","signingKeys","client_id","redirect_uri","authority","stateStore","prefix","store","window","sessionStorage","error","Error","doRefreshAccessToken","refreshToken","_this3","inflightRefreshRequest","getNewTokens","tokens","e","persistTokens","_this4","refreshTokenState","refresh_token","session_state","data","profile","requestStart","Date","now","response","useRefreshToken","state","timeoutInSeconds","accessToken","access_token","expiry","expires_in"],"sources":["../../src/oidc/tokenRefresher.ts"],"sourcesContent":["/*\nCopyright 2023 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 IdTokenClaims, OidcClient, WebStorageStateStore, ErrorResponse } from \"oidc-client-ts\";\n\nimport { type AccessTokens, TokenRefreshLogoutError } from \"../http-api/index.ts\";\nimport { generateScope } from \"./authorize.ts\";\nimport { discoverAndValidateOIDCIssuerWellKnown } from \"./discovery.ts\";\nimport { logger } from \"../logger.ts\";\n\n/**\n * @experimental\n * Class responsible for refreshing OIDC access tokens\n *\n * Client implementations will likely want to override {@link persistTokens} to persist tokens after successful refresh\n *\n */\nexport class OidcTokenRefresher {\n /**\n * This is now just a resolved promise and will be removed in a future version.\n * Initialisation is done lazily at token refresh time.\n * @deprecated Consumers no longer need to wait for this promise.\n */\n public readonly oidcClientReady!: Promise<void>;\n\n // If there is a initialisation attempt in progress, we keep track of it here.\n private initPromise?: Promise<void>;\n\n private oidcClient!: OidcClient;\n private inflightRefreshRequest?: Promise<AccessTokens>;\n\n public constructor(\n /**\n * The OIDC issuer as returned by the /auth_issuer API\n */\n private issuer: string,\n /**\n * id of this client as registered with the OP\n */\n private clientId: string,\n /**\n * redirectUri as registered with OP\n */\n private redirectUri: string,\n /**\n * Device ID of current session\n */\n protected deviceId: string,\n /**\n * idTokenClaims as returned from authorization grant\n * used to validate tokens\n */\n private readonly idTokenClaims: IdTokenClaims,\n ) {\n this.oidcClientReady = Promise.resolve();\n }\n\n /**\n * Ensures that the client is initialised.\n * @returns Promise that resolves when initialisation is complete\n * @throws if initialisation fails\n */\n private async ensureInit(): Promise<void> {\n if (!this.oidcClient) {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = this.initialiseOidcClient(this.issuer, this.clientId, this.deviceId, this.redirectUri);\n try {\n await this.initPromise;\n } finally {\n this.initPromise = undefined;\n }\n }\n }\n\n private async initialiseOidcClient(\n issuer: string,\n clientId: string,\n deviceId: string,\n redirectUri: string,\n ): Promise<void> {\n try {\n const config = await discoverAndValidateOIDCIssuerWellKnown(issuer);\n\n const scope = generateScope(deviceId);\n\n this.oidcClient = new OidcClient({\n metadata: config,\n signingKeys: config.signingKeys ?? undefined,\n client_id: clientId,\n scope,\n redirect_uri: redirectUri,\n authority: config.issuer,\n stateStore: new WebStorageStateStore({ prefix: \"mx_oidc_\", store: window.sessionStorage }),\n });\n } catch (error) {\n logger.error(\"Failed to initialise OIDC client.\", error);\n throw new Error(\"Failed to initialise OIDC client.\");\n }\n }\n\n /**\n * Attempt token refresh using given refresh token\n * @param refreshToken - refresh token to use in request with token issuer\n * @returns tokens - Promise that resolves with new access and refresh tokens\n * @throws when token refresh fails\n */\n public async doRefreshAccessToken(refreshToken: string): Promise<AccessTokens> {\n await this.ensureInit();\n\n if (!this.inflightRefreshRequest) {\n this.inflightRefreshRequest = this.getNewTokens(refreshToken);\n }\n try {\n const tokens = await this.inflightRefreshRequest;\n return tokens;\n } catch (e) {\n // If we encounter an OIDC error then signal that it should cause a logout by upgrading it to a TokenRefreshLogoutError\n if (e instanceof ErrorResponse) {\n throw new TokenRefreshLogoutError(e);\n }\n throw e;\n } finally {\n this.inflightRefreshRequest = undefined;\n }\n }\n\n /**\n * Persist the new tokens, called after tokens are successfully refreshed.\n *\n * This function is intended to be overriden by the consumer when persistence is necessary.\n *\n * @param tokens.accessToken - new access token\n * @param tokens.refreshToken - OPTIONAL new refresh token\n */\n protected async persistTokens(tokens: { accessToken: string; refreshToken?: string }): Promise<void> {\n // NOOP\n }\n\n private async getNewTokens(refreshToken: string): Promise<AccessTokens> {\n if (!this.oidcClient) {\n throw new Error(\"Cannot get new token before OIDC client is initialised.\");\n }\n\n const refreshTokenState = {\n refresh_token: refreshToken,\n session_state: \"test\",\n data: undefined,\n profile: this.idTokenClaims,\n };\n\n const requestStart = Date.now();\n const response = await this.oidcClient.useRefreshToken({\n state: refreshTokenState,\n timeoutInSeconds: 300,\n });\n\n const tokens = {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n // We use the request start time to calculate the expiry time as we don't know when the server received our request\n expiry: response.expires_in ? new Date(requestStart + response.expires_in * 1000) : undefined,\n } satisfies AccessTokens;\n\n await this.persistTokens(tokens);\n\n return tokens;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"tokenRefresher.js","names":["OidcClient","WebStorageStateStore","ErrorResponse","TokenRefreshLogoutError","generateScope","discoverAndValidateOIDCIssuerWellKnown","logger","OidcTokenRefresher","constructor","issuer","clientId","redirectUri","deviceId","idTokenClaims","_defineProperty","oidcClientReady","Promise","resolve","ensureInit","_this","_asyncToGenerator","oidcClient","initPromise","initialiseOidcClient","undefined","_this2","_config$signingKeys","config","scope","metadata","signingKeys","client_id","redirect_uri","authority","stateStore","prefix","store","window","sessionStorage","error","Error","doRefreshAccessToken","refreshToken","_this3","inflightRefreshRequest","getNewTokens","tokens","e","persistTokens","_this4","refreshTokenState","refresh_token","session_state","data","profile","requestStart","Date","now","response","useRefreshToken","state","timeoutInSeconds","accessToken","access_token","expiry","expires_in"],"sources":["../../src/oidc/tokenRefresher.ts"],"sourcesContent":["/*\nCopyright 2023 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 IdTokenClaims, OidcClient, WebStorageStateStore, ErrorResponse } from \"oidc-client-ts\";\n\nimport { type AccessTokens, TokenRefreshLogoutError } from \"../http-api/index.ts\";\nimport { generateScope } from \"./authorize.ts\";\nimport { discoverAndValidateOIDCIssuerWellKnown } from \"./discovery.ts\";\nimport { logger } from \"../logger.ts\";\n\n/**\n * @experimental\n * Class responsible for refreshing OIDC access tokens\n *\n * Client implementations will likely want to override {@link persistTokens} to persist tokens after successful refresh\n *\n */\nexport class OidcTokenRefresher {\n /**\n * This is now just a resolved promise and will be removed in a future version.\n * Initialisation is done lazily at token refresh time.\n * @deprecated Consumers no longer need to wait for this promise.\n */\n public readonly oidcClientReady!: Promise<void>;\n\n // If there is a initialisation attempt in progress, we keep track of it here.\n private initPromise?: Promise<void>;\n\n private oidcClient!: OidcClient;\n private inflightRefreshRequest?: Promise<AccessTokens>;\n\n public constructor(\n /**\n * The OIDC issuer as returned by the /auth_issuer API\n */\n private issuer: string,\n /**\n * id of this client as registered with the OP\n */\n private clientId: string,\n /**\n * redirectUri as registered with OP\n */\n private redirectUri: string,\n /**\n * Device ID of current session\n */\n protected deviceId: string,\n /**\n * idTokenClaims as returned from authorization grant\n * used to validate tokens\n */\n private readonly idTokenClaims: IdTokenClaims,\n ) {\n this.oidcClientReady = Promise.resolve();\n }\n\n /**\n * Ensures that the client is initialised.\n * @returns Promise that resolves when initialisation is complete\n * @throws if initialisation fails\n */\n private async ensureInit(): Promise<void> {\n if (!this.oidcClient) {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = this.initialiseOidcClient(this.issuer, this.clientId, this.deviceId, this.redirectUri);\n try {\n await this.initPromise;\n } finally {\n this.initPromise = undefined;\n }\n }\n }\n\n private async initialiseOidcClient(\n issuer: string,\n clientId: string,\n deviceId: string,\n redirectUri: string,\n ): Promise<void> {\n try {\n const config = await discoverAndValidateOIDCIssuerWellKnown(issuer);\n\n const scope = generateScope(deviceId);\n\n this.oidcClient = new OidcClient({\n metadata: config,\n signingKeys: config.signingKeys ?? undefined,\n client_id: clientId,\n scope,\n redirect_uri: redirectUri,\n authority: config.issuer,\n stateStore: new WebStorageStateStore({ prefix: \"mx_oidc_\", store: window.sessionStorage }),\n });\n } catch (error) {\n logger.error(\"Failed to initialise OIDC client.\", error);\n throw new Error(\"Failed to initialise OIDC client.\");\n }\n }\n\n /**\n * Attempt token refresh using given refresh token\n * @param refreshToken - refresh token to use in request with token issuer\n * @returns tokens - Promise that resolves with new access and refresh tokens\n * @throws when token refresh fails\n */\n public async doRefreshAccessToken(refreshToken: string): Promise<AccessTokens> {\n await this.ensureInit();\n\n if (!this.inflightRefreshRequest) {\n this.inflightRefreshRequest = this.getNewTokens(refreshToken);\n }\n try {\n const tokens = await this.inflightRefreshRequest;\n return tokens;\n } catch (e) {\n // If we encounter an OIDC error then signal that it should cause a logout by upgrading it to a TokenRefreshLogoutError\n if (e instanceof ErrorResponse) {\n throw new TokenRefreshLogoutError(e);\n }\n throw e;\n } finally {\n this.inflightRefreshRequest = undefined;\n }\n }\n\n /**\n * Persist the new tokens, called after tokens are successfully refreshed.\n *\n * This function is intended to be overriden by the consumer when persistence is necessary.\n *\n * @param tokens.accessToken - new access token\n * @param tokens.refreshToken - OPTIONAL new refresh token\n */\n protected async persistTokens(tokens: { accessToken: string; refreshToken?: string }): Promise<void> {\n // NOOP\n }\n\n private async getNewTokens(refreshToken: string): Promise<AccessTokens> {\n if (!this.oidcClient) {\n throw new Error(\"Cannot get new token before OIDC client is initialised.\");\n }\n\n const refreshTokenState = {\n refresh_token: refreshToken,\n session_state: \"test\",\n data: undefined,\n profile: this.idTokenClaims,\n };\n\n const requestStart = Date.now();\n const response = await this.oidcClient.useRefreshToken({\n state: refreshTokenState,\n timeoutInSeconds: 300,\n });\n\n const tokens = {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n // We use the request start time to calculate the expiry time as we don't know when the server received our request\n expiry: response.expires_in ? new Date(requestStart + response.expires_in * 1000) : undefined,\n } satisfies AccessTokens;\n\n await this.persistTokens(tokens);\n\n return tokens;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -161,12 +161,12 @@ export class PushProcessor {
161
161
  * @param client - The Matrix client object to use
162
162
  */
163
163
  constructor(client) {
164
+ this.client = client;
164
165
  /**
165
166
  * Maps the original key from the push rules to a list of property names
166
167
  * after unescaping.
167
168
  */
168
169
  _defineProperty(this, "parsedKeys", new Map());
169
- this.client = client;
170
170
  }
171
171
  /**
172
172
  * Convert a list of actions into a object with the actions as keys and their values
@@ -1 +1 @@
1
- {"version":3,"file":"pushprocessor.js","names":["deepCompare","escapeRegExp","globToRegexp","isNullOrUndefined","ConditionKind","PushRuleActionName","PushRuleKind","RuleId","TweakName","EventType","RULEKINDS_IN_ORDER","Override","ContentSpecific","RoomSpecific","SenderSpecific","Underride","DEFAULT_OVERRIDE_RULES","rule_id","default","enabled","conditions","kind","EventPropertyIs","key","value","SenderNotificationPermission","actions","Notify","set_tweak","Highlight","EventMatch","pattern","DontNotify","RoomServerAcl","UserDefinedRules","Symbol","EXPECTED_DEFAULT_OVERRIDE_RULE_IDS","Master","SuppressNotices","InviteToSelf","MemberEvent","IsUserMention","ContainsDisplayName","IsRoomMention","AtRoomNotification","Tombstone","DEFAULT_UNDERRIDE_RULES","CallStarted","Sound","EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS","IncomingCall","EncryptedDM","DM","Message","EncryptedMessage","mergeRulesWithDefaults","logger","incomingRules","defaultRules","orderedRuleIds","incomingDefaultRules","filter","rule","incomingCustomRules","insertDefaultPushRule","ruleId","newRules","push","warn","concat","nextExpectedRuleIdIndex","ruleIndex","indexOf","defaultRuleId","slice","PushProcessor","constructor","client","_defineProperty","Map","actionListToActionsObject","actionList","actionObj","notify","tweaks","action","undefined","rewriteDefaultRules","userId","arguments","length","JSON","parse","stringify","global","override","underride","getPushRuleGlobRegex","alignToWordBoundary","flags","_ref","_ref2","_slicedToArray","prefix","suffix","cacheKey","cachedGlobToRegex","RegExp","updateCachedPushRuleKeys","room","sender","toRemoveKeys","Set","parsedKeys","keys","ruleset","condition","delete","set","partsForDottedKey","forEach","k","matchingRuleFromKindSet","ev","kindset","rawrule","templateRuleToRaw","ruleMatchesEvent","_objectSpread","tprule","eventFulfillsCondition","cond","eventFulfillsEventMatchCondition","eventFulfillsEventPropertyIsCondition","EventPropertyContains","eventFulfillsEventPropertyContains","eventFulfillsDisplayNameCondition","RoomMemberCount","eventFulfillsRoomMemberCountCondition","eventFulfillsSenderNotifPermCondition","CallStartedPrefix","eventFulfillsCallStartedCondition","notifLevelKey","getRoom","getRoomId","currentState","mayTriggerNotifOfType","getSender","is","members","memberCount","getJoinedMemberCount","m","match","ineq","rhs","parseInt","isNaN","_room$currentState","content","getContent","isEncrypted","getClearContent","body","member","getMember","credentials","displayName","name","pat","search","val","valueForDottedKey","regex","Array","isArray","includes","_cond","getPrevContent","str","result","part","escaped","c","parts","get","firstPart","currentIndex","getType","event","thisPart","matchingRuleForEventWithRulesets","rulesets","getSafeUserId","pushActionsForEventAndRulesets","highlight","_rule$conditions","supportsIntentionalMentions","ContainsUserName","some","actionsForEvent","_this$pushActionsForE","pushRules","actionsAndRuleForEvent","getPushRuleById","_result$rule","getPushRuleAndKindById","scope","_this$client$pushRule"],"sources":["../src/pushprocessor.ts"],"sourcesContent":["/*\nCopyright 2015 - 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 { deepCompare, escapeRegExp, globToRegexp, isNullOrUndefined } from \"./utils.ts\";\nimport { type Logger } from \"./logger.ts\";\nimport { type MatrixClient } from \"./client.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport {\n ConditionKind,\n type IAnnotatedPushRule,\n type ICallStartedCondition,\n type ICallStartedPrefixCondition,\n type IContainsDisplayNameCondition,\n type IEventMatchCondition,\n type IEventPropertyContainsCondition,\n type IEventPropertyIsCondition,\n type IPushRule,\n type IPushRules,\n type IRoomMemberCountCondition,\n type ISenderNotificationPermissionCondition,\n type PushRuleAction,\n PushRuleActionName,\n type PushRuleCondition,\n PushRuleKind,\n type PushRuleSet,\n RuleId,\n TweakName,\n} from \"./@types/PushRules.ts\";\nimport { EventType } from \"./@types/event.ts\";\n\nconst RULEKINDS_IN_ORDER = [\n PushRuleKind.Override,\n PushRuleKind.ContentSpecific,\n PushRuleKind.RoomSpecific,\n PushRuleKind.SenderSpecific,\n PushRuleKind.Underride,\n];\n\n// The default override rules to apply to the push rules that arrive from the server.\n// We do this for two reasons:\n// 1. Synapse is unlikely to send us the push rule in an incremental sync - see\n// https://github.com/matrix-org/synapse/pull/4867#issuecomment-481446072 for\n// more details.\n// 2. We often want to start using push rules ahead of the server supporting them,\n// and so we can put them here.\nconst DEFAULT_OVERRIDE_RULES: Record<string, IPushRule> = {\n \".m.rule.is_room_mention\": {\n // Matrix v1.7\n rule_id: \".m.rule.is_room_mention\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventPropertyIs,\n key: \"content.m\\\\.mentions.room\",\n value: true,\n },\n {\n kind: ConditionKind.SenderNotificationPermission,\n key: \"room\",\n },\n ],\n actions: [\n PushRuleActionName.Notify,\n {\n set_tweak: TweakName.Highlight,\n },\n ],\n },\n \".m.rule.reaction\": {\n // For homeservers which don't support MSC2153 yet\n rule_id: \".m.rule.reaction\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: \"m.reaction\",\n },\n ],\n actions: [PushRuleActionName.DontNotify],\n },\n \".org.matrix.msc3786.rule.room.server_acl\": {\n // For homeservers which don't support MSC3786 yet\n rule_id: \".org.matrix.msc3786.rule.room.server_acl\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: EventType.RoomServerAcl,\n },\n {\n kind: ConditionKind.EventMatch,\n key: \"state_key\",\n pattern: \"\",\n },\n ],\n actions: [],\n },\n};\n\n// A special rule id for `EXPECTED_DEFAULT_OVERRIDE_RULE_IDS` and friends which denotes where user-defined rules live in the order.\nconst UserDefinedRules = Symbol(\"UserDefinedRules\");\n\ntype OrderedRules = Array<string | typeof UserDefinedRules>;\n\nconst EXPECTED_DEFAULT_OVERRIDE_RULE_IDS: OrderedRules = [\n RuleId.Master,\n UserDefinedRules,\n RuleId.SuppressNotices,\n RuleId.InviteToSelf,\n RuleId.MemberEvent,\n RuleId.IsUserMention,\n RuleId.ContainsDisplayName,\n RuleId.IsRoomMention,\n RuleId.AtRoomNotification,\n RuleId.Tombstone,\n \".m.rule.reaction\",\n \".m.rule.room.server_acl\",\n \".org.matrix.msc3786.rule.room.server_acl\",\n \".m.rule.suppress_edits\",\n];\n\nconst DEFAULT_UNDERRIDE_RULES: Record<string, IPushRule> = {\n \".org.matrix.msc3914.rule.room.call\": {\n // For homeservers which don't support MSC3914 yet\n rule_id: \".org.matrix.msc3914.rule.room.call\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: \"org.matrix.msc3401.call\",\n },\n {\n kind: ConditionKind.CallStarted,\n },\n ],\n actions: [PushRuleActionName.Notify, { set_tweak: TweakName.Sound, value: \"default\" }],\n },\n};\n\nconst EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS: OrderedRules = [\n UserDefinedRules,\n RuleId.IncomingCall,\n \".org.matrix.msc3914.rule.room.call\",\n RuleId.EncryptedDM,\n RuleId.DM,\n RuleId.Message,\n RuleId.EncryptedMessage,\n];\n\n/**\n * Make sure that each of the rules listed in `defaultRuleIds` is listed in the given set of push rules.\n *\n * @param logger - A `Logger` to write log messages to.\n * @param kind - the kind of push rule set being merged.\n * @param incomingRules - the existing set of known push rules for the user.\n * @param defaultRules - a lookup table for the default definitions of push rules.\n * @param orderedRuleIds - the IDs of the expected push rules, in order.\n *\n * @returns A copy of `incomingRules`, with any missing default rules inserted in the right place.\n */\nfunction mergeRulesWithDefaults(\n logger: Logger,\n kind: PushRuleKind,\n incomingRules: IPushRule[],\n defaultRules: Record<string, IPushRule>,\n orderedRuleIds: OrderedRules,\n): IPushRule[] {\n // Split the incomingRules into defaults and custom\n const incomingDefaultRules = incomingRules.filter((rule) => rule.default);\n const incomingCustomRules = incomingRules.filter((rule) => !rule.default);\n\n function insertDefaultPushRule(ruleId: OrderedRules[number]): void {\n if (ruleId === UserDefinedRules) {\n // Re-insert any user-defined rules that were in `incomingRules`\n newRules.push(...incomingCustomRules);\n } else if (ruleId in defaultRules) {\n logger.warn(`Adding default global ${kind} push rule ${ruleId}`);\n newRules.push(defaultRules[ruleId]);\n } else {\n logger.warn(`Missing default global ${kind} push rule ${ruleId}`);\n }\n }\n\n let nextExpectedRuleIdIndex = 0;\n const newRules: IPushRule[] = [];\n // Merge our expected rules (including the incoming custom rules) into the incoming default rules.\n for (const rule of incomingDefaultRules) {\n const ruleIndex = orderedRuleIds.indexOf(rule.rule_id);\n if (ruleIndex === -1) {\n // an unrecognised rule; copy it over\n newRules.push(rule);\n continue;\n }\n while (ruleIndex > nextExpectedRuleIdIndex) {\n // insert new rules\n const defaultRuleId = orderedRuleIds[nextExpectedRuleIdIndex];\n insertDefaultPushRule(defaultRuleId);\n nextExpectedRuleIdIndex += 1;\n }\n // copy over the existing rule\n newRules.push(rule);\n nextExpectedRuleIdIndex += 1;\n }\n\n // Now copy over any remaining default rules\n for (const ruleId of orderedRuleIds.slice(nextExpectedRuleIdIndex)) {\n insertDefaultPushRule(ruleId);\n }\n\n return newRules;\n}\n\nexport interface IActionsObject {\n /** Whether this event should notify the user or not. */\n notify: boolean;\n /** How this event should be notified. */\n tweaks: Partial<Record<TweakName, any>>;\n}\n\nexport class PushProcessor {\n /**\n * Construct a Push Processor.\n * @param client - The Matrix client object to use\n */\n public constructor(private readonly client: MatrixClient) {}\n\n /**\n * Maps the original key from the push rules to a list of property names\n * after unescaping.\n */\n private readonly parsedKeys = new Map<string, string[]>();\n\n /**\n * Convert a list of actions into a object with the actions as keys and their values\n * @example\n * eg. `[ 'notify', { set_tweak: 'sound', value: 'default' } ]`\n * becomes `{ notify: true, tweaks: { sound: 'default' } }`\n * @param actionList - The actions list\n *\n * @returns A object with key 'notify' (true or false) and an object of actions\n */\n public static actionListToActionsObject(actionList: PushRuleAction[]): IActionsObject {\n const actionObj: IActionsObject = { notify: false, tweaks: {} };\n for (const action of actionList) {\n if (action === PushRuleActionName.Notify) {\n actionObj.notify = true;\n } else if (typeof action === \"object\") {\n if (action.value === undefined) {\n action.value = true;\n }\n actionObj.tweaks[action.set_tweak] = action.value;\n }\n }\n return actionObj;\n }\n\n /**\n * Rewrites conditions on a client's push rules to match the defaults\n * where applicable. Useful for upgrading push rules to more strict\n * conditions when the server is falling behind on defaults.\n *\n * @param logger - A `Logger` to write log messages to.\n * @param incomingRules - The client's existing push rules\n * @param userId - The Matrix ID of the client.\n * @returns The rewritten rules\n */\n public static rewriteDefaultRules(\n logger: Logger,\n incomingRules: IPushRules,\n userId: string | undefined = undefined,\n ): IPushRules {\n let newRules: IPushRules = JSON.parse(JSON.stringify(incomingRules)); // deep clone\n\n // These lines are mostly to make the tests happy. We shouldn't run into these\n // properties missing in practice.\n if (!newRules) newRules = {} as IPushRules;\n if (!newRules.global) newRules.global = {} as PushRuleSet;\n if (!newRules.global.override) newRules.global.override = [];\n if (!newRules.global.underride) newRules.global.underride = [];\n\n // Merge the client-level defaults with the ones from the server\n newRules.global.override = mergeRulesWithDefaults(\n logger,\n PushRuleKind.Override,\n newRules.global.override,\n DEFAULT_OVERRIDE_RULES,\n EXPECTED_DEFAULT_OVERRIDE_RULE_IDS,\n );\n\n newRules.global.underride = mergeRulesWithDefaults(\n logger,\n PushRuleKind.Underride,\n newRules.global.underride,\n DEFAULT_UNDERRIDE_RULES,\n EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS,\n );\n\n return newRules;\n }\n\n /**\n * Create a RegExp object for the given glob pattern with a single capture group around the pattern itself, caching the result.\n * No cache invalidation is present currently,\n * as this will be inherently bounded to the size of the user's own push rules.\n * @param pattern - the glob pattern to convert to a RegExp\n * @param alignToWordBoundary - whether to align the pattern to word boundaries,\n * as specified for `content.body` matches, will use lookaround assertions to ensure the match only includes the pattern\n * @param flags - the flags to pass to the RegExp constructor, defaults to case-insensitive\n */\n public static getPushRuleGlobRegex(pattern: string, alignToWordBoundary = false, flags = \"i\"): RegExp {\n const [prefix, suffix] = alignToWordBoundary ? [\"(?<=^|\\\\W)\", \"(?=\\\\W|$)\"] : [\"^\", \"$\"];\n const cacheKey = `${alignToWordBoundary}-${flags}-${pattern}`;\n\n if (!PushProcessor.cachedGlobToRegex[cacheKey]) {\n PushProcessor.cachedGlobToRegex[cacheKey] = new RegExp(\n prefix + \"(\" + globToRegexp(pattern) + \")\" + suffix,\n flags,\n );\n }\n return PushProcessor.cachedGlobToRegex[cacheKey];\n }\n\n /**\n * Pre-caches the parsed keys for push rules and cleans out any obsolete cache\n * entries. Should be called after push rules are updated.\n * @param newRules - The new push rules.\n */\n public updateCachedPushRuleKeys(newRules: IPushRules): void {\n // These lines are mostly to make the tests happy. We shouldn't run into these\n // properties missing in practice.\n if (!newRules) newRules = {} as IPushRules;\n if (!newRules.global) newRules.global = {} as PushRuleSet;\n if (!newRules.global.override) newRules.global.override = [];\n if (!newRules.global.room) newRules.global.room = [];\n if (!newRules.global.sender) newRules.global.sender = [];\n if (!newRules.global.underride) newRules.global.underride = [];\n\n // Process the 'key' property on event_match conditions pre-cache the\n // values and clean-out any unused values.\n const toRemoveKeys = new Set(this.parsedKeys.keys());\n for (const ruleset of [\n newRules.global.override,\n newRules.global.room,\n newRules.global.sender,\n newRules.global.underride,\n ]) {\n for (const rule of ruleset) {\n if (!rule.conditions) {\n continue;\n }\n\n for (const condition of rule.conditions) {\n if (condition.kind !== ConditionKind.EventMatch) {\n continue;\n }\n\n // Ensure we keep this key.\n toRemoveKeys.delete(condition.key);\n\n // Pre-process the key.\n this.parsedKeys.set(condition.key, PushProcessor.partsForDottedKey(condition.key));\n }\n }\n }\n // Any keys that were previously cached, but are no longer needed should\n // be removed.\n toRemoveKeys.forEach((k) => this.parsedKeys.delete(k));\n }\n\n private static cachedGlobToRegex: Record<string, RegExp> = {}; // $glob: RegExp\n\n private matchingRuleFromKindSet(ev: MatrixEvent, kindset: PushRuleSet): IAnnotatedPushRule | null {\n for (const kind of RULEKINDS_IN_ORDER) {\n const ruleset = kindset[kind];\n if (!ruleset) {\n continue;\n }\n\n for (const rule of ruleset) {\n if (!rule.enabled) {\n continue;\n }\n\n const rawrule = this.templateRuleToRaw(kind, rule);\n if (!rawrule) {\n continue;\n }\n\n if (this.ruleMatchesEvent(rawrule, ev)) {\n return {\n ...rule,\n kind,\n };\n }\n }\n }\n return null;\n }\n\n private templateRuleToRaw(\n kind: PushRuleKind,\n tprule: IPushRule,\n ): Pick<IPushRule, \"rule_id\" | \"actions\" | \"conditions\"> | null {\n const rawrule: Pick<IPushRule, \"rule_id\" | \"actions\" | \"conditions\"> = {\n rule_id: tprule.rule_id,\n actions: tprule.actions,\n conditions: [],\n };\n switch (kind) {\n case PushRuleKind.Underride:\n case PushRuleKind.Override:\n rawrule.conditions = tprule.conditions;\n break;\n case PushRuleKind.RoomSpecific:\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"room_id\",\n value: tprule.rule_id,\n });\n break;\n case PushRuleKind.SenderSpecific:\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"user_id\",\n value: tprule.rule_id,\n });\n break;\n case PushRuleKind.ContentSpecific:\n if (!tprule.pattern) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"content.body\",\n pattern: tprule.pattern,\n });\n break;\n }\n return rawrule;\n }\n\n private eventFulfillsCondition(cond: PushRuleCondition, ev: MatrixEvent): boolean {\n switch (cond.kind) {\n case ConditionKind.EventMatch:\n return this.eventFulfillsEventMatchCondition(cond, ev);\n case ConditionKind.EventPropertyIs:\n return this.eventFulfillsEventPropertyIsCondition(cond, ev);\n case ConditionKind.EventPropertyContains:\n return this.eventFulfillsEventPropertyContains(cond, ev);\n case ConditionKind.ContainsDisplayName:\n return this.eventFulfillsDisplayNameCondition(cond, ev);\n case ConditionKind.RoomMemberCount:\n return this.eventFulfillsRoomMemberCountCondition(cond, ev);\n case ConditionKind.SenderNotificationPermission:\n return this.eventFulfillsSenderNotifPermCondition(cond, ev);\n case ConditionKind.CallStarted:\n case ConditionKind.CallStartedPrefix:\n return this.eventFulfillsCallStartedCondition(cond, ev);\n }\n\n // unknown conditions: we previously matched all unknown conditions,\n // but given that rules can be added to the base rules on a server,\n // it's probably better to not match unknown conditions.\n return false;\n }\n\n private eventFulfillsSenderNotifPermCondition(\n cond: ISenderNotificationPermissionCondition,\n ev: MatrixEvent,\n ): boolean {\n const notifLevelKey = cond[\"key\"];\n if (!notifLevelKey) {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n if (!room?.currentState) {\n return false;\n }\n\n // Note that this should not be the current state of the room but the state at\n // the point the event is in the DAG. Unfortunately the js-sdk does not store\n // this.\n return room.currentState.mayTriggerNotifOfType(notifLevelKey, ev.getSender()!);\n }\n\n private eventFulfillsRoomMemberCountCondition(cond: IRoomMemberCountCondition, ev: MatrixEvent): boolean {\n if (!cond.is) {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n if (!room || !room.currentState || !room.currentState.members) {\n return false;\n }\n\n const memberCount = room.currentState.getJoinedMemberCount();\n\n const m = cond.is.match(/^([=<>]*)(\\d*)$/);\n if (!m) {\n return false;\n }\n const ineq = m[1];\n const rhs = parseInt(m[2]);\n if (isNaN(rhs)) {\n return false;\n }\n switch (ineq) {\n case \"\":\n case \"==\":\n return memberCount == rhs;\n case \"<\":\n return memberCount < rhs;\n case \">\":\n return memberCount > rhs;\n case \"<=\":\n return memberCount <= rhs;\n case \">=\":\n return memberCount >= rhs;\n default:\n return false;\n }\n }\n\n private eventFulfillsDisplayNameCondition(cond: IContainsDisplayNameCondition, ev: MatrixEvent): boolean {\n let content = ev.getContent();\n if (ev.isEncrypted() && ev.getClearContent()) {\n content = ev.getClearContent()!;\n }\n if (!content || !content.body || typeof content.body != \"string\") {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n const member = room?.currentState?.getMember(this.client.credentials.userId!);\n if (!member) {\n return false;\n }\n\n const displayName = member.name;\n\n // N.B. we can't use \\b as it chokes on unicode. however \\W seems to be okay\n // as shorthand for [^0-9A-Za-z_].\n const pat = new RegExp(\"(^|\\\\W)\" + escapeRegExp(displayName) + \"(\\\\W|$)\", \"i\");\n return content.body.search(pat) > -1;\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing against the condition's glob-based\n * pattern.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventMatchCondition(cond: IEventMatchCondition, ev: MatrixEvent): boolean {\n if (!cond.key) {\n return false;\n }\n\n const val = this.valueForDottedKey(cond.key, ev);\n if (typeof val !== \"string\") {\n return false;\n }\n\n // XXX This does not match in a case-insensitive manner.\n //\n // See https://spec.matrix.org/v1.5/client-server-api/#conditions-1\n if (cond.value) {\n return cond.value === val;\n }\n\n if (typeof cond.pattern !== \"string\") {\n return false;\n }\n\n // Align to word boundary on `content.body` matches, whole string otherwise\n // https://spec.matrix.org/v1.13/client-server-api/#conditions-1\n const regex = PushProcessor.getPushRuleGlobRegex(cond.pattern, cond.key === \"content.body\");\n return !!val.match(regex);\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing exactly against the condition's\n * value.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventPropertyIsCondition(cond: IEventPropertyIsCondition, ev: MatrixEvent): boolean {\n if (!cond.key || cond.value === undefined) {\n return false;\n }\n return cond.value === this.valueForDottedKey(cond.key, ev);\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing exactly against the condition's\n * value.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventPropertyContains(cond: IEventPropertyContainsCondition, ev: MatrixEvent): boolean {\n if (!cond.key || cond.value === undefined) {\n return false;\n }\n const val = this.valueForDottedKey(cond.key, ev);\n if (!Array.isArray(val)) {\n return false;\n }\n return val.includes(cond.value);\n }\n\n private eventFulfillsCallStartedCondition(\n _cond: ICallStartedCondition | ICallStartedPrefixCondition,\n ev: MatrixEvent,\n ): boolean {\n // Since servers don't support properly sending push notification\n // about MSC3401 call events, we do the handling ourselves\n return (\n [\"m.ring\", \"m.prompt\"].includes(ev.getContent()[\"m.intent\"]) &&\n !(\"m.terminated\" in ev.getContent()) &&\n (ev.getPrevContent()[\"m.terminated\"] !== ev.getContent()[\"m.terminated\"] ||\n deepCompare(ev.getPrevContent(), {}))\n );\n }\n\n /**\n * Parse the key into the separate fields to search by splitting on\n * unescaped \".\", and then removing any escape characters.\n *\n * @param str - The key of the push rule condition: a dotted field.\n * @returns The unescaped parts to fetch.\n * @internal\n */\n public static partsForDottedKey(str: string): string[] {\n const result: string[] = [];\n\n // The current field and whether the previous character was the escape\n // character (a backslash).\n let part = \"\";\n let escaped = false;\n\n // Iterate over each character, and decide whether to append to the current\n // part (following the escape rules) or to start a new part (based on the\n // field separator).\n for (const c of str) {\n // If the previous character was the escape character (a backslash)\n // then decide what to append to the current part.\n if (escaped) {\n if (c === \"\\\\\" || c === \".\") {\n // An escaped backslash or dot just gets added.\n part += c;\n } else {\n // A character that shouldn't be escaped gets the backslash prepended.\n part += \"\\\\\" + c;\n }\n // This always resets being escaped.\n escaped = false;\n continue;\n }\n\n if (c == \".\") {\n // The field separator creates a new part.\n result.push(part);\n part = \"\";\n } else if (c == \"\\\\\") {\n // A backslash adds no characters, but starts an escape sequence.\n escaped = true;\n } else {\n // Otherwise, just add the current character.\n part += c;\n }\n }\n\n // Ensure the final part is included. If there's an open escape sequence\n // it should be included.\n if (escaped) {\n part += \"\\\\\";\n }\n result.push(part);\n\n return result;\n }\n\n /**\n * For a dotted field and event, fetch the value at that position, if one\n * exists.\n *\n * @param key - The key of the push rule condition: a dotted field to fetch.\n * @param ev - The matrix event to fetch the field from.\n * @returns The value at the dotted path given by key.\n */\n private valueForDottedKey(key: string, ev: MatrixEvent): any {\n // The key should already have been parsed via updateCachedPushRuleKeys,\n // but if it hasn't (maybe via an old consumer of the SDK which hasn't\n // been updated?) then lazily calculate it here.\n let parts = this.parsedKeys.get(key);\n if (parts === undefined) {\n parts = PushProcessor.partsForDottedKey(key);\n this.parsedKeys.set(key, parts);\n }\n let val: any;\n\n // special-case the first component to deal with encrypted messages\n const firstPart = parts[0];\n let currentIndex = 0;\n if (firstPart === \"content\") {\n val = ev.getContent();\n ++currentIndex;\n } else if (firstPart === \"type\") {\n val = ev.getType();\n ++currentIndex;\n } else {\n // use the raw event for any other fields\n val = ev.event;\n }\n\n for (; currentIndex < parts.length; ++currentIndex) {\n // The previous iteration resulted in null or undefined, bail (and\n // avoid the type error of attempting to retrieve a property).\n if (isNullOrUndefined(val)) {\n return undefined;\n }\n\n const thisPart = parts[currentIndex];\n val = val[thisPart];\n }\n return val;\n }\n\n private matchingRuleForEventWithRulesets(ev: MatrixEvent, rulesets?: IPushRules): IAnnotatedPushRule | null {\n if (!rulesets) {\n return null;\n }\n\n if (ev.getSender() === this.client.getSafeUserId()) {\n return null;\n }\n\n return this.matchingRuleFromKindSet(ev, rulesets.global);\n }\n\n private pushActionsForEventAndRulesets(\n ev: MatrixEvent,\n rulesets?: IPushRules,\n ): {\n actions?: IActionsObject;\n rule?: IAnnotatedPushRule;\n } {\n const rule = this.matchingRuleForEventWithRulesets(ev, rulesets);\n if (!rule) {\n return {};\n }\n\n const actionObj = PushProcessor.actionListToActionsObject(rule.actions);\n\n // Some actions are implicit in some situations: we add those here\n if (actionObj.tweaks.highlight === undefined) {\n // if it isn't specified, highlight if it's a content\n // rule but otherwise not\n actionObj.tweaks.highlight = rule.kind == PushRuleKind.ContentSpecific;\n }\n\n return { actions: actionObj, rule };\n }\n\n public ruleMatchesEvent(rule: Partial<IPushRule> & Pick<IPushRule, \"conditions\">, ev: MatrixEvent): boolean {\n // Disable the deprecated mentions push rules if the new mentions property exists.\n if (\n this.client.supportsIntentionalMentions() &&\n ev.getContent()[\"m.mentions\"] !== undefined &&\n (rule.rule_id === RuleId.ContainsUserName ||\n rule.rule_id === RuleId.ContainsDisplayName ||\n rule.rule_id === RuleId.AtRoomNotification)\n ) {\n return false;\n }\n\n return !rule.conditions?.some((cond) => !this.eventFulfillsCondition(cond, ev));\n }\n\n /**\n * Get the user's push actions for the given event\n */\n public actionsForEvent(ev: MatrixEvent): IActionsObject {\n const { actions } = this.pushActionsForEventAndRulesets(ev, this.client.pushRules);\n return actions || ({} as IActionsObject);\n }\n\n public actionsAndRuleForEvent(ev: MatrixEvent): {\n actions?: IActionsObject;\n rule?: IAnnotatedPushRule;\n } {\n return this.pushActionsForEventAndRulesets(ev, this.client.pushRules);\n }\n\n /**\n * Get one of the users push rules by its ID\n *\n * @param ruleId - The ID of the rule to search for\n * @returns The push rule, or null if no such rule was found\n */\n public getPushRuleById(ruleId: string): IPushRule | null {\n const result = this.getPushRuleAndKindById(ruleId);\n return result?.rule ?? null;\n }\n\n /**\n * Get one of the users push rules by its ID\n *\n * @param ruleId - The ID of the rule to search for\n * @returns rule The push rule, or null if no such rule was found\n * @returns kind - The PushRuleKind of the rule to search for\n */\n public getPushRuleAndKindById(ruleId: string): { rule: IPushRule; kind: PushRuleKind } | null {\n for (const scope of [\"global\"] as const) {\n if (this.client.pushRules?.[scope] === undefined) continue;\n\n for (const kind of RULEKINDS_IN_ORDER) {\n if (this.client.pushRules[scope][kind] === undefined) continue;\n\n for (const rule of this.client.pushRules[scope][kind]!) {\n if (rule.rule_id === ruleId) return { rule, kind };\n }\n }\n }\n return null;\n }\n}\n"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,YAAY,EAAEC,YAAY,EAAEC,iBAAiB,QAAQ,YAAY;AAIvF,SACIC,aAAa,EAabC,kBAAkB,EAElBC,YAAY,EAEZC,MAAM,EACNC,SAAS,QACN,uBAAuB;AAC9B,SAASC,SAAS,QAAQ,mBAAmB;AAE7C,IAAMC,kBAAkB,GAAG,CACvBJ,YAAY,CAACK,QAAQ,EACrBL,YAAY,CAACM,eAAe,EAC5BN,YAAY,CAACO,YAAY,EACzBP,YAAY,CAACQ,cAAc,EAC3BR,YAAY,CAACS,SAAS,CACzB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,sBAAiD,GAAG;EACtD,yBAAyB,EAAE;IACvB;IACAC,OAAO,EAAE,yBAAyB;IAClCC,OAAO,EAAE,IAAI;IACbC,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,CACR;MACIC,IAAI,EAAEjB,aAAa,CAACkB,eAAe;MACnCC,GAAG,EAAE,2BAA2B;MAChCC,KAAK,EAAE;IACX,CAAC,EACD;MACIH,IAAI,EAAEjB,aAAa,CAACqB,4BAA4B;MAChDF,GAAG,EAAE;IACT,CAAC,CACJ;IACDG,OAAO,EAAE,CACLrB,kBAAkB,CAACsB,MAAM,EACzB;MACIC,SAAS,EAAEpB,SAAS,CAACqB;IACzB,CAAC;EAET,CAAC;EACD,kBAAkB,EAAE;IAChB;IACAZ,OAAO,EAAE,kBAAkB;IAC3BC,OAAO,EAAE,IAAI;IACbC,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,CACR;MACIC,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;MAC9BP,GAAG,EAAE,MAAM;MACXQ,OAAO,EAAE;IACb,CAAC,CACJ;IACDL,OAAO,EAAE,CAACrB,kBAAkB,CAAC2B,UAAU;EAC3C,CAAC;EACD,0CAA0C,EAAE;IACxC;IACAf,OAAO,EAAE,0CAA0C;IACnDC,OAAO,EAAE,IAAI;IACbC,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,CACR;MACIC,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;MAC9BP,GAAG,EAAE,MAAM;MACXQ,OAAO,EAAEtB,SAAS,CAACwB;IACvB,CAAC,EACD;MACIZ,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;MAC9BP,GAAG,EAAE,WAAW;MAChBQ,OAAO,EAAE;IACb,CAAC,CACJ;IACDL,OAAO,EAAE;EACb;AACJ,CAAC;;AAED;AACA,IAAMQ,gBAAgB,GAAGC,MAAM,CAAC,kBAAkB,CAAC;AAInD,IAAMC,kCAAgD,GAAG,CACrD7B,MAAM,CAAC8B,MAAM,EACbH,gBAAgB,EAChB3B,MAAM,CAAC+B,eAAe,EACtB/B,MAAM,CAACgC,YAAY,EACnBhC,MAAM,CAACiC,WAAW,EAClBjC,MAAM,CAACkC,aAAa,EACpBlC,MAAM,CAACmC,mBAAmB,EAC1BnC,MAAM,CAACoC,aAAa,EACpBpC,MAAM,CAACqC,kBAAkB,EACzBrC,MAAM,CAACsC,SAAS,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,0CAA0C,EAC1C,wBAAwB,CAC3B;AAED,IAAMC,uBAAkD,GAAG;EACvD,oCAAoC,EAAE;IAClC;IACA7B,OAAO,EAAE,oCAAoC;IAC7CC,OAAO,EAAE,IAAI;IACbC,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,CACR;MACIC,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;MAC9BP,GAAG,EAAE,MAAM;MACXQ,OAAO,EAAE;IACb,CAAC,EACD;MACIV,IAAI,EAAEjB,aAAa,CAAC2C;IACxB,CAAC,CACJ;IACDrB,OAAO,EAAE,CAACrB,kBAAkB,CAACsB,MAAM,EAAE;MAAEC,SAAS,EAAEpB,SAAS,CAACwC,KAAK;MAAExB,KAAK,EAAE;IAAU,CAAC;EACzF;AACJ,CAAC;AAED,IAAMyB,mCAAiD,GAAG,CACtDf,gBAAgB,EAChB3B,MAAM,CAAC2C,YAAY,EACnB,oCAAoC,EACpC3C,MAAM,CAAC4C,WAAW,EAClB5C,MAAM,CAAC6C,EAAE,EACT7C,MAAM,CAAC8C,OAAO,EACd9C,MAAM,CAAC+C,gBAAgB,CAC1B;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,sBAAsBA,CAC3BC,MAAc,EACdnC,IAAkB,EAClBoC,aAA0B,EAC1BC,YAAuC,EACvCC,cAA4B,EACjB;EACX;EACA,IAAMC,oBAAoB,GAAGH,aAAa,CAACI,MAAM,CAAEC,IAAI,IAAKA,IAAI,CAAC5C,OAAO,CAAC;EACzE,IAAM6C,mBAAmB,GAAGN,aAAa,CAACI,MAAM,CAAEC,IAAI,IAAK,CAACA,IAAI,CAAC5C,OAAO,CAAC;EAEzE,SAAS8C,qBAAqBA,CAACC,MAA4B,EAAQ;IAC/D,IAAIA,MAAM,KAAK/B,gBAAgB,EAAE;MAC7B;MACAgC,QAAQ,CAACC,IAAI,CAAC,GAAGJ,mBAAmB,CAAC;IACzC,CAAC,MAAM,IAAIE,MAAM,IAAIP,YAAY,EAAE;MAC/BF,MAAM,CAACY,IAAI,0BAAAC,MAAA,CAA0BhD,IAAI,iBAAAgD,MAAA,CAAcJ,MAAM,CAAE,CAAC;MAChEC,QAAQ,CAACC,IAAI,CAACT,YAAY,CAACO,MAAM,CAAC,CAAC;IACvC,CAAC,MAAM;MACHT,MAAM,CAACY,IAAI,2BAAAC,MAAA,CAA2BhD,IAAI,iBAAAgD,MAAA,CAAcJ,MAAM,CAAE,CAAC;IACrE;EACJ;EAEA,IAAIK,uBAAuB,GAAG,CAAC;EAC/B,IAAMJ,QAAqB,GAAG,EAAE;EAChC;EACA,KAAK,IAAMJ,IAAI,IAAIF,oBAAoB,EAAE;IACrC,IAAMW,SAAS,GAAGZ,cAAc,CAACa,OAAO,CAACV,IAAI,CAAC7C,OAAO,CAAC;IACtD,IAAIsD,SAAS,KAAK,CAAC,CAAC,EAAE;MAClB;MACAL,QAAQ,CAACC,IAAI,CAACL,IAAI,CAAC;MACnB;IACJ;IACA,OAAOS,SAAS,GAAGD,uBAAuB,EAAE;MACxC;MACA,IAAMG,aAAa,GAAGd,cAAc,CAACW,uBAAuB,CAAC;MAC7DN,qBAAqB,CAACS,aAAa,CAAC;MACpCH,uBAAuB,IAAI,CAAC;IAChC;IACA;IACAJ,QAAQ,CAACC,IAAI,CAACL,IAAI,CAAC;IACnBQ,uBAAuB,IAAI,CAAC;EAChC;;EAEA;EACA,KAAK,IAAML,MAAM,IAAIN,cAAc,CAACe,KAAK,CAACJ,uBAAuB,CAAC,EAAE;IAChEN,qBAAqB,CAACC,MAAM,CAAC;EACjC;EAEA,OAAOC,QAAQ;AACnB;AASA,OAAO,MAAMS,aAAa,CAAC;EACvB;AACJ;AACA;AACA;EACWC,WAAWA,CAAkBC,MAAoB,EAAE;IAE1D;AACJ;AACA;AACA;IAHIC,eAAA,qBAI8B,IAAIC,GAAG,CAAmB,CAAC;IAAA,KANrBF,MAAoB,GAApBA,MAAoB;EAAG;EAQ3D;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,OAAcG,yBAAyBA,CAACC,UAA4B,EAAkB;IAClF,IAAMC,SAAyB,GAAG;MAAEC,MAAM,EAAE,KAAK;MAAEC,MAAM,EAAE,CAAC;IAAE,CAAC;IAC/D,KAAK,IAAMC,MAAM,IAAIJ,UAAU,EAAE;MAC7B,IAAII,MAAM,KAAKhF,kBAAkB,CAACsB,MAAM,EAAE;QACtCuD,SAAS,CAACC,MAAM,GAAG,IAAI;MAC3B,CAAC,MAAM,IAAI,OAAOE,MAAM,KAAK,QAAQ,EAAE;QACnC,IAAIA,MAAM,CAAC7D,KAAK,KAAK8D,SAAS,EAAE;UAC5BD,MAAM,CAAC7D,KAAK,GAAG,IAAI;QACvB;QACA0D,SAAS,CAACE,MAAM,CAACC,MAAM,CAACzD,SAAS,CAAC,GAAGyD,MAAM,CAAC7D,KAAK;MACrD;IACJ;IACA,OAAO0D,SAAS;EACpB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,OAAcK,mBAAmBA,CAC7B/B,MAAc,EACdC,aAAyB,EAEf;IAAA,IADV+B,MAA0B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAH,SAAA,GAAAG,SAAA,MAAGH,SAAS;IAEtC,IAAIpB,QAAoB,GAAGyB,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACpC,aAAa,CAAC,CAAC,CAAC,CAAC;;IAEtE;IACA;IACA,IAAI,CAACS,QAAQ,EAAEA,QAAQ,GAAG,CAAC,CAAe;IAC1C,IAAI,CAACA,QAAQ,CAAC4B,MAAM,EAAE5B,QAAQ,CAAC4B,MAAM,GAAG,CAAC,CAAgB;IACzD,IAAI,CAAC5B,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,EAAE7B,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,GAAG,EAAE;IAC5D,IAAI,CAAC7B,QAAQ,CAAC4B,MAAM,CAACE,SAAS,EAAE9B,QAAQ,CAAC4B,MAAM,CAACE,SAAS,GAAG,EAAE;;IAE9D;IACA9B,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,GAAGxC,sBAAsB,CAC7CC,MAAM,EACNlD,YAAY,CAACK,QAAQ,EACrBuD,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,EACxB/E,sBAAsB,EACtBoB,kCACJ,CAAC;IAED8B,QAAQ,CAAC4B,MAAM,CAACE,SAAS,GAAGzC,sBAAsB,CAC9CC,MAAM,EACNlD,YAAY,CAACS,SAAS,EACtBmD,QAAQ,CAAC4B,MAAM,CAACE,SAAS,EACzBlD,uBAAuB,EACvBG,mCACJ,CAAC;IAED,OAAOiB,QAAQ;EACnB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,OAAc+B,oBAAoBA,CAAClE,OAAe,EAAoD;IAAA,IAAlDmE,mBAAmB,GAAAT,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAH,SAAA,GAAAG,SAAA,MAAG,KAAK;IAAA,IAAEU,KAAK,GAAAV,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAH,SAAA,GAAAG,SAAA,MAAG,GAAG;IACxF,IAAAW,IAAA,GAAyBF,mBAAmB,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;MAAAG,KAAA,GAAAC,cAAA,CAAAF,IAAA;MAAhFG,MAAM,GAAAF,KAAA;MAAEG,MAAM,GAAAH,KAAA;IACrB,IAAMI,QAAQ,MAAApC,MAAA,CAAM6B,mBAAmB,OAAA7B,MAAA,CAAI8B,KAAK,OAAA9B,MAAA,CAAItC,OAAO,CAAE;IAE7D,IAAI,CAAC4C,aAAa,CAAC+B,iBAAiB,CAACD,QAAQ,CAAC,EAAE;MAC5C9B,aAAa,CAAC+B,iBAAiB,CAACD,QAAQ,CAAC,GAAG,IAAIE,MAAM,CAClDJ,MAAM,GAAG,GAAG,GAAGrG,YAAY,CAAC6B,OAAO,CAAC,GAAG,GAAG,GAAGyE,MAAM,EACnDL,KACJ,CAAC;IACL;IACA,OAAOxB,aAAa,CAAC+B,iBAAiB,CAACD,QAAQ,CAAC;EACpD;;EAEA;AACJ;AACA;AACA;AACA;EACWG,wBAAwBA,CAAC1C,QAAoB,EAAQ;IACxD;IACA;IACA,IAAI,CAACA,QAAQ,EAAEA,QAAQ,GAAG,CAAC,CAAe;IAC1C,IAAI,CAACA,QAAQ,CAAC4B,MAAM,EAAE5B,QAAQ,CAAC4B,MAAM,GAAG,CAAC,CAAgB;IACzD,IAAI,CAAC5B,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,EAAE7B,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,GAAG,EAAE;IAC5D,IAAI,CAAC7B,QAAQ,CAAC4B,MAAM,CAACe,IAAI,EAAE3C,QAAQ,CAAC4B,MAAM,CAACe,IAAI,GAAG,EAAE;IACpD,IAAI,CAAC3C,QAAQ,CAAC4B,MAAM,CAACgB,MAAM,EAAE5C,QAAQ,CAAC4B,MAAM,CAACgB,MAAM,GAAG,EAAE;IACxD,IAAI,CAAC5C,QAAQ,CAAC4B,MAAM,CAACE,SAAS,EAAE9B,QAAQ,CAAC4B,MAAM,CAACE,SAAS,GAAG,EAAE;;IAE9D;IACA;IACA,IAAMe,YAAY,GAAG,IAAIC,GAAG,CAAC,IAAI,CAACC,UAAU,CAACC,IAAI,CAAC,CAAC,CAAC;IACpD,KAAK,IAAMC,OAAO,IAAI,CAClBjD,QAAQ,CAAC4B,MAAM,CAACC,QAAQ,EACxB7B,QAAQ,CAAC4B,MAAM,CAACe,IAAI,EACpB3C,QAAQ,CAAC4B,MAAM,CAACgB,MAAM,EACtB5C,QAAQ,CAAC4B,MAAM,CAACE,SAAS,CAC5B,EAAE;MACC,KAAK,IAAMlC,IAAI,IAAIqD,OAAO,EAAE;QACxB,IAAI,CAACrD,IAAI,CAAC1C,UAAU,EAAE;UAClB;QACJ;QAEA,KAAK,IAAMgG,SAAS,IAAItD,IAAI,CAAC1C,UAAU,EAAE;UACrC,IAAIgG,SAAS,CAAC/F,IAAI,KAAKjB,aAAa,CAAC0B,UAAU,EAAE;YAC7C;UACJ;;UAEA;UACAiF,YAAY,CAACM,MAAM,CAACD,SAAS,CAAC7F,GAAG,CAAC;;UAElC;UACA,IAAI,CAAC0F,UAAU,CAACK,GAAG,CAACF,SAAS,CAAC7F,GAAG,EAAEoD,aAAa,CAAC4C,iBAAiB,CAACH,SAAS,CAAC7F,GAAG,CAAC,CAAC;QACtF;MACJ;IACJ;IACA;IACA;IACAwF,YAAY,CAACS,OAAO,CAAEC,CAAC,IAAK,IAAI,CAACR,UAAU,CAACI,MAAM,CAACI,CAAC,CAAC,CAAC;EAC1D;EAE+D;;EAEvDC,uBAAuBA,CAACC,EAAe,EAAEC,OAAoB,EAA6B;IAC9F,KAAK,IAAMvG,IAAI,IAAIX,kBAAkB,EAAE;MACnC,IAAMyG,OAAO,GAAGS,OAAO,CAACvG,IAAI,CAAC;MAC7B,IAAI,CAAC8F,OAAO,EAAE;QACV;MACJ;MAEA,KAAK,IAAMrD,IAAI,IAAIqD,OAAO,EAAE;QACxB,IAAI,CAACrD,IAAI,CAAC3C,OAAO,EAAE;UACf;QACJ;QAEA,IAAM0G,OAAO,GAAG,IAAI,CAACC,iBAAiB,CAACzG,IAAI,EAAEyC,IAAI,CAAC;QAClD,IAAI,CAAC+D,OAAO,EAAE;UACV;QACJ;QAEA,IAAI,IAAI,CAACE,gBAAgB,CAACF,OAAO,EAAEF,EAAE,CAAC,EAAE;UACpC,OAAAK,aAAA,CAAAA,aAAA,KACOlE,IAAI;YACPzC;UAAI;QAEZ;MACJ;IACJ;IACA,OAAO,IAAI;EACf;EAEQyG,iBAAiBA,CACrBzG,IAAkB,EAClB4G,MAAiB,EAC2C;IAC5D,IAAMJ,OAA8D,GAAG;MACnE5G,OAAO,EAAEgH,MAAM,CAAChH,OAAO;MACvBS,OAAO,EAAEuG,MAAM,CAACvG,OAAO;MACvBN,UAAU,EAAE;IAChB,CAAC;IACD,QAAQC,IAAI;MACR,KAAKf,YAAY,CAACS,SAAS;MAC3B,KAAKT,YAAY,CAACK,QAAQ;QACtBkH,OAAO,CAACzG,UAAU,GAAG6G,MAAM,CAAC7G,UAAU;QACtC;MACJ,KAAKd,YAAY,CAACO,YAAY;QAC1B,IAAI,CAACoH,MAAM,CAAChH,OAAO,EAAE;UACjB,OAAO,IAAI;QACf;QACA4G,OAAO,CAACzG,UAAU,CAAE+C,IAAI,CAAC;UACrB9C,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;UAC9BP,GAAG,EAAE,SAAS;UACdC,KAAK,EAAEyG,MAAM,CAAChH;QAClB,CAAC,CAAC;QACF;MACJ,KAAKX,YAAY,CAACQ,cAAc;QAC5B,IAAI,CAACmH,MAAM,CAAChH,OAAO,EAAE;UACjB,OAAO,IAAI;QACf;QACA4G,OAAO,CAACzG,UAAU,CAAE+C,IAAI,CAAC;UACrB9C,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;UAC9BP,GAAG,EAAE,SAAS;UACdC,KAAK,EAAEyG,MAAM,CAAChH;QAClB,CAAC,CAAC;QACF;MACJ,KAAKX,YAAY,CAACM,eAAe;QAC7B,IAAI,CAACqH,MAAM,CAAClG,OAAO,EAAE;UACjB,OAAO,IAAI;QACf;QACA8F,OAAO,CAACzG,UAAU,CAAE+C,IAAI,CAAC;UACrB9C,IAAI,EAAEjB,aAAa,CAAC0B,UAAU;UAC9BP,GAAG,EAAE,cAAc;UACnBQ,OAAO,EAAEkG,MAAM,CAAClG;QACpB,CAAC,CAAC;QACF;IACR;IACA,OAAO8F,OAAO;EAClB;EAEQK,sBAAsBA,CAACC,IAAuB,EAAER,EAAe,EAAW;IAC9E,QAAQQ,IAAI,CAAC9G,IAAI;MACb,KAAKjB,aAAa,CAAC0B,UAAU;QACzB,OAAO,IAAI,CAACsG,gCAAgC,CAACD,IAAI,EAAER,EAAE,CAAC;MAC1D,KAAKvH,aAAa,CAACkB,eAAe;QAC9B,OAAO,IAAI,CAAC+G,qCAAqC,CAACF,IAAI,EAAER,EAAE,CAAC;MAC/D,KAAKvH,aAAa,CAACkI,qBAAqB;QACpC,OAAO,IAAI,CAACC,kCAAkC,CAACJ,IAAI,EAAER,EAAE,CAAC;MAC5D,KAAKvH,aAAa,CAACsC,mBAAmB;QAClC,OAAO,IAAI,CAAC8F,iCAAiC,CAACL,IAAI,EAAER,EAAE,CAAC;MAC3D,KAAKvH,aAAa,CAACqI,eAAe;QAC9B,OAAO,IAAI,CAACC,qCAAqC,CAACP,IAAI,EAAER,EAAE,CAAC;MAC/D,KAAKvH,aAAa,CAACqB,4BAA4B;QAC3C,OAAO,IAAI,CAACkH,qCAAqC,CAACR,IAAI,EAAER,EAAE,CAAC;MAC/D,KAAKvH,aAAa,CAAC2C,WAAW;MAC9B,KAAK3C,aAAa,CAACwI,iBAAiB;QAChC,OAAO,IAAI,CAACC,iCAAiC,CAACV,IAAI,EAAER,EAAE,CAAC;IAC/D;;IAEA;IACA;IACA;IACA,OAAO,KAAK;EAChB;EAEQgB,qCAAqCA,CACzCR,IAA4C,EAC5CR,EAAe,EACR;IACP,IAAMmB,aAAa,GAAGX,IAAI,CAAC,KAAK,CAAC;IACjC,IAAI,CAACW,aAAa,EAAE;MAChB,OAAO,KAAK;IAChB;IAEA,IAAMjC,IAAI,GAAG,IAAI,CAAChC,MAAM,CAACkE,OAAO,CAACpB,EAAE,CAACqB,SAAS,CAAC,CAAC,CAAC;IAChD,IAAI,EAACnC,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEoC,YAAY,GAAE;MACrB,OAAO,KAAK;IAChB;;IAEA;IACA;IACA;IACA,OAAOpC,IAAI,CAACoC,YAAY,CAACC,qBAAqB,CAACJ,aAAa,EAAEnB,EAAE,CAACwB,SAAS,CAAC,CAAE,CAAC;EAClF;EAEQT,qCAAqCA,CAACP,IAA+B,EAAER,EAAe,EAAW;IACrG,IAAI,CAACQ,IAAI,CAACiB,EAAE,EAAE;MACV,OAAO,KAAK;IAChB;IAEA,IAAMvC,IAAI,GAAG,IAAI,CAAChC,MAAM,CAACkE,OAAO,CAACpB,EAAE,CAACqB,SAAS,CAAC,CAAC,CAAC;IAChD,IAAI,CAACnC,IAAI,IAAI,CAACA,IAAI,CAACoC,YAAY,IAAI,CAACpC,IAAI,CAACoC,YAAY,CAACI,OAAO,EAAE;MAC3D,OAAO,KAAK;IAChB;IAEA,IAAMC,WAAW,GAAGzC,IAAI,CAACoC,YAAY,CAACM,oBAAoB,CAAC,CAAC;IAE5D,IAAMC,CAAC,GAAGrB,IAAI,CAACiB,EAAE,CAACK,KAAK,CAAC,iBAAiB,CAAC;IAC1C,IAAI,CAACD,CAAC,EAAE;MACJ,OAAO,KAAK;IAChB;IACA,IAAME,IAAI,GAAGF,CAAC,CAAC,CAAC,CAAC;IACjB,IAAMG,GAAG,GAAGC,QAAQ,CAACJ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAIK,KAAK,CAACF,GAAG,CAAC,EAAE;MACZ,OAAO,KAAK;IAChB;IACA,QAAQD,IAAI;MACR,KAAK,EAAE;MACP,KAAK,IAAI;QACL,OAAOJ,WAAW,IAAIK,GAAG;MAC7B,KAAK,GAAG;QACJ,OAAOL,WAAW,GAAGK,GAAG;MAC5B,KAAK,GAAG;QACJ,OAAOL,WAAW,GAAGK,GAAG;MAC5B,KAAK,IAAI;QACL,OAAOL,WAAW,IAAIK,GAAG;MAC7B,KAAK,IAAI;QACL,OAAOL,WAAW,IAAIK,GAAG;MAC7B;QACI,OAAO,KAAK;IACpB;EACJ;EAEQnB,iCAAiCA,CAACL,IAAmC,EAAER,EAAe,EAAW;IAAA,IAAAmC,kBAAA;IACrG,IAAIC,OAAO,GAAGpC,EAAE,CAACqC,UAAU,CAAC,CAAC;IAC7B,IAAIrC,EAAE,CAACsC,WAAW,CAAC,CAAC,IAAItC,EAAE,CAACuC,eAAe,CAAC,CAAC,EAAE;MAC1CH,OAAO,GAAGpC,EAAE,CAACuC,eAAe,CAAC,CAAE;IACnC;IACA,IAAI,CAACH,OAAO,IAAI,CAACA,OAAO,CAACI,IAAI,IAAI,OAAOJ,OAAO,CAACI,IAAI,IAAI,QAAQ,EAAE;MAC9D,OAAO,KAAK;IAChB;IAEA,IAAMtD,IAAI,GAAG,IAAI,CAAChC,MAAM,CAACkE,OAAO,CAACpB,EAAE,CAACqB,SAAS,CAAC,CAAC,CAAC;IAChD,IAAMoB,MAAM,GAAGvD,IAAI,aAAJA,IAAI,gBAAAiD,kBAAA,GAAJjD,IAAI,CAAEoC,YAAY,cAAAa,kBAAA,uBAAlBA,kBAAA,CAAoBO,SAAS,CAAC,IAAI,CAACxF,MAAM,CAACyF,WAAW,CAAC9E,MAAO,CAAC;IAC7E,IAAI,CAAC4E,MAAM,EAAE;MACT,OAAO,KAAK;IAChB;IAEA,IAAMG,WAAW,GAAGH,MAAM,CAACI,IAAI;;IAE/B;IACA;IACA,IAAMC,GAAG,GAAG,IAAI9D,MAAM,CAAC,SAAS,GAAG1G,YAAY,CAACsK,WAAW,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC;IAC9E,OAAOR,OAAO,CAACI,IAAI,CAACO,MAAM,CAACD,GAAG,CAAC,GAAG,CAAC,CAAC;EACxC;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACYrC,gCAAgCA,CAACD,IAA0B,EAAER,EAAe,EAAW;IAC3F,IAAI,CAACQ,IAAI,CAAC5G,GAAG,EAAE;MACX,OAAO,KAAK;IAChB;IAEA,IAAMoJ,GAAG,GAAG,IAAI,CAACC,iBAAiB,CAACzC,IAAI,CAAC5G,GAAG,EAAEoG,EAAE,CAAC;IAChD,IAAI,OAAOgD,GAAG,KAAK,QAAQ,EAAE;MACzB,OAAO,KAAK;IAChB;;IAEA;IACA;IACA;IACA,IAAIxC,IAAI,CAAC3G,KAAK,EAAE;MACZ,OAAO2G,IAAI,CAAC3G,KAAK,KAAKmJ,GAAG;IAC7B;IAEA,IAAI,OAAOxC,IAAI,CAACpG,OAAO,KAAK,QAAQ,EAAE;MAClC,OAAO,KAAK;IAChB;;IAEA;IACA;IACA,IAAM8I,KAAK,GAAGlG,aAAa,CAACsB,oBAAoB,CAACkC,IAAI,CAACpG,OAAO,EAAEoG,IAAI,CAAC5G,GAAG,KAAK,cAAc,CAAC;IAC3F,OAAO,CAAC,CAACoJ,GAAG,CAAClB,KAAK,CAACoB,KAAK,CAAC;EAC7B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACYxC,qCAAqCA,CAACF,IAA+B,EAAER,EAAe,EAAW;IACrG,IAAI,CAACQ,IAAI,CAAC5G,GAAG,IAAI4G,IAAI,CAAC3G,KAAK,KAAK8D,SAAS,EAAE;MACvC,OAAO,KAAK;IAChB;IACA,OAAO6C,IAAI,CAAC3G,KAAK,KAAK,IAAI,CAACoJ,iBAAiB,CAACzC,IAAI,CAAC5G,GAAG,EAAEoG,EAAE,CAAC;EAC9D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACYY,kCAAkCA,CAACJ,IAAqC,EAAER,EAAe,EAAW;IACxG,IAAI,CAACQ,IAAI,CAAC5G,GAAG,IAAI4G,IAAI,CAAC3G,KAAK,KAAK8D,SAAS,EAAE;MACvC,OAAO,KAAK;IAChB;IACA,IAAMqF,GAAG,GAAG,IAAI,CAACC,iBAAiB,CAACzC,IAAI,CAAC5G,GAAG,EAAEoG,EAAE,CAAC;IAChD,IAAI,CAACmD,KAAK,CAACC,OAAO,CAACJ,GAAG,CAAC,EAAE;MACrB,OAAO,KAAK;IAChB;IACA,OAAOA,GAAG,CAACK,QAAQ,CAAC7C,IAAI,CAAC3G,KAAK,CAAC;EACnC;EAEQqH,iCAAiCA,CACrCoC,KAA0D,EAC1DtD,EAAe,EACR;IACP;IACA;IACA,OACI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAACqD,QAAQ,CAACrD,EAAE,CAACqC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAC5D,EAAE,cAAc,IAAIrC,EAAE,CAACqC,UAAU,CAAC,CAAC,CAAC,KACnCrC,EAAE,CAACuD,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,KAAKvD,EAAE,CAACqC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,IACpEhK,WAAW,CAAC2H,EAAE,CAACuD,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EAEjD;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACI,OAAc3D,iBAAiBA,CAAC4D,GAAW,EAAY;IACnD,IAAMC,MAAgB,GAAG,EAAE;;IAE3B;IACA;IACA,IAAIC,IAAI,GAAG,EAAE;IACb,IAAIC,OAAO,GAAG,KAAK;;IAEnB;IACA;IACA;IACA,KAAK,IAAMC,CAAC,IAAIJ,GAAG,EAAE;MACjB;MACA;MACA,IAAIG,OAAO,EAAE;QACT,IAAIC,CAAC,KAAK,IAAI,IAAIA,CAAC,KAAK,GAAG,EAAE;UACzB;UACAF,IAAI,IAAIE,CAAC;QACb,CAAC,MAAM;UACH;UACAF,IAAI,IAAI,IAAI,GAAGE,CAAC;QACpB;QACA;QACAD,OAAO,GAAG,KAAK;QACf;MACJ;MAEA,IAAIC,CAAC,IAAI,GAAG,EAAE;QACV;QACAH,MAAM,CAACjH,IAAI,CAACkH,IAAI,CAAC;QACjBA,IAAI,GAAG,EAAE;MACb,CAAC,MAAM,IAAIE,CAAC,IAAI,IAAI,EAAE;QAClB;QACAD,OAAO,GAAG,IAAI;MAClB,CAAC,MAAM;QACH;QACAD,IAAI,IAAIE,CAAC;MACb;IACJ;;IAEA;IACA;IACA,IAAID,OAAO,EAAE;MACTD,IAAI,IAAI,IAAI;IAChB;IACAD,MAAM,CAACjH,IAAI,CAACkH,IAAI,CAAC;IAEjB,OAAOD,MAAM;EACjB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACYR,iBAAiBA,CAACrJ,GAAW,EAAEoG,EAAe,EAAO;IACzD;IACA;IACA;IACA,IAAI6D,KAAK,GAAG,IAAI,CAACvE,UAAU,CAACwE,GAAG,CAAClK,GAAG,CAAC;IACpC,IAAIiK,KAAK,KAAKlG,SAAS,EAAE;MACrBkG,KAAK,GAAG7G,aAAa,CAAC4C,iBAAiB,CAAChG,GAAG,CAAC;MAC5C,IAAI,CAAC0F,UAAU,CAACK,GAAG,CAAC/F,GAAG,EAAEiK,KAAK,CAAC;IACnC;IACA,IAAIb,GAAQ;;IAEZ;IACA,IAAMe,SAAS,GAAGF,KAAK,CAAC,CAAC,CAAC;IAC1B,IAAIG,YAAY,GAAG,CAAC;IACpB,IAAID,SAAS,KAAK,SAAS,EAAE;MACzBf,GAAG,GAAGhD,EAAE,CAACqC,UAAU,CAAC,CAAC;MACrB,EAAE2B,YAAY;IAClB,CAAC,MAAM,IAAID,SAAS,KAAK,MAAM,EAAE;MAC7Bf,GAAG,GAAGhD,EAAE,CAACiE,OAAO,CAAC,CAAC;MAClB,EAAED,YAAY;IAClB,CAAC,MAAM;MACH;MACAhB,GAAG,GAAGhD,EAAE,CAACkE,KAAK;IAClB;IAEA,OAAOF,YAAY,GAAGH,KAAK,CAAC9F,MAAM,EAAE,EAAEiG,YAAY,EAAE;MAChD;MACA;MACA,IAAIxL,iBAAiB,CAACwK,GAAG,CAAC,EAAE;QACxB,OAAOrF,SAAS;MACpB;MAEA,IAAMwG,QAAQ,GAAGN,KAAK,CAACG,YAAY,CAAC;MACpChB,GAAG,GAAGA,GAAG,CAACmB,QAAQ,CAAC;IACvB;IACA,OAAOnB,GAAG;EACd;EAEQoB,gCAAgCA,CAACpE,EAAe,EAAEqE,QAAqB,EAA6B;IACxG,IAAI,CAACA,QAAQ,EAAE;MACX,OAAO,IAAI;IACf;IAEA,IAAIrE,EAAE,CAACwB,SAAS,CAAC,CAAC,KAAK,IAAI,CAACtE,MAAM,CAACoH,aAAa,CAAC,CAAC,EAAE;MAChD,OAAO,IAAI;IACf;IAEA,OAAO,IAAI,CAACvE,uBAAuB,CAACC,EAAE,EAAEqE,QAAQ,CAAClG,MAAM,CAAC;EAC5D;EAEQoG,8BAA8BA,CAClCvE,EAAe,EACfqE,QAAqB,EAIvB;IACE,IAAMlI,IAAI,GAAG,IAAI,CAACiI,gCAAgC,CAACpE,EAAE,EAAEqE,QAAQ,CAAC;IAChE,IAAI,CAAClI,IAAI,EAAE;MACP,OAAO,CAAC,CAAC;IACb;IAEA,IAAMoB,SAAS,GAAGP,aAAa,CAACK,yBAAyB,CAAClB,IAAI,CAACpC,OAAO,CAAC;;IAEvE;IACA,IAAIwD,SAAS,CAACE,MAAM,CAAC+G,SAAS,KAAK7G,SAAS,EAAE;MAC1C;MACA;MACAJ,SAAS,CAACE,MAAM,CAAC+G,SAAS,GAAGrI,IAAI,CAACzC,IAAI,IAAIf,YAAY,CAACM,eAAe;IAC1E;IAEA,OAAO;MAAEc,OAAO,EAAEwD,SAAS;MAAEpB;IAAK,CAAC;EACvC;EAEOiE,gBAAgBA,CAACjE,IAAwD,EAAE6D,EAAe,EAAW;IAAA,IAAAyE,gBAAA;IACxG;IACA,IACI,IAAI,CAACvH,MAAM,CAACwH,2BAA2B,CAAC,CAAC,IACzC1E,EAAE,CAACqC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK1E,SAAS,KAC1CxB,IAAI,CAAC7C,OAAO,KAAKV,MAAM,CAAC+L,gBAAgB,IACrCxI,IAAI,CAAC7C,OAAO,KAAKV,MAAM,CAACmC,mBAAmB,IAC3CoB,IAAI,CAAC7C,OAAO,KAAKV,MAAM,CAACqC,kBAAkB,CAAC,EACjD;MACE,OAAO,KAAK;IAChB;IAEA,OAAO,GAAAwJ,gBAAA,GAACtI,IAAI,CAAC1C,UAAU,cAAAgL,gBAAA,eAAfA,gBAAA,CAAiBG,IAAI,CAAEpE,IAAI,IAAK,CAAC,IAAI,CAACD,sBAAsB,CAACC,IAAI,EAAER,EAAE,CAAC,CAAC;EACnF;;EAEA;AACJ;AACA;EACW6E,eAAeA,CAAC7E,EAAe,EAAkB;IACpD,IAAA8E,qBAAA,GAAoB,IAAI,CAACP,8BAA8B,CAACvE,EAAE,EAAE,IAAI,CAAC9C,MAAM,CAAC6H,SAAS,CAAC;MAA1EhL,OAAO,GAAA+K,qBAAA,CAAP/K,OAAO;IACf,OAAOA,OAAO,IAAK,CAAC,CAAoB;EAC5C;EAEOiL,sBAAsBA,CAAChF,EAAe,EAG3C;IACE,OAAO,IAAI,CAACuE,8BAA8B,CAACvE,EAAE,EAAE,IAAI,CAAC9C,MAAM,CAAC6H,SAAS,CAAC;EACzE;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACWE,eAAeA,CAAC3I,MAAc,EAAoB;IAAA,IAAA4I,YAAA;IACrD,IAAMzB,MAAM,GAAG,IAAI,CAAC0B,sBAAsB,CAAC7I,MAAM,CAAC;IAClD,QAAA4I,YAAA,GAAOzB,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEtH,IAAI,cAAA+I,YAAA,cAAAA,YAAA,GAAI,IAAI;EAC/B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACWC,sBAAsBA,CAAC7I,MAAc,EAAkD;IAC1F,KAAK,IAAM8I,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAW;MAAA,IAAAC,qBAAA;MACrC,IAAI,EAAAA,qBAAA,OAAI,CAACnI,MAAM,CAAC6H,SAAS,cAAAM,qBAAA,uBAArBA,qBAAA,CAAwBD,KAAK,CAAC,MAAKzH,SAAS,EAAE;MAElD,KAAK,IAAMjE,IAAI,IAAIX,kBAAkB,EAAE;QACnC,IAAI,IAAI,CAACmE,MAAM,CAAC6H,SAAS,CAACK,KAAK,CAAC,CAAC1L,IAAI,CAAC,KAAKiE,SAAS,EAAE;QAEtD,KAAK,IAAMxB,IAAI,IAAI,IAAI,CAACe,MAAM,CAAC6H,SAAS,CAACK,KAAK,CAAC,CAAC1L,IAAI,CAAC,EAAG;UACpD,IAAIyC,IAAI,CAAC7C,OAAO,KAAKgD,MAAM,EAAE,OAAO;YAAEH,IAAI;YAAEzC;UAAK,CAAC;QACtD;MACJ;IACJ;IACA,OAAO,IAAI;EACf;AACJ;AAACyD,eAAA,CAxmBYH,aAAa,uBAsJqC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"pushprocessor.js","names":["deepCompare","escapeRegExp","globToRegexp","isNullOrUndefined","ConditionKind","PushRuleActionName","PushRuleKind","RuleId","TweakName","EventType","RULEKINDS_IN_ORDER","Override","ContentSpecific","RoomSpecific","SenderSpecific","Underride","DEFAULT_OVERRIDE_RULES","rule_id","default","enabled","conditions","kind","EventPropertyIs","key","value","SenderNotificationPermission","actions","Notify","set_tweak","Highlight","EventMatch","pattern","DontNotify","RoomServerAcl","UserDefinedRules","Symbol","EXPECTED_DEFAULT_OVERRIDE_RULE_IDS","Master","SuppressNotices","InviteToSelf","MemberEvent","IsUserMention","ContainsDisplayName","IsRoomMention","AtRoomNotification","Tombstone","DEFAULT_UNDERRIDE_RULES","CallStarted","Sound","EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS","IncomingCall","EncryptedDM","DM","Message","EncryptedMessage","mergeRulesWithDefaults","logger","incomingRules","defaultRules","orderedRuleIds","incomingDefaultRules","filter","rule","incomingCustomRules","insertDefaultPushRule","ruleId","newRules","push","warn","concat","nextExpectedRuleIdIndex","ruleIndex","indexOf","defaultRuleId","slice","PushProcessor","constructor","client","_defineProperty","Map","actionListToActionsObject","actionList","actionObj","notify","tweaks","action","undefined","rewriteDefaultRules","userId","arguments","length","JSON","parse","stringify","global","override","underride","getPushRuleGlobRegex","alignToWordBoundary","flags","_ref","_ref2","_slicedToArray","prefix","suffix","cacheKey","cachedGlobToRegex","RegExp","updateCachedPushRuleKeys","room","sender","toRemoveKeys","Set","parsedKeys","keys","ruleset","condition","delete","set","partsForDottedKey","forEach","k","matchingRuleFromKindSet","ev","kindset","rawrule","templateRuleToRaw","ruleMatchesEvent","_objectSpread","tprule","eventFulfillsCondition","cond","eventFulfillsEventMatchCondition","eventFulfillsEventPropertyIsCondition","EventPropertyContains","eventFulfillsEventPropertyContains","eventFulfillsDisplayNameCondition","RoomMemberCount","eventFulfillsRoomMemberCountCondition","eventFulfillsSenderNotifPermCondition","CallStartedPrefix","eventFulfillsCallStartedCondition","notifLevelKey","getRoom","getRoomId","currentState","mayTriggerNotifOfType","getSender","is","members","memberCount","getJoinedMemberCount","m","match","ineq","rhs","parseInt","isNaN","_room$currentState","content","getContent","isEncrypted","getClearContent","body","member","getMember","credentials","displayName","name","pat","search","val","valueForDottedKey","regex","Array","isArray","includes","_cond","getPrevContent","str","result","part","escaped","c","parts","get","firstPart","currentIndex","getType","event","thisPart","matchingRuleForEventWithRulesets","rulesets","getSafeUserId","pushActionsForEventAndRulesets","highlight","_rule$conditions","supportsIntentionalMentions","ContainsUserName","some","actionsForEvent","_this$pushActionsForE","pushRules","actionsAndRuleForEvent","getPushRuleById","_result$rule","getPushRuleAndKindById","scope","_this$client$pushRule"],"sources":["../src/pushprocessor.ts"],"sourcesContent":["/*\nCopyright 2015 - 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 { deepCompare, escapeRegExp, globToRegexp, isNullOrUndefined } from \"./utils.ts\";\nimport { type Logger } from \"./logger.ts\";\nimport { type MatrixClient } from \"./client.ts\";\nimport { type MatrixEvent } from \"./models/event.ts\";\nimport {\n ConditionKind,\n type IAnnotatedPushRule,\n type ICallStartedCondition,\n type ICallStartedPrefixCondition,\n type IContainsDisplayNameCondition,\n type IEventMatchCondition,\n type IEventPropertyContainsCondition,\n type IEventPropertyIsCondition,\n type IPushRule,\n type IPushRules,\n type IRoomMemberCountCondition,\n type ISenderNotificationPermissionCondition,\n type PushRuleAction,\n PushRuleActionName,\n type PushRuleCondition,\n PushRuleKind,\n type PushRuleSet,\n RuleId,\n TweakName,\n} from \"./@types/PushRules.ts\";\nimport { EventType } from \"./@types/event.ts\";\n\nconst RULEKINDS_IN_ORDER = [\n PushRuleKind.Override,\n PushRuleKind.ContentSpecific,\n PushRuleKind.RoomSpecific,\n PushRuleKind.SenderSpecific,\n PushRuleKind.Underride,\n];\n\n// The default override rules to apply to the push rules that arrive from the server.\n// We do this for two reasons:\n// 1. Synapse is unlikely to send us the push rule in an incremental sync - see\n// https://github.com/matrix-org/synapse/pull/4867#issuecomment-481446072 for\n// more details.\n// 2. We often want to start using push rules ahead of the server supporting them,\n// and so we can put them here.\nconst DEFAULT_OVERRIDE_RULES: Record<string, IPushRule> = {\n \".m.rule.is_room_mention\": {\n // Matrix v1.7\n rule_id: \".m.rule.is_room_mention\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventPropertyIs,\n key: \"content.m\\\\.mentions.room\",\n value: true,\n },\n {\n kind: ConditionKind.SenderNotificationPermission,\n key: \"room\",\n },\n ],\n actions: [\n PushRuleActionName.Notify,\n {\n set_tweak: TweakName.Highlight,\n },\n ],\n },\n \".m.rule.reaction\": {\n // For homeservers which don't support MSC2153 yet\n rule_id: \".m.rule.reaction\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: \"m.reaction\",\n },\n ],\n actions: [PushRuleActionName.DontNotify],\n },\n \".org.matrix.msc3786.rule.room.server_acl\": {\n // For homeservers which don't support MSC3786 yet\n rule_id: \".org.matrix.msc3786.rule.room.server_acl\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: EventType.RoomServerAcl,\n },\n {\n kind: ConditionKind.EventMatch,\n key: \"state_key\",\n pattern: \"\",\n },\n ],\n actions: [],\n },\n};\n\n// A special rule id for `EXPECTED_DEFAULT_OVERRIDE_RULE_IDS` and friends which denotes where user-defined rules live in the order.\nconst UserDefinedRules = Symbol(\"UserDefinedRules\");\n\ntype OrderedRules = Array<string | typeof UserDefinedRules>;\n\nconst EXPECTED_DEFAULT_OVERRIDE_RULE_IDS: OrderedRules = [\n RuleId.Master,\n UserDefinedRules,\n RuleId.SuppressNotices,\n RuleId.InviteToSelf,\n RuleId.MemberEvent,\n RuleId.IsUserMention,\n RuleId.ContainsDisplayName,\n RuleId.IsRoomMention,\n RuleId.AtRoomNotification,\n RuleId.Tombstone,\n \".m.rule.reaction\",\n \".m.rule.room.server_acl\",\n \".org.matrix.msc3786.rule.room.server_acl\",\n \".m.rule.suppress_edits\",\n];\n\nconst DEFAULT_UNDERRIDE_RULES: Record<string, IPushRule> = {\n \".org.matrix.msc3914.rule.room.call\": {\n // For homeservers which don't support MSC3914 yet\n rule_id: \".org.matrix.msc3914.rule.room.call\",\n default: true,\n enabled: true,\n conditions: [\n {\n kind: ConditionKind.EventMatch,\n key: \"type\",\n pattern: \"org.matrix.msc3401.call\",\n },\n {\n kind: ConditionKind.CallStarted,\n },\n ],\n actions: [PushRuleActionName.Notify, { set_tweak: TweakName.Sound, value: \"default\" }],\n },\n};\n\nconst EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS: OrderedRules = [\n UserDefinedRules,\n RuleId.IncomingCall,\n \".org.matrix.msc3914.rule.room.call\",\n RuleId.EncryptedDM,\n RuleId.DM,\n RuleId.Message,\n RuleId.EncryptedMessage,\n];\n\n/**\n * Make sure that each of the rules listed in `defaultRuleIds` is listed in the given set of push rules.\n *\n * @param logger - A `Logger` to write log messages to.\n * @param kind - the kind of push rule set being merged.\n * @param incomingRules - the existing set of known push rules for the user.\n * @param defaultRules - a lookup table for the default definitions of push rules.\n * @param orderedRuleIds - the IDs of the expected push rules, in order.\n *\n * @returns A copy of `incomingRules`, with any missing default rules inserted in the right place.\n */\nfunction mergeRulesWithDefaults(\n logger: Logger,\n kind: PushRuleKind,\n incomingRules: IPushRule[],\n defaultRules: Record<string, IPushRule>,\n orderedRuleIds: OrderedRules,\n): IPushRule[] {\n // Split the incomingRules into defaults and custom\n const incomingDefaultRules = incomingRules.filter((rule) => rule.default);\n const incomingCustomRules = incomingRules.filter((rule) => !rule.default);\n\n function insertDefaultPushRule(ruleId: OrderedRules[number]): void {\n if (ruleId === UserDefinedRules) {\n // Re-insert any user-defined rules that were in `incomingRules`\n newRules.push(...incomingCustomRules);\n } else if (ruleId in defaultRules) {\n logger.warn(`Adding default global ${kind} push rule ${ruleId}`);\n newRules.push(defaultRules[ruleId]);\n } else {\n logger.warn(`Missing default global ${kind} push rule ${ruleId}`);\n }\n }\n\n let nextExpectedRuleIdIndex = 0;\n const newRules: IPushRule[] = [];\n // Merge our expected rules (including the incoming custom rules) into the incoming default rules.\n for (const rule of incomingDefaultRules) {\n const ruleIndex = orderedRuleIds.indexOf(rule.rule_id);\n if (ruleIndex === -1) {\n // an unrecognised rule; copy it over\n newRules.push(rule);\n continue;\n }\n while (ruleIndex > nextExpectedRuleIdIndex) {\n // insert new rules\n const defaultRuleId = orderedRuleIds[nextExpectedRuleIdIndex];\n insertDefaultPushRule(defaultRuleId);\n nextExpectedRuleIdIndex += 1;\n }\n // copy over the existing rule\n newRules.push(rule);\n nextExpectedRuleIdIndex += 1;\n }\n\n // Now copy over any remaining default rules\n for (const ruleId of orderedRuleIds.slice(nextExpectedRuleIdIndex)) {\n insertDefaultPushRule(ruleId);\n }\n\n return newRules;\n}\n\nexport interface IActionsObject {\n /** Whether this event should notify the user or not. */\n notify: boolean;\n /** How this event should be notified. */\n tweaks: Partial<Record<TweakName, any>>;\n}\n\nexport class PushProcessor {\n /**\n * Construct a Push Processor.\n * @param client - The Matrix client object to use\n */\n public constructor(private readonly client: MatrixClient) {}\n\n /**\n * Maps the original key from the push rules to a list of property names\n * after unescaping.\n */\n private readonly parsedKeys = new Map<string, string[]>();\n\n /**\n * Convert a list of actions into a object with the actions as keys and their values\n * @example\n * eg. `[ 'notify', { set_tweak: 'sound', value: 'default' } ]`\n * becomes `{ notify: true, tweaks: { sound: 'default' } }`\n * @param actionList - The actions list\n *\n * @returns A object with key 'notify' (true or false) and an object of actions\n */\n public static actionListToActionsObject(actionList: PushRuleAction[]): IActionsObject {\n const actionObj: IActionsObject = { notify: false, tweaks: {} };\n for (const action of actionList) {\n if (action === PushRuleActionName.Notify) {\n actionObj.notify = true;\n } else if (typeof action === \"object\") {\n if (action.value === undefined) {\n action.value = true;\n }\n actionObj.tweaks[action.set_tweak] = action.value;\n }\n }\n return actionObj;\n }\n\n /**\n * Rewrites conditions on a client's push rules to match the defaults\n * where applicable. Useful for upgrading push rules to more strict\n * conditions when the server is falling behind on defaults.\n *\n * @param logger - A `Logger` to write log messages to.\n * @param incomingRules - The client's existing push rules\n * @param userId - The Matrix ID of the client.\n * @returns The rewritten rules\n */\n public static rewriteDefaultRules(\n logger: Logger,\n incomingRules: IPushRules,\n userId: string | undefined = undefined,\n ): IPushRules {\n let newRules: IPushRules = JSON.parse(JSON.stringify(incomingRules)); // deep clone\n\n // These lines are mostly to make the tests happy. We shouldn't run into these\n // properties missing in practice.\n if (!newRules) newRules = {} as IPushRules;\n if (!newRules.global) newRules.global = {} as PushRuleSet;\n if (!newRules.global.override) newRules.global.override = [];\n if (!newRules.global.underride) newRules.global.underride = [];\n\n // Merge the client-level defaults with the ones from the server\n newRules.global.override = mergeRulesWithDefaults(\n logger,\n PushRuleKind.Override,\n newRules.global.override,\n DEFAULT_OVERRIDE_RULES,\n EXPECTED_DEFAULT_OVERRIDE_RULE_IDS,\n );\n\n newRules.global.underride = mergeRulesWithDefaults(\n logger,\n PushRuleKind.Underride,\n newRules.global.underride,\n DEFAULT_UNDERRIDE_RULES,\n EXPECTED_DEFAULT_UNDERRIDE_RULE_IDS,\n );\n\n return newRules;\n }\n\n /**\n * Create a RegExp object for the given glob pattern with a single capture group around the pattern itself, caching the result.\n * No cache invalidation is present currently,\n * as this will be inherently bounded to the size of the user's own push rules.\n * @param pattern - the glob pattern to convert to a RegExp\n * @param alignToWordBoundary - whether to align the pattern to word boundaries,\n * as specified for `content.body` matches, will use lookaround assertions to ensure the match only includes the pattern\n * @param flags - the flags to pass to the RegExp constructor, defaults to case-insensitive\n */\n public static getPushRuleGlobRegex(pattern: string, alignToWordBoundary = false, flags = \"i\"): RegExp {\n const [prefix, suffix] = alignToWordBoundary ? [\"(?<=^|\\\\W)\", \"(?=\\\\W|$)\"] : [\"^\", \"$\"];\n const cacheKey = `${alignToWordBoundary}-${flags}-${pattern}`;\n\n if (!PushProcessor.cachedGlobToRegex[cacheKey]) {\n PushProcessor.cachedGlobToRegex[cacheKey] = new RegExp(\n prefix + \"(\" + globToRegexp(pattern) + \")\" + suffix,\n flags,\n );\n }\n return PushProcessor.cachedGlobToRegex[cacheKey];\n }\n\n /**\n * Pre-caches the parsed keys for push rules and cleans out any obsolete cache\n * entries. Should be called after push rules are updated.\n * @param newRules - The new push rules.\n */\n public updateCachedPushRuleKeys(newRules: IPushRules): void {\n // These lines are mostly to make the tests happy. We shouldn't run into these\n // properties missing in practice.\n if (!newRules) newRules = {} as IPushRules;\n if (!newRules.global) newRules.global = {} as PushRuleSet;\n if (!newRules.global.override) newRules.global.override = [];\n if (!newRules.global.room) newRules.global.room = [];\n if (!newRules.global.sender) newRules.global.sender = [];\n if (!newRules.global.underride) newRules.global.underride = [];\n\n // Process the 'key' property on event_match conditions pre-cache the\n // values and clean-out any unused values.\n const toRemoveKeys = new Set(this.parsedKeys.keys());\n for (const ruleset of [\n newRules.global.override,\n newRules.global.room,\n newRules.global.sender,\n newRules.global.underride,\n ]) {\n for (const rule of ruleset) {\n if (!rule.conditions) {\n continue;\n }\n\n for (const condition of rule.conditions) {\n if (condition.kind !== ConditionKind.EventMatch) {\n continue;\n }\n\n // Ensure we keep this key.\n toRemoveKeys.delete(condition.key);\n\n // Pre-process the key.\n this.parsedKeys.set(condition.key, PushProcessor.partsForDottedKey(condition.key));\n }\n }\n }\n // Any keys that were previously cached, but are no longer needed should\n // be removed.\n toRemoveKeys.forEach((k) => this.parsedKeys.delete(k));\n }\n\n private static cachedGlobToRegex: Record<string, RegExp> = {}; // $glob: RegExp\n\n private matchingRuleFromKindSet(ev: MatrixEvent, kindset: PushRuleSet): IAnnotatedPushRule | null {\n for (const kind of RULEKINDS_IN_ORDER) {\n const ruleset = kindset[kind];\n if (!ruleset) {\n continue;\n }\n\n for (const rule of ruleset) {\n if (!rule.enabled) {\n continue;\n }\n\n const rawrule = this.templateRuleToRaw(kind, rule);\n if (!rawrule) {\n continue;\n }\n\n if (this.ruleMatchesEvent(rawrule, ev)) {\n return {\n ...rule,\n kind,\n };\n }\n }\n }\n return null;\n }\n\n private templateRuleToRaw(\n kind: PushRuleKind,\n tprule: IPushRule,\n ): Pick<IPushRule, \"rule_id\" | \"actions\" | \"conditions\"> | null {\n const rawrule: Pick<IPushRule, \"rule_id\" | \"actions\" | \"conditions\"> = {\n rule_id: tprule.rule_id,\n actions: tprule.actions,\n conditions: [],\n };\n switch (kind) {\n case PushRuleKind.Underride:\n case PushRuleKind.Override:\n rawrule.conditions = tprule.conditions;\n break;\n case PushRuleKind.RoomSpecific:\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"room_id\",\n value: tprule.rule_id,\n });\n break;\n case PushRuleKind.SenderSpecific:\n if (!tprule.rule_id) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"user_id\",\n value: tprule.rule_id,\n });\n break;\n case PushRuleKind.ContentSpecific:\n if (!tprule.pattern) {\n return null;\n }\n rawrule.conditions!.push({\n kind: ConditionKind.EventMatch,\n key: \"content.body\",\n pattern: tprule.pattern,\n });\n break;\n }\n return rawrule;\n }\n\n private eventFulfillsCondition(cond: PushRuleCondition, ev: MatrixEvent): boolean {\n switch (cond.kind) {\n case ConditionKind.EventMatch:\n return this.eventFulfillsEventMatchCondition(cond, ev);\n case ConditionKind.EventPropertyIs:\n return this.eventFulfillsEventPropertyIsCondition(cond, ev);\n case ConditionKind.EventPropertyContains:\n return this.eventFulfillsEventPropertyContains(cond, ev);\n case ConditionKind.ContainsDisplayName:\n return this.eventFulfillsDisplayNameCondition(cond, ev);\n case ConditionKind.RoomMemberCount:\n return this.eventFulfillsRoomMemberCountCondition(cond, ev);\n case ConditionKind.SenderNotificationPermission:\n return this.eventFulfillsSenderNotifPermCondition(cond, ev);\n case ConditionKind.CallStarted:\n case ConditionKind.CallStartedPrefix:\n return this.eventFulfillsCallStartedCondition(cond, ev);\n }\n\n // unknown conditions: we previously matched all unknown conditions,\n // but given that rules can be added to the base rules on a server,\n // it's probably better to not match unknown conditions.\n return false;\n }\n\n private eventFulfillsSenderNotifPermCondition(\n cond: ISenderNotificationPermissionCondition,\n ev: MatrixEvent,\n ): boolean {\n const notifLevelKey = cond[\"key\"];\n if (!notifLevelKey) {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n if (!room?.currentState) {\n return false;\n }\n\n // Note that this should not be the current state of the room but the state at\n // the point the event is in the DAG. Unfortunately the js-sdk does not store\n // this.\n return room.currentState.mayTriggerNotifOfType(notifLevelKey, ev.getSender()!);\n }\n\n private eventFulfillsRoomMemberCountCondition(cond: IRoomMemberCountCondition, ev: MatrixEvent): boolean {\n if (!cond.is) {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n if (!room || !room.currentState || !room.currentState.members) {\n return false;\n }\n\n const memberCount = room.currentState.getJoinedMemberCount();\n\n const m = cond.is.match(/^([=<>]*)(\\d*)$/);\n if (!m) {\n return false;\n }\n const ineq = m[1];\n const rhs = parseInt(m[2]);\n if (isNaN(rhs)) {\n return false;\n }\n switch (ineq) {\n case \"\":\n case \"==\":\n return memberCount == rhs;\n case \"<\":\n return memberCount < rhs;\n case \">\":\n return memberCount > rhs;\n case \"<=\":\n return memberCount <= rhs;\n case \">=\":\n return memberCount >= rhs;\n default:\n return false;\n }\n }\n\n private eventFulfillsDisplayNameCondition(cond: IContainsDisplayNameCondition, ev: MatrixEvent): boolean {\n let content = ev.getContent();\n if (ev.isEncrypted() && ev.getClearContent()) {\n content = ev.getClearContent()!;\n }\n if (!content || !content.body || typeof content.body != \"string\") {\n return false;\n }\n\n const room = this.client.getRoom(ev.getRoomId());\n const member = room?.currentState?.getMember(this.client.credentials.userId!);\n if (!member) {\n return false;\n }\n\n const displayName = member.name;\n\n // N.B. we can't use \\b as it chokes on unicode. however \\W seems to be okay\n // as shorthand for [^0-9A-Za-z_].\n const pat = new RegExp(\"(^|\\\\W)\" + escapeRegExp(displayName) + \"(\\\\W|$)\", \"i\");\n return content.body.search(pat) > -1;\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing against the condition's glob-based\n * pattern.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventMatchCondition(cond: IEventMatchCondition, ev: MatrixEvent): boolean {\n if (!cond.key) {\n return false;\n }\n\n const val = this.valueForDottedKey(cond.key, ev);\n if (typeof val !== \"string\") {\n return false;\n }\n\n // XXX This does not match in a case-insensitive manner.\n //\n // See https://spec.matrix.org/v1.5/client-server-api/#conditions-1\n if (cond.value) {\n return cond.value === val;\n }\n\n if (typeof cond.pattern !== \"string\") {\n return false;\n }\n\n // Align to word boundary on `content.body` matches, whole string otherwise\n // https://spec.matrix.org/v1.13/client-server-api/#conditions-1\n const regex = PushProcessor.getPushRuleGlobRegex(cond.pattern, cond.key === \"content.body\");\n return !!val.match(regex);\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing exactly against the condition's\n * value.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventPropertyIsCondition(cond: IEventPropertyIsCondition, ev: MatrixEvent): boolean {\n if (!cond.key || cond.value === undefined) {\n return false;\n }\n return cond.value === this.valueForDottedKey(cond.key, ev);\n }\n\n /**\n * Check whether the given event matches the push rule condition by fetching\n * the property from the event and comparing exactly against the condition's\n * value.\n * @param cond - The push rule condition to check for a match.\n * @param ev - The event to check for a match.\n */\n private eventFulfillsEventPropertyContains(cond: IEventPropertyContainsCondition, ev: MatrixEvent): boolean {\n if (!cond.key || cond.value === undefined) {\n return false;\n }\n const val = this.valueForDottedKey(cond.key, ev);\n if (!Array.isArray(val)) {\n return false;\n }\n return val.includes(cond.value);\n }\n\n private eventFulfillsCallStartedCondition(\n _cond: ICallStartedCondition | ICallStartedPrefixCondition,\n ev: MatrixEvent,\n ): boolean {\n // Since servers don't support properly sending push notification\n // about MSC3401 call events, we do the handling ourselves\n return (\n [\"m.ring\", \"m.prompt\"].includes(ev.getContent()[\"m.intent\"]) &&\n !(\"m.terminated\" in ev.getContent()) &&\n (ev.getPrevContent()[\"m.terminated\"] !== ev.getContent()[\"m.terminated\"] ||\n deepCompare(ev.getPrevContent(), {}))\n );\n }\n\n /**\n * Parse the key into the separate fields to search by splitting on\n * unescaped \".\", and then removing any escape characters.\n *\n * @param str - The key of the push rule condition: a dotted field.\n * @returns The unescaped parts to fetch.\n * @internal\n */\n public static partsForDottedKey(str: string): string[] {\n const result: string[] = [];\n\n // The current field and whether the previous character was the escape\n // character (a backslash).\n let part = \"\";\n let escaped = false;\n\n // Iterate over each character, and decide whether to append to the current\n // part (following the escape rules) or to start a new part (based on the\n // field separator).\n for (const c of str) {\n // If the previous character was the escape character (a backslash)\n // then decide what to append to the current part.\n if (escaped) {\n if (c === \"\\\\\" || c === \".\") {\n // An escaped backslash or dot just gets added.\n part += c;\n } else {\n // A character that shouldn't be escaped gets the backslash prepended.\n part += \"\\\\\" + c;\n }\n // This always resets being escaped.\n escaped = false;\n continue;\n }\n\n if (c == \".\") {\n // The field separator creates a new part.\n result.push(part);\n part = \"\";\n } else if (c == \"\\\\\") {\n // A backslash adds no characters, but starts an escape sequence.\n escaped = true;\n } else {\n // Otherwise, just add the current character.\n part += c;\n }\n }\n\n // Ensure the final part is included. If there's an open escape sequence\n // it should be included.\n if (escaped) {\n part += \"\\\\\";\n }\n result.push(part);\n\n return result;\n }\n\n /**\n * For a dotted field and event, fetch the value at that position, if one\n * exists.\n *\n * @param key - The key of the push rule condition: a dotted field to fetch.\n * @param ev - The matrix event to fetch the field from.\n * @returns The value at the dotted path given by key.\n */\n private valueForDottedKey(key: string, ev: MatrixEvent): any {\n // The key should already have been parsed via updateCachedPushRuleKeys,\n // but if it hasn't (maybe via an old consumer of the SDK which hasn't\n // been updated?) then lazily calculate it here.\n let parts = this.parsedKeys.get(key);\n if (parts === undefined) {\n parts = PushProcessor.partsForDottedKey(key);\n this.parsedKeys.set(key, parts);\n }\n let val: any;\n\n // special-case the first component to deal with encrypted messages\n const firstPart = parts[0];\n let currentIndex = 0;\n if (firstPart === \"content\") {\n val = ev.getContent();\n ++currentIndex;\n } else if (firstPart === \"type\") {\n val = ev.getType();\n ++currentIndex;\n } else {\n // use the raw event for any other fields\n val = ev.event;\n }\n\n for (; currentIndex < parts.length; ++currentIndex) {\n // The previous iteration resulted in null or undefined, bail (and\n // avoid the type error of attempting to retrieve a property).\n if (isNullOrUndefined(val)) {\n return undefined;\n }\n\n const thisPart = parts[currentIndex];\n val = val[thisPart];\n }\n return val;\n }\n\n private matchingRuleForEventWithRulesets(ev: MatrixEvent, rulesets?: IPushRules): IAnnotatedPushRule | null {\n if (!rulesets) {\n return null;\n }\n\n if (ev.getSender() === this.client.getSafeUserId()) {\n return null;\n }\n\n return this.matchingRuleFromKindSet(ev, rulesets.global);\n }\n\n private pushActionsForEventAndRulesets(\n ev: MatrixEvent,\n rulesets?: IPushRules,\n ): {\n actions?: IActionsObject;\n rule?: IAnnotatedPushRule;\n } {\n const rule = this.matchingRuleForEventWithRulesets(ev, rulesets);\n if (!rule) {\n return {};\n }\n\n const actionObj = PushProcessor.actionListToActionsObject(rule.actions);\n\n // Some actions are implicit in some situations: we add those here\n if (actionObj.tweaks.highlight === undefined) {\n // if it isn't specified, highlight if it's a content\n // rule but otherwise not\n actionObj.tweaks.highlight = rule.kind == PushRuleKind.ContentSpecific;\n }\n\n return { actions: actionObj, rule };\n }\n\n public ruleMatchesEvent(rule: Partial<IPushRule> & Pick<IPushRule, \"conditions\">, ev: MatrixEvent): boolean {\n // Disable the deprecated mentions push rules if the new mentions property exists.\n if (\n this.client.supportsIntentionalMentions() &&\n ev.getContent()[\"m.mentions\"] !== undefined &&\n (rule.rule_id === RuleId.ContainsUserName ||\n rule.rule_id === RuleId.ContainsDisplayName ||\n rule.rule_id === RuleId.AtRoomNotification)\n ) {\n return false;\n }\n\n return !rule.conditions?.some((cond) => !this.eventFulfillsCondition(cond, ev));\n }\n\n /**\n * Get the user's push actions for the given event\n */\n public actionsForEvent(ev: MatrixEvent): IActionsObject {\n const { actions } = this.pushActionsForEventAndRulesets(ev, this.client.pushRules);\n return actions || ({} as IActionsObject);\n }\n\n public actionsAndRuleForEvent(ev: MatrixEvent): {\n actions?: IActionsObject;\n rule?: IAnnotatedPushRule;\n } {\n return this.pushActionsForEventAndRulesets(ev, this.client.pushRules);\n }\n\n /**\n * Get one of the users push rules by its ID\n *\n * @param ruleId - The ID of the rule to search for\n * @returns The push rule, or null if no such rule was found\n */\n public getPushRuleById(ruleId: string): IPushRule | null {\n const result = this.getPushRuleAndKindById(ruleId);\n return result?.rule ?? null;\n }\n\n /**\n * Get one of the users push rules by its ID\n *\n * @param ruleId - The ID of the rule to search for\n * @returns rule The push rule, or null if no such rule was found\n * @returns kind - The PushRuleKind of the rule to search for\n */\n public getPushRuleAndKindById(ruleId: string): { rule: IPushRule; kind: PushRuleKind } | null {\n for (const scope of [\"global\"] as const) {\n if (this.client.pushRules?.[scope] === undefined) continue;\n\n for (const kind of RULEKINDS_IN_ORDER) {\n if (this.client.pushRules[scope][kind] === undefined) continue;\n\n for (const rule of this.client.pushRules[scope][kind]!) {\n if (rule.rule_id === ruleId) return { rule, kind };\n }\n }\n }\n return null;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
5
  /*
@@ -74,6 +74,11 @@ export class MSC4108SignInWithQR {
74
74
  this.didScanCode = didScanCode;
75
75
  this.client = client;
76
76
  this.onFailure = onFailure;
77
+ _defineProperty(this, "ourIntent", void 0);
78
+ _defineProperty(this, "_code", void 0);
79
+ _defineProperty(this, "expectingNewDeviceId", void 0);
80
+ _defineProperty(this, "metadata", void 0);
81
+ _defineProperty(this, "grantInProgress", void 0);
77
82
  this.ourIntent = client ? QrCodeIntent.Reciprocate : QrCodeIntent.Login;
78
83
  }
79
84
 
@@ -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","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":[]}
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","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,10 +28,12 @@ import { logger } from "../../logger.js";
28
28
  */
29
29
  export class MSC4108SecureChannel {
30
30
  constructor(rendezvousSession, theirPublicKey, onFailure) {
31
- _defineProperty(this, "connected", false);
32
31
  this.rendezvousSession = rendezvousSession;
33
32
  this.theirPublicKey = theirPublicKey;
34
33
  this.onFailure = onFailure;
34
+ _defineProperty(this, "secureChannel", void 0);
35
+ _defineProperty(this, "establishedChannel", void 0);
36
+ _defineProperty(this, "connected", false);
35
37
  this.secureChannel = new Ecies();
36
38
  }
37
39