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,5 +1,3 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
2
  /*
5
3
  Copyright 2026 Element Creations Ltd.
@@ -34,90 +32,82 @@ import { ROOM_RETENTION_TYPE } from "../@types/retention.js";
34
32
  */
35
33
  export class RoomRetentionPolicy {
36
34
  constructor(room, retentionService, store) {
37
- var _this = this;
38
- this.room = room;
39
- this.retentionService = retentionService;
40
- this.store = store;
41
35
  // minRetention is not implemented.
42
36
  _defineProperty(this, "maxRetention", null);
43
37
  _defineProperty(this, "retentionTimeout", void 0);
44
38
  _defineProperty(this, "logger", void 0);
45
- _defineProperty(this, "handleRetentionUpdate", /*#__PURE__*/_asyncToGenerator(function* () {
39
+ _defineProperty(this, "handleRetentionUpdate", async () => {
46
40
  // First store if we currently have a retention period.
47
- var hadRetentionPeriod = _this.maxRetention !== null;
41
+ const hadRetentionPeriod = this.maxRetention !== null;
48
42
  try {
49
- yield _this.recalculateRetention(_this.room.currentState);
43
+ await this.recalculateRetention(this.room.currentState);
50
44
  } catch (err) {
51
- _this.logger.warn("Failed to recalculate retention policy", err);
45
+ this.logger.warn("Failed to recalculate retention policy", err);
52
46
  return;
53
47
  }
54
48
 
55
49
  // Bind/unbind the Timeline event handler based on whether we should be running retention.
56
- if (hadRetentionPeriod !== (_this.maxRetention !== null)) {
57
- _this.logger.info("retention recalculated to be", _this.maxRetention);
50
+ if (hadRetentionPeriod !== (this.maxRetention !== null)) {
51
+ this.logger.info("retention recalculated to be", this.maxRetention);
58
52
  // We've changed
59
- if (_this.maxRetention) {
60
- _this.room.on(RoomEvent.Timeline, _this.timelineUpdated);
53
+ if (this.maxRetention) {
54
+ this.room.on(RoomEvent.Timeline, this.timelineUpdated);
61
55
  } else {
62
- _this.room.off(RoomEvent.Timeline, _this.timelineUpdated);
56
+ this.room.off(RoomEvent.Timeline, this.timelineUpdated);
63
57
  }
64
58
  }
65
- }));
66
- _defineProperty(this, "recalculateRetention", /*#__PURE__*/function () {
67
- var _ref2 = _asyncToGenerator(function* (roomState) {
68
- var _serverPolicy$policie, _unstableEvent$getCon, _ref3, _serverPolicy$policie2, _serverPolicy$limits2;
69
- var unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find(e => e.getStateKey() === "");
70
- var stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find(e => e.getStateKey() === "");
71
- var serverPolicy = _this.retentionService.getCached();
72
- var serverRoomPolicy = serverPolicy === null || serverPolicy === void 0 || (_serverPolicy$policie = serverPolicy.policies) === null || _serverPolicy$policie === void 0 ? void 0 : _serverPolicy$policie[_this.room.roomId];
73
- var roomStatePolicy = (_unstableEvent$getCon = unstableEvent === null || unstableEvent === void 0 ? void 0 : unstableEvent.getContent()) !== null && _unstableEvent$getCon !== void 0 ? _unstableEvent$getCon : stableEvent === null || stableEvent === void 0 ? void 0 : stableEvent.getContent();
74
- var content = // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.
75
- (_ref3 = serverRoomPolicy !== null && serverRoomPolicy !== void 0 ? serverRoomPolicy :
76
- // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:
77
- roomStatePolicy) !== null && _ref3 !== void 0 ? _ref3 : // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:
78
- serverPolicy === null || serverPolicy === void 0 || (_serverPolicy$policie2 = serverPolicy.policies) === null || _serverPolicy$policie2 === void 0 ? void 0 : _serverPolicy$policie2["*"];
79
- if (!content) {
80
- // * otherwise, don't apply a retention policy in this room.
81
- _this.maxRetention = null;
82
- return;
83
- }
84
- var validatePolicy = !serverRoomPolicy && roomStatePolicy;
59
+ });
60
+ _defineProperty(this, "recalculateRetention", async roomState => {
61
+ const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find(e => e.getStateKey() === "");
62
+ const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find(e => e.getStateKey() === "");
63
+ const serverPolicy = this.retentionService.getCached();
64
+ const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];
65
+ const roomStatePolicy = unstableEvent?.getContent() ?? stableEvent?.getContent();
66
+ const content =
67
+ // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.
68
+ serverRoomPolicy ??
69
+ // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:
70
+ roomStatePolicy ??
71
+ // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:
72
+ serverPolicy?.policies?.["*"];
73
+ if (!content) {
74
+ // * otherwise, don't apply a retention policy in this room.
75
+ this.maxRetention = null;
76
+ return;
77
+ }
78
+ const validatePolicy = !serverRoomPolicy && roomStatePolicy;
85
79
 
86
- // Parse it
87
- var maxLifetime = content.max_lifetime;
88
- if (!maxLifetime && validatePolicy) {
89
- var _serverPolicy$limits;
90
- // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).
91
- maxLifetime = serverPolicy === null || serverPolicy === void 0 || (_serverPolicy$limits = serverPolicy.limits) === null || _serverPolicy$limits === void 0 || (_serverPolicy$limits = _serverPolicy$limits.max_lifetime) === null || _serverPolicy$limits === void 0 ? void 0 : _serverPolicy$limits.min;
92
- if (!maxLifetime) {
93
- _this.maxRetention = null;
94
- return;
95
- }
96
- }
97
- if (typeof maxLifetime !== "number") {
98
- throw Error("max_lifetime must be a number, got \"".concat(maxLifetime, "\""));
99
- }
100
- if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {
101
- throw Error("max_lifetime must be >= 0, got ".concat(maxLifetime));
102
- }
103
- _this.maxRetention = maxLifetime;
104
- if (validatePolicy && serverPolicy !== null && serverPolicy !== void 0 && (_serverPolicy$limits2 = serverPolicy.limits) !== null && _serverPolicy$limits2 !== void 0 && _serverPolicy$limits2.max_lifetime) {
105
- var _serverPolicy$limits$, _serverPolicy$limits$2;
106
- // We're using room state so we need to validate this policy matches the server.
107
- /**
108
- if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.
109
- if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.
110
- if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.
111
- */
112
- _this.maxRetention = Math.max(_this.maxRetention, (_serverPolicy$limits$ = serverPolicy.limits.max_lifetime.min) !== null && _serverPolicy$limits$ !== void 0 ? _serverPolicy$limits$ : 0);
113
- _this.maxRetention = Math.min(_this.maxRetention, (_serverPolicy$limits$2 = serverPolicy.limits.max_lifetime.max) !== null && _serverPolicy$limits$2 !== void 0 ? _serverPolicy$limits$2 : Number.MAX_SAFE_INTEGER);
80
+ // Parse it
81
+ let {
82
+ max_lifetime: maxLifetime
83
+ } = content;
84
+ if (!maxLifetime && validatePolicy) {
85
+ // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).
86
+ maxLifetime = serverPolicy?.limits?.max_lifetime?.min;
87
+ if (!maxLifetime) {
88
+ this.maxRetention = null;
89
+ return;
114
90
  }
115
- _this.processTimeline();
116
- });
117
- return function (_x) {
118
- return _ref2.apply(this, arguments);
119
- };
120
- }());
91
+ }
92
+ if (typeof maxLifetime !== "number") {
93
+ throw Error(`max_lifetime must be a number, got "${maxLifetime}"`);
94
+ }
95
+ if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {
96
+ throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);
97
+ }
98
+ this.maxRetention = maxLifetime;
99
+ if (validatePolicy && serverPolicy?.limits?.max_lifetime) {
100
+ // We're using room state so we need to validate this policy matches the server.
101
+ /**
102
+ if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.
103
+ if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.
104
+ if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.
105
+ */
106
+ this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);
107
+ this.maxRetention = Math.min(this.maxRetention, serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER);
108
+ }
109
+ this.processTimeline();
110
+ });
121
111
  _defineProperty(this, "timelineUpdated", () => {
122
112
  this.logger.info("timelineUpdated");
123
113
  this.scheduleTimelineCheck(200);
@@ -131,7 +121,10 @@ export class RoomRetentionPolicy {
131
121
  this.retentionTimeout = undefined;
132
122
  }, nextTs);
133
123
  });
134
- this.logger = rootLogger.getChild("RetentionPolicy ".concat(room.roomId));
124
+ this.room = room;
125
+ this.retentionService = retentionService;
126
+ this.store = store;
127
+ this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);
135
128
 
136
129
  // Recalculate on room state update.
137
130
  room.on(RoomStateEvent.Events, event => {
@@ -155,31 +148,29 @@ export class RoomRetentionPolicy {
155
148
  if (!this.maxRetention) {
156
149
  return true;
157
150
  }
158
- var expireBefore = Date.now() - this.maxRetention;
151
+ const expireBefore = Date.now() - this.maxRetention;
159
152
  return ev.getTs() > expireBefore;
160
153
  }
161
154
  processTimeline() {
162
155
  if (!this.maxRetention) {
163
156
  return; // No policy, skip.
164
157
  }
165
- this.logger.info("Running processTimeline");
166
- var expireBefore = Date.now() - this.maxRetention;
167
- var events = this.room.getLiveTimeline().getEvents().filter(ev => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== "m.room.redaction");
168
- var expiredEvents = events.filter(ev => ev.getTs() < expireBefore);
169
- var _events$filter$sort = events.filter(ev => ev.getTs() >= expireBefore).sort((a, b) => a.getTs() - b.getTs()),
170
- _events$filter$sort2 = _slicedToArray(_events$filter$sort, 1),
171
- earliestExpiringEvent = _events$filter$sort2[0];
158
+ this.logger.info(`Running processTimeline`);
159
+ const expireBefore = Date.now() - this.maxRetention;
160
+ const events = this.room.getLiveTimeline().getEvents().filter(ev => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== "m.room.redaction");
161
+ const expiredEvents = events.filter(ev => ev.getTs() < expireBefore);
162
+ const [earliestExpiringEvent] = events.filter(ev => ev.getTs() >= expireBefore).sort((a, b) => a.getTs() - b.getTs());
172
163
  if (earliestExpiringEvent) {
173
- var nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();
174
- this.logger.info("Next expiry scheduled for ".concat(nextTs));
164
+ const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();
165
+ this.logger.info(`Next expiry scheduled for ${nextTs}`);
175
166
  this.scheduleTimelineCheck(nextTs);
176
167
  }
177
168
  if (expiredEvents.length === 0) {
178
169
  this.logger.info("Found no expired events");
179
170
  return;
180
171
  }
181
- this.logger.info("Found ".concat(expiredEvents.length, " expired events"));
182
- for (var event of expiredEvents) {
172
+ this.logger.info(`Found ${expiredEvents.length} expired events`);
173
+ for (const event of expiredEvents) {
183
174
  this.room.tryApplyRedaction(new MatrixEvent({
184
175
  type: EventType.RoomRedaction,
185
176
  sender: event.getSender(),
@@ -194,7 +185,7 @@ export class RoomRetentionPolicy {
194
185
  }));
195
186
  }
196
187
  void this.store.removeEventsFromRoom(this.room.roomId, expiredEvents.map(e => e.getId())).catch(ex => {
197
- this.logger.warn("Failed to remove events from store", ex);
188
+ this.logger.warn(`Failed to remove events from store`, ex);
198
189
  });
199
190
  }
200
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"room-retention.js","names":["MatrixEvent","RoomEvent","RoomStateEvent","logger","rootLogger","EventType","ROOM_RETENTION_TYPE","RoomRetentionPolicy","constructor","room","retentionService","store","_this","_defineProperty","_asyncToGenerator","hadRetentionPeriod","maxRetention","recalculateRetention","currentState","err","warn","info","on","Timeline","timelineUpdated","off","_ref2","roomState","_serverPolicy$policie","_unstableEvent$getCon","_ref3","_serverPolicy$policie2","_serverPolicy$limits2","unstableEvent","getStateEvents","name","find","e","getStateKey","stableEvent","altName","serverPolicy","getCached","serverRoomPolicy","policies","roomId","roomStatePolicy","getContent","content","validatePolicy","maxLifetime","max_lifetime","_serverPolicy$limits","limits","min","Error","concat","Number","isInteger","_serverPolicy$limits$","_serverPolicy$limits$2","Math","max","MAX_SAFE_INTEGER","processTimeline","_x","apply","arguments","scheduleTimelineCheck","nextTs","retentionTimeout","clearTimeout","setTimeout","undefined","getChild","Events","event","getType","handleRetentionUpdate","shouldEventBeRetained","ev","expireBefore","Date","now","getTs","events","getLiveTimeline","getEvents","filter","isRedacted","expiredEvents","_events$filter$sort","sort","a","b","_events$filter$sort2","_slicedToArray","earliestExpiringEvent","length","tryApplyRedaction","type","RoomRedaction","sender","getSender","event_id","room_id","redacts","getId","reason","origin_server_ts","unsigned","removeEventsFromRoom","map","catch","ex"],"sources":["../../src/models/room-retention.ts"],"sourcesContent":["/*\nCopyright 2026 Element Creations Ltd.\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 { MatrixEvent } from \"../models/event.ts\";\nimport { RoomEvent, type Room } from \"./room.ts\";\nimport { RoomStateEvent, type RoomState } from \"./room-state.ts\";\nimport { type Logger, logger as rootLogger } from \"../logger.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport type { RetentionPolicyService } from \"../retentionPolicy.ts\";\nimport type { IStore } from \"../store/index.ts\";\nimport { ROOM_RETENTION_TYPE, type RoomRetentionContent } from \"../@types/retention.ts\";\n\n/**\n * Applies https://github.com/matrix-org/matrix-spec-proposals/pull/1763 by checking the current\n * state of the room and applying the *latest* retention policy to all preceeding events.\n * Currently does not:\n * - Apply global server policies (requires Synapse work)\n * - React at all to `min_retention` configs.\n * - Loop\n */\nexport class RoomRetentionPolicy {\n // minRetention is not implemented.\n private maxRetention: number | null = null;\n private retentionTimeout?: ReturnType<typeof setTimeout>;\n private readonly logger: Logger;\n\n public constructor(\n private readonly room: Room,\n private readonly retentionService: RetentionPolicyService,\n private readonly store: IStore,\n ) {\n this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);\n\n // Recalculate on room state update.\n room.on(RoomStateEvent.Events, (event) => {\n if (\n event.getStateKey() !== \"\" ||\n (event.getType() !== \"org.matrix.msc1763.retention\" && event.getType() !== \"m.room.retention\")\n ) {\n return;\n }\n void this.handleRetentionUpdate();\n });\n\n // Recalculate our retention whenever the global policy changes.\n this.retentionService.on(\"update\", () => {\n this.logger.info(\"Got global retention policy update!\");\n void this.handleRetentionUpdate();\n });\n // Do an initial check on construction.\n void this.handleRetentionUpdate();\n\n // Only bind RoomEvent.Timeline once we know we have a retention policy.\n }\n\n public shouldEventBeRetained(ev: MatrixEvent): boolean {\n if (!this.maxRetention) {\n return true;\n }\n const expireBefore = Date.now() - this.maxRetention;\n return ev.getTs() > expireBefore;\n }\n\n private readonly handleRetentionUpdate = async (): Promise<void> => {\n // First store if we currently have a retention period.\n const hadRetentionPeriod = this.maxRetention !== null;\n\n try {\n await this.recalculateRetention(this.room.currentState);\n } catch (err) {\n this.logger.warn(\"Failed to recalculate retention policy\", err);\n return;\n }\n\n // Bind/unbind the Timeline event handler based on whether we should be running retention.\n if (hadRetentionPeriod !== (this.maxRetention !== null)) {\n this.logger.info(\"retention recalculated to be\", this.maxRetention);\n // We've changed\n if (this.maxRetention) {\n this.room.on(RoomEvent.Timeline, this.timelineUpdated);\n } else {\n this.room.off(RoomEvent.Timeline, this.timelineUpdated);\n }\n }\n };\n\n private readonly recalculateRetention = async (roomState: RoomState): Promise<void> => {\n const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find((e) => e.getStateKey() === \"\");\n const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find((e) => e.getStateKey() === \"\");\n\n const serverPolicy = this.retentionService.getCached();\n\n const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];\n const roomStatePolicy =\n unstableEvent?.getContent<RoomRetentionContent>() ?? stableEvent?.getContent<RoomRetentionContent>();\n\n const content =\n // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.\n serverRoomPolicy ??\n // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:\n roomStatePolicy ??\n // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:\n serverPolicy?.policies?.[\"*\"];\n\n if (!content) {\n // * otherwise, don't apply a retention policy in this room.\n this.maxRetention = null;\n return;\n }\n\n const validatePolicy = !serverRoomPolicy && roomStatePolicy;\n\n // Parse it\n let { max_lifetime: maxLifetime } = content;\n\n if (!maxLifetime && validatePolicy) {\n // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).\n maxLifetime = serverPolicy?.limits?.max_lifetime?.min;\n if (!maxLifetime) {\n this.maxRetention = null;\n return;\n }\n }\n\n if (typeof maxLifetime !== \"number\") {\n throw Error(`max_lifetime must be a number, got \"${maxLifetime}\"`);\n }\n if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {\n throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);\n }\n this.maxRetention = maxLifetime;\n\n if (validatePolicy && serverPolicy?.limits?.max_lifetime) {\n // We're using room state so we need to validate this policy matches the server.\n /**\n if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.\n if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.\n if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.\n */\n this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);\n this.maxRetention = Math.min(\n this.maxRetention,\n serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER,\n );\n }\n\n this.processTimeline();\n };\n\n private readonly timelineUpdated = (): void => {\n this.logger.info(\"timelineUpdated\");\n this.scheduleTimelineCheck(200);\n };\n\n private readonly scheduleTimelineCheck = (nextTs: number): void => {\n if (this.retentionTimeout) {\n clearTimeout(this.retentionTimeout);\n }\n this.retentionTimeout = setTimeout(() => {\n this.processTimeline();\n this.retentionTimeout = undefined;\n }, nextTs);\n };\n\n private processTimeline(): void {\n if (!this.maxRetention) {\n return; // No policy, skip.\n }\n this.logger.info(`Running processTimeline`);\n const expireBefore = Date.now() - this.maxRetention;\n const events = this.room\n .getLiveTimeline()\n .getEvents()\n .filter((ev) => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== \"m.room.redaction\");\n\n const expiredEvents = events.filter((ev) => ev.getTs() < expireBefore);\n const [earliestExpiringEvent] = events\n .filter((ev) => ev.getTs() >= expireBefore)\n .sort((a, b) => a.getTs() - b.getTs());\n\n if (earliestExpiringEvent) {\n const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();\n this.logger.info(`Next expiry scheduled for ${nextTs}`);\n this.scheduleTimelineCheck(nextTs);\n }\n\n if (expiredEvents.length === 0) {\n this.logger.info(\"Found no expired events\");\n return;\n }\n this.logger.info(`Found ${expiredEvents.length} expired events`);\n for (const event of expiredEvents) {\n this.room.tryApplyRedaction(\n new MatrixEvent({\n type: EventType.RoomRedaction,\n sender: event.getSender(),\n event_id: \"$synthetic_redaction\",\n room_id: this.room.roomId,\n redacts: event.getId(),\n content: {\n reason: \"Retention policy\",\n },\n origin_server_ts: Date.now(),\n unsigned: {},\n }),\n );\n }\n void this.store\n .removeEventsFromRoom(\n this.room.roomId,\n expiredEvents.map((e) => e.getId()!),\n )\n .catch((ex) => {\n this.logger.warn(`Failed to remove events from store`, ex);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"room-retention.js","names":[],"sources":["../../src/models/room-retention.ts"],"sourcesContent":["/*\nCopyright 2026 Element Creations Ltd.\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 { MatrixEvent } from \"../models/event.ts\";\nimport { RoomEvent, type Room } from \"./room.ts\";\nimport { RoomStateEvent, type RoomState } from \"./room-state.ts\";\nimport { type Logger, logger as rootLogger } from \"../logger.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport type { RetentionPolicyService } from \"../retentionPolicy.ts\";\nimport type { IStore } from \"../store/index.ts\";\nimport { ROOM_RETENTION_TYPE, type RoomRetentionContent } from \"../@types/retention.ts\";\n\n/**\n * Applies https://github.com/matrix-org/matrix-spec-proposals/pull/1763 by checking the current\n * state of the room and applying the *latest* retention policy to all preceeding events.\n * Currently does not:\n * - Apply global server policies (requires Synapse work)\n * - React at all to `min_retention` configs.\n * - Loop\n */\nexport class RoomRetentionPolicy {\n // minRetention is not implemented.\n private maxRetention: number | null = null;\n private retentionTimeout?: ReturnType<typeof setTimeout>;\n private readonly logger: Logger;\n\n public constructor(\n private readonly room: Room,\n private readonly retentionService: RetentionPolicyService,\n private readonly store: IStore,\n ) {\n this.logger = rootLogger.getChild(`RetentionPolicy ${room.roomId}`);\n\n // Recalculate on room state update.\n room.on(RoomStateEvent.Events, (event) => {\n if (\n event.getStateKey() !== \"\" ||\n (event.getType() !== \"org.matrix.msc1763.retention\" && event.getType() !== \"m.room.retention\")\n ) {\n return;\n }\n void this.handleRetentionUpdate();\n });\n\n // Recalculate our retention whenever the global policy changes.\n this.retentionService.on(\"update\", () => {\n this.logger.info(\"Got global retention policy update!\");\n void this.handleRetentionUpdate();\n });\n // Do an initial check on construction.\n void this.handleRetentionUpdate();\n\n // Only bind RoomEvent.Timeline once we know we have a retention policy.\n }\n\n public shouldEventBeRetained(ev: MatrixEvent): boolean {\n if (!this.maxRetention) {\n return true;\n }\n const expireBefore = Date.now() - this.maxRetention;\n return ev.getTs() > expireBefore;\n }\n\n private readonly handleRetentionUpdate = async (): Promise<void> => {\n // First store if we currently have a retention period.\n const hadRetentionPeriod = this.maxRetention !== null;\n\n try {\n await this.recalculateRetention(this.room.currentState);\n } catch (err) {\n this.logger.warn(\"Failed to recalculate retention policy\", err);\n return;\n }\n\n // Bind/unbind the Timeline event handler based on whether we should be running retention.\n if (hadRetentionPeriod !== (this.maxRetention !== null)) {\n this.logger.info(\"retention recalculated to be\", this.maxRetention);\n // We've changed\n if (this.maxRetention) {\n this.room.on(RoomEvent.Timeline, this.timelineUpdated);\n } else {\n this.room.off(RoomEvent.Timeline, this.timelineUpdated);\n }\n }\n };\n\n private readonly recalculateRetention = async (roomState: RoomState): Promise<void> => {\n const unstableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.name).find((e) => e.getStateKey() === \"\");\n const stableEvent = roomState.getStateEvents(ROOM_RETENTION_TYPE.altName).find((e) => e.getStateKey() === \"\");\n\n const serverPolicy = this.retentionService.getCached();\n\n const serverRoomPolicy = serverPolicy?.policies?.[this.room.roomId];\n const roomStatePolicy =\n unstableEvent?.getContent<RoomRetentionContent>() ?? stableEvent?.getContent<RoomRetentionContent>();\n\n const content =\n // * if the homeserver defines a specific retention policy for this room, then use this policy as the effective retention policy of the room.\n serverRoomPolicy ??\n // * otherwise, if the state of the room includes a `m.room.retention` event with an empty state key:\n roomStatePolicy ??\n // * otherwise, if the state of the room does not include a m.room.retention event with an empty state key:\n serverPolicy?.policies?.[\"*\"];\n\n if (!content) {\n // * otherwise, don't apply a retention policy in this room.\n this.maxRetention = null;\n return;\n }\n\n const validatePolicy = !serverRoomPolicy && roomStatePolicy;\n\n // Parse it\n let { max_lifetime: maxLifetime } = content;\n\n if (!maxLifetime && validatePolicy) {\n // if there is no value specified in the room's state, use the limit's min value for the effective retention policy of the room (which can be null or absent).\n maxLifetime = serverPolicy?.limits?.max_lifetime?.min;\n if (!maxLifetime) {\n this.maxRetention = null;\n return;\n }\n }\n\n if (typeof maxLifetime !== \"number\") {\n throw Error(`max_lifetime must be a number, got \"${maxLifetime}\"`);\n }\n if (maxLifetime < 0 || !Number.isInteger(maxLifetime)) {\n throw Error(`max_lifetime must be >= 0, got ${maxLifetime}`);\n }\n this.maxRetention = maxLifetime;\n\n if (validatePolicy && serverPolicy?.limits?.max_lifetime) {\n // We're using room state so we need to validate this policy matches the server.\n /**\n if the value specified in the room's state complies with the limit, use this value for the effective retention policy of the room.\n if the value specified in the room's state is lower than the limit's min value, use the min value for the effective retention policy of the room.\n if the value specified in the room's state is greater than the limit's max value, use the max value for the effective retention policy of the room.\n */\n this.maxRetention = Math.max(this.maxRetention, serverPolicy.limits.max_lifetime.min ?? 0);\n this.maxRetention = Math.min(\n this.maxRetention,\n serverPolicy.limits.max_lifetime.max ?? Number.MAX_SAFE_INTEGER,\n );\n }\n\n this.processTimeline();\n };\n\n private readonly timelineUpdated = (): void => {\n this.logger.info(\"timelineUpdated\");\n this.scheduleTimelineCheck(200);\n };\n\n private readonly scheduleTimelineCheck = (nextTs: number): void => {\n if (this.retentionTimeout) {\n clearTimeout(this.retentionTimeout);\n }\n this.retentionTimeout = setTimeout(() => {\n this.processTimeline();\n this.retentionTimeout = undefined;\n }, nextTs);\n };\n\n private processTimeline(): void {\n if (!this.maxRetention) {\n return; // No policy, skip.\n }\n this.logger.info(`Running processTimeline`);\n const expireBefore = Date.now() - this.maxRetention;\n const events = this.room\n .getLiveTimeline()\n .getEvents()\n .filter((ev) => ev.getStateKey() === undefined && !ev.isRedacted() && ev.getType() !== \"m.room.redaction\");\n\n const expiredEvents = events.filter((ev) => ev.getTs() < expireBefore);\n const [earliestExpiringEvent] = events\n .filter((ev) => ev.getTs() >= expireBefore)\n .sort((a, b) => a.getTs() - b.getTs());\n\n if (earliestExpiringEvent) {\n const nextTs = earliestExpiringEvent.getTs() + this.maxRetention - Date.now();\n this.logger.info(`Next expiry scheduled for ${nextTs}`);\n this.scheduleTimelineCheck(nextTs);\n }\n\n if (expiredEvents.length === 0) {\n this.logger.info(\"Found no expired events\");\n return;\n }\n this.logger.info(`Found ${expiredEvents.length} expired events`);\n for (const event of expiredEvents) {\n this.room.tryApplyRedaction(\n new MatrixEvent({\n type: EventType.RoomRedaction,\n sender: event.getSender(),\n event_id: \"$synthetic_redaction\",\n room_id: this.room.roomId,\n redacts: event.getId(),\n content: {\n reason: \"Retention policy\",\n },\n origin_server_ts: Date.now(),\n unsigned: {},\n }),\n );\n }\n void this.store\n .removeEventsFromRoom(\n this.room.roomId,\n expiredEvents.map((e) => e.getId()!),\n )\n .catch((ex) => {\n this.logger.warn(`Failed to remove events from store`, ex);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}