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 2022 The Matrix.org Foundation C.I.C.
7
5
 
@@ -30,16 +28,15 @@ import { anySignal, parseErrorResponse, timeoutSignal } from "./utils.js";
30
28
  import { TokenRefresher, TokenRefreshOutcome } from "./refresh.js";
31
29
  export class FetchHttpApi {
32
30
  constructor(eventEmitter, opts) {
33
- var _opts$useAuthorizatio;
34
- this.eventEmitter = eventEmitter;
35
- this.opts = opts;
36
31
  _defineProperty(this, "abortController", new AbortController());
37
32
  _defineProperty(this, "tokenRefresher", void 0);
33
+ this.eventEmitter = eventEmitter;
34
+ this.opts = opts;
38
35
  checkObjectHasKeys(opts, ["baseUrl", "prefix"]);
39
36
  if (!opts.onlyData) {
40
37
  throw new Error("Constructing FetchHttpApi without `onlyData=true` is no longer supported.");
41
38
  }
42
- opts.useAuthorizationHeader = (_opts$useAuthorizatio = opts.useAuthorizationHeader) !== null && _opts$useAuthorizatio !== void 0 ? _opts$useAuthorizatio : true;
39
+ opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;
43
40
  this.tokenRefresher = new TokenRefresher(opts);
44
41
  }
45
42
  abort() {
@@ -64,20 +61,20 @@ export class FetchHttpApi {
64
61
  if (!this.opts.idBaseUrl) {
65
62
  throw new Error("No identity server base URL set");
66
63
  }
67
- var queryParams = undefined;
68
- var body = undefined;
64
+ let queryParams = undefined;
65
+ let body = undefined;
69
66
  if (method === Method.Get) {
70
67
  queryParams = params;
71
68
  } else {
72
69
  body = params;
73
70
  }
74
- var fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);
75
- var opts = {
71
+ const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);
72
+ const opts = {
76
73
  json: true,
77
74
  headers: {}
78
75
  };
79
76
  if (accessToken) {
80
- opts.headers.Authorization = "Bearer ".concat(accessToken);
77
+ opts.headers.Authorization = `Bearer ${accessToken}`;
81
78
  }
82
79
  return this.requestOtherUrl(method, fullUri, body, opts);
83
80
  }
@@ -100,66 +97,58 @@ export class FetchHttpApi {
100
97
  * @returns The parsed response.
101
98
  * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
102
99
  */
103
- authedRequest(method, path) {
104
- var queryParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
105
- var body = arguments.length > 3 ? arguments[3] : undefined;
106
- var paramOpts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
100
+ authedRequest(method, path, queryParams = {}, body, paramOpts = {}) {
107
101
  return this.doAuthedRequest(1, method, path, queryParams, body, paramOpts);
108
102
  }
109
103
 
110
104
  // Wrapper around public method authedRequest to allow for tracking retry attempt counts
111
- doAuthedRequest(attempt, method, path, queryParams, body) {
112
- var _arguments = arguments,
113
- _this = this;
114
- return _asyncToGenerator(function* () {
115
- var paramOpts = _arguments.length > 5 && _arguments[5] !== undefined ? _arguments[5] : {};
116
- // avoid mutating paramOpts so they can be used on retry
117
- var opts = deepCopy(paramOpts);
118
- // we have to manually copy the abortSignal over as it is not a plain object
119
- opts.abortSignal = paramOpts.abortSignal;
105
+ async doAuthedRequest(attempt, method, path, queryParams, body, paramOpts = {}) {
106
+ // avoid mutating paramOpts so they can be used on retry
107
+ const opts = deepCopy(paramOpts);
108
+ // we have to manually copy the abortSignal over as it is not a plain object
109
+ opts.abortSignal = paramOpts.abortSignal;
120
110
 
121
- // Take a snapshot of the current token state before we start the request so we can reference it if we error
122
- var requestSnapshot = yield _this.tokenRefresher.prepareForRequest();
123
- if (requestSnapshot.accessToken) {
124
- if (_this.opts.useAuthorizationHeader) {
125
- if (!opts.headers) {
126
- opts.headers = {};
127
- }
128
- if (!opts.headers.Authorization) {
129
- opts.headers.Authorization = "Bearer ".concat(requestSnapshot.accessToken);
130
- }
131
- if (queryParams.access_token) {
132
- delete queryParams.access_token;
133
- }
134
- } else if (!queryParams.access_token) {
135
- queryParams.access_token = requestSnapshot.accessToken;
111
+ // Take a snapshot of the current token state before we start the request so we can reference it if we error
112
+ const requestSnapshot = await this.tokenRefresher.prepareForRequest();
113
+ if (requestSnapshot.accessToken) {
114
+ if (this.opts.useAuthorizationHeader) {
115
+ if (!opts.headers) {
116
+ opts.headers = {};
136
117
  }
137
- }
138
- try {
139
- var response = yield _this.request(method, path, queryParams, body, opts);
140
- return response;
141
- } catch (error) {
142
- if (!(error instanceof MatrixError)) {
143
- throw error;
118
+ if (!opts.headers.Authorization) {
119
+ opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;
144
120
  }
145
- if (error.errcode === "M_UNKNOWN_TOKEN") {
146
- var outcome = yield _this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);
147
- if (outcome === TokenRefreshOutcome.Success) {
148
- // if we got a new token retry the request
149
- return _this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);
150
- }
151
- if (outcome === TokenRefreshOutcome.Failure) {
152
- throw new TokenRefreshError(error);
153
- }
154
- if (!(opts !== null && opts !== void 0 && opts.inhibitLogoutEmit)) {
155
- _this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);
156
- }
157
- } else if (error.errcode == "M_CONSENT_NOT_GIVEN") {
158
- _this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);
121
+ if (queryParams.access_token) {
122
+ delete queryParams.access_token;
159
123
  }
124
+ } else if (!queryParams.access_token) {
125
+ queryParams.access_token = requestSnapshot.accessToken;
126
+ }
127
+ }
128
+ try {
129
+ const response = await this.request(method, path, queryParams, body, opts);
130
+ return response;
131
+ } catch (error) {
132
+ if (!(error instanceof MatrixError)) {
160
133
  throw error;
161
134
  }
162
- })();
135
+ if (error.errcode === "M_UNKNOWN_TOKEN") {
136
+ const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);
137
+ if (outcome === TokenRefreshOutcome.Success) {
138
+ // if we got a new token retry the request
139
+ return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);
140
+ }
141
+ if (outcome === TokenRefreshOutcome.Failure) {
142
+ throw new TokenRefreshError(error);
143
+ }
144
+ if (!opts?.inhibitLogoutEmit) {
145
+ this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);
146
+ }
147
+ } else if (error.errcode == "M_CONSENT_NOT_GIVEN") {
148
+ this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);
149
+ }
150
+ throw error;
151
+ }
163
152
  }
164
153
 
165
154
  /**
@@ -179,7 +168,7 @@ export class FetchHttpApi {
179
168
  * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
180
169
  */
181
170
  request(method, path, queryParams, body, opts) {
182
- var fullUri = this.getUrl(path, queryParams, opts === null || opts === void 0 ? void 0 : opts.prefix, opts === null || opts === void 0 ? void 0 : opts.baseUrl);
171
+ const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);
183
172
  return this.requestOtherUrl(method, fullUri, body, opts);
184
173
  }
185
174
 
@@ -195,115 +184,108 @@ export class FetchHttpApi {
195
184
  * @returns The parsed response.
196
185
  * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.
197
186
  */
198
- requestOtherUrl(method, url, body) {
199
- var _arguments2 = arguments,
200
- _this2 = this;
201
- return _asyncToGenerator(function* () {
202
- var _this2$opts$logger, _opts$localTimeoutMs, _opts$keepAlive, _body$constructor;
203
- var opts = _arguments2.length > 3 && _arguments2[3] !== undefined ? _arguments2[3] : {};
204
- if (opts.json !== undefined && opts.rawResponseBody !== undefined) {
205
- throw new Error("Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`");
206
- }
207
- var urlForLogs = _this2.sanitizeUrlForLogs(url);
208
- (_this2$opts$logger = _this2.opts.logger) === null || _this2$opts$logger === void 0 || _this2$opts$logger.debug("FetchHttpApi: --> ".concat(method, " ").concat(urlForLogs));
209
- var headers = Object.assign({}, opts.headers || {});
210
- var jsonResponse = !opts.rawResponseBody && opts.json !== false;
211
- if (jsonResponse) {
212
- if (!headers["Accept"]) {
213
- headers["Accept"] = "application/json";
214
- }
215
- }
216
- var timeout = (_opts$localTimeoutMs = opts.localTimeoutMs) !== null && _opts$localTimeoutMs !== void 0 ? _opts$localTimeoutMs : _this2.opts.localTimeoutMs;
217
- var keepAlive = (_opts$keepAlive = opts.keepAlive) !== null && _opts$keepAlive !== void 0 ? _opts$keepAlive : false;
218
- var signals = [_this2.abortController.signal];
219
- if (timeout !== undefined) {
220
- signals.push(timeoutSignal(timeout));
221
- }
222
- if (opts.abortSignal) {
223
- signals.push(opts.abortSignal);
187
+ async requestOtherUrl(method, url, body, opts = {}) {
188
+ if (opts.json !== undefined && opts.rawResponseBody !== undefined) {
189
+ throw new Error("Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`");
190
+ }
191
+ const urlForLogs = this.sanitizeUrlForLogs(url);
192
+ this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);
193
+ const headers = Object.assign({}, opts.headers || {});
194
+ const jsonResponse = !opts.rawResponseBody && opts.json !== false;
195
+ if (jsonResponse) {
196
+ if (!headers["Accept"]) {
197
+ headers["Accept"] = "application/json";
224
198
  }
199
+ }
200
+ const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;
201
+ const keepAlive = opts.keepAlive ?? false;
202
+ const signals = [this.abortController.signal];
203
+ if (timeout !== undefined) {
204
+ signals.push(timeoutSignal(timeout));
205
+ }
206
+ if (opts.abortSignal) {
207
+ signals.push(opts.abortSignal);
208
+ }
225
209
 
226
- // If the body is an object, encode it as JSON and set the `Content-Type` header,
227
- // unless that has been explicitly inhibited by setting `opts.json: false`.
228
- // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref
229
- var data;
230
- if (opts.json !== false && (body === null || body === void 0 || (_body$constructor = body.constructor) === null || _body$constructor === void 0 ? void 0 : _body$constructor.name) === Object.name) {
231
- data = JSON.stringify(body);
232
- if (!headers["Content-Type"]) {
233
- headers["Content-Type"] = "application/json";
234
- }
235
- } else {
236
- data = body;
210
+ // If the body is an object, encode it as JSON and set the `Content-Type` header,
211
+ // unless that has been explicitly inhibited by setting `opts.json: false`.
212
+ // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref
213
+ let data;
214
+ if (opts.json !== false && body?.constructor?.name === Object.name) {
215
+ data = JSON.stringify(body);
216
+ if (!headers["Content-Type"]) {
217
+ headers["Content-Type"] = "application/json";
237
218
  }
238
- var _anySignal = anySignal(signals),
239
- signal = _anySignal.signal,
240
- cleanup = _anySignal.cleanup;
219
+ } else {
220
+ data = body;
221
+ }
222
+ const {
223
+ signal,
224
+ cleanup
225
+ } = anySignal(signals);
241
226
 
242
- // Set cache mode based on presence of Authorization header.
243
- // Browsers/proxies do not cache responses to requests with Authorization headers.
244
- // So specifying "no-cache" is redundant, and actually prevents caching
245
- // of preflight requests in CORS scenarios. As such, we only set "no-cache"
246
- // when there is no Authorization header.
247
- var cacheMode = "Authorization" in headers ? undefined : "no-cache";
248
- var res;
249
- var start = Date.now();
250
- try {
251
- var _this2$opts$logger2;
252
- res = yield _this2.fetch(url, {
253
- signal,
254
- method,
255
- body: data,
256
- headers,
257
- mode: "cors",
258
- redirect: "follow",
259
- referrer: "",
260
- referrerPolicy: "no-referrer",
261
- cache: cacheMode,
262
- credentials: "omit",
263
- // we send credentials via headers
264
- keepalive: keepAlive,
265
- priority: opts.priority
266
- });
267
- (_this2$opts$logger2 = _this2.opts.logger) === null || _this2$opts$logger2 === void 0 || _this2$opts$logger2.debug("FetchHttpApi: <-- ".concat(method, " ").concat(urlForLogs, " [").concat(Date.now() - start, "ms ").concat(res.status, "]"));
268
- } catch (e) {
269
- var _this2$opts$logger3;
270
- (_this2$opts$logger3 = _this2.opts.logger) === null || _this2$opts$logger3 === void 0 || _this2$opts$logger3.debug("FetchHttpApi: <-- ".concat(method, " ").concat(urlForLogs, " [").concat(Date.now() - start, "ms ").concat(e, "]"));
271
- if (e.name === "AbortError") {
272
- throw e;
273
- }
274
- throw new ConnectionError("fetch failed", e);
275
- } finally {
276
- cleanup();
277
- }
278
- if (!res.ok) {
279
- throw parseErrorResponse(res, yield res.text());
280
- }
281
- if (opts.rawResponseBody) {
282
- return yield res.blob();
283
- } else if (jsonResponse) {
284
- return yield res.json();
285
- } else {
286
- return yield res.text();
227
+ // Set cache mode based on presence of Authorization header.
228
+ // Browsers/proxies do not cache responses to requests with Authorization headers.
229
+ // So specifying "no-cache" is redundant, and actually prevents caching
230
+ // of preflight requests in CORS scenarios. As such, we only set "no-cache"
231
+ // when there is no Authorization header.
232
+ const cacheMode = "Authorization" in headers ? undefined : "no-cache";
233
+ let res;
234
+ const start = Date.now();
235
+ try {
236
+ res = await this.fetch(url, {
237
+ signal,
238
+ method,
239
+ body: data,
240
+ headers,
241
+ mode: "cors",
242
+ redirect: "follow",
243
+ referrer: "",
244
+ referrerPolicy: "no-referrer",
245
+ cache: cacheMode,
246
+ credentials: "omit",
247
+ // we send credentials via headers
248
+ keepalive: keepAlive,
249
+ priority: opts.priority
250
+ });
251
+ this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`);
252
+ } catch (e) {
253
+ this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);
254
+ if (e.name === "AbortError") {
255
+ throw e;
287
256
  }
288
- })();
257
+ throw new ConnectionError("fetch failed", e);
258
+ } finally {
259
+ cleanup();
260
+ }
261
+ if (!res.ok) {
262
+ throw parseErrorResponse(res, await res.text());
263
+ }
264
+ if (opts.rawResponseBody) {
265
+ return await res.blob();
266
+ } else if (jsonResponse) {
267
+ return await res.json();
268
+ } else {
269
+ return await res.text();
270
+ }
289
271
  }
290
272
  sanitizeUrlForLogs(url) {
291
273
  try {
292
- var asUrl;
274
+ let asUrl;
293
275
  if (typeof url === "string") {
294
276
  asUrl = new URL(url);
295
277
  } else {
296
278
  asUrl = url;
297
279
  }
298
280
  // Remove the values of any URL params that could contain potential secrets
299
- var sanitizedQs = new URLSearchParams();
300
- for (var key of asUrl.searchParams.keys()) {
281
+ const sanitizedQs = new URLSearchParams();
282
+ for (const key of asUrl.searchParams.keys()) {
301
283
  sanitizedQs.append(key, "xxx");
302
284
  }
303
- var sanitizedQsString = sanitizedQs.toString();
304
- var sanitizedQsUrlPiece = sanitizedQsString ? "?".concat(sanitizedQsString) : "";
285
+ const sanitizedQsString = sanitizedQs.toString();
286
+ const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : "";
305
287
  return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;
306
- } catch (_unused) {
288
+ } catch {
307
289
  // defensive coding for malformed url
308
290
  return "??";
309
291
  }
@@ -317,12 +299,12 @@ export class FetchHttpApi {
317
299
  * @returns URL
318
300
  */
319
301
  getUrl(path, queryParams, prefix, baseUrl) {
320
- var baseUrlWithFallback = baseUrl !== null && baseUrl !== void 0 ? baseUrl : this.opts.baseUrl;
321
- var baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith("/") ? baseUrlWithFallback.slice(0, -1) : baseUrlWithFallback;
322
- var url = new URL(baseUrlWithoutTrailingSlash + (prefix !== null && prefix !== void 0 ? prefix : this.opts.prefix) + path);
302
+ const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;
303
+ const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith("/") ? baseUrlWithFallback.slice(0, -1) : baseUrlWithFallback;
304
+ const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);
323
305
  // If there are any params, encode and append them to the URL.
324
306
  if (this.opts.extraParams || queryParams) {
325
- var mergedParams = _objectSpread(_objectSpread({}, this.opts.extraParams), queryParams);
307
+ const mergedParams = _objectSpread(_objectSpread({}, this.opts.extraParams), queryParams);
326
308
  encodeParams(mergedParams, url.searchParams);
327
309
  }
328
310
  return url;
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","names":["checkObjectHasKeys","deepCopy","encodeParams","Method","ConnectionError","MatrixError","TokenRefreshError","HttpApiEvent","anySignal","parseErrorResponse","timeoutSignal","TokenRefresher","TokenRefreshOutcome","FetchHttpApi","constructor","eventEmitter","opts","_opts$useAuthorizatio","_defineProperty","AbortController","onlyData","Error","useAuthorizationHeader","tokenRefresher","abort","abortController","fetch","resource","options","fetchFn","globalThis","setIdBaseUrl","url","idBaseUrl","idServerRequest","method","path","params","prefix","accessToken","queryParams","undefined","body","Get","fullUri","getUrl","json","headers","Authorization","concat","requestOtherUrl","authedRequest","arguments","length","paramOpts","doAuthedRequest","attempt","_arguments","_this","_asyncToGenerator","abortSignal","requestSnapshot","prepareForRequest","access_token","response","request","error","errcode","outcome","handleUnknownToken","Success","Failure","inhibitLogoutEmit","emit","SessionLoggedOut","NoConsent","message","data","consent_uri","baseUrl","_arguments2","_this2","_this2$opts$logger","_opts$localTimeoutMs","_opts$keepAlive","_body$constructor","rawResponseBody","urlForLogs","sanitizeUrlForLogs","logger","debug","Object","assign","jsonResponse","timeout","localTimeoutMs","keepAlive","signals","signal","push","name","JSON","stringify","_anySignal","cleanup","cacheMode","res","start","Date","now","_this2$opts$logger2","mode","redirect","referrer","referrerPolicy","cache","credentials","keepalive","priority","status","e","_this2$opts$logger3","ok","text","blob","asUrl","URL","sanitizedQs","URLSearchParams","key","searchParams","keys","append","sanitizedQsString","toString","sanitizedQsUrlPiece","origin","pathname","_unused","baseUrlWithFallback","baseUrlWithoutTrailingSlash","endsWith","slice","extraParams","mergedParams","_objectSpread"],"sources":["../../src/http-api/fetch.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\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fetch.js","names":[],"sources":["../../src/http-api/fetch.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\n/**\n * This is an internal module. See {@link MatrixHttpApi} for the public class.\n */\n\nimport { checkObjectHasKeys, deepCopy, encodeParams } from \"../utils.ts\";\nimport { type TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { Method } from \"./method.ts\";\nimport { ConnectionError, MatrixError, TokenRefreshError } from \"./errors.ts\";\nimport {\n type BaseRequestOpts,\n HttpApiEvent,\n type HttpApiEventHandlerMap,\n type IHttpOpts,\n type IRequestOpts,\n type Body,\n} from \"./interface.ts\";\nimport { anySignal, parseErrorResponse, timeoutSignal } from \"./utils.ts\";\nimport { type QueryDict } from \"../utils.ts\";\nimport { TokenRefresher, TokenRefreshOutcome } from \"./refresh.ts\";\n\nexport class FetchHttpApi<O extends IHttpOpts> {\n private abortController = new AbortController();\n private readonly tokenRefresher: TokenRefresher;\n\n public constructor(\n private eventEmitter: TypedEventEmitter<HttpApiEvent, HttpApiEventHandlerMap>,\n public readonly opts: O,\n ) {\n checkObjectHasKeys(opts, [\"baseUrl\", \"prefix\"]);\n if (!opts.onlyData) {\n throw new Error(\"Constructing FetchHttpApi without `onlyData=true` is no longer supported.\");\n }\n opts.useAuthorizationHeader = opts.useAuthorizationHeader ?? true;\n\n this.tokenRefresher = new TokenRefresher(opts);\n }\n\n public abort(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n public fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof globalThis.fetch> {\n if (this.opts.fetchFn) {\n return this.opts.fetchFn(resource, options);\n }\n return globalThis.fetch(resource, options);\n }\n\n /**\n * Sets the base URL for the identity server\n * @param url - The new base url\n */\n public setIdBaseUrl(url?: string): void {\n this.opts.idBaseUrl = url;\n }\n\n public idServerRequest<T extends object = Record<string, unknown>>(\n method: Method,\n path: string,\n params: Record<string, string | string[]> | undefined,\n prefix: string,\n accessToken?: string,\n ): Promise<T> {\n if (!this.opts.idBaseUrl) {\n throw new Error(\"No identity server base URL set\");\n }\n\n let queryParams: QueryDict | undefined = undefined;\n let body: Record<string, string | string[]> | undefined = undefined;\n if (method === Method.Get) {\n queryParams = params;\n } else {\n body = params;\n }\n\n const fullUri = this.getUrl(path, queryParams, prefix, this.opts.idBaseUrl);\n\n const opts: IRequestOpts = {\n json: true,\n headers: {},\n };\n if (accessToken) {\n opts.headers!.Authorization = `Bearer ${accessToken}`;\n }\n\n return this.requestOtherUrl(method, fullUri, body, opts);\n }\n\n /**\n * Perform an authorised request to the homeserver.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param paramOpts - additional options.\n * When `paramOpts.doNotAttemptTokenRefresh` is true, token refresh will not be attempted\n * when an expired token is encountered. Used to only attempt token refresh once.\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public authedRequest<T>(\n method: Method,\n path: string,\n queryParams: QueryDict = {},\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n return this.doAuthedRequest<T>(1, method, path, queryParams, body, paramOpts);\n }\n\n // Wrapper around public method authedRequest to allow for tracking retry attempt counts\n private async doAuthedRequest<T>(\n attempt: number,\n method: Method,\n path: string,\n queryParams: QueryDict,\n body?: Body,\n paramOpts: IRequestOpts = {},\n ): Promise<T> {\n // avoid mutating paramOpts so they can be used on retry\n const opts = deepCopy(paramOpts);\n // we have to manually copy the abortSignal over as it is not a plain object\n opts.abortSignal = paramOpts.abortSignal;\n\n // Take a snapshot of the current token state before we start the request so we can reference it if we error\n const requestSnapshot = await this.tokenRefresher.prepareForRequest();\n if (requestSnapshot.accessToken) {\n if (this.opts.useAuthorizationHeader) {\n if (!opts.headers) {\n opts.headers = {};\n }\n if (!opts.headers.Authorization) {\n opts.headers.Authorization = `Bearer ${requestSnapshot.accessToken}`;\n }\n if (queryParams.access_token) {\n delete queryParams.access_token;\n }\n } else if (!queryParams.access_token) {\n queryParams.access_token = requestSnapshot.accessToken;\n }\n }\n\n try {\n const response = await this.request<T>(method, path, queryParams, body, opts);\n return response;\n } catch (error) {\n if (!(error instanceof MatrixError)) {\n throw error;\n }\n\n if (error.errcode === \"M_UNKNOWN_TOKEN\") {\n const outcome = await this.tokenRefresher.handleUnknownToken(requestSnapshot, attempt);\n if (outcome === TokenRefreshOutcome.Success) {\n // if we got a new token retry the request\n return this.doAuthedRequest(attempt + 1, method, path, queryParams, body, paramOpts);\n }\n if (outcome === TokenRefreshOutcome.Failure) {\n throw new TokenRefreshError(error);\n }\n\n if (!opts?.inhibitLogoutEmit) {\n this.eventEmitter.emit(HttpApiEvent.SessionLoggedOut, error);\n }\n } else if (error.errcode == \"M_CONSENT_NOT_GIVEN\") {\n this.eventEmitter.emit(HttpApiEvent.NoConsent, error.message, error.data.consent_uri);\n }\n\n throw error;\n }\n }\n\n /**\n * Perform a request to the homeserver without any credentials.\n * @param method - The HTTP method e.g. \"GET\".\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g.\n * \"/createRoom\".\n *\n * @param queryParams - A dict of query params (these will NOT be\n * urlencoded). If unspecified, there will be no query params.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public request<T>(\n method: Method,\n path: string,\n queryParams?: QueryDict,\n body?: Body,\n opts?: IRequestOpts,\n ): Promise<T> {\n const fullUri = this.getUrl(path, queryParams, opts?.prefix, opts?.baseUrl);\n return this.requestOtherUrl<T>(method, fullUri, body, opts);\n }\n\n /**\n * Perform a request to an arbitrary URL.\n * @param method - The HTTP method e.g. \"GET\".\n * @param url - The HTTP URL object.\n *\n * @param body - The HTTP JSON body.\n *\n * @param opts - additional options\n *\n * @returns The parsed response.\n * @throws Error if a problem occurred. This includes network problems and Matrix-specific error JSON.\n */\n public async requestOtherUrl<T>(\n method: Method,\n url: URL | string,\n body?: Body,\n opts: BaseRequestOpts = {},\n ): Promise<T> {\n if (opts.json !== undefined && opts.rawResponseBody !== undefined) {\n throw new Error(\"Invalid call to `FetchHttpApi` sets both `opts.json` and `opts.rawResponseBody`\");\n }\n\n const urlForLogs = this.sanitizeUrlForLogs(url);\n\n this.opts.logger?.debug(`FetchHttpApi: --> ${method} ${urlForLogs}`);\n\n const headers = Object.assign({}, opts.headers || {});\n\n const jsonResponse = !opts.rawResponseBody && opts.json !== false;\n if (jsonResponse) {\n if (!headers[\"Accept\"]) {\n headers[\"Accept\"] = \"application/json\";\n }\n }\n\n const timeout = opts.localTimeoutMs ?? this.opts.localTimeoutMs;\n const keepAlive = opts.keepAlive ?? false;\n const signals = [this.abortController.signal];\n if (timeout !== undefined) {\n signals.push(timeoutSignal(timeout));\n }\n if (opts.abortSignal) {\n signals.push(opts.abortSignal);\n }\n\n // If the body is an object, encode it as JSON and set the `Content-Type` header,\n // unless that has been explicitly inhibited by setting `opts.json: false`.\n // We can't use getPrototypeOf here as objects made in other contexts e.g. over postMessage won't have same ref\n let data: BodyInit;\n if (opts.json !== false && body?.constructor?.name === Object.name) {\n data = JSON.stringify(body);\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n } else {\n data = body as BodyInit;\n }\n\n const { signal, cleanup } = anySignal(signals);\n\n // Set cache mode based on presence of Authorization header.\n // Browsers/proxies do not cache responses to requests with Authorization headers.\n // So specifying \"no-cache\" is redundant, and actually prevents caching\n // of preflight requests in CORS scenarios. As such, we only set \"no-cache\"\n // when there is no Authorization header.\n const cacheMode = \"Authorization\" in headers ? undefined : \"no-cache\";\n\n let res: Response;\n const start = Date.now();\n try {\n res = await this.fetch(url, {\n signal,\n method,\n body: data,\n headers,\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"\",\n referrerPolicy: \"no-referrer\",\n cache: cacheMode,\n credentials: \"omit\", // we send credentials via headers\n keepalive: keepAlive,\n priority: opts.priority,\n });\n\n this.opts.logger?.debug(\n `FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${res.status}]`,\n );\n } catch (e) {\n this.opts.logger?.debug(`FetchHttpApi: <-- ${method} ${urlForLogs} [${Date.now() - start}ms ${e}]`);\n if ((<Error>e).name === \"AbortError\") {\n throw e;\n }\n throw new ConnectionError(\"fetch failed\", <Error>e);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n throw parseErrorResponse(res, await res.text());\n }\n\n if (opts.rawResponseBody) {\n return (await res.blob()) as T;\n } else if (jsonResponse) {\n return await res.json();\n } else {\n return (await res.text()) as T;\n }\n }\n\n private sanitizeUrlForLogs(url: URL | string): string {\n try {\n let asUrl: URL;\n if (typeof url === \"string\") {\n asUrl = new URL(url);\n } else {\n asUrl = url;\n }\n // Remove the values of any URL params that could contain potential secrets\n const sanitizedQs = new URLSearchParams();\n for (const key of asUrl.searchParams.keys()) {\n sanitizedQs.append(key, \"xxx\");\n }\n const sanitizedQsString = sanitizedQs.toString();\n const sanitizedQsUrlPiece = sanitizedQsString ? `?${sanitizedQsString}` : \"\";\n\n return asUrl.origin + asUrl.pathname + sanitizedQsUrlPiece;\n } catch {\n // defensive coding for malformed url\n return \"??\";\n }\n }\n /**\n * Form and return a homeserver request URL based on the given path params and prefix.\n * @param path - The HTTP path <b>after</b> the supplied prefix e.g. \"/createRoom\".\n * @param queryParams - A dict of query params (these will NOT be urlencoded).\n * @param prefix - The full prefix to use e.g. \"/_matrix/client/v2_alpha\", defaulting to this.opts.prefix.\n * @param baseUrl - The baseUrl to use e.g. \"https://matrix.org\", defaulting to this.opts.baseUrl.\n * @returns URL\n */\n public getUrl(path: string, queryParams?: QueryDict, prefix?: string, baseUrl?: string): URL {\n const baseUrlWithFallback = baseUrl ?? this.opts.baseUrl;\n const baseUrlWithoutTrailingSlash = baseUrlWithFallback.endsWith(\"/\")\n ? baseUrlWithFallback.slice(0, -1)\n : baseUrlWithFallback;\n const url = new URL(baseUrlWithoutTrailingSlash + (prefix ?? this.opts.prefix) + path);\n // If there are any params, encode and append them to the URL.\n if (this.opts.extraParams || queryParams) {\n const mergedParams = { ...this.opts.extraParams, ...queryParams };\n encodeParams(mergedParams, url.searchParams);\n }\n\n return url;\n }\n}\n"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,SAAS,kBAAkB,EAAE,QAAQ,EAAE,YAAY,QAAQ,aAAa;AAExE,SAAS,MAAM,QAAQ,aAAa;AACpC,SAAS,eAAe,EAAE,WAAW,EAAE,iBAAiB,QAAQ,aAAa;AAC7E,SAEI,YAAY,QAKT,gBAAgB;AACvB,SAAS,SAAS,EAAE,kBAAkB,EAAE,aAAa,QAAQ,YAAY;AAEzE,SAAS,cAAc,EAAE,mBAAmB,QAAQ,cAAc;AAElE,OAAO,MAAM,YAAY,CAAsB;EAIpC,WAAW,CACN,YAAqE,EAC7D,IAAO,EACzB;IAAA,yCANwB,IAAI,eAAe,CAAC,CAAC;IAAA;IAAA,KAInC,YAAqE,GAArE,YAAqE;IAAA,KAC7D,IAAO,GAAP,IAAO;IAEvB,kBAAkB,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;MAChB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC;IAChG;IACA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,IAAI;IAEjE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC;EAClD;EAEO,KAAK,GAAS;IACjB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,CAAC;EAChD;EAEO,KAAK,CAAC,QAAsB,EAAE,OAAqB,EAAuC;IAC7F,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;MACnB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC/C;IACA,OAAO,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC;EAC9C;;EAEA;AACJ;AACA;AACA;EACW,YAAY,CAAC,GAAY,EAAQ;IACpC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG;EAC7B;EAEO,eAAe,CAClB,MAAc,EACd,IAAY,EACZ,MAAqD,EACrD,MAAc,EACd,WAAoB,EACV;IACV,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;MACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACtD;IAEA,IAAI,WAAkC,GAAG,SAAS;IAClD,IAAI,IAAmD,GAAG,SAAS;IACnE,IAAI,MAAM,KAAK,MAAM,CAAC,GAAG,EAAE;MACvB,WAAW,GAAG,MAAM;IACxB,CAAC,MAAM;MACH,IAAI,GAAG,MAAM;IACjB;IAEA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAE3E,MAAM,IAAkB,GAAG;MACvB,IAAI,EAAE,IAAI;MACV,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,WAAW,EAAE;MACb,IAAI,CAAC,OAAO,CAAE,aAAa,GAAG,UAAU,WAAW,EAAE;IACzD;IAEA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;EAC5D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACW,aAAa,CAChB,MAAc,EACd,IAAY,EACZ,WAAsB,GAAG,CAAC,CAAC,EAC3B,IAAW,EACX,SAAuB,GAAG,CAAC,CAAC,EAClB;IACV,OAAO,IAAI,CAAC,eAAe,CAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;EACjF;;EAEA;EACA,MAAc,eAAe,CACzB,OAAe,EACf,MAAc,EACd,IAAY,EACZ,WAAsB,EACtB,IAAW,EACX,SAAuB,GAAG,CAAC,CAAC,EAClB;IACV;IACA,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC;IAChC;IACA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW;;IAExC;IACA,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACrE,IAAI,eAAe,CAAC,WAAW,EAAE;MAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;UACf,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACrB;QACA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;UAC7B,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,eAAe,CAAC,WAAW,EAAE;QACxE;QACA,IAAI,WAAW,CAAC,YAAY,EAAE;UAC1B,OAAO,WAAW,CAAC,YAAY;QACnC;MACJ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;QAClC,WAAW,CAAC,YAAY,GAAG,eAAe,CAAC,WAAW;MAC1D;IACJ;IAEA,IAAI;MACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC;MAC7E,OAAO,QAAQ;IACnB,CAAC,CAAC,OAAO,KAAK,EAAE;MACZ,IAAI,EAAE,KAAK,YAAY,WAAW,CAAC,EAAE;QACjC,MAAM,KAAK;MACf;MAEA,IAAI,KAAK,CAAC,OAAO,KAAK,iBAAiB,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC;QACtF,IAAI,OAAO,KAAK,mBAAmB,CAAC,OAAO,EAAE;UACzC;UACA,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;QACxF;QACA,IAAI,OAAO,KAAK,mBAAmB,CAAC,OAAO,EAAE;UACzC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC;QACtC;QAEA,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE;UAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC;QAChE;MACJ,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,qBAAqB,EAAE;QAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;MACzF;MAEA,MAAM,KAAK;IACf;EACJ;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACW,OAAO,CACV,MAAc,EACd,IAAY,EACZ,WAAuB,EACvB,IAAW,EACX,IAAmB,EACT;IACV,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAC3E,OAAO,IAAI,CAAC,eAAe,CAAI,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;EAC/D;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAa,eAAe,CACxB,MAAc,EACd,GAAiB,EACjB,IAAW,EACX,IAAqB,GAAG,CAAC,CAAC,EAChB;IACV,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE;MAC/D,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC;IACtG;IAEA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;IAE/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,qBAAqB,MAAM,IAAI,UAAU,EAAE,CAAC;IAEpE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;IACjE,IAAI,YAAY,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,kBAAkB;MAC1C;IACJ;IAEA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK;IACzC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IAC7C,IAAI,OAAO,KAAK,SAAS,EAAE;MACvB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC;IACA,IAAI,IAAI,CAAC,WAAW,EAAE;MAClB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAClC;;IAEA;IACA;IACA;IACA,IAAI,IAAc;IAClB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE,WAAW,EAAE,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE;MAChE,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;MAC3B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QAC1B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB;MAChD;IACJ,CAAC,MAAM;MACH,IAAI,GAAG,IAAgB;IAC3B;IAEA,MAAM;MAAE,MAAM;MAAE;IAAQ,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;;IAE9C;IACA;IACA;IACA;IACA;IACA,MAAM,SAAS,GAAG,eAAe,IAAI,OAAO,GAAG,SAAS,GAAG,UAAU;IAErE,IAAI,GAAa;IACjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI;MACA,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;QACxB,MAAM;QACN,MAAM;QACN,IAAI,EAAE,IAAI;QACV,OAAO;QACP,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,aAAa;QAC7B,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,MAAM;QAAE;QACrB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,IAAI,CAAC;MACnB,CAAC,CAAC;MAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CACnB,qBAAqB,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,MAAM,GACpF,CAAC;IACL,CAAC,CAAC,OAAO,CAAC,EAAE;MACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,qBAAqB,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC;MACnG,IAAY,CAAC,CAAE,IAAI,KAAK,YAAY,EAAE;QAClC,MAAM,CAAC;MACX;MACA,MAAM,IAAI,eAAe,CAAC,cAAc,EAAS,CAAC,CAAC;IACvD,CAAC,SAAS;MACN,OAAO,CAAC,CAAC;IACb;IAEA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;MACT,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD;IAEA,IAAI,IAAI,CAAC,eAAe,EAAE;MACtB,OAAQ,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,MAAM,IAAI,YAAY,EAAE;MACrB,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,MAAM;MACH,OAAQ,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B;EACJ;EAEQ,kBAAkB,CAAC,GAAiB,EAAU;IAClD,IAAI;MACA,IAAI,KAAU;MACd,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACzB,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;MACxB,CAAC,MAAM;QACH,KAAK,GAAG,GAAG;MACf;MACA;MACA,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,CAAC;MACzC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE;QACzC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;MAClC;MACA,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;MAChD,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,GAAG,EAAE;MAE5E,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,mBAAmB;IAC9D,CAAC,CAAC,MAAM;MACJ;MACA,OAAO,IAAI;IACf;EACJ;EACA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACW,MAAM,CAAC,IAAY,EAAE,WAAuB,EAAE,MAAe,EAAE,OAAgB,EAAO;IACzF,MAAM,mBAAmB,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;IACxD,MAAM,2BAA2B,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAC/D,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAChC,mBAAmB;IACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,2BAA2B,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtF;IACA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,EAAE;MACtC,MAAM,YAAY,mCAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,GAAK,WAAW,CAAE;MACjE,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC;IAChD;IAEA,OAAO,GAAG;EACd;AACJ","ignoreList":[]}
@@ -28,8 +28,8 @@ export * from "./errors.js";
28
28
  export * from "./method.js";
29
29
  export * from "./utils.js";
30
30
  export class MatrixHttpApi extends FetchHttpApi {
31
- constructor() {
32
- super(...arguments);
31
+ constructor(...args) {
32
+ super(...args);
33
33
  _defineProperty(this, "uploads", []);
34
34
  }
35
35
  /**
@@ -45,30 +45,28 @@ export class MatrixHttpApi extends FetchHttpApi {
45
45
  * @throws May throw a `MatrixSafetyError` if content is deemed unsafe.
46
46
  * @see MatrixSafetyError
47
47
  */
48
- uploadContent(file) {
49
- var _opts$includeFilename, _opts$abortController, _opts$type, _opts$name;
50
- var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
51
- var includeFilename = (_opts$includeFilename = opts.includeFilename) !== null && _opts$includeFilename !== void 0 ? _opts$includeFilename : true;
52
- var abortController = (_opts$abortController = opts.abortController) !== null && _opts$abortController !== void 0 ? _opts$abortController : new AbortController();
48
+ uploadContent(file, opts = {}) {
49
+ const includeFilename = opts.includeFilename ?? true;
50
+ const abortController = opts.abortController ?? new AbortController();
53
51
 
54
52
  // If the file doesn't have a mime type, use a default since the HS errors if we don't supply one.
55
- var contentType = ((_opts$type = opts.type) !== null && _opts$type !== void 0 ? _opts$type : file.type) || "application/octet-stream";
56
- var fileName = (_opts$name = opts.name) !== null && _opts$name !== void 0 ? _opts$name : file.name;
57
- var upload = {
53
+ const contentType = (opts.type ?? file.type) || "application/octet-stream";
54
+ const fileName = opts.name ?? file.name;
55
+ const upload = {
58
56
  loaded: 0,
59
57
  total: 0,
60
58
  abortController
61
59
  };
62
- var uploadResolvers = Promise.withResolvers();
60
+ const uploadResolvers = Promise.withResolvers();
63
61
  if (globalThis.XMLHttpRequest) {
64
- var xhr = new globalThis.XMLHttpRequest();
65
- var timeoutFn = function timeoutFn() {
62
+ const xhr = new globalThis.XMLHttpRequest();
63
+ const timeoutFn = function () {
66
64
  xhr.abort();
67
65
  uploadResolvers.reject(new Error("Timeout"));
68
66
  };
69
67
 
70
68
  // set an initial timeout of 30s; we'll advance it each time we get a progress notification
71
- var timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
69
+ let timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
72
70
  xhr.onreadystatechange = function () {
73
71
  switch (xhr.readyState) {
74
72
  case globalThis.XMLHttpRequest.DONE:
@@ -96,17 +94,16 @@ export class MatrixHttpApi extends FetchHttpApi {
96
94
  }
97
95
  };
98
96
  xhr.upload.onprogress = ev => {
99
- var _opts$progressHandler;
100
97
  callbacks.clearTimeout(timeoutTimer);
101
98
  upload.loaded = ev.loaded;
102
99
  upload.total = ev.total;
103
100
  timeoutTimer = callbacks.setTimeout(timeoutFn, 30000);
104
- (_opts$progressHandler = opts.progressHandler) === null || _opts$progressHandler === void 0 || _opts$progressHandler.call(opts, {
101
+ opts.progressHandler?.({
105
102
  loaded: ev.loaded,
106
103
  total: ev.total
107
104
  });
108
105
  };
109
- var url = this.getUrl("/upload", undefined, MediaPrefix.V3);
106
+ const url = this.getUrl("/upload", undefined, MediaPrefix.V3);
110
107
  if (includeFilename && fileName) {
111
108
  url.searchParams.set("filename", encodeURIComponent(fileName));
112
109
  }
@@ -123,11 +120,11 @@ export class MatrixHttpApi extends FetchHttpApi {
123
120
  xhr.abort();
124
121
  });
125
122
  } else {
126
- var queryParams = {};
123
+ const queryParams = {};
127
124
  if (includeFilename && fileName) {
128
125
  queryParams.filename = fileName;
129
126
  }
130
- var headers = {
127
+ const headers = {
131
128
  "Content-Type": contentType
132
129
  };
133
130
  this.authedRequest(Method.Post, "/upload", queryParams, file, {
@@ -149,7 +146,7 @@ export class MatrixHttpApi extends FetchHttpApi {
149
146
  return upload.promise;
150
147
  }
151
148
  cancelUpload(promise) {
152
- var upload = this.uploads.find(u => u.promise === promise);
149
+ const upload = this.uploads.find(u => u.promise === promise);
153
150
  if (upload) {
154
151
  upload.abortController.abort();
155
152
  return true;