matrix-js-sdk 41.8.0 → 41.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/lib/@types/AESEncryptedSecretStoragePayload.js +3 -1
  4. package/lib/@types/IIdentityServerProvider.js +3 -1
  5. package/lib/@types/PushRules.js +7 -7
  6. package/lib/@types/PushRules.js.map +1 -1
  7. package/lib/@types/auth.js +4 -4
  8. package/lib/@types/auth.js.map +1 -1
  9. package/lib/@types/beacon.js +2 -2
  10. package/lib/@types/beacon.js.map +1 -1
  11. package/lib/@types/common.js +3 -1
  12. package/lib/@types/crypto.js +3 -1
  13. package/lib/@types/event.js +20 -20
  14. package/lib/@types/event.js.map +1 -1
  15. package/lib/@types/events.js +3 -1
  16. package/lib/@types/extensible_events.js +6 -6
  17. package/lib/@types/extensible_events.js.map +1 -1
  18. package/lib/@types/global.d.js.map +1 -1
  19. package/lib/@types/json.js +3 -1
  20. package/lib/@types/local_notifications.js +3 -1
  21. package/lib/@types/location.js +4 -4
  22. package/lib/@types/location.js.map +1 -1
  23. package/lib/@types/matrix-sdk-crypto-wasm.d.js +3 -1
  24. package/lib/@types/media.js +3 -1
  25. package/lib/@types/membership.js +1 -1
  26. package/lib/@types/membership.js.map +1 -1
  27. package/lib/@types/partials.js +6 -6
  28. package/lib/@types/partials.js.map +1 -1
  29. package/lib/@types/polls.js +5 -5
  30. package/lib/@types/polls.js.map +1 -1
  31. package/lib/@types/read_receipts.js +2 -2
  32. package/lib/@types/read_receipts.js.map +1 -1
  33. package/lib/@types/registration.js +3 -1
  34. package/lib/@types/requests.js +1 -1
  35. package/lib/@types/requests.js.map +1 -1
  36. package/lib/@types/retention.js +1 -1
  37. package/lib/@types/retention.js.map +1 -1
  38. package/lib/@types/search.js +1 -1
  39. package/lib/@types/search.js.map +1 -1
  40. package/lib/@types/signed.js +3 -1
  41. package/lib/@types/spaces.js +3 -1
  42. package/lib/@types/state_events.js +3 -1
  43. package/lib/@types/synapse.js +3 -1
  44. package/lib/@types/sync.js +1 -1
  45. package/lib/@types/sync.js.map +1 -1
  46. package/lib/@types/threepids.js +1 -1
  47. package/lib/@types/threepids.js.map +1 -1
  48. package/lib/@types/topic.js +1 -1
  49. package/lib/@types/topic.js.map +1 -1
  50. package/lib/@types/uia.js +3 -1
  51. package/lib/NamespacedValue.js +8 -8
  52. package/lib/NamespacedValue.js.map +1 -1
  53. package/lib/ReEmitter.js +9 -16
  54. package/lib/ReEmitter.js.map +1 -1
  55. package/lib/ToDeviceMessageQueue.js +49 -57
  56. package/lib/ToDeviceMessageQueue.js.map +1 -1
  57. package/lib/autodiscovery.js +232 -247
  58. package/lib/autodiscovery.js.map +1 -1
  59. package/lib/base64.js +1 -1
  60. package/lib/base64.js.map +1 -1
  61. package/lib/browser-index.d.ts +2 -2
  62. package/lib/browser-index.d.ts.map +1 -1
  63. package/lib/browser-index.js +5 -5
  64. package/lib/browser-index.js.map +1 -1
  65. package/lib/capabilityPoller.js +19 -22
  66. package/lib/capabilityPoller.js.map +1 -1
  67. package/lib/client.d.ts +2 -8
  68. package/lib/client.d.ts.map +1 -1
  69. package/lib/client.js +2043 -2487
  70. package/lib/client.js.map +1 -1
  71. package/lib/common-crypto/CryptoBackend.js +2 -2
  72. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  73. package/lib/common-crypto/key-passphrase.js.map +1 -1
  74. package/lib/content-helpers.js +43 -48
  75. package/lib/content-helpers.js.map +1 -1
  76. package/lib/content-repo.js +14 -24
  77. package/lib/content-repo.js.map +1 -1
  78. package/lib/crypto/store/base.js +6 -6
  79. package/lib/crypto/store/base.js.map +1 -1
  80. package/lib/crypto/store/indexeddb-crypto-store-backend.js +190 -238
  81. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  82. package/lib/crypto/store/indexeddb-crypto-store.js +25 -30
  83. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  84. package/lib/crypto/store/localStorage-crypto-store.js +113 -145
  85. package/lib/crypto/store/localStorage-crypto-store.js.map +1 -1
  86. package/lib/crypto/store/memory-crypto-store.js +74 -105
  87. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  88. package/lib/crypto-api/CryptoEvent.js +1 -1
  89. package/lib/crypto-api/CryptoEvent.js.map +1 -1
  90. package/lib/crypto-api/CryptoEventHandlerMap.js +3 -1
  91. package/lib/crypto-api/index.d.ts +15 -6
  92. package/lib/crypto-api/index.d.ts.map +1 -1
  93. package/lib/crypto-api/index.js +22 -22
  94. package/lib/crypto-api/index.js.map +1 -1
  95. package/lib/crypto-api/key-passphrase.js +15 -23
  96. package/lib/crypto-api/key-passphrase.js.map +1 -1
  97. package/lib/crypto-api/keybackup.js +3 -1
  98. package/lib/crypto-api/recovery-key.js +11 -12
  99. package/lib/crypto-api/recovery-key.js.map +1 -1
  100. package/lib/crypto-api/verification.js +3 -3
  101. package/lib/crypto-api/verification.js.map +1 -1
  102. package/lib/digest.js +7 -14
  103. package/lib/digest.js.map +1 -1
  104. package/lib/embedded.d.ts.map +1 -1
  105. package/lib/embedded.js +380 -505
  106. package/lib/embedded.js.map +1 -1
  107. package/lib/errors.js +2 -2
  108. package/lib/errors.js.map +1 -1
  109. package/lib/event-mapper.js +10 -12
  110. package/lib/event-mapper.js.map +1 -1
  111. package/lib/extensible_events_v1/ExtensibleEvent.js.map +1 -1
  112. package/lib/extensible_events_v1/InvalidEventError.js.map +1 -1
  113. package/lib/extensible_events_v1/MessageEvent.js +11 -13
  114. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  115. package/lib/extensible_events_v1/PollEndEvent.js +3 -4
  116. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  117. package/lib/extensible_events_v1/PollResponseEvent.js +5 -6
  118. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  119. package/lib/extensible_events_v1/PollStartEvent.js +8 -10
  120. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  121. package/lib/extensible_events_v1/utilities.js.map +1 -1
  122. package/lib/feature.js +18 -31
  123. package/lib/feature.js.map +1 -1
  124. package/lib/filter-component.d.ts.map +1 -1
  125. package/lib/filter-component.js +20 -26
  126. package/lib/filter-component.js.map +1 -1
  127. package/lib/filter.js +14 -17
  128. package/lib/filter.js.map +1 -1
  129. package/lib/http-api/errors.js +28 -43
  130. package/lib/http-api/errors.js.map +1 -1
  131. package/lib/http-api/fetch.js +141 -159
  132. package/lib/http-api/fetch.js.map +1 -1
  133. package/lib/http-api/index.js +17 -20
  134. package/lib/http-api/index.js.map +1 -1
  135. package/lib/http-api/interface.js +1 -1
  136. package/lib/http-api/interface.js.map +1 -1
  137. package/lib/http-api/method.js +1 -1
  138. package/lib/http-api/method.js.map +1 -1
  139. package/lib/http-api/prefix.js +3 -3
  140. package/lib/http-api/prefix.js.map +1 -1
  141. package/lib/http-api/refresh.js +74 -94
  142. package/lib/http-api/refresh.js.map +1 -1
  143. package/lib/http-api/utils.d.ts +1 -1
  144. package/lib/http-api/utils.d.ts.map +1 -1
  145. package/lib/http-api/utils.js +34 -42
  146. package/lib/http-api/utils.js.map +1 -1
  147. package/lib/index.js.map +1 -1
  148. package/lib/indexeddb-helpers.js +3 -3
  149. package/lib/indexeddb-helpers.js.map +1 -1
  150. package/lib/indexeddb-worker.js.map +1 -1
  151. package/lib/interactive-auth.d.ts +5 -5
  152. package/lib/interactive-auth.d.ts.map +1 -1
  153. package/lib/interactive-auth.js +172 -204
  154. package/lib/interactive-auth.js.map +1 -1
  155. package/lib/logger.js +21 -57
  156. package/lib/logger.js.map +1 -1
  157. package/lib/matrix.js +7 -11
  158. package/lib/matrix.js.map +1 -1
  159. package/lib/matrixrtc/CallMembership.js +80 -74
  160. package/lib/matrixrtc/CallMembership.js.map +1 -1
  161. package/lib/matrixrtc/EncryptionManager.js +1 -1
  162. package/lib/matrixrtc/EncryptionManager.js.map +1 -1
  163. package/lib/matrixrtc/IKeyTransport.js +1 -1
  164. package/lib/matrixrtc/IKeyTransport.js.map +1 -1
  165. package/lib/matrixrtc/IMembershipManager.js +1 -1
  166. package/lib/matrixrtc/IMembershipManager.js.map +1 -1
  167. package/lib/matrixrtc/LivekitTransport.d.ts +1 -1
  168. package/lib/matrixrtc/LivekitTransport.js +4 -4
  169. package/lib/matrixrtc/LivekitTransport.js.map +1 -1
  170. package/lib/matrixrtc/MatrixRTCSession.js +137 -187
  171. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  172. package/lib/matrixrtc/MatrixRTCSessionManager.js +36 -41
  173. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  174. package/lib/matrixrtc/MembershipManager.js +332 -378
  175. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  176. package/lib/matrixrtc/MembershipManagerActionScheduler.js +54 -63
  177. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  178. package/lib/matrixrtc/RTCEncryptionManager.js +119 -143
  179. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  180. package/lib/matrixrtc/ToDeviceKeyTransport.js +53 -58
  181. package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
  182. package/lib/matrixrtc/index.js.map +1 -1
  183. package/lib/matrixrtc/membershipData/common.js +1 -1
  184. package/lib/matrixrtc/membershipData/common.js.map +1 -1
  185. package/lib/matrixrtc/membershipData/index.js.map +1 -1
  186. package/lib/matrixrtc/membershipData/rtc.js +15 -23
  187. package/lib/matrixrtc/membershipData/rtc.js.map +1 -1
  188. package/lib/matrixrtc/membershipData/session.js +4 -5
  189. package/lib/matrixrtc/membershipData/session.js.map +1 -1
  190. package/lib/matrixrtc/types.js +4 -6
  191. package/lib/matrixrtc/types.js.map +1 -1
  192. package/lib/matrixrtc/utils.js +4 -11
  193. package/lib/matrixrtc/utils.js.map +1 -1
  194. package/lib/models/MSC3089Branch.js +91 -116
  195. package/lib/models/MSC3089Branch.js.map +1 -1
  196. package/lib/models/MSC3089TreeSpace.js +209 -245
  197. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  198. package/lib/models/ToDeviceMessage.js +3 -1
  199. package/lib/models/beacon.js +14 -13
  200. package/lib/models/beacon.js.map +1 -1
  201. package/lib/models/compare-event-ordering.js +13 -13
  202. package/lib/models/compare-event-ordering.js.map +1 -1
  203. package/lib/models/device.js +3 -3
  204. package/lib/models/device.js.map +1 -1
  205. package/lib/models/event-context.js +5 -8
  206. package/lib/models/event-context.js.map +1 -1
  207. package/lib/models/event-status.js +1 -1
  208. package/lib/models/event-status.js.map +1 -1
  209. package/lib/models/event-timeline-set.js +88 -94
  210. package/lib/models/event-timeline-set.js.map +1 -1
  211. package/lib/models/event-timeline.js +28 -30
  212. package/lib/models/event-timeline.js.map +1 -1
  213. package/lib/models/event.js +182 -226
  214. package/lib/models/event.js.map +1 -1
  215. package/lib/models/invites-ignorer-types.js +4 -4
  216. package/lib/models/invites-ignorer-types.js.map +1 -1
  217. package/lib/models/invites-ignorer.js +159 -179
  218. package/lib/models/invites-ignorer.js.map +1 -1
  219. package/lib/models/poll.js +71 -81
  220. package/lib/models/poll.js.map +1 -1
  221. package/lib/models/profile-keys.js +2 -2
  222. package/lib/models/profile-keys.js.map +1 -1
  223. package/lib/models/read-receipt.js +40 -56
  224. package/lib/models/read-receipt.js.map +1 -1
  225. package/lib/models/related-relations.js.map +1 -1
  226. package/lib/models/relations-container.js +22 -23
  227. package/lib/models/relations-container.js.map +1 -1
  228. package/lib/models/relations.js +133 -159
  229. package/lib/models/relations.js.map +1 -1
  230. package/lib/models/room-member.js +24 -29
  231. package/lib/models/room-member.js.map +1 -1
  232. package/lib/models/room-receipts.js +29 -43
  233. package/lib/models/room-receipts.js.map +1 -1
  234. package/lib/models/room-retention.js +74 -83
  235. package/lib/models/room-retention.js.map +1 -1
  236. package/lib/models/room-state.js +143 -172
  237. package/lib/models/room-state.js.map +1 -1
  238. package/lib/models/room-sticky-events.d.ts +1 -0
  239. package/lib/models/room-sticky-events.d.ts.map +1 -1
  240. package/lib/models/room-sticky-events.js +45 -65
  241. package/lib/models/room-sticky-events.js.map +1 -1
  242. package/lib/models/room-summary.js.map +1 -1
  243. package/lib/models/room.d.ts.map +1 -1
  244. package/lib/models/room.js +765 -909
  245. package/lib/models/room.js.map +1 -1
  246. package/lib/models/search-result.js +5 -5
  247. package/lib/models/search-result.js.map +1 -1
  248. package/lib/models/thread.js +225 -285
  249. package/lib/models/thread.js.map +1 -1
  250. package/lib/models/typed-event-emitter.js +7 -18
  251. package/lib/models/typed-event-emitter.js.map +1 -1
  252. package/lib/models/user.js +8 -8
  253. package/lib/models/user.js.map +1 -1
  254. package/lib/oidc/authorize.js +208 -241
  255. package/lib/oidc/authorize.js.map +1 -1
  256. package/lib/oidc/discovery.js +23 -36
  257. package/lib/oidc/discovery.js.map +1 -1
  258. package/lib/oidc/error.js +1 -1
  259. package/lib/oidc/error.js.map +1 -1
  260. package/lib/oidc/index.js +1 -0
  261. package/lib/oidc/index.js.map +1 -1
  262. package/lib/oidc/register.js +60 -66
  263. package/lib/oidc/register.js.map +1 -1
  264. package/lib/oidc/tokenRefresher.js +77 -91
  265. package/lib/oidc/tokenRefresher.js.map +1 -1
  266. package/lib/oidc/validate.js +18 -18
  267. package/lib/oidc/validate.js.map +1 -1
  268. package/lib/pushprocessor.js +71 -82
  269. package/lib/pushprocessor.js.map +1 -1
  270. package/lib/randomstring.js +9 -9
  271. package/lib/randomstring.js.map +1 -1
  272. package/lib/realtime-callbacks.js +25 -28
  273. package/lib/realtime-callbacks.js.map +1 -1
  274. package/lib/receipt-accumulator.d.ts +2 -0
  275. package/lib/receipt-accumulator.d.ts.map +1 -1
  276. package/lib/receipt-accumulator.js +14 -22
  277. package/lib/receipt-accumulator.js.map +1 -1
  278. package/lib/rendezvous/MSC4108SignInWithQR.js +271 -302
  279. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
  280. package/lib/rendezvous/RendezvousChannel.js +3 -1
  281. package/lib/rendezvous/RendezvousCode.js +3 -1
  282. package/lib/rendezvous/RendezvousError.js.map +1 -1
  283. package/lib/rendezvous/RendezvousFailureReason.js +2 -2
  284. package/lib/rendezvous/RendezvousFailureReason.js.map +1 -1
  285. package/lib/rendezvous/RendezvousIntent.js +1 -1
  286. package/lib/rendezvous/RendezvousIntent.js.map +1 -1
  287. package/lib/rendezvous/RendezvousTransport.js +3 -1
  288. package/lib/rendezvous/channels/MSC4108SecureChannel.js +123 -147
  289. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  290. package/lib/rendezvous/index.js +44 -69
  291. package/lib/rendezvous/index.js.map +1 -1
  292. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +1 -1
  293. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +134 -152
  294. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
  295. package/lib/retentionPolicy.js +6 -9
  296. package/lib/retentionPolicy.js.map +1 -1
  297. package/lib/room-hierarchy.js +52 -60
  298. package/lib/room-hierarchy.js.map +1 -1
  299. package/lib/rust-crypto/CrossSigningIdentity.js +94 -104
  300. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
  301. package/lib/rust-crypto/DehydratedDeviceManager.js +157 -190
  302. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
  303. package/lib/rust-crypto/KeyClaimManager.js +18 -22
  304. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  305. package/lib/rust-crypto/OutgoingRequestProcessor.js +109 -139
  306. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  307. package/lib/rust-crypto/OutgoingRequestsManager.js +66 -80
  308. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  309. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +1 -1
  310. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +196 -224
  311. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
  312. package/lib/rust-crypto/RoomEncryptor.js +127 -143
  313. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  314. package/lib/rust-crypto/backup.js +453 -549
  315. package/lib/rust-crypto/backup.js.map +1 -1
  316. package/lib/rust-crypto/constants.js +1 -1
  317. package/lib/rust-crypto/constants.js.map +1 -1
  318. package/lib/rust-crypto/device-converter.js +15 -28
  319. package/lib/rust-crypto/device-converter.js.map +1 -1
  320. package/lib/rust-crypto/index.js +103 -116
  321. package/lib/rust-crypto/index.js.map +1 -1
  322. package/lib/rust-crypto/libolm_migration.js +303 -365
  323. package/lib/rust-crypto/libolm_migration.js.map +1 -1
  324. package/lib/rust-crypto/rust-crypto.d.ts +5 -1
  325. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  326. package/lib/rust-crypto/rust-crypto.js +1067 -1332
  327. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  328. package/lib/rust-crypto/secret-storage.js +12 -25
  329. package/lib/rust-crypto/secret-storage.js.map +1 -1
  330. package/lib/rust-crypto/verification.js +137 -189
  331. package/lib/rust-crypto/verification.js.map +1 -1
  332. package/lib/scheduler.js +44 -19
  333. package/lib/scheduler.js.map +1 -1
  334. package/lib/secret-storage.js +179 -213
  335. package/lib/secret-storage.js.map +1 -1
  336. package/lib/serverCapabilities.js +6 -9
  337. package/lib/serverCapabilities.js.map +1 -1
  338. package/lib/service-types.js +1 -1
  339. package/lib/service-types.js.map +1 -1
  340. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  341. package/lib/sliding-sync-sdk.js +368 -424
  342. package/lib/sliding-sync-sdk.js.map +1 -1
  343. package/lib/sliding-sync.js +135 -171
  344. package/lib/sliding-sync.js.map +1 -1
  345. package/lib/store/index.js +3 -1
  346. package/lib/store/indexeddb-backend.js +3 -1
  347. package/lib/store/indexeddb-local-backend.js +194 -253
  348. package/lib/store/indexeddb-local-backend.js.map +1 -1
  349. package/lib/store/indexeddb-remote-backend.js +33 -63
  350. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  351. package/lib/store/indexeddb-store-worker.js +22 -23
  352. package/lib/store/indexeddb-store-worker.js.map +1 -1
  353. package/lib/store/indexeddb.js +44 -71
  354. package/lib/store/indexeddb.js.map +1 -1
  355. package/lib/store/local-storage-events-emitter.js +2 -2
  356. package/lib/store/local-storage-events-emitter.js.map +1 -1
  357. package/lib/store/memory.js +34 -57
  358. package/lib/store/memory.js.map +1 -1
  359. package/lib/store/stub.js +22 -35
  360. package/lib/store/stub.js.map +1 -1
  361. package/lib/sync-accumulator.js +54 -66
  362. package/lib/sync-accumulator.js.map +1 -1
  363. package/lib/sync.d.ts.map +1 -1
  364. package/lib/sync.js +905 -998
  365. package/lib/sync.js.map +1 -1
  366. package/lib/testing.js +63 -105
  367. package/lib/testing.js.map +1 -1
  368. package/lib/thread-utils.js +1 -4
  369. package/lib/thread-utils.js.map +1 -1
  370. package/lib/timeline-window.js +89 -102
  371. package/lib/timeline-window.js.map +1 -1
  372. package/lib/types.js +1 -1
  373. package/lib/types.js.map +1 -1
  374. package/lib/utils/decryptAESSecretStorageItem.js +14 -25
  375. package/lib/utils/decryptAESSecretStorageItem.js.map +1 -1
  376. package/lib/utils/encryptAESSecretStorageItem.js +27 -38
  377. package/lib/utils/encryptAESSecretStorageItem.js.map +1 -1
  378. package/lib/utils/internal/deriveKeys.js +25 -32
  379. package/lib/utils/internal/deriveKeys.js.map +1 -1
  380. package/lib/utils/roomVersion.js +1 -1
  381. package/lib/utils/roomVersion.js.map +1 -1
  382. package/lib/utils.js +83 -135
  383. package/lib/utils.js.map +1 -1
  384. package/lib/version-support.js +3 -3
  385. package/lib/version-support.js.map +1 -1
  386. package/lib/webrtc/audioContext.js +5 -6
  387. package/lib/webrtc/audioContext.js.map +1 -1
  388. package/lib/webrtc/call.js +1081 -1250
  389. package/lib/webrtc/call.js.map +1 -1
  390. package/lib/webrtc/callEventHandler.js +202 -214
  391. package/lib/webrtc/callEventHandler.js.map +1 -1
  392. package/lib/webrtc/callEventTypes.js +2 -2
  393. package/lib/webrtc/callEventTypes.js.map +1 -1
  394. package/lib/webrtc/callFeed.js +18 -20
  395. package/lib/webrtc/callFeed.js.map +1 -1
  396. package/lib/webrtc/groupCall.js +513 -602
  397. package/lib/webrtc/groupCall.js.map +1 -1
  398. package/lib/webrtc/groupCallEventHandler.js +59 -62
  399. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  400. package/lib/webrtc/mediaHandler.js +198 -232
  401. package/lib/webrtc/mediaHandler.js.map +1 -1
  402. package/lib/webrtc/stats/callFeedStatsReporter.js +16 -20
  403. package/lib/webrtc/stats/callFeedStatsReporter.js.map +1 -1
  404. package/lib/webrtc/stats/callStatsReportGatherer.js +67 -75
  405. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  406. package/lib/webrtc/stats/callStatsReportSummary.js +3 -1
  407. package/lib/webrtc/stats/connectionStats.js.map +1 -1
  408. package/lib/webrtc/stats/connectionStatsBuilder.js +2 -2
  409. package/lib/webrtc/stats/connectionStatsBuilder.js.map +1 -1
  410. package/lib/webrtc/stats/connectionStatsReportBuilder.js +20 -24
  411. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -1
  412. package/lib/webrtc/stats/groupCallStats.js +6 -8
  413. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  414. package/lib/webrtc/stats/media/mediaSsrcHandler.js +7 -8
  415. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
  416. package/lib/webrtc/stats/media/mediaTrackHandler.js +7 -9
  417. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +1 -1
  418. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  419. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  420. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +7 -7
  421. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  422. package/lib/webrtc/stats/statsReport.js +1 -1
  423. package/lib/webrtc/stats/statsReport.js.map +1 -1
  424. package/lib/webrtc/stats/statsReportEmitter.js.map +1 -1
  425. package/lib/webrtc/stats/summaryStatsReportGatherer.js +14 -14
  426. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +1 -1
  427. package/lib/webrtc/stats/trackStatsBuilder.js +32 -34
  428. package/lib/webrtc/stats/trackStatsBuilder.js.map +1 -1
  429. package/lib/webrtc/stats/transportStats.js +3 -1
  430. package/lib/webrtc/stats/transportStatsBuilder.js +9 -9
  431. package/lib/webrtc/stats/transportStatsBuilder.js.map +1 -1
  432. package/lib/webrtc/stats/valueFormatter.js +1 -1
  433. package/lib/webrtc/stats/valueFormatter.js.map +1 -1
  434. package/package.json +18 -33
  435. package/src/@types/global.d.ts +2 -2
  436. package/src/ToDeviceMessageQueue.ts +2 -2
  437. package/src/browser-index.ts +4 -4
  438. package/src/client.ts +15 -20
  439. package/src/crypto-api/index.ts +17 -6
  440. package/src/embedded.ts +4 -6
  441. package/src/filter-component.ts +1 -0
  442. package/src/http-api/utils.ts +1 -1
  443. package/src/interactive-auth.ts +11 -5
  444. package/src/matrixrtc/LivekitTransport.ts +1 -1
  445. package/src/matrixrtc/MatrixRTCSession.ts +1 -1
  446. package/src/models/MSC3089Branch.ts +1 -1
  447. package/src/models/room-sticky-events.ts +1 -0
  448. package/src/models/room.ts +9 -11
  449. package/src/receipt-accumulator.ts +2 -0
  450. package/src/rendezvous/index.ts +1 -1
  451. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +2 -2
  452. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +1 -1
  453. package/src/rust-crypto/index.ts +6 -6
  454. package/src/rust-crypto/rust-crypto.ts +31 -7
  455. package/src/rust-crypto/verification.ts +1 -1
  456. package/src/sliding-sync-sdk.ts +5 -7
  457. package/src/store/indexeddb-local-backend.ts +3 -3
  458. package/src/sync.ts +6 -8
@@ -1,4 +1,3 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  /*
3
2
  Copyright 2022 The Matrix.org Foundation C.I.C.
4
3
 
@@ -21,7 +20,7 @@ import { globToRegexp } from "../utils.js";
21
20
  import { EventType } from "../@types/event.js";
22
21
  import { IGNORE_INVITES_ACCOUNT_EVENT_KEY, POLICIES_ACCOUNT_EVENT_TYPE, PolicyRecommendation, PolicyScope } from "./invites-ignorer-types.js";
23
22
  export { IGNORE_INVITES_ACCOUNT_EVENT_KEY, POLICIES_ACCOUNT_EVENT_TYPE, PolicyRecommendation, PolicyScope };
24
- var scopeToEventTypeMap = {
23
+ const scopeToEventTypeMap = {
25
24
  [PolicyScope.User]: EventType.PolicyRuleUser,
26
25
  [PolicyScope.Room]: EventType.PolicyRuleRoom,
27
26
  [PolicyScope.Server]: EventType.PolicyRuleServer
@@ -50,27 +49,21 @@ export class IgnoredInvites {
50
49
  * @param reason - A human-readable reason for introducing this new rule.
51
50
  * @returns The event id for the new rule.
52
51
  */
53
- addRule(scope, entity, reason) {
54
- var _this = this;
55
- return _asyncToGenerator(function* () {
56
- var target = yield _this.getOrCreateTargetRoom();
57
- var response = yield _this.client.sendStateEvent(target.roomId, scopeToEventTypeMap[scope], {
58
- entity,
59
- reason,
60
- recommendation: PolicyRecommendation.Ban
61
- });
62
- return response.event_id;
63
- })();
52
+ async addRule(scope, entity, reason) {
53
+ const target = await this.getOrCreateTargetRoom();
54
+ const response = await this.client.sendStateEvent(target.roomId, scopeToEventTypeMap[scope], {
55
+ entity,
56
+ reason,
57
+ recommendation: PolicyRecommendation.Ban
58
+ });
59
+ return response.event_id;
64
60
  }
65
61
 
66
62
  /**
67
63
  * Remove a rule.
68
64
  */
69
- removeRule(event) {
70
- var _this2 = this;
71
- return _asyncToGenerator(function* () {
72
- yield _this2.client.redactEvent(event.getRoomId(), event.getId());
73
- })();
65
+ async removeRule(event) {
66
+ await this.client.redactEvent(event.getRoomId(), event.getId());
74
67
  }
75
68
 
76
69
  /**
@@ -89,26 +82,23 @@ export class IgnoredInvites {
89
82
  * This rewrite is inherently racy and could overwrite or be overwritten by
90
83
  * other concurrent rewrites of the same object.
91
84
  */
92
- addSource(roomId) {
93
- var _this3 = this;
94
- return _asyncToGenerator(function* () {
95
- // We attempt to join the room *before* calling
96
- // `await this.getOrCreateSourceRooms()` to decrease the duration
97
- // of the racy section.
98
- yield _this3.client.joinRoom(roomId);
99
- // Race starts.
100
- var sources = (yield _this3.getOrCreateSourceRooms()).map(room => room.roomId);
101
- if (sources.includes(roomId)) {
102
- return false;
103
- }
104
- sources.push(roomId);
105
- yield _this3.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
106
- ignoreInvitesPolicies.sources = sources;
107
- });
85
+ async addSource(roomId) {
86
+ // We attempt to join the room *before* calling
87
+ // `await this.getOrCreateSourceRooms()` to decrease the duration
88
+ // of the racy section.
89
+ await this.client.joinRoom(roomId);
90
+ // Race starts.
91
+ const sources = (await this.getOrCreateSourceRooms()).map(room => room.roomId);
92
+ if (sources.includes(roomId)) {
93
+ return false;
94
+ }
95
+ sources.push(roomId);
96
+ await this.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
97
+ ignoreInvitesPolicies.sources = sources;
98
+ });
108
99
 
109
- // Race ends.
110
- return true;
111
- })();
100
+ // Race ends.
101
+ return true;
112
102
  }
113
103
 
114
104
  /**
@@ -119,68 +109,67 @@ export class IgnoredInvites {
119
109
  * @param params.roomId - The room to which the user is invited.
120
110
  * @returns A rule matching the entity, if any was found, `null` otherwise.
121
111
  */
122
- getRuleForInvite(_ref) {
123
- var _this4 = this;
124
- return _asyncToGenerator(function* () {
125
- var sender = _ref.sender,
126
- roomId = _ref.roomId;
127
- // In this implementation, we perform a very naive lookup:
128
- // - search in each policy room;
129
- // - turn each (potentially glob) rule entity into a regexp.
130
- //
131
- // Real-world testing will tell us whether this is performant enough.
132
- // In the (unfortunately likely) case it isn't, there are several manners
133
- // in which we could optimize this:
134
- // - match several entities per go;
135
- // - pre-compile each rule entity into a regexp;
136
- // - pre-compile entire rooms into a single regexp.
137
- var policyRooms = yield _this4.getOrCreateSourceRooms();
138
- var senderServer = sender.split(":")[1];
139
- var roomServer = roomId.split(":")[1];
140
- for (var room of policyRooms) {
141
- var state = room.getUnfilteredTimelineSet().getLiveTimeline().getState(EventTimeline.FORWARDS);
142
- for (var _ref3 of [{
143
- scope: PolicyScope.Room,
144
- entities: [roomId]
145
- }, {
146
- scope: PolicyScope.User,
147
- entities: [sender]
148
- }, {
149
- scope: PolicyScope.Server,
150
- entities: [senderServer, roomServer]
151
- }]) {
152
- var scope = _ref3.scope;
153
- var entities = _ref3.entities;
154
- var events = state.getStateEvents(scopeToEventTypeMap[scope]);
155
- for (var event of events) {
156
- var content = event.getContent();
157
- if ((content === null || content === void 0 ? void 0 : content.recommendation) != PolicyRecommendation.Ban) {
158
- // Ignoring invites only looks at `m.ban` recommendations.
159
- continue;
160
- }
161
- var glob = content === null || content === void 0 ? void 0 : content.entity;
162
- if (!glob) {
163
- // Invalid event.
164
- continue;
165
- }
166
- var regexp = void 0;
167
- try {
168
- regexp = new RegExp(globToRegexp(glob));
169
- } catch (_unused) {
170
- // Assume invalid event.
171
- continue;
172
- }
173
- for (var entity of entities) {
174
- if (entity && regexp.test(entity)) {
175
- return event;
176
- }
112
+ async getRuleForInvite({
113
+ sender,
114
+ roomId
115
+ }) {
116
+ // In this implementation, we perform a very naive lookup:
117
+ // - search in each policy room;
118
+ // - turn each (potentially glob) rule entity into a regexp.
119
+ //
120
+ // Real-world testing will tell us whether this is performant enough.
121
+ // In the (unfortunately likely) case it isn't, there are several manners
122
+ // in which we could optimize this:
123
+ // - match several entities per go;
124
+ // - pre-compile each rule entity into a regexp;
125
+ // - pre-compile entire rooms into a single regexp.
126
+ const policyRooms = await this.getOrCreateSourceRooms();
127
+ const senderServer = sender.split(":")[1];
128
+ const roomServer = roomId.split(":")[1];
129
+ for (const room of policyRooms) {
130
+ const state = room.getUnfilteredTimelineSet().getLiveTimeline().getState(EventTimeline.FORWARDS);
131
+ for (const {
132
+ scope,
133
+ entities
134
+ } of [{
135
+ scope: PolicyScope.Room,
136
+ entities: [roomId]
137
+ }, {
138
+ scope: PolicyScope.User,
139
+ entities: [sender]
140
+ }, {
141
+ scope: PolicyScope.Server,
142
+ entities: [senderServer, roomServer]
143
+ }]) {
144
+ const events = state.getStateEvents(scopeToEventTypeMap[scope]);
145
+ for (const event of events) {
146
+ const content = event.getContent();
147
+ if (content?.recommendation != PolicyRecommendation.Ban) {
148
+ // Ignoring invites only looks at `m.ban` recommendations.
149
+ continue;
150
+ }
151
+ const glob = content?.entity;
152
+ if (!glob) {
153
+ // Invalid event.
154
+ continue;
155
+ }
156
+ let regexp;
157
+ try {
158
+ regexp = new RegExp(globToRegexp(glob));
159
+ } catch {
160
+ // Assume invalid event.
161
+ continue;
162
+ }
163
+ for (const entity of entities) {
164
+ if (entity && regexp.test(entity)) {
165
+ return event;
177
166
  }
178
- // No match.
179
167
  }
168
+ // No match.
180
169
  }
181
170
  }
182
- return null;
183
- })();
171
+ }
172
+ return null;
184
173
  }
185
174
 
186
175
  /**
@@ -197,37 +186,34 @@ export class IgnoredInvites {
197
186
  * This rewrite is inherently racy and could overwrite or be overwritten by
198
187
  * other concurrent rewrites of the same object.
199
188
  */
200
- getOrCreateTargetRoom() {
201
- var _this5 = this;
202
- return _asyncToGenerator(function* () {
203
- var ignoreInvitesPolicies = _this5.getIgnoreInvitesPolicies();
204
- var target = ignoreInvitesPolicies.target;
205
- // Validate `target`. If it is invalid, trash out the current `target`
206
- // and create a new room.
207
- if (typeof target !== "string") {
189
+ async getOrCreateTargetRoom() {
190
+ const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();
191
+ let target = ignoreInvitesPolicies.target;
192
+ // Validate `target`. If it is invalid, trash out the current `target`
193
+ // and create a new room.
194
+ if (typeof target !== "string") {
195
+ target = null;
196
+ }
197
+ if (target) {
198
+ // Check that the room exists and is valid.
199
+ const room = this.client.getRoom(target);
200
+ if (room) {
201
+ return room;
202
+ } else {
208
203
  target = null;
209
204
  }
210
- if (target) {
211
- // Check that the room exists and is valid.
212
- var room = _this5.client.getRoom(target);
213
- if (room) {
214
- return room;
215
- } else {
216
- target = null;
217
- }
218
- }
219
- // We need to create our own policy room for ignoring invites.
220
- target = (yield _this5.client.createRoom({
221
- name: "Individual Policy Room",
222
- preset: Preset.PrivateChat
223
- })).room_id;
224
- yield _this5.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
225
- ignoreInvitesPolicies.target = target;
226
- });
205
+ }
206
+ // We need to create our own policy room for ignoring invites.
207
+ target = (await this.client.createRoom({
208
+ name: "Individual Policy Room",
209
+ preset: Preset.PrivateChat
210
+ })).room_id;
211
+ await this.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
212
+ ignoreInvitesPolicies.target = target;
213
+ });
227
214
 
228
- // Since we have just called `createRoom`, `getRoom` should not be `null`.
229
- return _this5.client.getRoom(target);
230
- })();
215
+ // Since we have just called `createRoom`, `getRoom` should not be `null`.
216
+ return this.client.getRoom(target);
231
217
  }
232
218
 
233
219
  /**
@@ -244,42 +230,39 @@ export class IgnoredInvites {
244
230
  * This rewrite is inherently racy and could overwrite or be overwritten by
245
231
  * other concurrent rewrites of the same object.
246
232
  */
247
- getOrCreateSourceRooms() {
248
- var _this6 = this;
249
- return _asyncToGenerator(function* () {
250
- var ignoreInvitesPolicies = _this6.getIgnoreInvitesPolicies();
251
- var sources = ignoreInvitesPolicies.sources;
233
+ async getOrCreateSourceRooms() {
234
+ const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();
235
+ let sources = ignoreInvitesPolicies.sources;
252
236
 
253
- // Validate `sources`. If it is invalid, trash out the current `sources`
254
- // and create a new list of sources from `target`.
255
- var hasChanges = false;
256
- if (!Array.isArray(sources)) {
257
- // `sources` could not be an array.
258
- hasChanges = true;
259
- sources = [];
260
- }
261
- var sourceRooms = sources
262
- // `sources` could contain non-string / invalid room ids
263
- .filter(roomId => typeof roomId === "string").map(roomId => _this6.client.getRoom(roomId)).filter(room => !!room);
264
- if (sourceRooms.length != sources.length) {
265
- hasChanges = true;
266
- }
267
- if (sourceRooms.length == 0) {
268
- // `sources` could be empty (possibly because we've removed
269
- // invalid content)
270
- var target = yield _this6.getOrCreateTargetRoom();
271
- hasChanges = true;
272
- sourceRooms = [target];
273
- }
274
- if (hasChanges) {
275
- // Reload `policies`/`ignoreInvitesPolicies` in case it has been changed
276
- // during or by our call to `this.getTargetRoom()`.
277
- yield _this6.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
278
- ignoreInvitesPolicies.sources = sources;
279
- });
280
- }
281
- return sourceRooms;
282
- })();
237
+ // Validate `sources`. If it is invalid, trash out the current `sources`
238
+ // and create a new list of sources from `target`.
239
+ let hasChanges = false;
240
+ if (!Array.isArray(sources)) {
241
+ // `sources` could not be an array.
242
+ hasChanges = true;
243
+ sources = [];
244
+ }
245
+ let sourceRooms = sources
246
+ // `sources` could contain non-string / invalid room ids
247
+ .filter(roomId => typeof roomId === "string").map(roomId => this.client.getRoom(roomId)).filter(room => !!room);
248
+ if (sourceRooms.length != sources.length) {
249
+ hasChanges = true;
250
+ }
251
+ if (sourceRooms.length == 0) {
252
+ // `sources` could be empty (possibly because we've removed
253
+ // invalid content)
254
+ const target = await this.getOrCreateTargetRoom();
255
+ hasChanges = true;
256
+ sourceRooms = [target];
257
+ }
258
+ if (hasChanges) {
259
+ // Reload `policies`/`ignoreInvitesPolicies` in case it has been changed
260
+ // during or by our call to `this.getTargetRoom()`.
261
+ await this.withIgnoreInvitesPolicies(ignoreInvitesPolicies => {
262
+ ignoreInvitesPolicies.sources = sources;
263
+ });
264
+ }
265
+ return sourceRooms;
283
266
  }
284
267
 
285
268
  /**
@@ -299,16 +282,14 @@ export class IgnoredInvites {
299
282
  /**
300
283
  * Modify in place the `IGNORE_INVITES_POLICIES` object from account data.
301
284
  */
302
- withIgnoreInvitesPolicies(cb) {
303
- var _this7 = this;
304
- return _asyncToGenerator(function* () {
305
- var _this7$getPoliciesAnd = _this7.getPoliciesAndIgnoreInvitesPolicies(),
306
- policies = _this7$getPoliciesAnd.policies,
307
- ignoreInvitesPolicies = _this7$getPoliciesAnd.ignoreInvitesPolicies;
308
- cb(ignoreInvitesPolicies);
309
- policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;
310
- yield _this7.client.setAccountData(POLICIES_ACCOUNT_EVENT_TYPE.name, policies);
311
- })();
285
+ async withIgnoreInvitesPolicies(cb) {
286
+ const {
287
+ policies,
288
+ ignoreInvitesPolicies
289
+ } = this.getPoliciesAndIgnoreInvitesPolicies();
290
+ cb(ignoreInvitesPolicies);
291
+ policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;
292
+ await this.client.setAccountData(POLICIES_ACCOUNT_EVENT_TYPE.name, policies);
312
293
  }
313
294
 
314
295
  /**
@@ -316,27 +297,26 @@ export class IgnoredInvites {
316
297
  * object.
317
298
  */
318
299
  getPoliciesAndIgnoreInvitesPolicies() {
319
- var policies = {};
320
- for (var key of [POLICIES_ACCOUNT_EVENT_TYPE.name, POLICIES_ACCOUNT_EVENT_TYPE.altName]) {
321
- var _this$client$getAccou;
300
+ let policies = {};
301
+ for (const key of [POLICIES_ACCOUNT_EVENT_TYPE.name, POLICIES_ACCOUNT_EVENT_TYPE.altName]) {
322
302
  if (!key) {
323
303
  continue;
324
304
  }
325
- var value = (_this$client$getAccou = this.client.getAccountData(key)) === null || _this$client$getAccou === void 0 ? void 0 : _this$client$getAccou.getContent();
305
+ const value = this.client.getAccountData(key)?.getContent();
326
306
  if (value) {
327
307
  policies = value;
328
308
  break;
329
309
  }
330
310
  }
331
- var ignoreInvitesPolicies = {};
332
- var hasIgnoreInvitesPolicies = false;
333
- for (var _key of [IGNORE_INVITES_ACCOUNT_EVENT_KEY.name, IGNORE_INVITES_ACCOUNT_EVENT_KEY.altName]) {
334
- if (!_key) {
311
+ let ignoreInvitesPolicies = {};
312
+ let hasIgnoreInvitesPolicies = false;
313
+ for (const key of [IGNORE_INVITES_ACCOUNT_EVENT_KEY.name, IGNORE_INVITES_ACCOUNT_EVENT_KEY.altName]) {
314
+ if (!key) {
335
315
  continue;
336
316
  }
337
- var _value = policies[_key];
338
- if (_value && typeof _value == "object") {
339
- ignoreInvitesPolicies = _value;
317
+ const value = policies[key];
318
+ if (value && typeof value == "object") {
319
+ ignoreInvitesPolicies = value;
340
320
  hasIgnoreInvitesPolicies = true;
341
321
  break;
342
322
  }
@@ -1 +1 @@
1
- {"version":3,"file":"invites-ignorer.js","names":["EventTimeline","Preset","globToRegexp","EventType","IGNORE_INVITES_ACCOUNT_EVENT_KEY","POLICIES_ACCOUNT_EVENT_TYPE","PolicyRecommendation","PolicyScope","scopeToEventTypeMap","User","PolicyRuleUser","Room","PolicyRuleRoom","Server","PolicyRuleServer","IgnoredInvites","constructor","client","addRule","scope","entity","reason","_this","_asyncToGenerator","target","getOrCreateTargetRoom","response","sendStateEvent","roomId","recommendation","Ban","event_id","removeRule","event","_this2","redactEvent","getRoomId","getId","addSource","_this3","joinRoom","sources","getOrCreateSourceRooms","map","room","includes","push","withIgnoreInvitesPolicies","ignoreInvitesPolicies","getRuleForInvite","_ref","_this4","sender","policyRooms","senderServer","split","roomServer","state","getUnfilteredTimelineSet","getLiveTimeline","getState","FORWARDS","_ref3","entities","events","getStateEvents","content","getContent","glob","regexp","RegExp","_unused","test","_this5","getIgnoreInvitesPolicies","getRoom","createRoom","name","preset","PrivateChat","room_id","_this6","hasChanges","Array","isArray","sourceRooms","filter","length","getPoliciesAndIgnoreInvitesPolicies","cb","_this7","_this7$getPoliciesAnd","policies","setAccountData","key","altName","_this$client$getAccou","value","getAccountData","hasIgnoreInvitesPolicies"],"sources":["../../src/models/invites-ignorer.ts"],"sourcesContent":["/*\nCopyright 2022 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 MatrixClient } from \"../client.ts\";\nimport { type IContent, type MatrixEvent } from \"./event.ts\";\nimport { EventTimeline } from \"./event-timeline.ts\";\nimport { Preset } from \"../@types/partials.ts\";\nimport { globToRegexp } from \"../utils.ts\";\nimport { type Room } from \"./room.ts\";\nimport { EventType, type StateEvents } from \"../@types/event.ts\";\nimport {\n IGNORE_INVITES_ACCOUNT_EVENT_KEY,\n POLICIES_ACCOUNT_EVENT_TYPE,\n PolicyRecommendation,\n PolicyScope,\n} from \"./invites-ignorer-types.ts\";\n\nexport { IGNORE_INVITES_ACCOUNT_EVENT_KEY, POLICIES_ACCOUNT_EVENT_TYPE, PolicyRecommendation, PolicyScope };\n\nconst scopeToEventTypeMap: Record<PolicyScope, keyof StateEvents> = {\n [PolicyScope.User]: EventType.PolicyRuleUser,\n [PolicyScope.Room]: EventType.PolicyRuleRoom,\n [PolicyScope.Server]: EventType.PolicyRuleServer,\n};\n\n/**\n * A container for ignored invites.\n *\n * # Performance\n *\n * This implementation is extremely naive. It expects that we are dealing\n * with a very short list of sources (e.g. only one). If real-world\n * applications turn out to require longer lists, we may need to rework\n * our data structures.\n */\nexport class IgnoredInvites {\n public constructor(private readonly client: MatrixClient) {}\n\n /**\n * Add a new rule.\n *\n * @param scope - The scope for this rule.\n * @param entity - The entity covered by this rule. Globs are supported.\n * @param reason - A human-readable reason for introducing this new rule.\n * @returns The event id for the new rule.\n */\n public async addRule(scope: PolicyScope, entity: string, reason: string): Promise<string> {\n const target = await this.getOrCreateTargetRoom();\n const response = await this.client.sendStateEvent(target.roomId, scopeToEventTypeMap[scope], {\n entity,\n reason,\n recommendation: PolicyRecommendation.Ban,\n });\n return response.event_id;\n }\n\n /**\n * Remove a rule.\n */\n public async removeRule(event: MatrixEvent): Promise<void> {\n await this.client.redactEvent(event.getRoomId()!, event.getId()!);\n }\n\n /**\n * Add a new room to the list of sources. If the user isn't a member of the\n * room, attempt to join it.\n *\n * @param roomId - A valid room id. If this room is already in the list\n * of sources, it will not be duplicated.\n * @returns `true` if the source was added, `false` if it was already present.\n * @throws If `roomId` isn't the id of a room that the current user is already\n * member of or can join.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async addSource(roomId: string): Promise<boolean> {\n // We attempt to join the room *before* calling\n // `await this.getOrCreateSourceRooms()` to decrease the duration\n // of the racy section.\n await this.client.joinRoom(roomId);\n // Race starts.\n const sources = (await this.getOrCreateSourceRooms()).map((room) => room.roomId);\n if (sources.includes(roomId)) {\n return false;\n }\n sources.push(roomId);\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.sources = sources;\n });\n\n // Race ends.\n return true;\n }\n\n /**\n * Find out whether an invite should be ignored.\n *\n * @param params\n * @param params.sender - The user id for the user who issued the invite.\n * @param params.roomId - The room to which the user is invited.\n * @returns A rule matching the entity, if any was found, `null` otherwise.\n */\n public async getRuleForInvite({\n sender,\n roomId,\n }: {\n sender: string;\n roomId: string;\n }): Promise<Readonly<MatrixEvent | null>> {\n // In this implementation, we perform a very naive lookup:\n // - search in each policy room;\n // - turn each (potentially glob) rule entity into a regexp.\n //\n // Real-world testing will tell us whether this is performant enough.\n // In the (unfortunately likely) case it isn't, there are several manners\n // in which we could optimize this:\n // - match several entities per go;\n // - pre-compile each rule entity into a regexp;\n // - pre-compile entire rooms into a single regexp.\n const policyRooms = await this.getOrCreateSourceRooms();\n const senderServer = sender.split(\":\")[1];\n const roomServer = roomId.split(\":\")[1];\n for (const room of policyRooms) {\n const state = room.getUnfilteredTimelineSet().getLiveTimeline().getState(EventTimeline.FORWARDS)!;\n\n for (const { scope, entities } of [\n { scope: PolicyScope.Room, entities: [roomId] },\n { scope: PolicyScope.User, entities: [sender] },\n { scope: PolicyScope.Server, entities: [senderServer, roomServer] },\n ]) {\n const events = state.getStateEvents(scopeToEventTypeMap[scope]);\n for (const event of events) {\n const content = event.getContent();\n if (content?.recommendation != PolicyRecommendation.Ban) {\n // Ignoring invites only looks at `m.ban` recommendations.\n continue;\n }\n const glob = content?.entity;\n if (!glob) {\n // Invalid event.\n continue;\n }\n let regexp: RegExp;\n try {\n regexp = new RegExp(globToRegexp(glob));\n } catch {\n // Assume invalid event.\n continue;\n }\n for (const entity of entities) {\n if (entity && regexp.test(entity)) {\n return event;\n }\n }\n // No match.\n }\n }\n }\n return null;\n }\n\n /**\n * Get the target room, i.e. the room in which any new rule should be written.\n *\n * If there is no target room setup, a target room is created.\n *\n * Note: This method is public for testing reasons. Most clients should not need\n * to call it directly.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async getOrCreateTargetRoom(): Promise<Room> {\n const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();\n let target = ignoreInvitesPolicies.target;\n // Validate `target`. If it is invalid, trash out the current `target`\n // and create a new room.\n if (typeof target !== \"string\") {\n target = null;\n }\n if (target) {\n // Check that the room exists and is valid.\n const room = this.client.getRoom(target);\n if (room) {\n return room;\n } else {\n target = null;\n }\n }\n // We need to create our own policy room for ignoring invites.\n target = (\n await this.client.createRoom({\n name: \"Individual Policy Room\",\n preset: Preset.PrivateChat,\n })\n ).room_id;\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.target = target;\n });\n\n // Since we have just called `createRoom`, `getRoom` should not be `null`.\n return this.client.getRoom(target)!;\n }\n\n /**\n * Get the list of source rooms, i.e. the rooms from which rules need to be read.\n *\n * If no source rooms are setup, the target room is used as sole source room.\n *\n * Note: This method is public for testing reasons. Most clients should not need\n * to call it directly.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async getOrCreateSourceRooms(): Promise<Room[]> {\n const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();\n let sources: string[] = ignoreInvitesPolicies.sources;\n\n // Validate `sources`. If it is invalid, trash out the current `sources`\n // and create a new list of sources from `target`.\n let hasChanges = false;\n if (!Array.isArray(sources)) {\n // `sources` could not be an array.\n hasChanges = true;\n sources = [];\n }\n let sourceRooms = sources\n // `sources` could contain non-string / invalid room ids\n .filter((roomId) => typeof roomId === \"string\")\n .map((roomId) => this.client.getRoom(roomId))\n .filter((room) => !!room) as Room[];\n if (sourceRooms.length != sources.length) {\n hasChanges = true;\n }\n if (sourceRooms.length == 0) {\n // `sources` could be empty (possibly because we've removed\n // invalid content)\n const target = await this.getOrCreateTargetRoom();\n hasChanges = true;\n sourceRooms = [target];\n }\n if (hasChanges) {\n // Reload `policies`/`ignoreInvitesPolicies` in case it has been changed\n // during or by our call to `this.getTargetRoom()`.\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.sources = sources;\n });\n }\n return sourceRooms;\n }\n\n /**\n * Fetch the `IGNORE_INVITES_POLICIES` object from account data.\n *\n * If both an unstable prefix version and a stable prefix version are available,\n * it will return the stable prefix version preferentially.\n *\n * The result is *not* validated but is guaranteed to be a non-null object.\n *\n * @returns A non-null object.\n */\n private getIgnoreInvitesPolicies(): { [key: string]: any } {\n return this.getPoliciesAndIgnoreInvitesPolicies().ignoreInvitesPolicies;\n }\n\n /**\n * Modify in place the `IGNORE_INVITES_POLICIES` object from account data.\n */\n private async withIgnoreInvitesPolicies(\n cb: (ignoreInvitesPolicies: { [key: string]: any }) => void,\n ): Promise<void> {\n const { policies, ignoreInvitesPolicies } = this.getPoliciesAndIgnoreInvitesPolicies();\n cb(ignoreInvitesPolicies);\n policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;\n await this.client.setAccountData(POLICIES_ACCOUNT_EVENT_TYPE.name, policies);\n }\n\n /**\n * As `getIgnoreInvitesPolicies` but also return the `POLICIES_ACCOUNT_EVENT_TYPE`\n * object.\n */\n private getPoliciesAndIgnoreInvitesPolicies(): {\n policies: { [key: string]: any };\n ignoreInvitesPolicies: { [key: string]: any };\n } {\n let policies: IContent = {};\n for (const key of [POLICIES_ACCOUNT_EVENT_TYPE.name, POLICIES_ACCOUNT_EVENT_TYPE.altName]) {\n if (!key) {\n continue;\n }\n const value = this.client.getAccountData(key)?.getContent();\n if (value) {\n policies = value;\n break;\n }\n }\n\n let ignoreInvitesPolicies = {};\n let hasIgnoreInvitesPolicies = false;\n for (const key of [IGNORE_INVITES_ACCOUNT_EVENT_KEY.name, IGNORE_INVITES_ACCOUNT_EVENT_KEY.altName]) {\n if (!key) {\n continue;\n }\n const value = policies[key];\n if (value && typeof value == \"object\") {\n ignoreInvitesPolicies = value;\n hasIgnoreInvitesPolicies = true;\n break;\n }\n }\n if (!hasIgnoreInvitesPolicies) {\n policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;\n }\n\n return { policies, ignoreInvitesPolicies };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"invites-ignorer.js","names":[],"sources":["../../src/models/invites-ignorer.ts"],"sourcesContent":["/*\nCopyright 2022 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 MatrixClient } from \"../client.ts\";\nimport { type IContent, type MatrixEvent } from \"./event.ts\";\nimport { EventTimeline } from \"./event-timeline.ts\";\nimport { Preset } from \"../@types/partials.ts\";\nimport { globToRegexp } from \"../utils.ts\";\nimport { type Room } from \"./room.ts\";\nimport { EventType, type StateEvents } from \"../@types/event.ts\";\nimport {\n IGNORE_INVITES_ACCOUNT_EVENT_KEY,\n POLICIES_ACCOUNT_EVENT_TYPE,\n PolicyRecommendation,\n PolicyScope,\n} from \"./invites-ignorer-types.ts\";\n\nexport { IGNORE_INVITES_ACCOUNT_EVENT_KEY, POLICIES_ACCOUNT_EVENT_TYPE, PolicyRecommendation, PolicyScope };\n\nconst scopeToEventTypeMap: Record<PolicyScope, keyof StateEvents> = {\n [PolicyScope.User]: EventType.PolicyRuleUser,\n [PolicyScope.Room]: EventType.PolicyRuleRoom,\n [PolicyScope.Server]: EventType.PolicyRuleServer,\n};\n\n/**\n * A container for ignored invites.\n *\n * # Performance\n *\n * This implementation is extremely naive. It expects that we are dealing\n * with a very short list of sources (e.g. only one). If real-world\n * applications turn out to require longer lists, we may need to rework\n * our data structures.\n */\nexport class IgnoredInvites {\n public constructor(private readonly client: MatrixClient) {}\n\n /**\n * Add a new rule.\n *\n * @param scope - The scope for this rule.\n * @param entity - The entity covered by this rule. Globs are supported.\n * @param reason - A human-readable reason for introducing this new rule.\n * @returns The event id for the new rule.\n */\n public async addRule(scope: PolicyScope, entity: string, reason: string): Promise<string> {\n const target = await this.getOrCreateTargetRoom();\n const response = await this.client.sendStateEvent(target.roomId, scopeToEventTypeMap[scope], {\n entity,\n reason,\n recommendation: PolicyRecommendation.Ban,\n });\n return response.event_id;\n }\n\n /**\n * Remove a rule.\n */\n public async removeRule(event: MatrixEvent): Promise<void> {\n await this.client.redactEvent(event.getRoomId()!, event.getId()!);\n }\n\n /**\n * Add a new room to the list of sources. If the user isn't a member of the\n * room, attempt to join it.\n *\n * @param roomId - A valid room id. If this room is already in the list\n * of sources, it will not be duplicated.\n * @returns `true` if the source was added, `false` if it was already present.\n * @throws If `roomId` isn't the id of a room that the current user is already\n * member of or can join.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async addSource(roomId: string): Promise<boolean> {\n // We attempt to join the room *before* calling\n // `await this.getOrCreateSourceRooms()` to decrease the duration\n // of the racy section.\n await this.client.joinRoom(roomId);\n // Race starts.\n const sources = (await this.getOrCreateSourceRooms()).map((room) => room.roomId);\n if (sources.includes(roomId)) {\n return false;\n }\n sources.push(roomId);\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.sources = sources;\n });\n\n // Race ends.\n return true;\n }\n\n /**\n * Find out whether an invite should be ignored.\n *\n * @param params\n * @param params.sender - The user id for the user who issued the invite.\n * @param params.roomId - The room to which the user is invited.\n * @returns A rule matching the entity, if any was found, `null` otherwise.\n */\n public async getRuleForInvite({\n sender,\n roomId,\n }: {\n sender: string;\n roomId: string;\n }): Promise<Readonly<MatrixEvent | null>> {\n // In this implementation, we perform a very naive lookup:\n // - search in each policy room;\n // - turn each (potentially glob) rule entity into a regexp.\n //\n // Real-world testing will tell us whether this is performant enough.\n // In the (unfortunately likely) case it isn't, there are several manners\n // in which we could optimize this:\n // - match several entities per go;\n // - pre-compile each rule entity into a regexp;\n // - pre-compile entire rooms into a single regexp.\n const policyRooms = await this.getOrCreateSourceRooms();\n const senderServer = sender.split(\":\")[1];\n const roomServer = roomId.split(\":\")[1];\n for (const room of policyRooms) {\n const state = room.getUnfilteredTimelineSet().getLiveTimeline().getState(EventTimeline.FORWARDS)!;\n\n for (const { scope, entities } of [\n { scope: PolicyScope.Room, entities: [roomId] },\n { scope: PolicyScope.User, entities: [sender] },\n { scope: PolicyScope.Server, entities: [senderServer, roomServer] },\n ]) {\n const events = state.getStateEvents(scopeToEventTypeMap[scope]);\n for (const event of events) {\n const content = event.getContent();\n if (content?.recommendation != PolicyRecommendation.Ban) {\n // Ignoring invites only looks at `m.ban` recommendations.\n continue;\n }\n const glob = content?.entity;\n if (!glob) {\n // Invalid event.\n continue;\n }\n let regexp: RegExp;\n try {\n regexp = new RegExp(globToRegexp(glob));\n } catch {\n // Assume invalid event.\n continue;\n }\n for (const entity of entities) {\n if (entity && regexp.test(entity)) {\n return event;\n }\n }\n // No match.\n }\n }\n }\n return null;\n }\n\n /**\n * Get the target room, i.e. the room in which any new rule should be written.\n *\n * If there is no target room setup, a target room is created.\n *\n * Note: This method is public for testing reasons. Most clients should not need\n * to call it directly.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async getOrCreateTargetRoom(): Promise<Room> {\n const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();\n let target = ignoreInvitesPolicies.target;\n // Validate `target`. If it is invalid, trash out the current `target`\n // and create a new room.\n if (typeof target !== \"string\") {\n target = null;\n }\n if (target) {\n // Check that the room exists and is valid.\n const room = this.client.getRoom(target);\n if (room) {\n return room;\n } else {\n target = null;\n }\n }\n // We need to create our own policy room for ignoring invites.\n target = (\n await this.client.createRoom({\n name: \"Individual Policy Room\",\n preset: Preset.PrivateChat,\n })\n ).room_id;\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.target = target;\n });\n\n // Since we have just called `createRoom`, `getRoom` should not be `null`.\n return this.client.getRoom(target)!;\n }\n\n /**\n * Get the list of source rooms, i.e. the rooms from which rules need to be read.\n *\n * If no source rooms are setup, the target room is used as sole source room.\n *\n * Note: This method is public for testing reasons. Most clients should not need\n * to call it directly.\n *\n * # Safety\n *\n * This method will rewrite the `Policies` object in the user's account data.\n * This rewrite is inherently racy and could overwrite or be overwritten by\n * other concurrent rewrites of the same object.\n */\n public async getOrCreateSourceRooms(): Promise<Room[]> {\n const ignoreInvitesPolicies = this.getIgnoreInvitesPolicies();\n let sources: string[] = ignoreInvitesPolicies.sources;\n\n // Validate `sources`. If it is invalid, trash out the current `sources`\n // and create a new list of sources from `target`.\n let hasChanges = false;\n if (!Array.isArray(sources)) {\n // `sources` could not be an array.\n hasChanges = true;\n sources = [];\n }\n let sourceRooms = sources\n // `sources` could contain non-string / invalid room ids\n .filter((roomId) => typeof roomId === \"string\")\n .map((roomId) => this.client.getRoom(roomId))\n .filter((room) => !!room) as Room[];\n if (sourceRooms.length != sources.length) {\n hasChanges = true;\n }\n if (sourceRooms.length == 0) {\n // `sources` could be empty (possibly because we've removed\n // invalid content)\n const target = await this.getOrCreateTargetRoom();\n hasChanges = true;\n sourceRooms = [target];\n }\n if (hasChanges) {\n // Reload `policies`/`ignoreInvitesPolicies` in case it has been changed\n // during or by our call to `this.getTargetRoom()`.\n await this.withIgnoreInvitesPolicies((ignoreInvitesPolicies) => {\n ignoreInvitesPolicies.sources = sources;\n });\n }\n return sourceRooms;\n }\n\n /**\n * Fetch the `IGNORE_INVITES_POLICIES` object from account data.\n *\n * If both an unstable prefix version and a stable prefix version are available,\n * it will return the stable prefix version preferentially.\n *\n * The result is *not* validated but is guaranteed to be a non-null object.\n *\n * @returns A non-null object.\n */\n private getIgnoreInvitesPolicies(): { [key: string]: any } {\n return this.getPoliciesAndIgnoreInvitesPolicies().ignoreInvitesPolicies;\n }\n\n /**\n * Modify in place the `IGNORE_INVITES_POLICIES` object from account data.\n */\n private async withIgnoreInvitesPolicies(\n cb: (ignoreInvitesPolicies: { [key: string]: any }) => void,\n ): Promise<void> {\n const { policies, ignoreInvitesPolicies } = this.getPoliciesAndIgnoreInvitesPolicies();\n cb(ignoreInvitesPolicies);\n policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;\n await this.client.setAccountData(POLICIES_ACCOUNT_EVENT_TYPE.name, policies);\n }\n\n /**\n * As `getIgnoreInvitesPolicies` but also return the `POLICIES_ACCOUNT_EVENT_TYPE`\n * object.\n */\n private getPoliciesAndIgnoreInvitesPolicies(): {\n policies: { [key: string]: any };\n ignoreInvitesPolicies: { [key: string]: any };\n } {\n let policies: IContent = {};\n for (const key of [POLICIES_ACCOUNT_EVENT_TYPE.name, POLICIES_ACCOUNT_EVENT_TYPE.altName]) {\n if (!key) {\n continue;\n }\n const value = this.client.getAccountData(key)?.getContent();\n if (value) {\n policies = value;\n break;\n }\n }\n\n let ignoreInvitesPolicies = {};\n let hasIgnoreInvitesPolicies = false;\n for (const key of [IGNORE_INVITES_ACCOUNT_EVENT_KEY.name, IGNORE_INVITES_ACCOUNT_EVENT_KEY.altName]) {\n if (!key) {\n continue;\n }\n const value = policies[key];\n if (value && typeof value == \"object\") {\n ignoreInvitesPolicies = value;\n hasIgnoreInvitesPolicies = true;\n break;\n }\n }\n if (!hasIgnoreInvitesPolicies) {\n policies[IGNORE_INVITES_ACCOUNT_EVENT_KEY.name] = ignoreInvitesPolicies;\n }\n\n return { policies, ignoreInvitesPolicies };\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAAS,aAAa,QAAQ,qBAAqB;AACnD,SAAS,MAAM,QAAQ,uBAAuB;AAC9C,SAAS,YAAY,QAAQ,aAAa;AAE1C,SAAS,SAAS,QAA0B,oBAAoB;AAChE,SACI,gCAAgC,EAChC,2BAA2B,EAC3B,oBAAoB,EACpB,WAAW,QACR,4BAA4B;AAEnC,SAAS,gCAAgC,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,WAAW;AAEzG,MAAM,mBAA2D,GAAG;EAChE,CAAC,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC,cAAc;EAC5C,CAAC,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC,cAAc;EAC5C,CAAC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;AACpC,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,cAAc,CAAC;EACjB,WAAW,CAAkB,MAAoB,EAAE;IAAA,KAAtB,MAAoB,GAApB,MAAoB;EAAG;;EAE3D;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,OAAO,CAAC,KAAkB,EAAE,MAAc,EAAE,MAAc,EAAmB;IACtF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE;MACzF,MAAM;MACN,MAAM;MACN,cAAc,EAAE,oBAAoB,CAAC;IACzC,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC,QAAQ;EAC5B;;EAEA;AACJ;AACA;EACI,MAAa,UAAU,CAAC,KAAkB,EAAiB;IACvD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAG,KAAK,CAAC,KAAK,CAAC,CAAE,CAAC;EACrE;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,SAAS,CAAC,MAAc,EAAoB;IACrD;IACA;IACA;IACA,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClC;IACA,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,GAAG,CAAE,IAAI,IAAK,IAAI,CAAC,MAAM,CAAC;IAChF,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;MAC1B,OAAO,KAAK;IAChB;IACA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IACpB,MAAM,IAAI,CAAC,yBAAyB,CAAE,qBAAqB,IAAK;MAC5D,qBAAqB,CAAC,OAAO,GAAG,OAAO;IAC3C,CAAC,CAAC;;IAEF;IACA,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,gBAAgB,CAAC;IAC1B,MAAM;IACN;EAIJ,CAAC,EAAyC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;MAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAE;MAEjG,KAAK,MAAM;QAAE,KAAK;QAAE;MAAS,CAAC,IAAI,CAC9B;QAAE,KAAK,EAAE,WAAW,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC,MAAM;MAAE,CAAC,EAC/C;QAAE,KAAK,EAAE,WAAW,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC,MAAM;MAAE,CAAC,EAC/C;QAAE,KAAK,EAAE,WAAW,CAAC,MAAM;QAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,UAAU;MAAE,CAAC,CACtE,EAAE;QACC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;UACxB,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;UAClC,IAAI,OAAO,EAAE,cAAc,IAAI,oBAAoB,CAAC,GAAG,EAAE;YACrD;YACA;UACJ;UACA,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM;UAC5B,IAAI,CAAC,IAAI,EAAE;YACP;YACA;UACJ;UACA,IAAI,MAAc;UAClB,IAAI;YACA,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;UAC3C,CAAC,CAAC,MAAM;YACJ;YACA;UACJ;UACA,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;YAC3B,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;cAC/B,OAAO,KAAK;YAChB;UACJ;UACA;QACJ;MACJ;IACJ;IACA,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,qBAAqB,GAAkB;IAChD,MAAM,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,MAAM,GAAG,qBAAqB,CAAC,MAAM;IACzC;IACA;IACA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;MAC5B,MAAM,GAAG,IAAI;IACjB;IACA,IAAI,MAAM,EAAE;MACR;MACA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;MACxC,IAAI,IAAI,EAAE;QACN,OAAO,IAAI;MACf,CAAC,MAAM;QACH,MAAM,GAAG,IAAI;MACjB;IACJ;IACA;IACA,MAAM,GAAG,CACL,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;MACzB,IAAI,EAAE,wBAAwB;MAC9B,MAAM,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EACJ,OAAO;IACT,MAAM,IAAI,CAAC,yBAAyB,CAAE,qBAAqB,IAAK;MAC5D,qBAAqB,CAAC,MAAM,GAAG,MAAM;IACzC,CAAC,CAAC;;IAEF;IACA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;EACtC;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,sBAAsB,GAAoB;IACnD,MAAM,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,OAAiB,GAAG,qBAAqB,CAAC,OAAO;;IAErD;IACA;IACA,IAAI,UAAU,GAAG,KAAK;IACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;MACzB;MACA,UAAU,GAAG,IAAI;MACjB,OAAO,GAAG,EAAE;IAChB;IACA,IAAI,WAAW,GAAG;IACd;IAAA,CACC,MAAM,CAAE,MAAM,IAAK,OAAO,MAAM,KAAK,QAAQ,CAAC,CAC9C,GAAG,CAAE,MAAM,IAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAC5C,MAAM,CAAE,IAAI,IAAK,CAAC,CAAC,IAAI,CAAW;IACvC,IAAI,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;MACtC,UAAU,GAAG,IAAI;IACrB;IACA,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;MACzB;MACA;MACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,CAAC;MACjD,UAAU,GAAG,IAAI;MACjB,WAAW,GAAG,CAAC,MAAM,CAAC;IAC1B;IACA,IAAI,UAAU,EAAE;MACZ;MACA;MACA,MAAM,IAAI,CAAC,yBAAyB,CAAE,qBAAqB,IAAK;QAC5D,qBAAqB,CAAC,OAAO,GAAG,OAAO;MAC3C,CAAC,CAAC;IACN;IACA,OAAO,WAAW;EACtB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACY,wBAAwB,GAA2B;IACvD,OAAO,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC,qBAAqB;EAC3E;;EAEA;AACJ;AACA;EACI,MAAc,yBAAyB,CACnC,EAA2D,EAC9C;IACb,MAAM;MAAE,QAAQ;MAAE;IAAsB,CAAC,GAAG,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACtF,EAAE,CAAC,qBAAqB,CAAC;IACzB,QAAQ,CAAC,gCAAgC,CAAC,IAAI,CAAC,GAAG,qBAAqB;IACvE,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,2BAA2B,CAAC,IAAI,EAAE,QAAQ,CAAC;EAChF;;EAEA;AACJ;AACA;AACA;EACY,mCAAmC,GAGzC;IACE,IAAI,QAAkB,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,2BAA2B,CAAC,OAAO,CAAC,EAAE;MACvF,IAAI,CAAC,GAAG,EAAE;QACN;MACJ;MACA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;MAC3D,IAAI,KAAK,EAAE;QACP,QAAQ,GAAG,KAAK;QAChB;MACJ;IACJ;IAEA,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,IAAI,wBAAwB,GAAG,KAAK;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,gCAAgC,CAAC,IAAI,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAAE;MACjG,IAAI,CAAC,GAAG,EAAE;QACN;MACJ;MACA,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;MAC3B,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE;QACnC,qBAAqB,GAAG,KAAK;QAC7B,wBAAwB,GAAG,IAAI;QAC/B;MACJ;IACJ;IACA,IAAI,CAAC,wBAAwB,EAAE;MAC3B,QAAQ,CAAC,gCAAgC,CAAC,IAAI,CAAC,GAAG,qBAAqB;IAC3E;IAEA,OAAO;MAAE,QAAQ;MAAE;IAAsB,CAAC;EAC9C;AACJ","ignoreList":[]}