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 +1 @@
1
- {"version":3,"file":"NamespacedValue.js","names":["NamespacedValue","constructor","stable","unstable","Error","name","altName","names","push","matches","val","findIn","obj","undefined","includedIn","arr","included","includes","ServerControlledNamespacedValue","arguments","_defineProperty","setPreferUnstable","preferUnstable","UnstableValue"],"sources":["../src/NamespacedValue.ts"],"sourcesContent":["/*\nCopyright 2021 - 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * Represents a simple Matrix namespaced value. This will assume that if a stable prefix\n * is provided that the stable prefix should be used when representing the identifier.\n */\nexport class NamespacedValue<S extends string, U extends string> {\n // Stable is optional, but one of the two parameters is required, hence the weird-looking types.\n // Goal is to to have developers explicitly say there is no stable value (if applicable).\n public constructor(stable: S, unstable: U);\n public constructor(stable: S, unstable: U | null);\n public constructor(stable: null, unstable: U);\n public constructor(\n public readonly stable: S | null,\n public readonly unstable: U | null,\n ) {\n if (!this.unstable && !this.stable) {\n throw new Error(\"One of stable or unstable values must be supplied\");\n }\n }\n\n public get name(): U | S {\n if (this.stable) {\n return this.stable;\n }\n return this.unstable!;\n }\n\n public get altName(): U | S | null | undefined {\n if (!this.stable) {\n return null;\n }\n return this.unstable;\n }\n\n public get names(): (U | S)[] {\n const names = [this.name];\n const altName = this.altName;\n if (altName) names.push(altName);\n return names;\n }\n\n public matches(val: string): boolean {\n return this.name === val || this.altName === val;\n }\n\n // this desperately wants https://github.com/microsoft/TypeScript/pull/26349 at the top level of the class\n // so we can instantiate `NamespacedValue<string, _, _>` as a default type for that namespace.\n public findIn<V>(obj: Partial<Record<NonNullable<S | U>, V>>): V | undefined {\n let val: V | undefined = undefined;\n if (this.name) {\n val = obj?.[this.name];\n }\n if (!val && this.altName) {\n val = obj?.[this.altName];\n }\n return val;\n }\n\n public includedIn(arr: any[]): boolean {\n let included = false;\n if (this.name) {\n included = arr.includes(this.name);\n }\n if (!included && this.altName) {\n included = arr.includes(this.altName);\n }\n return included;\n }\n}\n\nexport class ServerControlledNamespacedValue<S extends string, U extends string> extends NamespacedValue<S, U> {\n private preferUnstable = false;\n\n public setPreferUnstable(preferUnstable: boolean): void {\n this.preferUnstable = preferUnstable;\n }\n\n public get name(): U | S {\n if (this.stable && !this.preferUnstable) {\n return this.stable;\n }\n return this.unstable!;\n }\n}\n\n/**\n * Represents a namespaced value which prioritizes the unstable value over the stable\n * value.\n */\nexport class UnstableValue<S extends string, U extends string> extends NamespacedValue<S, U> {\n // Note: Constructor difference is that `unstable` is *required*.\n public constructor(stable: S, unstable: U) {\n super(stable, unstable);\n if (!this.unstable) {\n throw new Error(\"Unstable value must be supplied\");\n }\n }\n\n public get name(): U {\n return this.unstable!;\n }\n\n public get altName(): S {\n return this.stable!;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"NamespacedValue.js","names":[],"sources":["../src/NamespacedValue.ts"],"sourcesContent":["/*\nCopyright 2021 - 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * Represents a simple Matrix namespaced value. This will assume that if a stable prefix\n * is provided that the stable prefix should be used when representing the identifier.\n */\nexport class NamespacedValue<S extends string, U extends string> {\n // Stable is optional, but one of the two parameters is required, hence the weird-looking types.\n // Goal is to to have developers explicitly say there is no stable value (if applicable).\n public constructor(stable: S, unstable: U);\n public constructor(stable: S, unstable: U | null);\n public constructor(stable: null, unstable: U);\n public constructor(\n public readonly stable: S | null,\n public readonly unstable: U | null,\n ) {\n if (!this.unstable && !this.stable) {\n throw new Error(\"One of stable or unstable values must be supplied\");\n }\n }\n\n public get name(): U | S {\n if (this.stable) {\n return this.stable;\n }\n return this.unstable!;\n }\n\n public get altName(): U | S | null | undefined {\n if (!this.stable) {\n return null;\n }\n return this.unstable;\n }\n\n public get names(): (U | S)[] {\n const names = [this.name];\n const altName = this.altName;\n if (altName) names.push(altName);\n return names;\n }\n\n public matches(val: string): boolean {\n return this.name === val || this.altName === val;\n }\n\n // this desperately wants https://github.com/microsoft/TypeScript/pull/26349 at the top level of the class\n // so we can instantiate `NamespacedValue<string, _, _>` as a default type for that namespace.\n public findIn<V>(obj: Partial<Record<NonNullable<S | U>, V>>): V | undefined {\n let val: V | undefined = undefined;\n if (this.name) {\n val = obj?.[this.name];\n }\n if (!val && this.altName) {\n val = obj?.[this.altName];\n }\n return val;\n }\n\n public includedIn(arr: any[]): boolean {\n let included = false;\n if (this.name) {\n included = arr.includes(this.name);\n }\n if (!included && this.altName) {\n included = arr.includes(this.altName);\n }\n return included;\n }\n}\n\nexport class ServerControlledNamespacedValue<S extends string, U extends string> extends NamespacedValue<S, U> {\n private preferUnstable = false;\n\n public setPreferUnstable(preferUnstable: boolean): void {\n this.preferUnstable = preferUnstable;\n }\n\n public get name(): U | S {\n if (this.stable && !this.preferUnstable) {\n return this.stable;\n }\n return this.unstable!;\n }\n}\n\n/**\n * Represents a namespaced value which prioritizes the unstable value over the stable\n * value.\n */\nexport class UnstableValue<S extends string, U extends string> extends NamespacedValue<S, U> {\n // Note: Constructor difference is that `unstable` is *required*.\n public constructor(stable: S, unstable: U) {\n super(stable, unstable);\n if (!this.unstable) {\n throw new Error(\"Unstable value must be supplied\");\n }\n }\n\n public get name(): U {\n return this.unstable!;\n }\n\n public get altName(): S {\n return this.stable!;\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM,eAAe,CAAqC;EAC7D;EACA;;EAIO,WAAW,CACE,MAAgB,EAChB,QAAkB,EACpC;IAAA,KAFkB,MAAgB,GAAhB,MAAgB;IAAA,KAChB,QAAkB,GAAlB,QAAkB;IAElC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;MAChC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACxE;EACJ;EAEA,IAAW,IAAI,GAAU;IACrB,IAAI,IAAI,CAAC,MAAM,EAAE;MACb,OAAO,IAAI,CAAC,MAAM;IACtB;IACA,OAAO,IAAI,CAAC,QAAQ;EACxB;EAEA,IAAW,OAAO,GAA6B;IAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;MACd,OAAO,IAAI;IACf;IACA,OAAO,IAAI,CAAC,QAAQ;EACxB;EAEA,IAAW,KAAK,GAAc;IAC1B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;IAC5B,IAAI,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,OAAO,KAAK;EAChB;EAEO,OAAO,CAAC,GAAW,EAAW;IACjC,OAAO,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;EACpD;;EAEA;EACA;EACO,MAAM,CAAI,GAA2C,EAAiB;IACzE,IAAI,GAAkB,GAAG,SAAS;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE;MACX,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B;IACA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;MACtB,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B;IACA,OAAO,GAAG;EACd;EAEO,UAAU,CAAC,GAAU,EAAW;IACnC,IAAI,QAAQ,GAAG,KAAK;IACpB,IAAI,IAAI,CAAC,IAAI,EAAE;MACX,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC;IACA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE;MAC3B,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACzC;IACA,OAAO,QAAQ;EACnB;AACJ;AAEA,OAAO,MAAM,+BAA+B,SAA6C,eAAe,CAAO;EAAA;IAAA;IAAA,wCAClF,KAAK;EAAA;EAEvB,iBAAiB,CAAC,cAAuB,EAAQ;IACpD,IAAI,CAAC,cAAc,GAAG,cAAc;EACxC;EAEA,IAAW,IAAI,GAAU;IACrB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;MACrC,OAAO,IAAI,CAAC,MAAM;IACtB;IACA,OAAO,IAAI,CAAC,QAAQ;EACxB;AACJ;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAM,aAAa,SAA6C,eAAe,CAAO;EACzF;EACO,WAAW,CAAC,MAAS,EAAE,QAAW,EAAE;IACvC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;MAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACtD;EACJ;EAEA,IAAW,IAAI,GAAM;IACjB,OAAO,IAAI,CAAC,QAAQ;EACxB;EAEA,IAAW,OAAO,GAAM;IACpB,OAAO,IAAI,CAAC,MAAM;EACtB;AACJ","ignoreList":[]}
package/lib/ReEmitter.js CHANGED
@@ -21,24 +21,23 @@ limitations under the License.
21
21
 
22
22
  export class ReEmitter {
23
23
  constructor(target) {
24
- this.target = target;
25
24
  // Map from emitter to event name to re-emitter
26
25
  _defineProperty(this, "reEmitters", new WeakMap());
26
+ this.target = target;
27
27
  }
28
28
  reEmit(source, eventNames) {
29
- var _this = this;
30
- var reEmittersByEvent = this.reEmitters.get(source);
29
+ let reEmittersByEvent = this.reEmitters.get(source);
31
30
  if (!reEmittersByEvent) {
32
31
  reEmittersByEvent = new Map();
33
32
  this.reEmitters.set(source, reEmittersByEvent);
34
33
  }
35
- var _loop = function _loop(eventName) {
36
- if (reEmittersByEvent.has(eventName)) return 1; // continue
34
+ for (const eventName of eventNames) {
35
+ if (reEmittersByEvent.has(eventName)) continue;
37
36
 
38
37
  // We include the source as the last argument for event handlers which may need it,
39
38
  // such as read receipt listeners on the client class which won't have the context
40
39
  // of the room.
41
- var forSource = function forSource() {
40
+ const forSource = (...args) => {
42
41
  // EventEmitter special cases 'error' to make the emit function throw if no
43
42
  // handler is attached, which sort of makes sense for making sure that something
44
43
  // handles an error, but for re-emitting, there could be a listener on the original
@@ -49,24 +48,18 @@ export class ReEmitter {
49
48
  // later by a different part of the code where 'emit' throwing because the app hasn't
50
49
  // added an error handler isn't terribly helpful. (A better fix in retrospect may
51
50
  // have been to just avoid using the event name 'error', but backwards compat...)
52
- if (eventName === "error" && _this.target.listenerCount("error") === 0) return;
53
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
54
- args[_key] = arguments[_key];
55
- }
56
- _this.target.emit(eventName, ...args, source);
51
+ if (eventName === "error" && this.target.listenerCount("error") === 0) return;
52
+ this.target.emit(eventName, ...args, source);
57
53
  };
58
54
  source.on(eventName, forSource);
59
55
  reEmittersByEvent.set(eventName, forSource);
60
- };
61
- for (var eventName of eventNames) {
62
- if (_loop(eventName)) continue;
63
56
  }
64
57
  }
65
58
  stopReEmitting(source, eventNames) {
66
- var reEmittersByEvent = this.reEmitters.get(source);
59
+ const reEmittersByEvent = this.reEmitters.get(source);
67
60
  if (!reEmittersByEvent) return; // We were never re-emitting these events in the first place
68
61
 
69
- for (var eventName of eventNames) {
62
+ for (const eventName of eventNames) {
70
63
  source.off(eventName, reEmittersByEvent.get(eventName));
71
64
  reEmittersByEvent.delete(eventName);
72
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ReEmitter.js","names":["ReEmitter","constructor","target","_defineProperty","WeakMap","reEmit","source","eventNames","_this","reEmittersByEvent","reEmitters","get","Map","set","_loop","eventName","has","forSource","listenerCount","_len","arguments","length","args","Array","_key","emit","on","stopReEmitting","off","delete","size","TypedReEmitter"],"sources":["../src/ReEmitter.ts"],"sourcesContent":["/*\nCopyright 2015, 2016 OpenMarket Ltd\nCopyright 2017 Vector Creations Ltd\nCopyright 2017 New Vector 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\n// eslint-disable-next-line no-restricted-imports\nimport { type EventEmitter } from \"events\";\n\nimport { type ListenerMap, type TypedEventEmitter } from \"./models/typed-event-emitter.ts\";\n\nexport class ReEmitter {\n public constructor(private readonly target: EventEmitter) {}\n\n // Map from emitter to event name to re-emitter\n private reEmitters = new WeakMap<EventEmitter, Map<string, (...args: any[]) => void>>();\n\n public reEmit(source: EventEmitter, eventNames: string[]): void {\n let reEmittersByEvent = this.reEmitters.get(source);\n if (!reEmittersByEvent) {\n reEmittersByEvent = new Map();\n this.reEmitters.set(source, reEmittersByEvent);\n }\n\n for (const eventName of eventNames) {\n if (reEmittersByEvent.has(eventName)) continue;\n\n // We include the source as the last argument for event handlers which may need it,\n // such as read receipt listeners on the client class which won't have the context\n // of the room.\n const forSource = (...args: any[]): void => {\n // EventEmitter special cases 'error' to make the emit function throw if no\n // handler is attached, which sort of makes sense for making sure that something\n // handles an error, but for re-emitting, there could be a listener on the original\n // source object so the test doesn't really work. We *could* try to replicate the\n // same logic and throw if there is no listener on either the source or the target,\n // but this behaviour is fairly undesireable for us anyway: the main place we throw\n // 'error' events is for calls, where error events are usually emitted some time\n // later by a different part of the code where 'emit' throwing because the app hasn't\n // added an error handler isn't terribly helpful. (A better fix in retrospect may\n // have been to just avoid using the event name 'error', but backwards compat...)\n if (eventName === \"error\" && this.target.listenerCount(\"error\") === 0) return;\n this.target.emit(eventName, ...args, source);\n };\n source.on(eventName, forSource);\n reEmittersByEvent.set(eventName, forSource);\n }\n }\n\n public stopReEmitting(source: EventEmitter, eventNames: string[]): void {\n const reEmittersByEvent = this.reEmitters.get(source);\n if (!reEmittersByEvent) return; // We were never re-emitting these events in the first place\n\n for (const eventName of eventNames) {\n source.off(eventName, reEmittersByEvent.get(eventName)!);\n reEmittersByEvent.delete(eventName);\n }\n\n if (reEmittersByEvent.size === 0) this.reEmitters.delete(source);\n }\n}\n\nexport class TypedReEmitter<Events extends string, Arguments extends ListenerMap<Events>> extends ReEmitter {\n public constructor(target: TypedEventEmitter<Events, Arguments>) {\n super(target);\n }\n\n public reEmit<ReEmittedEvents extends string, T extends Events & ReEmittedEvents>(\n source: TypedEventEmitter<ReEmittedEvents, any>,\n eventNames: T[],\n ): void {\n super.reEmit(source, eventNames);\n }\n\n public stopReEmitting<ReEmittedEvents extends string, T extends Events & ReEmittedEvents>(\n source: TypedEventEmitter<ReEmittedEvents, any>,\n eventNames: T[],\n ): void {\n super.stopReEmitting(source, eventNames);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAKA,OAAO,MAAMA,SAAS,CAAC;EACZC,WAAWA,CAAkBC,MAAoB,EAAE;IAAA,KAAtBA,MAAoB,GAApBA,MAAoB;IAExD;IAAAC,eAAA,qBACqB,IAAIC,OAAO,CAAsD,CAAC;EAH5B;EAKpDC,MAAMA,CAACC,MAAoB,EAAEC,UAAoB,EAAQ;IAAA,IAAAC,KAAA;IAC5D,IAAIC,iBAAiB,GAAG,IAAI,CAACC,UAAU,CAACC,GAAG,CAACL,MAAM,CAAC;IACnD,IAAI,CAACG,iBAAiB,EAAE;MACpBA,iBAAiB,GAAG,IAAIG,GAAG,CAAC,CAAC;MAC7B,IAAI,CAACF,UAAU,CAACG,GAAG,CAACP,MAAM,EAAEG,iBAAiB,CAAC;IAClD;IAAC,IAAAK,KAAA,YAAAA,MAAAC,SAAA,EAEmC;MAChC,IAAIN,iBAAiB,CAACO,GAAG,CAACD,SAAS,CAAC;;MAEpC;MACA;MACA;MACA,IAAME,SAAS,GAAG,SAAZA,SAASA,CAAA,EAA6B;QACxC;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,IAAIF,SAAS,KAAK,OAAO,IAAIP,KAAI,CAACN,MAAM,CAACgB,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAAO,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAX5DC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;UAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;QAAA;QAYtBhB,KAAI,CAACN,MAAM,CAACuB,IAAI,CAACV,SAAS,EAAE,GAAGO,IAAI,EAAEhB,MAAM,CAAC;MAChD,CAAC;MACDA,MAAM,CAACoB,EAAE,CAACX,SAAS,EAAEE,SAAS,CAAC;MAC/BR,iBAAiB,CAACI,GAAG,CAACE,SAAS,EAAEE,SAAS,CAAC;IAC/C,CAAC;IAtBD,KAAK,IAAMF,SAAS,IAAIR,UAAU;MAAA,IAAAO,KAAA,CAAAC,SAAA,GACQ;IAAS;EAsBvD;EAEOY,cAAcA,CAACrB,MAAoB,EAAEC,UAAoB,EAAQ;IACpE,IAAME,iBAAiB,GAAG,IAAI,CAACC,UAAU,CAACC,GAAG,CAACL,MAAM,CAAC;IACrD,IAAI,CAACG,iBAAiB,EAAE,OAAO,CAAC;;IAEhC,KAAK,IAAMM,SAAS,IAAIR,UAAU,EAAE;MAChCD,MAAM,CAACsB,GAAG,CAACb,SAAS,EAAEN,iBAAiB,CAACE,GAAG,CAACI,SAAS,CAAE,CAAC;MACxDN,iBAAiB,CAACoB,MAAM,CAACd,SAAS,CAAC;IACvC;IAEA,IAAIN,iBAAiB,CAACqB,IAAI,KAAK,CAAC,EAAE,IAAI,CAACpB,UAAU,CAACmB,MAAM,CAACvB,MAAM,CAAC;EACpE;AACJ;AAEA,OAAO,MAAMyB,cAAc,SAAuE/B,SAAS,CAAC;EACjGC,WAAWA,CAACC,MAA4C,EAAE;IAC7D,KAAK,CAACA,MAAM,CAAC;EACjB;EAEOG,MAAMA,CACTC,MAA+C,EAC/CC,UAAe,EACX;IACJ,KAAK,CAACF,MAAM,CAACC,MAAM,EAAEC,UAAU,CAAC;EACpC;EAEOoB,cAAcA,CACjBrB,MAA+C,EAC/CC,UAAe,EACX;IACJ,KAAK,CAACoB,cAAc,CAACrB,MAAM,EAAEC,UAAU,CAAC;EAC5C;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"ReEmitter.js","names":[],"sources":["../src/ReEmitter.ts"],"sourcesContent":["/*\nCopyright 2015, 2016 OpenMarket Ltd\nCopyright 2017 Vector Creations Ltd\nCopyright 2017 New Vector 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\n// eslint-disable-next-line no-restricted-imports\nimport { type EventEmitter } from \"events\";\n\nimport { type ListenerMap, type TypedEventEmitter } from \"./models/typed-event-emitter.ts\";\n\nexport class ReEmitter {\n public constructor(private readonly target: EventEmitter) {}\n\n // Map from emitter to event name to re-emitter\n private reEmitters = new WeakMap<EventEmitter, Map<string, (...args: any[]) => void>>();\n\n public reEmit(source: EventEmitter, eventNames: string[]): void {\n let reEmittersByEvent = this.reEmitters.get(source);\n if (!reEmittersByEvent) {\n reEmittersByEvent = new Map();\n this.reEmitters.set(source, reEmittersByEvent);\n }\n\n for (const eventName of eventNames) {\n if (reEmittersByEvent.has(eventName)) continue;\n\n // We include the source as the last argument for event handlers which may need it,\n // such as read receipt listeners on the client class which won't have the context\n // of the room.\n const forSource = (...args: any[]): void => {\n // EventEmitter special cases 'error' to make the emit function throw if no\n // handler is attached, which sort of makes sense for making sure that something\n // handles an error, but for re-emitting, there could be a listener on the original\n // source object so the test doesn't really work. We *could* try to replicate the\n // same logic and throw if there is no listener on either the source or the target,\n // but this behaviour is fairly undesireable for us anyway: the main place we throw\n // 'error' events is for calls, where error events are usually emitted some time\n // later by a different part of the code where 'emit' throwing because the app hasn't\n // added an error handler isn't terribly helpful. (A better fix in retrospect may\n // have been to just avoid using the event name 'error', but backwards compat...)\n if (eventName === \"error\" && this.target.listenerCount(\"error\") === 0) return;\n this.target.emit(eventName, ...args, source);\n };\n source.on(eventName, forSource);\n reEmittersByEvent.set(eventName, forSource);\n }\n }\n\n public stopReEmitting(source: EventEmitter, eventNames: string[]): void {\n const reEmittersByEvent = this.reEmitters.get(source);\n if (!reEmittersByEvent) return; // We were never re-emitting these events in the first place\n\n for (const eventName of eventNames) {\n source.off(eventName, reEmittersByEvent.get(eventName)!);\n reEmittersByEvent.delete(eventName);\n }\n\n if (reEmittersByEvent.size === 0) this.reEmitters.delete(source);\n }\n}\n\nexport class TypedReEmitter<Events extends string, Arguments extends ListenerMap<Events>> extends ReEmitter {\n public constructor(target: TypedEventEmitter<Events, Arguments>) {\n super(target);\n }\n\n public reEmit<ReEmittedEvents extends string, T extends Events & ReEmittedEvents>(\n source: TypedEventEmitter<ReEmittedEvents, any>,\n eventNames: T[],\n ): void {\n super.reEmit(source, eventNames);\n }\n\n public stopReEmitting<ReEmittedEvents extends string, T extends Events & ReEmittedEvents>(\n source: TypedEventEmitter<ReEmittedEvents, any>,\n eventNames: T[],\n ): void {\n super.stopReEmitting(source, eventNames);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAKA,OAAO,MAAM,SAAS,CAAC;EACZ,WAAW,CAAkB,MAAoB,EAAE;IAE1D;IAAA,oCACqB,IAAI,OAAO,CAAsD,CAAC;IAAA,KAHnD,MAAoB,GAApB,MAAoB;EAAG;EAKpD,MAAM,CAAC,MAAoB,EAAE,UAAoB,EAAQ;IAC5D,IAAI,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;IACnD,IAAI,CAAC,iBAAiB,EAAE;MACpB,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC;MAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAClD;IAEA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;MAChC,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;;MAEtC;MACA;MACA;MACA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAW,KAAW;QACxC;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,IAAI,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC;MAChD,CAAC;MACD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;MAC/B,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C;EACJ;EAEO,cAAc,CAAC,MAAoB,EAAE,UAAoB,EAAQ;IACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;IACrD,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC;;IAEhC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;MAChC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;MACxD,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC;IACvC;IAEA,IAAI,iBAAiB,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;EACpE;AACJ;AAEA,OAAO,MAAM,cAAc,SAAuE,SAAS,CAAC;EACjG,WAAW,CAAC,MAA4C,EAAE;IAC7D,KAAK,CAAC,MAAM,CAAC;EACjB;EAEO,MAAM,CACT,MAA+C,EAC/C,UAAe,EACX;IACJ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;EACpC;EAEO,cAAc,CACjB,MAA+C,EAC/C,UAAe,EACX;IACJ,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC;EAC5C;AACJ","ignoreList":[]}
@@ -1,4 +1,3 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
2
  /*
4
3
  Copyright 2022 The Matrix.org Foundation C.I.C.
@@ -21,7 +20,7 @@ import { ClientEvent } from "./client.js";
21
20
  import { MatrixScheduler } from "./scheduler.js";
22
21
  import { SyncState } from "./sync.js";
23
22
  import { MapWithDefault } from "./utils.js";
24
- var MAX_BATCH_SIZE = 20;
23
+ const MAX_BATCH_SIZE = 20;
25
24
 
26
25
  /**
27
26
  * Maintains a queue of outgoing to-device messages, sending them
@@ -29,64 +28,63 @@ var MAX_BATCH_SIZE = 20;
29
28
  */
30
29
  export class ToDeviceMessageQueue {
31
30
  constructor(client, logger) {
32
- var _this = this;
33
- this.client = client;
34
- this.logger = logger;
35
31
  _defineProperty(this, "sending", false);
36
32
  _defineProperty(this, "running", true);
37
33
  _defineProperty(this, "retryTimeout", null);
38
34
  _defineProperty(this, "retryAttempts", 0);
39
- _defineProperty(this, "sendQueue", /*#__PURE__*/_asyncToGenerator(function* () {
40
- if (_this.retryTimeout !== null) clearTimeout(_this.retryTimeout);
41
- _this.retryTimeout = null;
42
- if (_this.sending || !_this.running) return;
43
- _this.logger.debug("Attempting to send queued to-device messages");
44
- _this.sending = true;
45
- var headBatch;
35
+ _defineProperty(this, "sendQueue", async () => {
36
+ if (this.retryTimeout !== null) clearTimeout(this.retryTimeout);
37
+ this.retryTimeout = null;
38
+ if (this.sending || !this.running) return;
39
+ this.logger.debug("Attempting to send queued to-device messages");
40
+ this.sending = true;
41
+ let headBatch;
46
42
  try {
47
- while (_this.running) {
48
- headBatch = yield _this.client.store.getOldestToDeviceBatch();
43
+ while (this.running) {
44
+ headBatch = await this.client.store.getOldestToDeviceBatch();
49
45
  if (headBatch === null) break;
50
- yield _this.sendBatch(headBatch);
51
- yield _this.client.store.removeToDeviceBatch(headBatch.id);
52
- _this.retryAttempts = 0;
46
+ await this.sendBatch(headBatch);
47
+ await this.client.store.removeToDeviceBatch(headBatch.id);
48
+ this.retryAttempts = 0;
53
49
  }
54
50
 
55
51
  // Make sure we're still running after the async tasks: if not, stop.
56
- if (!_this.running) return;
57
- _this.logger.debug("All queued to-device messages sent");
52
+ if (!this.running) return;
53
+ this.logger.debug("All queued to-device messages sent");
58
54
  } catch (e) {
59
- ++_this.retryAttempts;
55
+ ++this.retryAttempts;
60
56
  // eslint-disable-next-line @typescript-eslint/naming-convention
61
57
  // eslint-disable-next-line new-cap
62
- var retryDelay = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(null, _this.retryAttempts, e);
58
+ const retryDelay = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(null, this.retryAttempts, e);
63
59
  if (retryDelay === -1) {
64
60
  // the scheduler function doesn't differentiate between fatal errors and just getting
65
61
  // bored and giving up for now
66
62
  if (Math.floor(e.httpStatus / 100) === 4) {
67
- _this.logger.error("Fatal error when sending to-device message - dropping to-device batch!", e);
68
- yield _this.client.store.removeToDeviceBatch(headBatch.id);
63
+ this.logger.error("Fatal error when sending to-device message - dropping to-device batch!", e);
64
+ await this.client.store.removeToDeviceBatch(headBatch.id);
69
65
  } else {
70
- _this.logger.info("Automatic retry limit reached for to-device messages.");
66
+ this.logger.info("Automatic retry limit reached for to-device messages.");
71
67
  }
72
68
  return;
73
69
  }
74
- _this.logger.info("Failed to send batch of to-device messages. Will retry in ".concat(retryDelay, "ms"), e);
75
- _this.retryTimeout = setTimeout(_this.sendQueue, retryDelay);
70
+ this.logger.info(`Failed to send batch of to-device messages. Will retry in ${retryDelay}ms`, e);
71
+ this.retryTimeout = setTimeout(this.sendQueue, retryDelay);
76
72
  } finally {
77
- _this.sending = false;
73
+ this.sending = false;
78
74
  }
79
- }));
75
+ });
80
76
  /**
81
77
  * Listen to sync state changes and automatically resend any pending events
82
78
  * once syncing is resumed
83
79
  */
84
80
  _defineProperty(this, "onResumedSync", (state, oldState) => {
85
81
  if (state === SyncState.Syncing && oldState !== SyncState.Syncing) {
86
- this.logger.info("Resuming queue after resumed sync");
87
- this.sendQueue();
82
+ this.logger.info(`Resuming queue after resumed sync`);
83
+ void this.sendQueue();
88
84
  }
89
85
  });
86
+ this.client = client;
87
+ this.logger = logger;
90
88
  }
91
89
  start() {
92
90
  this.running = true;
@@ -99,37 +97,31 @@ export class ToDeviceMessageQueue {
99
97
  this.retryTimeout = null;
100
98
  this.client.removeListener(ClientEvent.Sync, this.onResumedSync);
101
99
  }
102
- queueBatch(batch) {
103
- var _this2 = this;
104
- return _asyncToGenerator(function* () {
105
- var batches = [];
106
- for (var i = 0; i < batch.batch.length; i += MAX_BATCH_SIZE) {
107
- var batchWithTxnId = {
108
- eventType: batch.eventType,
109
- batch: batch.batch.slice(i, i + MAX_BATCH_SIZE),
110
- txnId: _this2.client.makeTxnId()
111
- };
112
- batches.push(batchWithTxnId);
113
- var msgmap = batchWithTxnId.batch.map(msg => "".concat(msg.userId, "/").concat(msg.deviceId, " (msgid ").concat(msg.payload[ToDeviceMessageId], ")"));
114
- _this2.logger.info("Enqueuing batch of to-device messages. type=".concat(batch.eventType, " txnid=").concat(batchWithTxnId.txnId), msgmap);
115
- }
116
- yield _this2.client.store.saveToDeviceBatches(batches);
117
- _this2.sendQueue();
118
- })();
100
+ async queueBatch(batch) {
101
+ const batches = [];
102
+ for (let i = 0; i < batch.batch.length; i += MAX_BATCH_SIZE) {
103
+ const batchWithTxnId = {
104
+ eventType: batch.eventType,
105
+ batch: batch.batch.slice(i, i + MAX_BATCH_SIZE),
106
+ txnId: this.client.makeTxnId()
107
+ };
108
+ batches.push(batchWithTxnId);
109
+ const msgmap = batchWithTxnId.batch.map(msg => `${msg.userId}/${msg.deviceId} (msgid ${msg.payload[ToDeviceMessageId]})`);
110
+ this.logger.info(`Enqueuing batch of to-device messages. type=${batch.eventType} txnid=${batchWithTxnId.txnId}`, msgmap);
111
+ }
112
+ await this.client.store.saveToDeviceBatches(batches);
113
+ void this.sendQueue();
119
114
  }
120
115
  /**
121
116
  * Attempts to send a batch of to-device messages.
122
117
  */
123
- sendBatch(batch) {
124
- var _this3 = this;
125
- return _asyncToGenerator(function* () {
126
- var contentMap = new MapWithDefault(() => new Map());
127
- for (var item of batch.batch) {
128
- contentMap.getOrCreate(item.userId).set(item.deviceId, item.payload);
129
- }
130
- _this3.logger.info("Sending batch of ".concat(batch.batch.length, " to-device messages with ID ").concat(batch.id, " and txnId ").concat(batch.txnId));
131
- yield _this3.client.sendToDevice(batch.eventType, contentMap, batch.txnId);
132
- })();
118
+ async sendBatch(batch) {
119
+ const contentMap = new MapWithDefault(() => new Map());
120
+ for (const item of batch.batch) {
121
+ contentMap.getOrCreate(item.userId).set(item.deviceId, item.payload);
122
+ }
123
+ this.logger.info(`Sending batch of ${batch.batch.length} to-device messages with ID ${batch.id} and txnId ${batch.txnId}`);
124
+ await this.client.sendToDevice(batch.eventType, contentMap, batch.txnId);
133
125
  }
134
126
  }
135
127
  //# sourceMappingURL=ToDeviceMessageQueue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToDeviceMessageQueue.js","names":["ToDeviceMessageId","ClientEvent","MatrixScheduler","SyncState","MapWithDefault","MAX_BATCH_SIZE","ToDeviceMessageQueue","constructor","client","logger","_this","_defineProperty","_asyncToGenerator","retryTimeout","clearTimeout","sending","running","debug","headBatch","store","getOldestToDeviceBatch","sendBatch","removeToDeviceBatch","id","retryAttempts","e","retryDelay","RETRY_BACKOFF_RATELIMIT","Math","floor","httpStatus","error","info","concat","setTimeout","sendQueue","state","oldState","Syncing","start","on","Sync","onResumedSync","stop","removeListener","queueBatch","batch","_this2","batches","i","length","batchWithTxnId","eventType","slice","txnId","makeTxnId","push","msgmap","map","msg","userId","deviceId","payload","saveToDeviceBatches","_this3","contentMap","Map","item","getOrCreate","set","sendToDevice"],"sources":["../src/ToDeviceMessageQueue.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { ToDeviceMessageId } from \"./@types/event.ts\";\nimport { type Logger } from \"./logger.ts\";\nimport { type MatrixClient, ClientEvent } from \"./client.ts\";\nimport { type MatrixError } from \"./http-api/index.ts\";\nimport {\n type IndexedToDeviceBatch,\n type ToDeviceBatch,\n type ToDeviceBatchWithTxnId,\n type ToDevicePayload,\n} from \"./models/ToDeviceMessage.ts\";\nimport { MatrixScheduler } from \"./scheduler.ts\";\nimport { SyncState } from \"./sync.ts\";\nimport { MapWithDefault } from \"./utils.ts\";\n\nconst MAX_BATCH_SIZE = 20;\n\n/**\n * Maintains a queue of outgoing to-device messages, sending them\n * as soon as the homeserver is reachable.\n */\nexport class ToDeviceMessageQueue {\n private sending = false;\n private running = true;\n private retryTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryAttempts = 0;\n\n public constructor(\n private client: MatrixClient,\n private readonly logger: Logger,\n ) {}\n\n public start(): void {\n this.running = true;\n this.sendQueue();\n this.client.on(ClientEvent.Sync, this.onResumedSync);\n }\n\n public stop(): void {\n this.running = false;\n if (this.retryTimeout !== null) clearTimeout(this.retryTimeout);\n this.retryTimeout = null;\n this.client.removeListener(ClientEvent.Sync, this.onResumedSync);\n }\n\n public async queueBatch(batch: ToDeviceBatch): Promise<void> {\n const batches: ToDeviceBatchWithTxnId[] = [];\n for (let i = 0; i < batch.batch.length; i += MAX_BATCH_SIZE) {\n const batchWithTxnId = {\n eventType: batch.eventType,\n batch: batch.batch.slice(i, i + MAX_BATCH_SIZE),\n txnId: this.client.makeTxnId(),\n };\n batches.push(batchWithTxnId);\n const msgmap = batchWithTxnId.batch.map(\n (msg) => `${msg.userId}/${msg.deviceId} (msgid ${msg.payload[ToDeviceMessageId]})`,\n );\n this.logger.info(\n `Enqueuing batch of to-device messages. type=${batch.eventType} txnid=${batchWithTxnId.txnId}`,\n msgmap,\n );\n }\n\n await this.client.store.saveToDeviceBatches(batches);\n this.sendQueue();\n }\n\n public sendQueue = async (): Promise<void> => {\n if (this.retryTimeout !== null) clearTimeout(this.retryTimeout);\n this.retryTimeout = null;\n\n if (this.sending || !this.running) return;\n\n this.logger.debug(\"Attempting to send queued to-device messages\");\n\n this.sending = true;\n let headBatch: IndexedToDeviceBatch | null;\n try {\n while (this.running) {\n headBatch = await this.client.store.getOldestToDeviceBatch();\n if (headBatch === null) break;\n await this.sendBatch(headBatch);\n await this.client.store.removeToDeviceBatch(headBatch.id);\n this.retryAttempts = 0;\n }\n\n // Make sure we're still running after the async tasks: if not, stop.\n if (!this.running) return;\n\n this.logger.debug(\"All queued to-device messages sent\");\n } catch (e) {\n ++this.retryAttempts;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n // eslint-disable-next-line new-cap\n const retryDelay = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(null, this.retryAttempts, <MatrixError>e);\n if (retryDelay === -1) {\n // the scheduler function doesn't differentiate between fatal errors and just getting\n // bored and giving up for now\n if (Math.floor((<MatrixError>e).httpStatus! / 100) === 4) {\n this.logger.error(\"Fatal error when sending to-device message - dropping to-device batch!\", e);\n await this.client.store.removeToDeviceBatch(headBatch!.id);\n } else {\n this.logger.info(\"Automatic retry limit reached for to-device messages.\");\n }\n return;\n }\n\n this.logger.info(`Failed to send batch of to-device messages. Will retry in ${retryDelay}ms`, e);\n this.retryTimeout = setTimeout(this.sendQueue, retryDelay);\n } finally {\n this.sending = false;\n }\n };\n\n /**\n * Attempts to send a batch of to-device messages.\n */\n private async sendBatch(batch: IndexedToDeviceBatch): Promise<void> {\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const item of batch.batch) {\n contentMap.getOrCreate(item.userId).set(item.deviceId, item.payload);\n }\n\n this.logger.info(\n `Sending batch of ${batch.batch.length} to-device messages with ID ${batch.id} and txnId ${batch.txnId}`,\n );\n\n await this.client.sendToDevice(batch.eventType, contentMap, batch.txnId);\n }\n\n /**\n * Listen to sync state changes and automatically resend any pending events\n * once syncing is resumed\n */\n private onResumedSync = (state: SyncState | null, oldState: SyncState | null): void => {\n if (state === SyncState.Syncing && oldState !== SyncState.Syncing) {\n this.logger.info(`Resuming queue after resumed sync`);\n this.sendQueue();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ToDeviceMessageQueue.js","names":[],"sources":["../src/ToDeviceMessageQueue.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { ToDeviceMessageId } from \"./@types/event.ts\";\nimport { type Logger } from \"./logger.ts\";\nimport { type MatrixClient, ClientEvent } from \"./client.ts\";\nimport { type MatrixError } from \"./http-api/index.ts\";\nimport {\n type IndexedToDeviceBatch,\n type ToDeviceBatch,\n type ToDeviceBatchWithTxnId,\n type ToDevicePayload,\n} from \"./models/ToDeviceMessage.ts\";\nimport { MatrixScheduler } from \"./scheduler.ts\";\nimport { SyncState } from \"./sync.ts\";\nimport { MapWithDefault } from \"./utils.ts\";\n\nconst MAX_BATCH_SIZE = 20;\n\n/**\n * Maintains a queue of outgoing to-device messages, sending them\n * as soon as the homeserver is reachable.\n */\nexport class ToDeviceMessageQueue {\n private sending = false;\n private running = true;\n private retryTimeout: ReturnType<typeof setTimeout> | null = null;\n private retryAttempts = 0;\n\n public constructor(\n private client: MatrixClient,\n private readonly logger: Logger,\n ) {}\n\n public start(): void {\n this.running = true;\n this.sendQueue();\n this.client.on(ClientEvent.Sync, this.onResumedSync);\n }\n\n public stop(): void {\n this.running = false;\n if (this.retryTimeout !== null) clearTimeout(this.retryTimeout);\n this.retryTimeout = null;\n this.client.removeListener(ClientEvent.Sync, this.onResumedSync);\n }\n\n public async queueBatch(batch: ToDeviceBatch): Promise<void> {\n const batches: ToDeviceBatchWithTxnId[] = [];\n for (let i = 0; i < batch.batch.length; i += MAX_BATCH_SIZE) {\n const batchWithTxnId = {\n eventType: batch.eventType,\n batch: batch.batch.slice(i, i + MAX_BATCH_SIZE),\n txnId: this.client.makeTxnId(),\n };\n batches.push(batchWithTxnId);\n const msgmap = batchWithTxnId.batch.map(\n (msg) => `${msg.userId}/${msg.deviceId} (msgid ${msg.payload[ToDeviceMessageId]})`,\n );\n this.logger.info(\n `Enqueuing batch of to-device messages. type=${batch.eventType} txnid=${batchWithTxnId.txnId}`,\n msgmap,\n );\n }\n\n await this.client.store.saveToDeviceBatches(batches);\n void this.sendQueue();\n }\n\n public sendQueue = async (): Promise<void> => {\n if (this.retryTimeout !== null) clearTimeout(this.retryTimeout);\n this.retryTimeout = null;\n\n if (this.sending || !this.running) return;\n\n this.logger.debug(\"Attempting to send queued to-device messages\");\n\n this.sending = true;\n let headBatch: IndexedToDeviceBatch | null;\n try {\n while (this.running) {\n headBatch = await this.client.store.getOldestToDeviceBatch();\n if (headBatch === null) break;\n await this.sendBatch(headBatch);\n await this.client.store.removeToDeviceBatch(headBatch.id);\n this.retryAttempts = 0;\n }\n\n // Make sure we're still running after the async tasks: if not, stop.\n if (!this.running) return;\n\n this.logger.debug(\"All queued to-device messages sent\");\n } catch (e) {\n ++this.retryAttempts;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n // eslint-disable-next-line new-cap\n const retryDelay = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(null, this.retryAttempts, <MatrixError>e);\n if (retryDelay === -1) {\n // the scheduler function doesn't differentiate between fatal errors and just getting\n // bored and giving up for now\n if (Math.floor((<MatrixError>e).httpStatus! / 100) === 4) {\n this.logger.error(\"Fatal error when sending to-device message - dropping to-device batch!\", e);\n await this.client.store.removeToDeviceBatch(headBatch!.id);\n } else {\n this.logger.info(\"Automatic retry limit reached for to-device messages.\");\n }\n return;\n }\n\n this.logger.info(`Failed to send batch of to-device messages. Will retry in ${retryDelay}ms`, e);\n this.retryTimeout = setTimeout(this.sendQueue, retryDelay);\n } finally {\n this.sending = false;\n }\n };\n\n /**\n * Attempts to send a batch of to-device messages.\n */\n private async sendBatch(batch: IndexedToDeviceBatch): Promise<void> {\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const item of batch.batch) {\n contentMap.getOrCreate(item.userId).set(item.deviceId, item.payload);\n }\n\n this.logger.info(\n `Sending batch of ${batch.batch.length} to-device messages with ID ${batch.id} and txnId ${batch.txnId}`,\n );\n\n await this.client.sendToDevice(batch.eventType, contentMap, batch.txnId);\n }\n\n /**\n * Listen to sync state changes and automatically resend any pending events\n * once syncing is resumed\n */\n private onResumedSync = (state: SyncState | null, oldState: SyncState | null): void => {\n if (state === SyncState.Syncing && oldState !== SyncState.Syncing) {\n this.logger.info(`Resuming queue after resumed sync`);\n void this.sendQueue();\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}