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,7 +1,5 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
3
  /*
6
4
  Copyright 2025-2026 The Matrix.org Foundation C.I.C.
7
5
 
@@ -75,13 +73,13 @@ On Leave: ───────── STOP ALL ABOVE
75
73
  * Call membership should always remain sticky for this amount
76
74
  * of time.
77
75
  */
78
- var MEMBERSHIP_STICKY_DURATION_MS = 60 * 60 * 1000; // 60 minutes
76
+ const MEMBERSHIP_STICKY_DURATION_MS = 60 * 60 * 1000; // 60 minutes
79
77
 
80
78
  /**
81
79
  * The different types of actions the MembershipManager can take.
82
80
  * @internal
83
81
  */
84
- export var MembershipActionType = /*#__PURE__*/function (MembershipActionType) {
82
+ export let MembershipActionType = /*#__PURE__*/function (MembershipActionType) {
85
83
  MembershipActionType["SendDelayedEvent"] = "SendDelayedEvent";
86
84
  // -> MembershipActionType.SendJoinEvent if successful
87
85
  // -> DelayedLeaveActionType.SendDelayedEvent on error, retry sending the first delayed event.
@@ -110,7 +108,7 @@ export var MembershipActionType = /*#__PURE__*/function (MembershipActionType) {
110
108
  function createInsertActionUpdate(type, offset) {
111
109
  return {
112
110
  insert: [{
113
- ts: Date.now() + (offset !== null && offset !== void 0 ? offset : 0),
111
+ ts: Date.now() + (offset ?? 0),
114
112
  type
115
113
  }]
116
114
  };
@@ -118,7 +116,7 @@ function createInsertActionUpdate(type, offset) {
118
116
  function createReplaceActionUpdate(type, offset) {
119
117
  return {
120
118
  replace: [{
121
- ts: Date.now() + (offset !== null && offset !== void 0 ? offset : 0),
119
+ ts: Date.now() + (offset ?? 0),
122
120
  type
123
121
  }]
124
122
  };
@@ -171,7 +169,7 @@ export class MembershipManager extends TypedEventEmitter {
171
169
  this.state = MembershipManager.defaultState;
172
170
  this.scheduler.startWithJoin().catch(e => {
173
171
  this.logger.error("MembershipManager stopped because: ", e);
174
- onError === null || onError === void 0 || onError(e);
172
+ onError?.(e);
175
173
  }).finally(() => {
176
174
  // Should already be set to false when calling `leave` in non error cases.
177
175
  this.activated = false;
@@ -180,8 +178,7 @@ export class MembershipManager extends TypedEventEmitter {
180
178
  this.emit(MembershipManagerEvent.StatusChanged, this.oldStatus, this.status);
181
179
  }
182
180
  if (!this.scheduler.running) {
183
- var _this$leavePromiseRes;
184
- (_this$leavePromiseRes = this.leavePromiseResolvers) === null || _this$leavePromiseRes === void 0 || _this$leavePromiseRes.resolve(true);
181
+ this.leavePromiseResolvers?.resolve(true);
185
182
  this.leavePromiseResolvers = undefined;
186
183
  }
187
184
  });
@@ -205,10 +202,7 @@ export class MembershipManager extends TypedEventEmitter {
205
202
  this.leavePromiseResolvers = Promise.withResolvers();
206
203
  this.activated = false;
207
204
  this.scheduler.initiateLeave();
208
- if (timeout) setTimeout(() => {
209
- var _this$leavePromiseRes2;
210
- return (_this$leavePromiseRes2 = this.leavePromiseResolvers) === null || _this$leavePromiseRes2 === void 0 ? void 0 : _this$leavePromiseRes2.resolve(false);
211
- }, timeout);
205
+ if (timeout) setTimeout(() => this.leavePromiseResolvers?.resolve(false), timeout);
212
206
  }
213
207
  return this.leavePromiseResolvers.promise;
214
208
  }
@@ -220,7 +214,7 @@ export class MembershipManager extends TypedEventEmitter {
220
214
  if (!this._ownMembership) {
221
215
  // If one of these actions are scheduled or are getting inserted in the next iteration, we should already
222
216
  // take care of our missing membership.
223
- var sendingMembershipActions = [MembershipActionType.SendDelayedEvent, MembershipActionType.SendJoinEvent];
217
+ const sendingMembershipActions = [MembershipActionType.SendDelayedEvent, MembershipActionType.SendJoinEvent];
224
218
  this.logger.warn("Missing own membership: force re-join");
225
219
  this.state.hasMemberStateEvent = false;
226
220
  if (this.scheduler.actions.some(a => sendingMembershipActions.includes(a.type))) {
@@ -232,19 +226,16 @@ export class MembershipManager extends TypedEventEmitter {
232
226
  }
233
227
  return Promise.resolve();
234
228
  }
235
- updateCallIntent(callIntent) {
236
- var _this = this;
237
- return _asyncToGenerator(function* () {
238
- if (!_this.activated || !_this.ownMembership) {
239
- throw Error("You cannot update your intent before joining the call");
240
- }
241
- if (_this.ownMembership.callIntent === callIntent) {
242
- return; // No-op
243
- }
244
- _this.callIntent = callIntent;
245
- // Kick off a new membership event as a result.
246
- yield _this.sendJoinEvent();
247
- })();
229
+ async updateCallIntent(callIntent) {
230
+ if (!this.activated || !this.ownMembership) {
231
+ throw Error("You cannot update your intent before joining the call");
232
+ }
233
+ if (this.ownMembership.callIntent === callIntent) {
234
+ return; // No-op
235
+ }
236
+ this.callIntent = callIntent;
237
+ // Kick off a new membership event as a result.
238
+ await this.sendJoinEvent();
248
239
  }
249
240
 
250
241
  /**
@@ -255,10 +246,6 @@ export class MembershipManager extends TypedEventEmitter {
255
246
  */
256
247
  constructor(joinConfig, room, client, slotDescription, parentLogger) {
257
248
  super();
258
- this.joinConfig = joinConfig;
259
- this.room = room;
260
- this.client = client;
261
- this.slotDescription = slotDescription;
262
249
  _defineProperty(this, "activated", false);
263
250
  _defineProperty(this, "logger", void 0);
264
251
  _defineProperty(this, "callIntent", void 0);
@@ -285,10 +272,12 @@ export class MembershipManager extends TypedEventEmitter {
285
272
  _defineProperty(this, "clientSendMembership", myMembership => {
286
273
  return this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, myMembership, this.stateKey);
287
274
  });
288
- this.logger = (parentLogger !== null && parentLogger !== void 0 ? parentLogger : rootLogger).getChild("[MembershipManager]");
289
- var _ref = [this.client.getUserId(), this.client.getDeviceId()],
290
- userId = _ref[0],
291
- deviceId = _ref[1];
275
+ this.joinConfig = joinConfig;
276
+ this.room = room;
277
+ this.client = client;
278
+ this.slotDescription = slotDescription;
279
+ this.logger = (parentLogger ?? rootLogger).getChild(`[MembershipManager]`);
280
+ const [userId, deviceId] = [this.client.getUserId(), this.client.getDeviceId()];
292
281
  if (userId === null) throw Error("Missing userId in client");
293
282
  if (deviceId === null) throw Error("Missing deviceId in client");
294
283
  this.deviceId = deviceId;
@@ -297,19 +286,19 @@ export class MembershipManager extends TypedEventEmitter {
297
286
  // we keep it as a string for now for backwards compatibility.
298
287
  this.stateKey = this.makeMembershipStateKey(userId, deviceId);
299
288
  this.state = MembershipManager.defaultState;
300
- this.callIntent = joinConfig === null || joinConfig === void 0 ? void 0 : joinConfig.callIntent;
289
+ this.callIntent = joinConfig?.callIntent;
301
290
  this.scheduler = new ActionScheduler(type => {
302
291
  if (this.oldStatus) {
303
292
  // we put this at the beginning of the actions scheduler loop handle callback since it is a loop this
304
293
  // is equivalent to running it at the end of the loop. (just after applying the status/action list changes)
305
294
  // This order is required because this method needs to return the action updates.
306
- this.logger.debug("MembershipManager applied action changes. Status: ".concat(this.oldStatus, " -> ").concat(this.status));
295
+ this.logger.debug(`MembershipManager applied action changes. Status: ${this.oldStatus} -> ${this.status}`);
307
296
  if (this.oldStatus !== this.status) {
308
297
  this.emit(MembershipManagerEvent.StatusChanged, this.oldStatus, this.status);
309
298
  }
310
299
  }
311
300
  this.oldStatus = this.status;
312
- this.logger.debug("MembershipManager before processing action. status=".concat(this.oldStatus));
301
+ this.logger.debug(`MembershipManager before processing action. status=${this.oldStatus}`);
313
302
  return this.membershipLoopHandler(type);
314
303
  }, this.logger);
315
304
  }
@@ -328,187 +317,170 @@ export class MembershipManager extends TypedEventEmitter {
328
317
  };
329
318
  }
330
319
  get networkErrorRetryMs() {
331
- var _this$joinConfig$netw, _this$joinConfig;
332
- return (_this$joinConfig$netw = (_this$joinConfig = this.joinConfig) === null || _this$joinConfig === void 0 ? void 0 : _this$joinConfig.networkErrorRetryMs) !== null && _this$joinConfig$netw !== void 0 ? _this$joinConfig$netw : 3000;
320
+ return this.joinConfig?.networkErrorRetryMs ?? 3000;
333
321
  }
334
322
  get membershipEventExpiryMs() {
335
- var _this$joinConfig$memb, _this$joinConfig2;
336
- return (_this$joinConfig$memb = (_this$joinConfig2 = this.joinConfig) === null || _this$joinConfig2 === void 0 ? void 0 : _this$joinConfig2.membershipEventExpiryMs) !== null && _this$joinConfig$memb !== void 0 ? _this$joinConfig$memb : DEFAULT_EXPIRE_DURATION;
323
+ return this.joinConfig?.membershipEventExpiryMs ?? DEFAULT_EXPIRE_DURATION;
337
324
  }
338
325
  get membershipEventExpiryHeadroomMs() {
339
- var _this$joinConfig$memb2, _this$joinConfig3;
340
- return (_this$joinConfig$memb2 = (_this$joinConfig3 = this.joinConfig) === null || _this$joinConfig3 === void 0 ? void 0 : _this$joinConfig3.membershipEventExpiryHeadroomMs) !== null && _this$joinConfig$memb2 !== void 0 ? _this$joinConfig$memb2 : 5000;
326
+ return this.joinConfig?.membershipEventExpiryHeadroomMs ?? 5000;
341
327
  }
342
328
  computeNextExpiryActionTs(iteration) {
343
329
  return this.state.startTime + Math.min(this.membershipEventExpiryMs, MEMBERSHIP_STICKY_DURATION_MS) * iteration - this.membershipEventExpiryHeadroomMs;
344
330
  }
345
331
  get delayedLeaveEventDelayMs() {
346
- var _ref2, _this$delayedLeaveEve, _this$joinConfig4;
347
- return (_ref2 = (_this$delayedLeaveEve = this.delayedLeaveEventDelayMsOverride) !== null && _this$delayedLeaveEve !== void 0 ? _this$delayedLeaveEve : (_this$joinConfig4 = this.joinConfig) === null || _this$joinConfig4 === void 0 ? void 0 : _this$joinConfig4.delayedLeaveEventDelayMs) !== null && _ref2 !== void 0 ? _ref2 : 8000;
332
+ return this.delayedLeaveEventDelayMsOverride ?? this.joinConfig?.delayedLeaveEventDelayMs ?? 8000;
348
333
  }
349
334
  get delayedLeaveEventRestartMs() {
350
- var _this$joinConfig$dela, _this$joinConfig5;
351
- return (_this$joinConfig$dela = (_this$joinConfig5 = this.joinConfig) === null || _this$joinConfig5 === void 0 ? void 0 : _this$joinConfig5.delayedLeaveEventRestartMs) !== null && _this$joinConfig$dela !== void 0 ? _this$joinConfig$dela : 5000;
335
+ return this.joinConfig?.delayedLeaveEventRestartMs ?? 5000;
352
336
  }
353
337
  get maximumRateLimitRetryCount() {
354
- var _this$joinConfig$maxi, _this$joinConfig6;
355
- return (_this$joinConfig$maxi = (_this$joinConfig6 = this.joinConfig) === null || _this$joinConfig6 === void 0 ? void 0 : _this$joinConfig6.maximumRateLimitRetryCount) !== null && _this$joinConfig$maxi !== void 0 ? _this$joinConfig$maxi : 10;
338
+ return this.joinConfig?.maximumRateLimitRetryCount ?? 10;
356
339
  }
357
340
  get maximumNetworkErrorRetryCount() {
358
- var _this$joinConfig$maxi2, _this$joinConfig7;
359
- return (_this$joinConfig$maxi2 = (_this$joinConfig7 = this.joinConfig) === null || _this$joinConfig7 === void 0 ? void 0 : _this$joinConfig7.maximumNetworkErrorRetryCount) !== null && _this$joinConfig$maxi2 !== void 0 ? _this$joinConfig$maxi2 : 10;
341
+ return this.joinConfig?.maximumNetworkErrorRetryCount ?? 10;
360
342
  }
361
343
  get delayedLeaveEventRestartLocalTimeoutMs() {
362
- var _this$joinConfig$dela2, _this$joinConfig8;
363
- return (_this$joinConfig$dela2 = (_this$joinConfig8 = this.joinConfig) === null || _this$joinConfig8 === void 0 ? void 0 : _this$joinConfig8.delayedLeaveEventRestartLocalTimeoutMs) !== null && _this$joinConfig$dela2 !== void 0 ? _this$joinConfig$dela2 : 2000;
344
+ return this.joinConfig?.delayedLeaveEventRestartLocalTimeoutMs ?? 2000;
364
345
  }
365
346
 
366
347
  // LOOP HANDLER:
367
- membershipLoopHandler(type) {
368
- var _this2 = this;
369
- return _asyncToGenerator(function* () {
370
- switch (type) {
371
- case MembershipActionType.SendDelayedEvent:
372
- {
373
- // Before we start we check if we come from a state where we have a delay id.
374
- if (!_this2.state.delayId) {
375
- return _this2.sendOrResendDelayedLeaveEvent(); // Normal case without any previous delayed id.
376
- } else {
377
- // This can happen if someone else (or another client) removes our own membership event.
378
- // It will trigger `onRTCSessionMemberUpdate` queue `MembershipActionType.SendDelayedEvent`.
379
- // We might still have our delayed event from the previous participation and dependent on the server this might not
380
- // get removed automatically if the state changes. Hence, it would remove our membership unexpectedly shortly after the rejoin.
381
- //
382
- // In this block we will try to cancel this delayed event before setting up a new one.
383
-
384
- return _this2.cancelKnownDelayIdBeforeSendDelayedEvent(_this2.state.delayId);
385
- }
386
- }
387
- case MembershipActionType.RestartDelayedEvent:
388
- {
389
- if (!_this2.state.delayId) {
390
- // Delay id got reset. This action was used to check if the hs canceled the delayed event when the join state got sent.
391
- return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
392
- }
393
- return _this2.restartDelayedEvent(_this2.state.delayId);
394
- }
395
- case MembershipActionType.SendScheduledDelayedLeaveEvent:
396
- {
397
- // We are already good
398
- if (!_this2.state.hasMemberStateEvent) {
399
- return {
400
- replace: []
401
- };
402
- }
403
- if (_this2.state.delayId) {
404
- return _this2.sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent(_this2.state.delayId);
405
- } else {
406
- return createInsertActionUpdate(MembershipActionType.SendLeaveEvent);
407
- }
348
+ async membershipLoopHandler(type) {
349
+ switch (type) {
350
+ case MembershipActionType.SendDelayedEvent:
351
+ {
352
+ // Before we start we check if we come from a state where we have a delay id.
353
+ if (!this.state.delayId) {
354
+ return this.sendOrResendDelayedLeaveEvent(); // Normal case without any previous delayed id.
355
+ } else {
356
+ // This can happen if someone else (or another client) removes our own membership event.
357
+ // It will trigger `onRTCSessionMemberUpdate` queue `MembershipActionType.SendDelayedEvent`.
358
+ // We might still have our delayed event from the previous participation and dependent on the server this might not
359
+ // get removed automatically if the state changes. Hence, it would remove our membership unexpectedly shortly after the rejoin.
360
+ //
361
+ // In this block we will try to cancel this delayed event before setting up a new one.
362
+
363
+ return this.cancelKnownDelayIdBeforeSendDelayedEvent(this.state.delayId);
408
364
  }
409
- case MembershipActionType.SendJoinEvent:
410
- {
411
- return _this2.sendJoinEvent();
365
+ }
366
+ case MembershipActionType.RestartDelayedEvent:
367
+ {
368
+ if (!this.state.delayId) {
369
+ // Delay id got reset. This action was used to check if the hs canceled the delayed event when the join state got sent.
370
+ return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
412
371
  }
413
- case MembershipActionType.UpdateExpiry:
414
- {
415
- return _this2.updateExpiryOnJoinedEvent();
372
+ return this.restartDelayedEvent(this.state.delayId);
373
+ }
374
+ case MembershipActionType.SendScheduledDelayedLeaveEvent:
375
+ {
376
+ // We are already good
377
+ if (!this.state.hasMemberStateEvent) {
378
+ return {
379
+ replace: []
380
+ };
416
381
  }
417
- case MembershipActionType.SendLeaveEvent:
418
- {
419
- // We are good already
420
- if (!_this2.state.hasMemberStateEvent) {
421
- return {
422
- replace: []
423
- };
424
- }
425
- // This is only a fallback in case we do not have working delayed events support.
426
- // first we should try to just send the scheduled leave event
427
- return _this2.sendFallbackLeaveEvent();
382
+ if (this.state.delayId) {
383
+ return this.sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent(this.state.delayId);
384
+ } else {
385
+ return createInsertActionUpdate(MembershipActionType.SendLeaveEvent);
428
386
  }
429
- }
430
- })();
431
- }
432
- // HANDLERS (used in the membershipLoopHandler)
433
- sendOrResendDelayedLeaveEvent() {
434
- var _this3 = this;
435
- return _asyncToGenerator(function* () {
436
- // We can reach this at the start of a call (where we do not yet have a membership: state.hasMemberStateEvent=false)
437
- // or during a call if the state event canceled our delayed event or caused by an unexpected error that removed our delayed event.
438
- // (Another client could have canceled it, the homeserver might have removed/lost it due to a restart, ...)
439
- // In the `then` and `catch` block we treat both cases differently. "if (this.state.hasMemberStateEvent) {} else {}"
440
- return yield _this3.clientSendDelayedDisconnectMembership().then(response => {
441
- _this3.state.expectedServerDelayLeaveTs = Date.now() + _this3.delayedLeaveEventDelayMs;
442
- _this3.setAndEmitProbablyLeft(false);
443
- // On success we reset retries and set delayId.
444
- _this3.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
445
- _this3.setAndEmitDelayId(response.delay_id);
446
- if (_this3.state.hasMemberStateEvent) {
447
- // This action was scheduled because the previous delayed event was cancelled
448
- // due to lack of https://github.com/element-hq/synapse/pull/17810
449
- return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, _this3.delayedLeaveEventRestartMs);
450
- } else {
451
- // This action was scheduled because we are in the process of joining
452
- return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
453
387
  }
454
- }).catch(e => {
455
- var repeatActionType = MembershipActionType.SendDelayedEvent;
456
- if (_this3.manageMaxDelayExceededSituation(e)) {
457
- return createInsertActionUpdate(repeatActionType);
388
+ case MembershipActionType.SendJoinEvent:
389
+ {
390
+ return this.sendJoinEvent();
458
391
  }
459
- var update = _this3.actionUpdateFromErrors(e, repeatActionType, "_unstable_sendDelayedStateEvent");
460
- if (update) return update;
461
- if (_this3.state.hasMemberStateEvent) {
462
- // This action was scheduled because the previous delayed event was cancelled
463
- // due to lack of https://github.com/element-hq/synapse/pull/17810
464
-
465
- // Don't do any other delayed event work if its not supported.
466
- if (_this3.isUnsupportedDelayedEndpoint(e)) return {};
467
- throw Error("Could not send delayed event, even though delayed events are supported. " + e);
468
- } else {
469
- // This action was scheduled because we are in the process of joining
470
- // log and fall through
471
- if (_this3.isUnsupportedDelayedEndpoint(e)) {
472
- _this3.logger.info("Not using delayed event because the endpoint is not supported");
473
- } else {
474
- _this3.logger.info("Not using delayed event because: " + e);
475
- }
476
- // On any other error we fall back to not using delayed events and send the join state event immediately
477
- return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
392
+ case MembershipActionType.UpdateExpiry:
393
+ {
394
+ return this.updateExpiryOnJoinedEvent();
478
395
  }
479
- });
480
- })();
481
- }
482
- cancelKnownDelayIdBeforeSendDelayedEvent(delayId) {
483
- var _this4 = this;
484
- return _asyncToGenerator(function* () {
485
- // Remove all running updates and restarts
486
- return yield _this4.client._unstable_cancelScheduledDelayedEvent(delayId).then(() => {
487
- _this4.setAndEmitDelayId(undefined);
488
- _this4.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
489
- return createReplaceActionUpdate(MembershipActionType.SendDelayedEvent);
490
- }).catch(e => {
491
- var repeatActionType = MembershipActionType.SendDelayedEvent;
492
- var update = _this4.actionUpdateFromErrors(e, repeatActionType, "cancelScheduledDelayedEvent");
493
- if (update) return update;
494
- if (_this4.isNotFoundError(e)) {
495
- // If we get a M_NOT_FOUND we know that the delayed event got already removed.
496
- // This means we are good and can set it to undefined and run this again.
497
- _this4.setAndEmitDelayId(undefined);
498
- return createReplaceActionUpdate(repeatActionType);
396
+ case MembershipActionType.SendLeaveEvent:
397
+ {
398
+ // We are good already
399
+ if (!this.state.hasMemberStateEvent) {
400
+ return {
401
+ replace: []
402
+ };
403
+ }
404
+ // This is only a fallback in case we do not have working delayed events support.
405
+ // first we should try to just send the scheduled leave event
406
+ return this.sendFallbackLeaveEvent();
499
407
  }
500
- if (_this4.isUnsupportedDelayedEndpoint(e)) {
501
- return createReplaceActionUpdate(MembershipActionType.SendJoinEvent);
408
+ }
409
+ }
410
+ // HANDLERS (used in the membershipLoopHandler)
411
+ async sendOrResendDelayedLeaveEvent() {
412
+ // We can reach this at the start of a call (where we do not yet have a membership: state.hasMemberStateEvent=false)
413
+ // or during a call if the state event canceled our delayed event or caused by an unexpected error that removed our delayed event.
414
+ // (Another client could have canceled it, the homeserver might have removed/lost it due to a restart, ...)
415
+ // In the `then` and `catch` block we treat both cases differently. "if (this.state.hasMemberStateEvent) {} else {}"
416
+ return await this.clientSendDelayedDisconnectMembership().then(response => {
417
+ this.state.expectedServerDelayLeaveTs = Date.now() + this.delayedLeaveEventDelayMs;
418
+ this.setAndEmitProbablyLeft(false);
419
+ // On success we reset retries and set delayId.
420
+ this.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
421
+ this.setAndEmitDelayId(response.delay_id);
422
+ if (this.state.hasMemberStateEvent) {
423
+ // This action was scheduled because the previous delayed event was cancelled
424
+ // due to lack of https://github.com/element-hq/synapse/pull/17810
425
+ return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, this.delayedLeaveEventRestartMs);
426
+ } else {
427
+ // This action was scheduled because we are in the process of joining
428
+ return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
429
+ }
430
+ }).catch(e => {
431
+ const repeatActionType = MembershipActionType.SendDelayedEvent;
432
+ if (this.manageMaxDelayExceededSituation(e)) {
433
+ return createInsertActionUpdate(repeatActionType);
434
+ }
435
+ const update = this.actionUpdateFromErrors(e, repeatActionType, "_unstable_sendDelayedStateEvent");
436
+ if (update) return update;
437
+ if (this.state.hasMemberStateEvent) {
438
+ // This action was scheduled because the previous delayed event was cancelled
439
+ // due to lack of https://github.com/element-hq/synapse/pull/17810
440
+
441
+ // Don't do any other delayed event work if its not supported.
442
+ if (this.isUnsupportedDelayedEndpoint(e)) return {};
443
+ throw Error("Could not send delayed event, even though delayed events are supported. " + e);
444
+ } else {
445
+ // This action was scheduled because we are in the process of joining
446
+ // log and fall through
447
+ if (this.isUnsupportedDelayedEndpoint(e)) {
448
+ this.logger.info("Not using delayed event because the endpoint is not supported");
449
+ } else {
450
+ this.logger.info("Not using delayed event because: " + e);
502
451
  }
503
- // We do not just ignore and log this error since we would also need to reset the delayId.
452
+ // On any other error we fall back to not using delayed events and send the join state event immediately
453
+ return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
454
+ }
455
+ });
456
+ }
457
+ async cancelKnownDelayIdBeforeSendDelayedEvent(delayId) {
458
+ // Remove all running updates and restarts
459
+ return await this.client._unstable_cancelScheduledDelayedEvent(delayId).then(() => {
460
+ this.setAndEmitDelayId(undefined);
461
+ this.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
462
+ return createReplaceActionUpdate(MembershipActionType.SendDelayedEvent);
463
+ }).catch(e => {
464
+ const repeatActionType = MembershipActionType.SendDelayedEvent;
465
+ const update = this.actionUpdateFromErrors(e, repeatActionType, "cancelScheduledDelayedEvent");
466
+ if (update) return update;
467
+ if (this.isNotFoundError(e)) {
468
+ // If we get a M_NOT_FOUND we know that the delayed event got already removed.
469
+ // This means we are good and can set it to undefined and run this again.
470
+ this.setAndEmitDelayId(undefined);
471
+ return createReplaceActionUpdate(repeatActionType);
472
+ }
473
+ if (this.isUnsupportedDelayedEndpoint(e)) {
474
+ return createReplaceActionUpdate(MembershipActionType.SendJoinEvent);
475
+ }
476
+ // We do not just ignore and log this error since we would also need to reset the delayId.
504
477
 
505
- // This becomes an unrecoverable error case since something is significantly off if we don't hit any of the above cases
506
- // when state.delayId !== undefined
507
- // We do not just ignore and log this error since we would also need to reset the delayId.
508
- // It is cleaner if we, the frontend, rejoins instead of resetting the delayId here and behaving like in the success case.
509
- throw Error("We failed to cancel a delayed event where we already had a delay id with an error we cannot automatically handle");
510
- });
511
- })();
478
+ // This becomes an unrecoverable error case since something is significantly off if we don't hit any of the above cases
479
+ // when state.delayId !== undefined
480
+ // We do not just ignore and log this error since we would also need to reset the delayId.
481
+ // It is cleaner if we, the frontend, rejoins instead of resetting the delayId here and behaving like in the success case.
482
+ throw Error("We failed to cancel a delayed event where we already had a delay id with an error we cannot automatically handle");
483
+ });
512
484
  }
513
485
  setAndEmitProbablyLeft(probablyLeft) {
514
486
  if (this.state.probablyLeft === probablyLeft) {
@@ -522,155 +494,140 @@ export class MembershipManager extends TypedEventEmitter {
522
494
  this.state.delayId = delayId;
523
495
  this.emit(MembershipManagerEvent.DelayIdChanged, this.state.delayId);
524
496
  }
525
- restartDelayedEvent(delayId) {
526
- var _this5 = this;
527
- return _asyncToGenerator(function* () {
528
- // Compute the duration until we expect the server to send the delayed leave event.
529
- var durationUntilServerDelayedLeave = _this5.state.expectedServerDelayLeaveTs ? _this5.state.expectedServerDelayLeaveTs - Date.now() : undefined;
530
- var abortPromise = new Promise((_, reject) => {
531
- setTimeout(() => {
532
- reject(new AbortError("Restart delayed event timed out before the HS responded"));
533
- },
534
- // We abort immediately at the time where we expect the server to send the delayed leave event.
535
- // At this point we want the catch block to run and set the `probablyLeft` state.
536
- //
537
- // While we are already in probablyLeft state, we use the unaltered delayedLeaveEventRestartLocalTimeoutMs.
538
- durationUntilServerDelayedLeave !== undefined && !_this5.state.probablyLeft ? Math.min(_this5.delayedLeaveEventRestartLocalTimeoutMs, durationUntilServerDelayedLeave) : _this5.delayedLeaveEventRestartLocalTimeoutMs);
539
- });
540
-
541
- // The obvious choice here would be to use the `IRequestOpts` to set the timeout. Since this call might be forwarded
542
- // to the widget driver this information would get lost. That is why we mimic the AbortError using the race.
543
- return yield Promise.race([_this5.client._unstable_restartScheduledDelayedEvent(delayId), abortPromise]).then(() => {
544
- // Whenever we successfully restart the delayed event we update the `state.expectedServerDelayLeaveTs`
545
- // which stores the predicted timestamp at which the server will send the delayed leave event if there wont be any further
546
- // successful restart requests.
547
- _this5.state.expectedServerDelayLeaveTs = Date.now() + _this5.delayedLeaveEventDelayMs;
548
- _this5.resetRateLimitCounter(MembershipActionType.RestartDelayedEvent);
549
- _this5.setAndEmitProbablyLeft(false);
550
- return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, _this5.delayedLeaveEventRestartMs);
551
- }).catch(e => {
552
- if (_this5.state.expectedServerDelayLeaveTs && _this5.state.expectedServerDelayLeaveTs <= Date.now()) {
553
- // Once we reach this point it's likely that the server is sending the delayed leave event so we emit `probablyLeft = true`.
554
- // It will emit `probablyLeft = false` once we notice about our leave through sync and successfully setup a new state event.
555
- _this5.setAndEmitProbablyLeft(true);
556
- }
557
- var repeatActionType = MembershipActionType.RestartDelayedEvent;
558
- if (_this5.isNotFoundError(e)) {
559
- _this5.setAndEmitDelayId(undefined);
560
- return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
561
- }
562
- // If the HS does not support delayed events we wont reschedule.
563
- if (_this5.isUnsupportedDelayedEndpoint(e)) return {};
564
-
565
- // TODO this also needs a test: get rate limit while checking id delayed event is scheduled
566
- var update = _this5.actionUpdateFromErrors(e, repeatActionType, "restartScheduledDelayedEvent");
567
- if (update) return update;
568
-
569
- // In other error cases we have no idea what is happening
570
- throw Error("Could not restart delayed event, even though delayed events are supported. " + e);
571
- });
572
- })();
573
- }
574
- sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent(delayId) {
575
- var _this6 = this;
576
- return _asyncToGenerator(function* () {
577
- return yield _this6.client._unstable_sendScheduledDelayedEvent(delayId).then(() => {
578
- _this6.state.hasMemberStateEvent = false;
579
- _this6.setAndEmitDelayId(undefined);
580
- _this6.resetRateLimitCounter(MembershipActionType.SendScheduledDelayedLeaveEvent);
581
- return {
582
- replace: []
583
- };
584
- }).catch(e => {
585
- var repeatActionType = MembershipActionType.SendLeaveEvent;
586
- if (_this6.isUnsupportedDelayedEndpoint(e)) return {};
587
- if (_this6.isNotFoundError(e)) {
588
- _this6.setAndEmitDelayId(undefined);
589
- return createInsertActionUpdate(repeatActionType);
590
- }
591
- var update = _this6.actionUpdateFromErrors(e, repeatActionType, "sendScheduledDelayedEvent");
592
- if (update) return update;
497
+ async restartDelayedEvent(delayId) {
498
+ // Compute the duration until we expect the server to send the delayed leave event.
499
+ const durationUntilServerDelayedLeave = this.state.expectedServerDelayLeaveTs ? this.state.expectedServerDelayLeaveTs - Date.now() : undefined;
500
+ const abortPromise = new Promise((_, reject) => {
501
+ setTimeout(() => {
502
+ reject(new AbortError("Restart delayed event timed out before the HS responded"));
503
+ },
504
+ // We abort immediately at the time where we expect the server to send the delayed leave event.
505
+ // At this point we want the catch block to run and set the `probablyLeft` state.
506
+ //
507
+ // While we are already in probablyLeft state, we use the unaltered delayedLeaveEventRestartLocalTimeoutMs.
508
+ durationUntilServerDelayedLeave !== undefined && !this.state.probablyLeft ? Math.min(this.delayedLeaveEventRestartLocalTimeoutMs, durationUntilServerDelayedLeave) : this.delayedLeaveEventRestartLocalTimeoutMs);
509
+ });
510
+
511
+ // The obvious choice here would be to use the `IRequestOpts` to set the timeout. Since this call might be forwarded
512
+ // to the widget driver this information would get lost. That is why we mimic the AbortError using the race.
513
+ return await Promise.race([this.client._unstable_restartScheduledDelayedEvent(delayId), abortPromise]).then(() => {
514
+ // Whenever we successfully restart the delayed event we update the `state.expectedServerDelayLeaveTs`
515
+ // which stores the predicted timestamp at which the server will send the delayed leave event if there wont be any further
516
+ // successful restart requests.
517
+ this.state.expectedServerDelayLeaveTs = Date.now() + this.delayedLeaveEventDelayMs;
518
+ this.resetRateLimitCounter(MembershipActionType.RestartDelayedEvent);
519
+ this.setAndEmitProbablyLeft(false);
520
+ return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, this.delayedLeaveEventRestartMs);
521
+ }).catch(e => {
522
+ if (this.state.expectedServerDelayLeaveTs && this.state.expectedServerDelayLeaveTs <= Date.now()) {
523
+ // Once we reach this point it's likely that the server is sending the delayed leave event so we emit `probablyLeft = true`.
524
+ // It will emit `probablyLeft = false` once we notice about our leave through sync and successfully setup a new state event.
525
+ this.setAndEmitProbablyLeft(true);
526
+ }
527
+ const repeatActionType = MembershipActionType.RestartDelayedEvent;
528
+ if (this.isNotFoundError(e)) {
529
+ this.setAndEmitDelayId(undefined);
530
+ return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
531
+ }
532
+ // If the HS does not support delayed events we wont reschedule.
533
+ if (this.isUnsupportedDelayedEndpoint(e)) return {};
593
534
 
594
- // On any other error we fall back to SendLeaveEvent (this includes hard errors from rate limiting)
595
- _this6.logger.warn("Encountered unexpected error during SendScheduledDelayedLeaveEvent. Falling back to SendLeaveEvent", e);
535
+ // TODO this also needs a test: get rate limit while checking id delayed event is scheduled
536
+ const update = this.actionUpdateFromErrors(e, repeatActionType, "restartScheduledDelayedEvent");
537
+ if (update) return update;
538
+
539
+ // In other error cases we have no idea what is happening
540
+ throw Error("Could not restart delayed event, even though delayed events are supported. " + e);
541
+ });
542
+ }
543
+ async sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent(delayId) {
544
+ return await this.client._unstable_sendScheduledDelayedEvent(delayId).then(() => {
545
+ this.state.hasMemberStateEvent = false;
546
+ this.setAndEmitDelayId(undefined);
547
+ this.resetRateLimitCounter(MembershipActionType.SendScheduledDelayedLeaveEvent);
548
+ return {
549
+ replace: []
550
+ };
551
+ }).catch(e => {
552
+ const repeatActionType = MembershipActionType.SendLeaveEvent;
553
+ if (this.isUnsupportedDelayedEndpoint(e)) return {};
554
+ if (this.isNotFoundError(e)) {
555
+ this.setAndEmitDelayId(undefined);
596
556
  return createInsertActionUpdate(repeatActionType);
597
- });
598
- })();
599
- }
600
- sendJoinEvent() {
601
- var _this7 = this;
602
- return _asyncToGenerator(function* () {
603
- return yield _this7.clientSendMembership(_this7.makeMyMembership(_this7.membershipEventExpiryMs)).then(() => {
604
- _this7.setAndEmitProbablyLeft(false);
605
- _this7.state.startTime = Date.now();
606
- // The next update should already use twice the membershipEventExpiryTimeout
607
- _this7.state.expireUpdateIterations = 1;
608
- _this7.state.hasMemberStateEvent = true;
609
- _this7.resetRateLimitCounter(MembershipActionType.SendJoinEvent);
610
- // An UpdateExpiry action might be left over from a previous join event.
611
- // We can reach sendJoinEvent when the delayed leave event gets send by the HS.
612
- // The branch where we might have a leftover UpdateExpiry action is:
613
- // RestartDelayedEvent (cannot find it, server removed it)
614
- // -> SendDelayedEvent (send new delayed event)
615
- // -> SendJoinEvent (here with a still scheduled UpdateExpiry action)
616
- var actionsWithoutUpdateExpiry = _this7.scheduler.actions.filter(a => a.type !== MembershipActionType.UpdateExpiry &&
617
- // A new UpdateExpiry action with an updated will be scheduled,
618
- a.type !== MembershipActionType.SendJoinEvent // Manually remove the SendJoinEvent action,
619
- );
620
- return {
621
- replace: [...actionsWithoutUpdateExpiry,
622
- // To check if the delayed event is still there or got removed by inserting the stateEvent, we need to restart it.
623
- {
624
- ts: Date.now(),
625
- type: MembershipActionType.RestartDelayedEvent
626
- }, {
627
- ts: _this7.computeNextExpiryActionTs(_this7.state.expireUpdateIterations),
628
- type: MembershipActionType.UpdateExpiry
629
- }]
630
- };
631
- }).catch(e => {
632
- var update = _this7.actionUpdateFromErrors(e, MembershipActionType.SendJoinEvent, "sendStateEvent");
633
- if (update) return update;
634
- throw e;
635
- });
636
- })();
637
- }
638
- updateExpiryOnJoinedEvent() {
639
- var _this8 = this;
640
- return _asyncToGenerator(function* () {
641
- var nextExpireUpdateIteration = _this8.state.expireUpdateIterations + 1;
642
- return yield _this8.clientSendMembership(_this8.makeMyMembership(_this8.membershipEventExpiryMs * nextExpireUpdateIteration)).then(() => {
643
- // Success, we reset retries and schedule update.
644
- _this8.resetRateLimitCounter(MembershipActionType.UpdateExpiry);
645
- _this8.state.expireUpdateIterations = nextExpireUpdateIteration;
646
- return {
647
- insert: [{
648
- ts: _this8.computeNextExpiryActionTs(nextExpireUpdateIteration),
649
- type: MembershipActionType.UpdateExpiry
650
- }]
651
- };
652
- }).catch(e => {
653
- var update = _this8.actionUpdateFromErrors(e, MembershipActionType.UpdateExpiry, "sendStateEvent");
654
- if (update) return update;
655
- throw e;
656
- });
657
- })();
658
- }
659
- sendFallbackLeaveEvent() {
660
- var _this9 = this;
661
- return _asyncToGenerator(function* () {
662
- return yield _this9.clientSendMembership({}).then(() => {
663
- _this9.resetRateLimitCounter(MembershipActionType.SendLeaveEvent);
664
- _this9.state.hasMemberStateEvent = false;
665
- return {
666
- replace: []
667
- };
668
- }).catch(e => {
669
- var update = _this9.actionUpdateFromErrors(e, MembershipActionType.SendLeaveEvent, "sendStateEvent");
670
- if (update) return update;
671
- throw e;
672
- });
673
- })();
557
+ }
558
+ const update = this.actionUpdateFromErrors(e, repeatActionType, "sendScheduledDelayedEvent");
559
+ if (update) return update;
560
+
561
+ // On any other error we fall back to SendLeaveEvent (this includes hard errors from rate limiting)
562
+ this.logger.warn("Encountered unexpected error during SendScheduledDelayedLeaveEvent. Falling back to SendLeaveEvent", e);
563
+ return createInsertActionUpdate(repeatActionType);
564
+ });
565
+ }
566
+ async sendJoinEvent() {
567
+ return await this.clientSendMembership(this.makeMyMembership(this.membershipEventExpiryMs)).then(() => {
568
+ this.setAndEmitProbablyLeft(false);
569
+ this.state.startTime = Date.now();
570
+ // The next update should already use twice the membershipEventExpiryTimeout
571
+ this.state.expireUpdateIterations = 1;
572
+ this.state.hasMemberStateEvent = true;
573
+ this.resetRateLimitCounter(MembershipActionType.SendJoinEvent);
574
+ // An UpdateExpiry action might be left over from a previous join event.
575
+ // We can reach sendJoinEvent when the delayed leave event gets send by the HS.
576
+ // The branch where we might have a leftover UpdateExpiry action is:
577
+ // RestartDelayedEvent (cannot find it, server removed it)
578
+ // -> SendDelayedEvent (send new delayed event)
579
+ // -> SendJoinEvent (here with a still scheduled UpdateExpiry action)
580
+ const actionsWithoutUpdateExpiry = this.scheduler.actions.filter(a => a.type !== MembershipActionType.UpdateExpiry &&
581
+ // A new UpdateExpiry action with an updated will be scheduled,
582
+ a.type !== MembershipActionType.SendJoinEvent // Manually remove the SendJoinEvent action,
583
+ );
584
+ return {
585
+ replace: [...actionsWithoutUpdateExpiry,
586
+ // To check if the delayed event is still there or got removed by inserting the stateEvent, we need to restart it.
587
+ {
588
+ ts: Date.now(),
589
+ type: MembershipActionType.RestartDelayedEvent
590
+ }, {
591
+ ts: this.computeNextExpiryActionTs(this.state.expireUpdateIterations),
592
+ type: MembershipActionType.UpdateExpiry
593
+ }]
594
+ };
595
+ }).catch(e => {
596
+ const update = this.actionUpdateFromErrors(e, MembershipActionType.SendJoinEvent, "sendStateEvent");
597
+ if (update) return update;
598
+ throw e;
599
+ });
600
+ }
601
+ async updateExpiryOnJoinedEvent() {
602
+ const nextExpireUpdateIteration = this.state.expireUpdateIterations + 1;
603
+ return await this.clientSendMembership(this.makeMyMembership(this.membershipEventExpiryMs * nextExpireUpdateIteration)).then(() => {
604
+ // Success, we reset retries and schedule update.
605
+ this.resetRateLimitCounter(MembershipActionType.UpdateExpiry);
606
+ this.state.expireUpdateIterations = nextExpireUpdateIteration;
607
+ return {
608
+ insert: [{
609
+ ts: this.computeNextExpiryActionTs(nextExpireUpdateIteration),
610
+ type: MembershipActionType.UpdateExpiry
611
+ }]
612
+ };
613
+ }).catch(e => {
614
+ const update = this.actionUpdateFromErrors(e, MembershipActionType.UpdateExpiry, "sendStateEvent");
615
+ if (update) return update;
616
+ throw e;
617
+ });
618
+ }
619
+ async sendFallbackLeaveEvent() {
620
+ return await this.clientSendMembership({}).then(() => {
621
+ this.resetRateLimitCounter(MembershipActionType.SendLeaveEvent);
622
+ this.state.hasMemberStateEvent = false;
623
+ return {
624
+ replace: []
625
+ };
626
+ }).catch(e => {
627
+ const update = this.actionUpdateFromErrors(e, MembershipActionType.SendLeaveEvent, "sendStateEvent");
628
+ if (update) return update;
629
+ throw e;
630
+ });
674
631
  }
675
632
 
676
633
  // HELPERS
@@ -681,14 +638,14 @@ export class MembershipManager extends TypedEventEmitter {
681
638
  makeMembershipStateKey(localUserId, localDeviceId) {
682
639
  // INFO_SLOT_ID_LEGACY_CASE (search for all occurances of this INFO to get the full picture)
683
640
  // Revert back to "" just for the state key (state keys are always legacy. we use sticky events for non legacy events)
684
- var application = this.slotDescription.application;
685
- var needsEmptyStringRoomFix = application === "m.call" && this.slotDescription.id === "ROOM";
686
- var slotId = needsEmptyStringRoomFix ? "" : this.slotDescription.id;
687
- var stateKey = "".concat(localUserId, "_").concat(localDeviceId, "_").concat(application).concat(slotId);
641
+ const application = this.slotDescription.application;
642
+ const needsEmptyStringRoomFix = application === "m.call" && this.slotDescription.id === "ROOM";
643
+ const slotId = needsEmptyStringRoomFix ? "" : this.slotDescription.id;
644
+ const stateKey = `${localUserId}_${localDeviceId}_${application}${slotId}`;
688
645
  if (/^org\.matrix\.msc(3757|3779)\b/.exec(this.room.getVersion())) {
689
646
  return stateKey;
690
647
  } else {
691
- return "_".concat(stateKey);
648
+ return `_${stateKey}`;
692
649
  }
693
650
  }
694
651
 
@@ -697,21 +654,20 @@ export class MembershipManager extends TypedEventEmitter {
697
654
  * @returns Only returns `SessionMembershipData`
698
655
  */
699
656
  makeMyMembership(expires) {
700
- var _this$fociPreferred, _this$fociPreferred2;
701
- var ownMembership = this.ownMembership;
702
- var needsEmptyStringRoomFix = this.slotDescription.application === "m.call" && this.slotDescription.id === "ROOM";
703
- var focusObjects = this.rtcTransport === undefined ? {
657
+ const ownMembership = this.ownMembership;
658
+ const needsEmptyStringRoomFix = this.slotDescription.application === "m.call" && this.slotDescription.id === "ROOM";
659
+ const focusObjects = this.rtcTransport === undefined ? {
704
660
  focus_active: {
705
661
  type: "livekit",
706
662
  focus_selection: "oldest_membership"
707
663
  },
708
- foci_preferred: (_this$fociPreferred = this.fociPreferred) !== null && _this$fociPreferred !== void 0 ? _this$fociPreferred : []
664
+ foci_preferred: this.fociPreferred ?? []
709
665
  } : {
710
666
  focus_active: {
711
667
  type: "livekit",
712
668
  focus_selection: "multi_sfu"
713
669
  },
714
- foci_preferred: [this.rtcTransport, ...((_this$fociPreferred2 = this.fociPreferred) !== null && _this$fociPreferred2 !== void 0 ? _this$fociPreferred2 : [])]
670
+ foci_preferred: [this.rtcTransport, ...(this.fociPreferred ?? [])]
715
671
  };
716
672
  return _objectSpread(_objectSpread({
717
673
  "application": this.slotDescription.application,
@@ -723,7 +679,7 @@ export class MembershipManager extends TypedEventEmitter {
723
679
  // DO NOT use this.memberId here since that is the state key (using application...)
724
680
  // But for session events we use the colon seperated userId and deviceId. The SFU will automatically
725
681
  // assign those values to the media participant for those versions.
726
- "membershipID": "".concat(this.userId, ":").concat(this.deviceId),
682
+ "membershipID": `${this.userId}:${this.deviceId}`,
727
683
  expires,
728
684
  "m.call.intent": this.callIntent
729
685
  }, focusObjects), ownMembership !== undefined ? {
@@ -749,7 +705,7 @@ export class MembershipManager extends TypedEventEmitter {
749
705
  */
750
706
  manageMaxDelayExceededSituation(error) {
751
707
  if (error instanceof MatrixError && error.errcode === "M_UNKNOWN" && error.data["org.matrix.msc4140.errcode"] === "M_MAX_DELAY_EXCEEDED") {
752
- var maxDelayAllowed = error.data["org.matrix.msc4140.max_delay"];
708
+ const maxDelayAllowed = error.data["org.matrix.msc4140.max_delay"];
753
709
  if (typeof maxDelayAllowed === "number" && this.delayedLeaveEventDelayMs > maxDelayAllowed) {
754
710
  this.delayedLeaveEventDelayMsOverride = maxDelayAllowed;
755
711
  }
@@ -759,9 +715,9 @@ export class MembershipManager extends TypedEventEmitter {
759
715
  return false;
760
716
  }
761
717
  actionUpdateFromErrors(error, type, method) {
762
- var updateLimit = this.actionUpdateFromRateLimitError(error, method, type);
718
+ const updateLimit = this.actionUpdateFromRateLimitError(error, method, type);
763
719
  if (updateLimit) return updateLimit;
764
- var updateNetwork = this.actionUpdateFromNetworkErrorRetry(error, type);
720
+ const updateNetwork = this.actionUpdateFromNetworkErrorRetry(error, type);
765
721
  if (updateNetwork) return updateNetwork;
766
722
  }
767
723
  /**
@@ -774,23 +730,21 @@ export class MembershipManager extends TypedEventEmitter {
774
730
  * Returns false if it is not a network error.
775
731
  */
776
732
  actionUpdateFromRateLimitError(error, method, type) {
777
- var _this$state$rateLimit;
778
733
  // "Is rate limit"-boundary
779
734
  if (!((error instanceof HTTPError || error instanceof MatrixError) && error.isRateLimitError())) {
780
735
  return undefined;
781
736
  }
782
737
 
783
738
  // retry boundary
784
- var rateLimitRetries = (_this$state$rateLimit = this.state.rateLimitRetries.get(type)) !== null && _this$state$rateLimit !== void 0 ? _this$state$rateLimit : 0;
739
+ const rateLimitRetries = this.state.rateLimitRetries.get(type) ?? 0;
785
740
  if (rateLimitRetries < this.maximumRateLimitRetryCount) {
786
- var resendDelay;
787
- var defaultMs = 5000;
741
+ let resendDelay;
742
+ const defaultMs = 5000;
788
743
  try {
789
- var _error$getRetryAfterM;
790
- resendDelay = (_error$getRetryAfterM = error.getRetryAfterMs()) !== null && _error$getRetryAfterM !== void 0 ? _error$getRetryAfterM : defaultMs;
791
- this.logger.info("Rate limited by server, retrying in ".concat(resendDelay, "ms"));
744
+ resendDelay = error.getRetryAfterMs() ?? defaultMs;
745
+ this.logger.info(`Rate limited by server, retrying in ${resendDelay}ms`);
792
746
  } catch (e) {
793
- this.logger.warn("Error while retrieving a rate-limit retry delay, retrying after default delay of ".concat(defaultMs), e);
747
+ this.logger.warn(`Error while retrieving a rate-limit retry delay, retrying after default delay of ${defaultMs}`, e);
794
748
  resendDelay = defaultMs;
795
749
  }
796
750
  this.state.rateLimitRetries.set(type, rateLimitRetries + 1);
@@ -811,16 +765,15 @@ export class MembershipManager extends TypedEventEmitter {
811
765
  * Returns false if it is not a network error.
812
766
  */
813
767
  actionUpdateFromNetworkErrorRetry(error, type) {
814
- var _this$state$networkEr;
815
768
  // "Is a network error"-boundary
816
- var retries = (_this$state$networkEr = this.state.networkErrorRetries.get(type)) !== null && _this$state$networkEr !== void 0 ? _this$state$networkEr : 0;
769
+ const retries = this.state.networkErrorRetries.get(type) ?? 0;
817
770
 
818
771
  // Strings for error logging
819
- var retryDurationString = this.networkErrorRetryMs / 1000 + "s";
820
- var retryCounterString = "(" + retries + "/" + this.maximumNetworkErrorRetryCount + ")";
772
+ const retryDurationString = this.networkErrorRetryMs / 1000 + "s";
773
+ const retryCounterString = "(" + retries + "/" + this.maximumNetworkErrorRetryCount + ")";
821
774
 
822
775
  // Variables for scheduling the new event
823
- var retryDuration = this.networkErrorRetryMs;
776
+ let retryDuration = this.networkErrorRetryMs;
824
777
  if (error instanceof Error && error.name === "AbortError") {
825
778
  // We do not wait for the timeout on local timeouts.
826
779
  retryDuration = 0;
@@ -868,9 +821,11 @@ export class MembershipManager extends TypedEventEmitter {
868
821
  this.state.networkErrorRetries.set(type, 0);
869
822
  }
870
823
  get status() {
871
- var actions = this.scheduler.actions;
824
+ const actions = this.scheduler.actions;
872
825
  if (actions.length === 1) {
873
- var type = actions[0].type;
826
+ const {
827
+ type
828
+ } = actions[0];
874
829
  switch (type) {
875
830
  case MembershipActionType.SendDelayedEvent:
876
831
  case MembershipActionType.SendJoinEvent:
@@ -885,16 +840,16 @@ export class MembershipManager extends TypedEventEmitter {
885
840
  // pass through as not expected
886
841
  }
887
842
  } else if (actions.length === 2) {
888
- var types = actions.map(a => a.type);
843
+ const types = actions.map(a => a.type);
889
844
  // normal state for connected with delayed events
890
845
  if ((types.includes(MembershipActionType.RestartDelayedEvent) || types.includes(MembershipActionType.SendDelayedEvent) && this.state.hasMemberStateEvent) && types.includes(MembershipActionType.UpdateExpiry)) {
891
846
  return Status.Connected;
892
847
  }
893
848
  } else if (actions.length === 3) {
894
- var _types = actions.map(a => a.type);
849
+ const types = actions.map(a => a.type);
895
850
  // It is a correct connected state if we already schedule the next Restart but have not yet cleaned up
896
851
  // the current restart.
897
- if (_types.filter(t => t === MembershipActionType.RestartDelayedEvent).length === 2 && _types.includes(MembershipActionType.UpdateExpiry)) {
852
+ if (types.filter(t => t === MembershipActionType.RestartDelayedEvent).length === 2 && types.includes(MembershipActionType.UpdateExpiry)) {
898
853
  return Status.Connected;
899
854
  }
900
855
  }
@@ -922,8 +877,6 @@ export class StickyEventMembershipManager extends MembershipManager {
922
877
  // we keep it as a string for now for backwards compatibility.
923
878
  memberId, parentLogger) {
924
879
  super(joinConfig, room, clientWithSticky, sessionDescription, parentLogger);
925
- this.clientWithSticky = clientWithSticky;
926
- this.memberId = memberId;
927
880
  _defineProperty(this, "clientSendDelayedDisconnectMembership", () => this.clientWithSticky._unstable_sendStickyDelayedEvent(this.room.roomId, MEMBERSHIP_STICKY_DURATION_MS, {
928
881
  delay: this.delayedLeaveEventDelayMs
929
882
  }, null, EventType.RTCMembership, {
@@ -934,10 +887,11 @@ export class StickyEventMembershipManager extends MembershipManager {
934
887
  msc4354_sticky_key: this.memberId
935
888
  }));
936
889
  });
890
+ this.clientWithSticky = clientWithSticky;
891
+ this.memberId = memberId;
937
892
  }
938
893
  actionUpdateFromErrors(e, t, m) {
939
- var _StickyEventMembershi;
940
- return super.actionUpdateFromErrors(e, t, (_StickyEventMembershi = StickyEventMembershipManager.nameMap.get(m)) !== null && _StickyEventMembershi !== void 0 ? _StickyEventMembershi : "unknown");
894
+ return super.actionUpdateFromErrors(e, t, StickyEventMembershipManager.nameMap.get(m) ?? "unknown");
941
895
  }
942
896
 
943
897
  /**
@@ -945,12 +899,12 @@ export class StickyEventMembershipManager extends MembershipManager {
945
899
  * @returns Only returns `RtcMembershipData`
946
900
  */
947
901
  makeMyMembership() {
948
- var ownMembership = this.ownMembership;
949
- var livekitTransport = isLivekitTransportConfig(this.rtcTransport) ? this.rtcTransport : undefined;
950
- var relationObject = ownMembership !== null && ownMembership !== void 0 && ownMembership.eventId ? {
902
+ const ownMembership = this.ownMembership;
903
+ const livekitTransport = isLivekitTransportConfig(this.rtcTransport) ? this.rtcTransport : undefined;
904
+ const relationObject = ownMembership?.eventId ? {
951
905
  "m.relation": {
952
906
  rel_type: RelationType.Reference,
953
- event_id: ownMembership === null || ownMembership === void 0 ? void 0 : ownMembership.eventId
907
+ event_id: ownMembership?.eventId
954
908
  }
955
909
  } : {};
956
910
  return _objectSpread({