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
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
2
  /*
4
3
  Copyright 2019, 2021, 2023 The Matrix.org Foundation C.I.C.
@@ -21,16 +20,13 @@ import { logger } from "../logger.js";
21
20
  import { RelationType } from "../@types/event.js";
22
21
  import { TypedEventEmitter } from "./typed-event-emitter.js";
23
22
  import { Room } from "./room.js";
24
- export var RelationsEvent = /*#__PURE__*/function (RelationsEvent) {
23
+ export let RelationsEvent = /*#__PURE__*/function (RelationsEvent) {
25
24
  RelationsEvent["Add"] = "Relations.add";
26
25
  RelationsEvent["Remove"] = "Relations.remove";
27
26
  RelationsEvent["Redaction"] = "Relations.redaction";
28
27
  return RelationsEvent;
29
28
  }({});
30
- var matchesEventType = function matchesEventType(eventType, targetEventType) {
31
- var altTargetEventTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
32
- return [targetEventType, ...altTargetEventTypes].includes(eventType);
33
- };
29
+ const matchesEventType = (eventType, targetEventType, altTargetEventTypes = []) => [targetEventType, ...altTargetEventTypes].includes(eventType);
34
30
 
35
31
  /**
36
32
  * A container for relation events that supports easy access to common ways of
@@ -48,12 +44,7 @@ export class Relations extends TypedEventEmitter {
48
44
  * @param altEventTypes - alt event types for relation events, for example to support unstable prefixed event types
49
45
  */
50
46
  constructor(relationType, eventType, client, altEventTypes) {
51
- var _this;
52
47
  super();
53
- _this = this;
54
- this.relationType = relationType;
55
- this.eventType = eventType;
56
- this.altEventTypes = altEventTypes;
57
48
  _defineProperty(this, "relationEventIds", new Set());
58
49
  _defineProperty(this, "relations", new Set());
59
50
  _defineProperty(this, "annotationsByKey", {});
@@ -92,25 +83,23 @@ export class Relations extends TypedEventEmitter {
92
83
  *
93
84
  * @param redactedEvent - The original relation event that is about to be redacted.
94
85
  */
95
- _defineProperty(this, "onBeforeRedaction", /*#__PURE__*/function () {
96
- var _ref = _asyncToGenerator(function* (redactedEvent) {
97
- if (!_this.relations.has(redactedEvent)) {
98
- return;
99
- }
100
- _this.relations.delete(redactedEvent);
101
- if (_this.relationType === RelationType.Annotation) {
102
- // Remove the redacted annotation from aggregation by key
103
- _this.removeAnnotationFromAggregation(redactedEvent);
104
- } else if (_this.relationType === RelationType.Replace) {
105
- yield _this.updateTargetEventReplacement();
106
- }
107
- redactedEvent.removeListener(MatrixEventEvent.BeforeRedaction, _this.onBeforeRedaction);
108
- _this.emit(RelationsEvent.Redaction, redactedEvent);
109
- });
110
- return function (_x) {
111
- return _ref.apply(this, arguments);
112
- };
113
- }());
86
+ _defineProperty(this, "onBeforeRedaction", async redactedEvent => {
87
+ if (!this.relations.has(redactedEvent)) {
88
+ return;
89
+ }
90
+ this.relations.delete(redactedEvent);
91
+ if (this.relationType === RelationType.Annotation) {
92
+ // Remove the redacted annotation from aggregation by key
93
+ this.removeAnnotationFromAggregation(redactedEvent);
94
+ } else if (this.relationType === RelationType.Replace) {
95
+ await this.updateTargetEventReplacement();
96
+ }
97
+ redactedEvent.removeListener(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);
98
+ this.emit(RelationsEvent.Redaction, redactedEvent);
99
+ });
100
+ this.relationType = relationType;
101
+ this.eventType = eventType;
102
+ this.altEventTypes = altEventTypes;
114
103
  this.client = client instanceof Room ? client.client : client;
115
104
  }
116
105
 
@@ -119,40 +108,37 @@ export class Relations extends TypedEventEmitter {
119
108
  *
120
109
  * @param event - The new relation event to be added.
121
110
  */
122
- addEvent(event) {
123
- var _this2 = this;
124
- return _asyncToGenerator(function* () {
125
- if (_this2.relationEventIds.has(event.getId())) {
126
- return;
127
- }
128
- var relation = event.getRelation();
129
- if (!relation) {
130
- logger.error("Event must have relation info");
131
- return;
132
- }
133
- var relationType = relation.rel_type;
134
- var eventType = event.getType();
135
- if (_this2.relationType !== relationType || !matchesEventType(eventType, _this2.eventType, _this2.altEventTypes)) {
136
- logger.error("Event relation info doesn't match this container");
137
- return;
138
- }
111
+ async addEvent(event) {
112
+ if (this.relationEventIds.has(event.getId())) {
113
+ return;
114
+ }
115
+ const relation = event.getRelation();
116
+ if (!relation) {
117
+ logger.error("Event must have relation info");
118
+ return;
119
+ }
120
+ const relationType = relation.rel_type;
121
+ const eventType = event.getType();
122
+ if (this.relationType !== relationType || !matchesEventType(eventType, this.eventType, this.altEventTypes)) {
123
+ logger.error("Event relation info doesn't match this container");
124
+ return;
125
+ }
139
126
 
140
- // If the event is in the process of being sent, listen for cancellation
141
- // so we can remove the event from the collection.
142
- if (event.isSending()) {
143
- event.on(MatrixEventEvent.Status, _this2.onEventStatus);
144
- }
145
- _this2.relations.add(event);
146
- _this2.relationEventIds.add(event.getId());
147
- if (_this2.relationType === RelationType.Annotation) {
148
- _this2.addAnnotationToAggregation(event);
149
- } else if (_this2.relationType === RelationType.Replace) {
150
- yield _this2.updateTargetEventReplacement();
151
- }
152
- event.on(MatrixEventEvent.BeforeRedaction, _this2.onBeforeRedaction);
153
- _this2.emit(RelationsEvent.Add, event);
154
- _this2.maybeEmitCreated();
155
- })();
127
+ // If the event is in the process of being sent, listen for cancellation
128
+ // so we can remove the event from the collection.
129
+ if (event.isSending()) {
130
+ event.on(MatrixEventEvent.Status, this.onEventStatus);
131
+ }
132
+ this.relations.add(event);
133
+ this.relationEventIds.add(event.getId());
134
+ if (this.relationType === RelationType.Annotation) {
135
+ this.addAnnotationToAggregation(event);
136
+ } else if (this.relationType === RelationType.Replace) {
137
+ await this.updateTargetEventReplacement();
138
+ }
139
+ event.on(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);
140
+ this.emit(RelationsEvent.Add, event);
141
+ this.maybeEmitCreated();
156
142
  }
157
143
 
158
144
  /**
@@ -160,20 +146,17 @@ export class Relations extends TypedEventEmitter {
160
146
  *
161
147
  * @param event - The relation event to remove.
162
148
  */
163
- removeEvent(event) {
164
- var _this3 = this;
165
- return _asyncToGenerator(function* () {
166
- if (!_this3.relations.has(event)) {
167
- return;
168
- }
169
- _this3.relations.delete(event);
170
- if (_this3.relationType === RelationType.Annotation) {
171
- _this3.removeAnnotationFromAggregation(event);
172
- } else if (_this3.relationType === RelationType.Replace) {
173
- yield _this3.updateTargetEventReplacement();
174
- }
175
- _this3.emit(RelationsEvent.Remove, event);
176
- })();
149
+ async removeEvent(event) {
150
+ if (!this.relations.has(event)) {
151
+ return;
152
+ }
153
+ this.relations.delete(event);
154
+ if (this.relationType === RelationType.Annotation) {
155
+ this.removeAnnotationFromAggregation(event);
156
+ } else if (this.relationType === RelationType.Replace) {
157
+ await this.updateTargetEventReplacement();
158
+ }
159
+ this.emit(RelationsEvent.Remove, event);
177
160
  }
178
161
  /**
179
162
  * Get all relation events in this collection.
@@ -188,11 +171,11 @@ export class Relations extends TypedEventEmitter {
188
171
  return [...this.relations];
189
172
  }
190
173
  addAnnotationToAggregation(event) {
191
- var _event$getRelation;
192
- var _ref2 = (_event$getRelation = event.getRelation()) !== null && _event$getRelation !== void 0 ? _event$getRelation : {},
193
- key = _ref2.key;
174
+ const {
175
+ key
176
+ } = event.getRelation() ?? {};
194
177
  if (!key) return;
195
- var eventsForKey = this.annotationsByKey[key];
178
+ let eventsForKey = this.annotationsByKey[key];
196
179
  if (!eventsForKey) {
197
180
  eventsForKey = this.annotationsByKey[key] = new Set();
198
181
  this.sortedAnnotationsByKey.push([key, eventsForKey]);
@@ -201,12 +184,12 @@ export class Relations extends TypedEventEmitter {
201
184
  eventsForKey.add(event);
202
185
  // Re-sort the [key, events] pairs in descending order of event count
203
186
  this.sortedAnnotationsByKey.sort((a, b) => {
204
- var aEvents = a[1];
205
- var bEvents = b[1];
187
+ const aEvents = a[1];
188
+ const bEvents = b[1];
206
189
  return bEvents.size - aEvents.size;
207
190
  });
208
- var sender = event.getSender();
209
- var eventsFromSender = this.annotationsBySender[sender];
191
+ const sender = event.getSender();
192
+ let eventsFromSender = this.annotationsBySender[sender];
210
193
  if (!eventsFromSender) {
211
194
  eventsFromSender = this.annotationsBySender[sender] = new Set();
212
195
  }
@@ -214,23 +197,23 @@ export class Relations extends TypedEventEmitter {
214
197
  eventsFromSender.add(event);
215
198
  }
216
199
  removeAnnotationFromAggregation(event) {
217
- var _event$getRelation2;
218
- var _ref3 = (_event$getRelation2 = event.getRelation()) !== null && _event$getRelation2 !== void 0 ? _event$getRelation2 : {},
219
- key = _ref3.key;
200
+ const {
201
+ key
202
+ } = event.getRelation() ?? {};
220
203
  if (!key) return;
221
- var eventsForKey = this.annotationsByKey[key];
204
+ const eventsForKey = this.annotationsByKey[key];
222
205
  if (eventsForKey) {
223
206
  eventsForKey.delete(event);
224
207
 
225
208
  // Re-sort the [key, events] pairs in descending order of event count
226
209
  this.sortedAnnotationsByKey.sort((a, b) => {
227
- var aEvents = a[1];
228
- var bEvents = b[1];
210
+ const aEvents = a[1];
211
+ const bEvents = b[1];
229
212
  return bEvents.size - aEvents.size;
230
213
  });
231
214
  }
232
- var sender = event.getSender();
233
- var eventsFromSender = this.annotationsBySender[sender];
215
+ const sender = event.getSender();
216
+ const eventsFromSender = this.annotationsBySender[sender];
234
217
  if (eventsFromSender) {
235
218
  eventsFromSender.delete(event);
236
219
  }
@@ -274,61 +257,55 @@ export class Relations extends TypedEventEmitter {
274
257
  * This is currently only supported for the m.replace relation type,
275
258
  * once the target event is known, see `addEvent`.
276
259
  */
277
- getLastReplacement() {
278
- var _this4 = this;
279
- return _asyncToGenerator(function* () {
280
- if (_this4.relationType !== RelationType.Replace) {
281
- // Aggregating on last only makes sense for this relation type
282
- return null;
260
+ async getLastReplacement() {
261
+ if (this.relationType !== RelationType.Replace) {
262
+ // Aggregating on last only makes sense for this relation type
263
+ return null;
264
+ }
265
+ if (!this.targetEvent) {
266
+ // Don't know which replacements to accept yet.
267
+ // This method shouldn't be called before the original
268
+ // event is known anyway.
269
+ return null;
270
+ }
271
+
272
+ // the all-knowning server tells us that the event at some point had
273
+ // this timestamp for its replacement, so any following replacement should definitely not be less
274
+ const replaceRelation = this.targetEvent.getServerAggregatedRelation(RelationType.Replace);
275
+ const minTs = replaceRelation?.origin_server_ts;
276
+ const lastReplacement = this.getRelations().reduce((last, event) => {
277
+ if (event.getSender() !== this.targetEvent.getSender()) {
278
+ return last;
283
279
  }
284
- if (!_this4.targetEvent) {
285
- // Don't know which replacements to accept yet.
286
- // This method shouldn't be called before the original
287
- // event is known anyway.
288
- return null;
280
+ if (minTs && minTs > event.getTs()) {
281
+ return last;
289
282
  }
290
-
291
- // the all-knowning server tells us that the event at some point had
292
- // this timestamp for its replacement, so any following replacement should definitely not be less
293
- var replaceRelation = _this4.targetEvent.getServerAggregatedRelation(RelationType.Replace);
294
- var minTs = replaceRelation === null || replaceRelation === void 0 ? void 0 : replaceRelation.origin_server_ts;
295
- var lastReplacement = _this4.getRelations().reduce((last, event) => {
296
- if (event.getSender() !== _this4.targetEvent.getSender()) {
297
- return last;
298
- }
299
- if (minTs && minTs > event.getTs()) {
300
- return last;
301
- }
302
- if (last && last.getTs() > event.getTs()) {
303
- return last;
304
- }
305
- return event;
306
- }, null);
307
- if (lastReplacement !== null && lastReplacement !== void 0 && lastReplacement.shouldAttemptDecryption() && _this4.client.getCrypto()) {
308
- // Dirty but we are expecting to pass the cryptoBackend which is not accessible here
309
- yield lastReplacement.attemptDecryption(_this4.client.getCrypto());
310
- } else if (lastReplacement !== null && lastReplacement !== void 0 && lastReplacement.isBeingDecrypted()) {
311
- yield lastReplacement.getDecryptionPromise();
283
+ if (last && last.getTs() > event.getTs()) {
284
+ return last;
312
285
  }
313
- return lastReplacement;
314
- })();
286
+ return event;
287
+ }, null);
288
+ if (lastReplacement?.shouldAttemptDecryption() && this.client.getCrypto()) {
289
+ // Dirty but we are expecting to pass the cryptoBackend which is not accessible here
290
+ await lastReplacement.attemptDecryption(this.client.getCrypto());
291
+ } else if (lastReplacement?.isBeingDecrypted()) {
292
+ await lastReplacement.getDecryptionPromise();
293
+ }
294
+ return lastReplacement;
315
295
  }
316
296
 
317
297
  /*
318
298
  * @param targetEvent - the event the relations are related to.
319
299
  */
320
- setTargetEvent(event) {
321
- var _this5 = this;
322
- return _asyncToGenerator(function* () {
323
- if (_this5.targetEvent) {
324
- return;
325
- }
326
- _this5.targetEvent = event;
327
- if (_this5.relationType === RelationType.Replace) {
328
- yield _this5.updateTargetEventReplacement();
329
- }
330
- _this5.maybeEmitCreated();
331
- })();
300
+ async setTargetEvent(event) {
301
+ if (this.targetEvent) {
302
+ return;
303
+ }
304
+ this.targetEvent = event;
305
+ if (this.relationType === RelationType.Replace) {
306
+ await this.updateTargetEventReplacement();
307
+ }
308
+ this.maybeEmitCreated();
332
309
  }
333
310
 
334
311
  /**
@@ -338,27 +315,24 @@ export class Relations extends TypedEventEmitter {
338
315
  * while edits are still being decrypted). A monotonic update counter guards
339
316
  * against older async resolutions overriding newer replacement selections.
340
317
  */
341
- updateTargetEventReplacement() {
342
- var _this6 = this;
343
- return _asyncToGenerator(function* () {
344
- if (!_this6.targetEvent || _this6.targetEvent.isState()) {
345
- return;
346
- }
347
- var targetEvent = _this6.targetEvent;
348
- var updateId = ++_this6.replacementUpdateId;
349
- var lastReplacement = yield _this6.getLastReplacement();
318
+ async updateTargetEventReplacement() {
319
+ if (!this.targetEvent || this.targetEvent.isState()) {
320
+ return;
321
+ }
322
+ const targetEvent = this.targetEvent;
323
+ const updateId = ++this.replacementUpdateId;
324
+ const lastReplacement = await this.getLastReplacement();
350
325
 
351
- // If a newer update started while we were awaiting, discard this stale result.
352
- if (updateId !== _this6.replacementUpdateId || _this6.targetEvent !== targetEvent) {
353
- return;
354
- }
326
+ // If a newer update started while we were awaiting, discard this stale result.
327
+ if (updateId !== this.replacementUpdateId || this.targetEvent !== targetEvent) {
328
+ return;
329
+ }
355
330
 
356
- // Avoid emitting Event.replaced when there is no replacement and none currently set.
357
- if (!lastReplacement && !targetEvent.replacingEvent()) {
358
- return;
359
- }
360
- targetEvent.makeReplaced(lastReplacement !== null && lastReplacement !== void 0 ? lastReplacement : undefined);
361
- })();
331
+ // Avoid emitting Event.replaced when there is no replacement and none currently set.
332
+ if (!lastReplacement && !targetEvent.replacingEvent()) {
333
+ return;
334
+ }
335
+ targetEvent.makeReplaced(lastReplacement ?? undefined);
362
336
  }
363
337
  maybeEmitCreated() {
364
338
  if (this.creationEmitted) {
@@ -1 +1 @@
1
- {"version":3,"file":"relations.js","names":["EventStatus","MatrixEventEvent","logger","RelationType","TypedEventEmitter","Room","RelationsEvent","matchesEventType","eventType","targetEventType","altTargetEventTypes","arguments","length","undefined","includes","Relations","constructor","relationType","client","altEventTypes","_this","this","_defineProperty","Set","event","status","isSending","removeListener","Status","onEventStatus","CANCELLED","removeEvent","_ref","_asyncToGenerator","redactedEvent","relations","has","delete","Annotation","removeAnnotationFromAggregation","Replace","updateTargetEventReplacement","BeforeRedaction","onBeforeRedaction","emit","Redaction","_x","apply","addEvent","_this2","relationEventIds","getId","relation","getRelation","error","rel_type","getType","on","add","addAnnotationToAggregation","Add","maybeEmitCreated","_this3","Remove","getRelations","_event$getRelation","_ref2","key","eventsForKey","annotationsByKey","sortedAnnotationsByKey","push","sort","a","b","aEvents","bEvents","size","sender","getSender","eventsFromSender","annotationsBySender","_event$getRelation2","_ref3","getSortedAnnotationsByKey","getAnnotationsBySender","getLastReplacement","_this4","targetEvent","replaceRelation","getServerAggregatedRelation","minTs","origin_server_ts","lastReplacement","reduce","last","getTs","shouldAttemptDecryption","getCrypto","attemptDecryption","isBeingDecrypted","getDecryptionPromise","setTargetEvent","_this5","_this6","isState","updateId","replacementUpdateId","replacingEvent","makeReplaced","creationEmitted","RelationsCreated"],"sources":["../../src/models/relations.ts"],"sourcesContent":["/*\nCopyright 2019, 2021, 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 { EventStatus, type IAggregatedRelation, type MatrixEvent, MatrixEventEvent } from \"./event.ts\";\nimport { logger } from \"../logger.ts\";\nimport { RelationType } from \"../@types/event.ts\";\nimport { TypedEventEmitter } from \"./typed-event-emitter.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { Room } from \"./room.ts\";\nimport { type CryptoBackend } from \"../common-crypto/CryptoBackend.ts\";\n\nexport enum RelationsEvent {\n Add = \"Relations.add\",\n Remove = \"Relations.remove\",\n Redaction = \"Relations.redaction\",\n}\n\nexport type EventHandlerMap = {\n [RelationsEvent.Add]: (event: MatrixEvent) => void;\n [RelationsEvent.Remove]: (event: MatrixEvent) => void;\n [RelationsEvent.Redaction]: (event: MatrixEvent) => void;\n};\n\nconst matchesEventType = (eventType: string, targetEventType: string, altTargetEventTypes: string[] = []): boolean =>\n [targetEventType, ...altTargetEventTypes].includes(eventType);\n\n/**\n * A container for relation events that supports easy access to common ways of\n * aggregating such events. Each instance holds events that of a single relation\n * type and event type. All of the events also relate to the same original event.\n *\n * The typical way to get one of these containers is via\n * EventTimelineSet#getRelationsForEvent.\n */\nexport class Relations extends TypedEventEmitter<RelationsEvent, EventHandlerMap> {\n private relationEventIds = new Set<string>();\n private relations = new Set<MatrixEvent>();\n private annotationsByKey: Record<string, Set<MatrixEvent>> = {};\n private annotationsBySender: Record<string, Set<MatrixEvent>> = {};\n private sortedAnnotationsByKey: [string, Set<MatrixEvent>][] = [];\n private targetEvent: MatrixEvent | null = null;\n private creationEmitted = false;\n private replacementUpdateId = 0;\n private readonly client: MatrixClient;\n\n /**\n * @param relationType - The type of relation involved, such as \"m.annotation\", \"m.reference\", \"m.replace\", etc.\n * @param eventType - The relation event's type, such as \"m.reaction\", etc.\n * @param client - The client which created this instance. For backwards compatibility also accepts a Room.\n * @param altEventTypes - alt event types for relation events, for example to support unstable prefixed event types\n */\n public constructor(\n public readonly relationType: RelationType | string,\n public readonly eventType: string,\n client: MatrixClient | Room,\n public readonly altEventTypes?: string[],\n ) {\n super();\n this.client = client instanceof Room ? client.client : client;\n }\n\n /**\n * Add relation events to this collection.\n *\n * @param event - The new relation event to be added.\n */\n public async addEvent(event: MatrixEvent): Promise<void> {\n if (this.relationEventIds.has(event.getId()!)) {\n return;\n }\n\n const relation = event.getRelation();\n if (!relation) {\n logger.error(\"Event must have relation info\");\n return;\n }\n\n const relationType = relation.rel_type;\n const eventType = event.getType();\n\n if (this.relationType !== relationType || !matchesEventType(eventType, this.eventType, this.altEventTypes)) {\n logger.error(\"Event relation info doesn't match this container\");\n return;\n }\n\n // If the event is in the process of being sent, listen for cancellation\n // so we can remove the event from the collection.\n if (event.isSending()) {\n event.on(MatrixEventEvent.Status, this.onEventStatus);\n }\n\n this.relations.add(event);\n this.relationEventIds.add(event.getId()!);\n\n if (this.relationType === RelationType.Annotation) {\n this.addAnnotationToAggregation(event);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n event.on(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);\n\n this.emit(RelationsEvent.Add, event);\n\n this.maybeEmitCreated();\n }\n\n /**\n * Remove relation event from this collection.\n *\n * @param event - The relation event to remove.\n */\n public async removeEvent(event: MatrixEvent): Promise<void> {\n if (!this.relations.has(event)) {\n return;\n }\n\n this.relations.delete(event);\n\n if (this.relationType === RelationType.Annotation) {\n this.removeAnnotationFromAggregation(event);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n this.emit(RelationsEvent.Remove, event);\n }\n\n /**\n * Listens for event status changes to remove cancelled events.\n *\n * @param event - The event whose status has changed\n * @param status - The new status\n */\n private onEventStatus = (event: MatrixEvent, status: EventStatus | null): void => {\n if (!event.isSending()) {\n // Sending is done, so we don't need to listen anymore\n event.removeListener(MatrixEventEvent.Status, this.onEventStatus);\n return;\n }\n if (status !== EventStatus.CANCELLED) {\n return;\n }\n // Event was cancelled, remove from the collection\n event.removeListener(MatrixEventEvent.Status, this.onEventStatus);\n this.removeEvent(event);\n };\n\n /**\n * Get all relation events in this collection.\n *\n * These are currently in the order of insertion to this collection, which\n * won't match timeline order in the case of scrollback.\n * TODO: Tweak `addEvent` to insert correctly for scrollback.\n *\n * Relation events in insertion order.\n */\n public getRelations(): MatrixEvent[] {\n return [...this.relations];\n }\n\n private addAnnotationToAggregation(event: MatrixEvent): void {\n const { key } = event.getRelation() ?? {};\n if (!key) return;\n\n let eventsForKey = this.annotationsByKey[key];\n if (!eventsForKey) {\n eventsForKey = this.annotationsByKey[key] = new Set();\n this.sortedAnnotationsByKey.push([key, eventsForKey]);\n }\n // Add the new event to the set for this key\n eventsForKey.add(event);\n // Re-sort the [key, events] pairs in descending order of event count\n this.sortedAnnotationsByKey.sort((a, b) => {\n const aEvents = a[1];\n const bEvents = b[1];\n return bEvents.size - aEvents.size;\n });\n\n const sender = event.getSender()!;\n let eventsFromSender = this.annotationsBySender[sender];\n if (!eventsFromSender) {\n eventsFromSender = this.annotationsBySender[sender] = new Set();\n }\n // Add the new event to the set for this sender\n eventsFromSender.add(event);\n }\n\n private removeAnnotationFromAggregation(event: MatrixEvent): void {\n const { key } = event.getRelation() ?? {};\n if (!key) return;\n\n const eventsForKey = this.annotationsByKey[key];\n if (eventsForKey) {\n eventsForKey.delete(event);\n\n // Re-sort the [key, events] pairs in descending order of event count\n this.sortedAnnotationsByKey.sort((a, b) => {\n const aEvents = a[1];\n const bEvents = b[1];\n return bEvents.size - aEvents.size;\n });\n }\n\n const sender = event.getSender()!;\n const eventsFromSender = this.annotationsBySender[sender];\n if (eventsFromSender) {\n eventsFromSender.delete(event);\n }\n }\n\n /**\n * For relations that have been redacted, we want to remove them from\n * aggregation data sets and emit an update event.\n *\n * To do so, we listen for `Event.beforeRedaction`, which happens:\n * - after the server accepted the redaction and remote echoed back to us\n * - before the original event has been marked redacted in the client\n *\n * @param redactedEvent - The original relation event that is about to be redacted.\n */\n private onBeforeRedaction = async (redactedEvent: MatrixEvent): Promise<void> => {\n if (!this.relations.has(redactedEvent)) {\n return;\n }\n\n this.relations.delete(redactedEvent);\n\n if (this.relationType === RelationType.Annotation) {\n // Remove the redacted annotation from aggregation by key\n this.removeAnnotationFromAggregation(redactedEvent);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n redactedEvent.removeListener(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);\n\n this.emit(RelationsEvent.Redaction, redactedEvent);\n };\n\n /**\n * Get all events in this collection grouped by key and sorted by descending\n * event count in each group.\n *\n * This is currently only supported for the annotation relation type.\n *\n * An array of [key, events] pairs sorted by descending event count.\n * The events are stored in a Set (which preserves insertion order).\n */\n public getSortedAnnotationsByKey(): [string, Set<MatrixEvent>][] | null {\n if (this.relationType !== RelationType.Annotation) {\n // Other relation types are not grouped currently.\n return null;\n }\n\n return this.sortedAnnotationsByKey;\n }\n\n /**\n * Get all events in this collection grouped by sender.\n *\n * This is currently only supported for the annotation relation type.\n *\n * An object with each relation sender as a key and the matching Set of\n * events for that sender as a value.\n */\n public getAnnotationsBySender(): Record<string, Set<MatrixEvent>> | null {\n if (this.relationType !== RelationType.Annotation) {\n // Other relation types are not grouped currently.\n return null;\n }\n\n return this.annotationsBySender;\n }\n\n /**\n * Returns the most recent (and allowed) m.replace relation, if any.\n *\n * This is currently only supported for the m.replace relation type,\n * once the target event is known, see `addEvent`.\n */\n public async getLastReplacement(): Promise<MatrixEvent | null> {\n if (this.relationType !== RelationType.Replace) {\n // Aggregating on last only makes sense for this relation type\n return null;\n }\n if (!this.targetEvent) {\n // Don't know which replacements to accept yet.\n // This method shouldn't be called before the original\n // event is known anyway.\n return null;\n }\n\n // the all-knowning server tells us that the event at some point had\n // this timestamp for its replacement, so any following replacement should definitely not be less\n const replaceRelation = this.targetEvent.getServerAggregatedRelation<IAggregatedRelation>(RelationType.Replace);\n const minTs = replaceRelation?.origin_server_ts;\n\n const lastReplacement = this.getRelations().reduce<MatrixEvent | null>((last, event) => {\n if (event.getSender() !== this.targetEvent!.getSender()) {\n return last;\n }\n if (minTs && minTs > event.getTs()) {\n return last;\n }\n if (last && last.getTs() > event.getTs()) {\n return last;\n }\n return event;\n }, null);\n\n if (lastReplacement?.shouldAttemptDecryption() && this.client.getCrypto()) {\n // Dirty but we are expecting to pass the cryptoBackend which is not accessible here\n await lastReplacement.attemptDecryption(this.client.getCrypto() as CryptoBackend);\n } else if (lastReplacement?.isBeingDecrypted()) {\n await lastReplacement.getDecryptionPromise();\n }\n\n return lastReplacement;\n }\n\n /*\n * @param targetEvent - the event the relations are related to.\n */\n public async setTargetEvent(event: MatrixEvent): Promise<void> {\n if (this.targetEvent) {\n return;\n }\n this.targetEvent = event;\n\n if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n this.maybeEmitCreated();\n }\n\n /**\n * Updates the target event with the latest replacement.\n *\n * Multiple replacement updates can be triggered concurrently (for example\n * while edits are still being decrypted). A monotonic update counter guards\n * against older async resolutions overriding newer replacement selections.\n */\n private async updateTargetEventReplacement(): Promise<void> {\n if (!this.targetEvent || this.targetEvent.isState()) {\n return;\n }\n\n const targetEvent = this.targetEvent;\n const updateId = ++this.replacementUpdateId;\n const lastReplacement = await this.getLastReplacement();\n\n // If a newer update started while we were awaiting, discard this stale result.\n if (updateId !== this.replacementUpdateId || this.targetEvent !== targetEvent) {\n return;\n }\n\n // Avoid emitting Event.replaced when there is no replacement and none currently set.\n if (!lastReplacement && !targetEvent.replacingEvent()) {\n return;\n }\n\n targetEvent.makeReplaced(lastReplacement ?? undefined);\n }\n\n private maybeEmitCreated(): void {\n if (this.creationEmitted) {\n return;\n }\n // Only emit we're \"created\" once we have a target event instance _and_\n // at least one related event.\n if (!this.targetEvent || !this.relations.size) {\n return;\n }\n this.creationEmitted = true;\n this.targetEvent.emit(MatrixEventEvent.RelationsCreated, this.relationType, this.eventType);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"relations.js","names":[],"sources":["../../src/models/relations.ts"],"sourcesContent":["/*\nCopyright 2019, 2021, 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 { EventStatus, type IAggregatedRelation, type MatrixEvent, MatrixEventEvent } from \"./event.ts\";\nimport { logger } from \"../logger.ts\";\nimport { RelationType } from \"../@types/event.ts\";\nimport { TypedEventEmitter } from \"./typed-event-emitter.ts\";\nimport { type MatrixClient } from \"../client.ts\";\nimport { Room } from \"./room.ts\";\nimport { type CryptoBackend } from \"../common-crypto/CryptoBackend.ts\";\n\nexport enum RelationsEvent {\n Add = \"Relations.add\",\n Remove = \"Relations.remove\",\n Redaction = \"Relations.redaction\",\n}\n\nexport type EventHandlerMap = {\n [RelationsEvent.Add]: (event: MatrixEvent) => void;\n [RelationsEvent.Remove]: (event: MatrixEvent) => void;\n [RelationsEvent.Redaction]: (event: MatrixEvent) => void;\n};\n\nconst matchesEventType = (eventType: string, targetEventType: string, altTargetEventTypes: string[] = []): boolean =>\n [targetEventType, ...altTargetEventTypes].includes(eventType);\n\n/**\n * A container for relation events that supports easy access to common ways of\n * aggregating such events. Each instance holds events that of a single relation\n * type and event type. All of the events also relate to the same original event.\n *\n * The typical way to get one of these containers is via\n * EventTimelineSet#getRelationsForEvent.\n */\nexport class Relations extends TypedEventEmitter<RelationsEvent, EventHandlerMap> {\n private relationEventIds = new Set<string>();\n private relations = new Set<MatrixEvent>();\n private annotationsByKey: Record<string, Set<MatrixEvent>> = {};\n private annotationsBySender: Record<string, Set<MatrixEvent>> = {};\n private sortedAnnotationsByKey: [string, Set<MatrixEvent>][] = [];\n private targetEvent: MatrixEvent | null = null;\n private creationEmitted = false;\n private replacementUpdateId = 0;\n private readonly client: MatrixClient;\n\n /**\n * @param relationType - The type of relation involved, such as \"m.annotation\", \"m.reference\", \"m.replace\", etc.\n * @param eventType - The relation event's type, such as \"m.reaction\", etc.\n * @param client - The client which created this instance. For backwards compatibility also accepts a Room.\n * @param altEventTypes - alt event types for relation events, for example to support unstable prefixed event types\n */\n public constructor(\n public readonly relationType: RelationType | string,\n public readonly eventType: string,\n client: MatrixClient | Room,\n public readonly altEventTypes?: string[],\n ) {\n super();\n this.client = client instanceof Room ? client.client : client;\n }\n\n /**\n * Add relation events to this collection.\n *\n * @param event - The new relation event to be added.\n */\n public async addEvent(event: MatrixEvent): Promise<void> {\n if (this.relationEventIds.has(event.getId()!)) {\n return;\n }\n\n const relation = event.getRelation();\n if (!relation) {\n logger.error(\"Event must have relation info\");\n return;\n }\n\n const relationType = relation.rel_type;\n const eventType = event.getType();\n\n if (this.relationType !== relationType || !matchesEventType(eventType, this.eventType, this.altEventTypes)) {\n logger.error(\"Event relation info doesn't match this container\");\n return;\n }\n\n // If the event is in the process of being sent, listen for cancellation\n // so we can remove the event from the collection.\n if (event.isSending()) {\n event.on(MatrixEventEvent.Status, this.onEventStatus);\n }\n\n this.relations.add(event);\n this.relationEventIds.add(event.getId()!);\n\n if (this.relationType === RelationType.Annotation) {\n this.addAnnotationToAggregation(event);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n event.on(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);\n\n this.emit(RelationsEvent.Add, event);\n\n this.maybeEmitCreated();\n }\n\n /**\n * Remove relation event from this collection.\n *\n * @param event - The relation event to remove.\n */\n public async removeEvent(event: MatrixEvent): Promise<void> {\n if (!this.relations.has(event)) {\n return;\n }\n\n this.relations.delete(event);\n\n if (this.relationType === RelationType.Annotation) {\n this.removeAnnotationFromAggregation(event);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n this.emit(RelationsEvent.Remove, event);\n }\n\n /**\n * Listens for event status changes to remove cancelled events.\n *\n * @param event - The event whose status has changed\n * @param status - The new status\n */\n private onEventStatus = (event: MatrixEvent, status: EventStatus | null): void => {\n if (!event.isSending()) {\n // Sending is done, so we don't need to listen anymore\n event.removeListener(MatrixEventEvent.Status, this.onEventStatus);\n return;\n }\n if (status !== EventStatus.CANCELLED) {\n return;\n }\n // Event was cancelled, remove from the collection\n event.removeListener(MatrixEventEvent.Status, this.onEventStatus);\n this.removeEvent(event);\n };\n\n /**\n * Get all relation events in this collection.\n *\n * These are currently in the order of insertion to this collection, which\n * won't match timeline order in the case of scrollback.\n * TODO: Tweak `addEvent` to insert correctly for scrollback.\n *\n * Relation events in insertion order.\n */\n public getRelations(): MatrixEvent[] {\n return [...this.relations];\n }\n\n private addAnnotationToAggregation(event: MatrixEvent): void {\n const { key } = event.getRelation() ?? {};\n if (!key) return;\n\n let eventsForKey = this.annotationsByKey[key];\n if (!eventsForKey) {\n eventsForKey = this.annotationsByKey[key] = new Set();\n this.sortedAnnotationsByKey.push([key, eventsForKey]);\n }\n // Add the new event to the set for this key\n eventsForKey.add(event);\n // Re-sort the [key, events] pairs in descending order of event count\n this.sortedAnnotationsByKey.sort((a, b) => {\n const aEvents = a[1];\n const bEvents = b[1];\n return bEvents.size - aEvents.size;\n });\n\n const sender = event.getSender()!;\n let eventsFromSender = this.annotationsBySender[sender];\n if (!eventsFromSender) {\n eventsFromSender = this.annotationsBySender[sender] = new Set();\n }\n // Add the new event to the set for this sender\n eventsFromSender.add(event);\n }\n\n private removeAnnotationFromAggregation(event: MatrixEvent): void {\n const { key } = event.getRelation() ?? {};\n if (!key) return;\n\n const eventsForKey = this.annotationsByKey[key];\n if (eventsForKey) {\n eventsForKey.delete(event);\n\n // Re-sort the [key, events] pairs in descending order of event count\n this.sortedAnnotationsByKey.sort((a, b) => {\n const aEvents = a[1];\n const bEvents = b[1];\n return bEvents.size - aEvents.size;\n });\n }\n\n const sender = event.getSender()!;\n const eventsFromSender = this.annotationsBySender[sender];\n if (eventsFromSender) {\n eventsFromSender.delete(event);\n }\n }\n\n /**\n * For relations that have been redacted, we want to remove them from\n * aggregation data sets and emit an update event.\n *\n * To do so, we listen for `Event.beforeRedaction`, which happens:\n * - after the server accepted the redaction and remote echoed back to us\n * - before the original event has been marked redacted in the client\n *\n * @param redactedEvent - The original relation event that is about to be redacted.\n */\n private onBeforeRedaction = async (redactedEvent: MatrixEvent): Promise<void> => {\n if (!this.relations.has(redactedEvent)) {\n return;\n }\n\n this.relations.delete(redactedEvent);\n\n if (this.relationType === RelationType.Annotation) {\n // Remove the redacted annotation from aggregation by key\n this.removeAnnotationFromAggregation(redactedEvent);\n } else if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n redactedEvent.removeListener(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction);\n\n this.emit(RelationsEvent.Redaction, redactedEvent);\n };\n\n /**\n * Get all events in this collection grouped by key and sorted by descending\n * event count in each group.\n *\n * This is currently only supported for the annotation relation type.\n *\n * An array of [key, events] pairs sorted by descending event count.\n * The events are stored in a Set (which preserves insertion order).\n */\n public getSortedAnnotationsByKey(): [string, Set<MatrixEvent>][] | null {\n if (this.relationType !== RelationType.Annotation) {\n // Other relation types are not grouped currently.\n return null;\n }\n\n return this.sortedAnnotationsByKey;\n }\n\n /**\n * Get all events in this collection grouped by sender.\n *\n * This is currently only supported for the annotation relation type.\n *\n * An object with each relation sender as a key and the matching Set of\n * events for that sender as a value.\n */\n public getAnnotationsBySender(): Record<string, Set<MatrixEvent>> | null {\n if (this.relationType !== RelationType.Annotation) {\n // Other relation types are not grouped currently.\n return null;\n }\n\n return this.annotationsBySender;\n }\n\n /**\n * Returns the most recent (and allowed) m.replace relation, if any.\n *\n * This is currently only supported for the m.replace relation type,\n * once the target event is known, see `addEvent`.\n */\n public async getLastReplacement(): Promise<MatrixEvent | null> {\n if (this.relationType !== RelationType.Replace) {\n // Aggregating on last only makes sense for this relation type\n return null;\n }\n if (!this.targetEvent) {\n // Don't know which replacements to accept yet.\n // This method shouldn't be called before the original\n // event is known anyway.\n return null;\n }\n\n // the all-knowning server tells us that the event at some point had\n // this timestamp for its replacement, so any following replacement should definitely not be less\n const replaceRelation = this.targetEvent.getServerAggregatedRelation<IAggregatedRelation>(RelationType.Replace);\n const minTs = replaceRelation?.origin_server_ts;\n\n const lastReplacement = this.getRelations().reduce<MatrixEvent | null>((last, event) => {\n if (event.getSender() !== this.targetEvent!.getSender()) {\n return last;\n }\n if (minTs && minTs > event.getTs()) {\n return last;\n }\n if (last && last.getTs() > event.getTs()) {\n return last;\n }\n return event;\n }, null);\n\n if (lastReplacement?.shouldAttemptDecryption() && this.client.getCrypto()) {\n // Dirty but we are expecting to pass the cryptoBackend which is not accessible here\n await lastReplacement.attemptDecryption(this.client.getCrypto() as CryptoBackend);\n } else if (lastReplacement?.isBeingDecrypted()) {\n await lastReplacement.getDecryptionPromise();\n }\n\n return lastReplacement;\n }\n\n /*\n * @param targetEvent - the event the relations are related to.\n */\n public async setTargetEvent(event: MatrixEvent): Promise<void> {\n if (this.targetEvent) {\n return;\n }\n this.targetEvent = event;\n\n if (this.relationType === RelationType.Replace) {\n await this.updateTargetEventReplacement();\n }\n\n this.maybeEmitCreated();\n }\n\n /**\n * Updates the target event with the latest replacement.\n *\n * Multiple replacement updates can be triggered concurrently (for example\n * while edits are still being decrypted). A monotonic update counter guards\n * against older async resolutions overriding newer replacement selections.\n */\n private async updateTargetEventReplacement(): Promise<void> {\n if (!this.targetEvent || this.targetEvent.isState()) {\n return;\n }\n\n const targetEvent = this.targetEvent;\n const updateId = ++this.replacementUpdateId;\n const lastReplacement = await this.getLastReplacement();\n\n // If a newer update started while we were awaiting, discard this stale result.\n if (updateId !== this.replacementUpdateId || this.targetEvent !== targetEvent) {\n return;\n }\n\n // Avoid emitting Event.replaced when there is no replacement and none currently set.\n if (!lastReplacement && !targetEvent.replacingEvent()) {\n return;\n }\n\n targetEvent.makeReplaced(lastReplacement ?? undefined);\n }\n\n private maybeEmitCreated(): void {\n if (this.creationEmitted) {\n return;\n }\n // Only emit we're \"created\" once we have a target event instance _and_\n // at least one related event.\n if (!this.targetEvent || !this.relations.size) {\n return;\n }\n this.creationEmitted = true;\n this.targetEvent.emit(MatrixEventEvent.RelationsCreated, this.relationType, this.eventType);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,WAAW,EAA8C,gBAAgB,QAAQ,YAAY;AACtG,SAAS,MAAM,QAAQ,cAAc;AACrC,SAAS,YAAY,QAAQ,oBAAoB;AACjD,SAAS,iBAAiB,QAAQ,0BAA0B;AAE5D,SAAS,IAAI,QAAQ,WAAW;AAGhC,WAAY,cAAc,0BAAd,cAAc;EAAd,cAAc;EAAd,cAAc;EAAd,cAAc;EAAA,OAAd,cAAc;AAAA;AAY1B,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,eAAuB,EAAE,mBAA6B,GAAG,EAAE,KACpG,CAAC,eAAe,EAAE,GAAG,mBAAmB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,SAAS,SAAS,iBAAiB,CAAkC;EAW9E;AACJ;AACA;AACA;AACA;AACA;EACW,WAAW,CACE,YAAmC,EACnC,SAAiB,EACjC,MAA2B,EACX,aAAwB,EAC1C;IACE,KAAK,CAAC,CAAC;IAAC,0CAtBe,IAAI,GAAG,CAAS,CAAC;IAAA,mCACxB,IAAI,GAAG,CAAc,CAAC;IAAA,0CACmB,CAAC,CAAC;IAAA,6CACC,CAAC,CAAC;IAAA,gDACH,EAAE;IAAA,qCACvB,IAAI;IAAA,yCACpB,KAAK;IAAA,6CACD,CAAC;IAAA;IAsF/B;AACJ;AACA;AACA;AACA;AACA;IALI,uCAMwB,CAAC,KAAkB,EAAE,MAA0B,KAAW;MAC9E,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;QACpB;QACA,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC;QACjE;MACJ;MACA,IAAI,MAAM,KAAK,WAAW,CAAC,SAAS,EAAE;QAClC;MACJ;MACA;MACA,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC;MACjE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IAiED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATI,2CAU4B,MAAO,aAA0B,IAAoB;MAC7E,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QACpC;MACJ;MAEA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;MAEpC,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAAE;QAC/C;QACA,IAAI,CAAC,+BAA+B,CAAC,aAAa,CAAC;MACvD,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE;QACnD,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC;MAC7C;MAEA,aAAa,CAAC,cAAc,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC;MAEtF,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC;IACtD,CAAC;IAAA,KA1LmB,YAAmC,GAAnC,YAAmC;IAAA,KACnC,SAAiB,GAAjB,SAAiB;IAAA,KAEjB,aAAwB,GAAxB,aAAwB;IAGxC,IAAI,CAAC,MAAM,GAAG,MAAM,YAAY,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM;EACjE;;EAEA;AACJ;AACA;AACA;AACA;EACI,MAAa,QAAQ,CAAC,KAAkB,EAAiB;IACrD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAE,CAAC,EAAE;MAC3C;IACJ;IAEA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE;MACX,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC;MAC7C;IACJ;IAEA,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAEjC,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE;MACxG,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC;MAChE;IACJ;;IAEA;IACA;IACA,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;MACnB,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC;IACzD;IAEA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAE,CAAC;IAEzC,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAAE;MAC/C,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;IAC1C,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE;MACnD,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC7C;IAEA,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAElE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;IAEpC,IAAI,CAAC,gBAAgB,CAAC,CAAC;EAC3B;;EAEA;AACJ;AACA;AACA;AACA;EACI,MAAa,WAAW,CAAC,KAAkB,EAAiB;IACxD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;MAC5B;IACJ;IAEA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;IAE5B,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAAE;MAC/C,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;IAC/C,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE;MACnD,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC7C;IAEA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC;EAC3C;EAsBA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACW,YAAY,GAAkB;IACjC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;EAC9B;EAEQ,0BAA0B,CAAC,KAAkB,EAAQ;IACzD,MAAM;MAAE;IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE;IAEV,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;IAC7C,IAAI,CAAC,YAAY,EAAE;MACf,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;MACrD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACzD;IACA;IACA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;IACA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;MACvC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;MACpB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;MACpB,OAAO,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IACtC,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAE;IACjC,IAAI,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACvD,IAAI,CAAC,gBAAgB,EAAE;MACnB,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACnE;IACA;IACA,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;EAC/B;EAEQ,+BAA+B,CAAC,KAAkB,EAAQ;IAC9D,MAAM;MAAE;IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE;IAEV,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;IAC/C,IAAI,YAAY,EAAE;MACd,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;;MAE1B;MACA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;QACvC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;MACtC,CAAC,CAAC;IACN;IAEA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAE;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACzD,IAAI,gBAAgB,EAAE;MAClB,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;IAClC;EACJ;EA+BA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACW,yBAAyB,GAAwC;IACpE,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAAE;MAC/C;MACA,OAAO,IAAI;IACf;IAEA,OAAO,IAAI,CAAC,sBAAsB;EACtC;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACW,sBAAsB,GAA4C;IACrE,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAAE;MAC/C;MACA,OAAO,IAAI;IACf;IAEA,OAAO,IAAI,CAAC,mBAAmB;EACnC;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACI,MAAa,kBAAkB,GAAgC;IAC3D,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE;MAC5C;MACA,OAAO,IAAI;IACf;IACA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;MACnB;MACA;MACA;MACA,OAAO,IAAI;IACf;;IAEA;IACA;IACA,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAsB,YAAY,CAAC,OAAO,CAAC;IAC/G,MAAM,KAAK,GAAG,eAAe,EAAE,gBAAgB;IAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAqB,CAAC,IAAI,EAAE,KAAK,KAAK;MACpF,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAE,SAAS,CAAC,CAAC,EAAE;QACrD,OAAO,IAAI;MACf;MACA,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;QAChC,OAAO,IAAI;MACf;MACA,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;QACtC,OAAO,IAAI;MACf;MACA,OAAO,KAAK;IAChB,CAAC,EAAE,IAAI,CAAC;IAER,IAAI,eAAe,EAAE,uBAAuB,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;MACvE;MACA,MAAM,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAkB,CAAC;IACrF,CAAC,MAAM,IAAI,eAAe,EAAE,gBAAgB,CAAC,CAAC,EAAE;MAC5C,MAAM,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAChD;IAEA,OAAO,eAAe;EAC1B;;EAEA;AACJ;AACA;EACI,MAAa,cAAc,CAAC,KAAkB,EAAiB;IAC3D,IAAI,IAAI,CAAC,WAAW,EAAE;MAClB;IACJ;IACA,IAAI,CAAC,WAAW,GAAG,KAAK;IAExB,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE;MAC5C,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC7C;IAEA,IAAI,CAAC,gBAAgB,CAAC,CAAC;EAC3B;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,MAAc,4BAA4B,GAAkB;IACxD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE;MACjD;IACJ;IAEA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;IACpC,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,mBAAmB;IAC3C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC;;IAEvD;IACA,IAAI,QAAQ,KAAK,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;MAC3E;IACJ;;IAEA;IACA,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE;MACnD;IACJ;IAEA,WAAW,CAAC,YAAY,CAAC,eAAe,IAAI,SAAS,CAAC;EAC1D;EAEQ,gBAAgB,GAAS;IAC7B,IAAI,IAAI,CAAC,eAAe,EAAE;MACtB;IACJ;IACA;IACA;IACA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;MAC3C;IACJ;IACA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;EAC/F;AACJ","ignoreList":[]}