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":"MSC4108SecureChannel.js","names":["Ecies","QrCodeData","QrCodeIntent","ClientRendezvousFailureReason","MSC4108FailureReason","RendezvousError","logger","MSC4108SecureChannel","constructor","rendezvousSession","theirPublicKey","onFailure","_defineProperty","secureChannel","generateCode","mode","serverName","_this","_asyncToGenerator","url","Error","public_key","Reciprocate","undefined","toBytes","getCheckCode","_this$establishedChan","x","establishedChannel","check_code","Array","from","as_bytes","map","b","concat","join","connect","_this2","connected","result","establish_outbound_channel","channel","info","send","initial_message","ciphertext","receive","UnexpectedMessageReceived","candidateLoginOkMessage","decrypt","InsecureChannelDetected","loginInitiateMessage","_this2$secureChannel$","establish_inbound_channel","candidateLoginInitiateMessage","message","loginOkMessage","encrypt","_this3","plaintext","_this4","secureSend","payload","_this5","stringifiedPayload","JSON","stringify","debug","type","secureReceive","_this6","json","parse","close","_this7","cancel","reason","_this8","_this8$onFailure","call","UserDeclined","UserCancelled","cancelled"],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 2024 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 {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MSC4108SecureChannel.js","names":[],"sources":["../../../src/rendezvous/channels/MSC4108SecureChannel.ts"],"sourcesContent":["/*\nCopyright 2024 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 {\n type Curve25519PublicKey,\n Ecies,\n type EstablishedEcies,\n QrCodeData,\n QrCodeIntent,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n ClientRendezvousFailureReason,\n MSC4108FailureReason,\n type MSC4108Payload,\n RendezvousError,\n type RendezvousFailureListener,\n} from \"../index.ts\";\nimport { type MSC4108RendezvousSession } from \"../transports/MSC4108RendezvousSession.ts\";\nimport { logger } from \"../../logger.ts\";\n\n/**\n * Prototype of the unstable [MSC4108](https://github.com/matrix-org/matrix-spec-proposals/pull/4108)\n * secure rendezvous session protocol.\n * @experimental Note that this is UNSTABLE and may have breaking changes without notice.\n * Imports @matrix-org/matrix-sdk-crypto-wasm so should be async-imported to avoid bundling the WASM into the main bundle.\n */\nexport class MSC4108SecureChannel {\n private readonly secureChannel: Ecies;\n private establishedChannel?: EstablishedEcies;\n private connected = false;\n\n public constructor(\n private rendezvousSession: MSC4108RendezvousSession,\n private theirPublicKey?: Curve25519PublicKey,\n public onFailure?: RendezvousFailureListener,\n ) {\n this.secureChannel = new Ecies();\n }\n\n /**\n * Generate a QR code for the current session.\n * @param mode the mode to generate the QR code in, either `Login` or `Reciprocate`.\n * @param serverName the name of the homeserver to connect to, as defined by server discovery in the spec, required for `Reciprocate` mode.\n */\n public async generateCode(mode: QrCodeIntent.Login): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent.Reciprocate, serverName: string): Promise<Uint8Array>;\n public async generateCode(mode: QrCodeIntent, serverName?: string): Promise<Uint8Array> {\n const { url } = this.rendezvousSession;\n\n if (!url) {\n throw new Error(\"No rendezvous session URL\");\n }\n\n return new QrCodeData(\n this.secureChannel.public_key(),\n url,\n mode === QrCodeIntent.Reciprocate ? serverName : undefined,\n ).toBytes();\n }\n\n /**\n * Returns the check code for the secure channel or undefined if not generated yet.\n */\n public getCheckCode(): string | undefined {\n const x = this.establishedChannel?.check_code();\n\n if (!x) {\n return undefined;\n }\n return Array.from(x.as_bytes())\n .map((b) => `${b % 10}`)\n .join(\"\");\n }\n\n /**\n * Connects and establishes a secure channel with the other device.\n */\n public async connect(): Promise<void> {\n if (this.connected) {\n throw new Error(\"Channel already connected\");\n }\n\n if (this.theirPublicKey) {\n // We are the scanning device\n const result = this.secureChannel.establish_outbound_channel(\n this.theirPublicKey,\n \"MATRIX_QR_CODE_LOGIN_INITIATE\",\n );\n this.establishedChannel = result.channel;\n\n /*\n Secure Channel step 4. Device S sends the initial message\n\n Nonce := 0\n SH := ECDH(Ss, Gp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n TaggedCiphertext := ChaCha20Poly1305_Encrypt(EncKey, Nonce, \"MATRIX_QR_CODE_LOGIN_INITIATE\")\n Nonce := Nonce + 2\n LoginInitiateMessage := UnpaddedBase64(TaggedCiphertext) || \"|\" || UnpaddedBase64(Sp)\n */\n {\n logger.info(\"Sending LoginInitiateMessage\");\n await this.rendezvousSession.send(result.initial_message);\n }\n\n /*\n Secure Channel step 6. Verification by Device S\n\n Nonce_G := 1\n (TaggedCiphertext, Sp) := Unpack(Message)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_G, TaggedCiphertext)\n Nonce_G := Nonce_G + 2\n\n unless Plaintext == \"MATRIX_QR_CODE_LOGIN_OK\":\n FAIL\n */\n {\n logger.info(\"Waiting for LoginOkMessage\");\n const ciphertext = await this.rendezvousSession.receive();\n\n if (!ciphertext) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n const candidateLoginOkMessage = await this.decrypt(ciphertext);\n\n if (candidateLoginOkMessage !== \"MATRIX_QR_CODE_LOGIN_OK\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n\n // Step 6 is now complete. We trust the channel\n }\n } else {\n /*\n Secure Channel step 5. Device G confirms\n\n Nonce_S := 0\n (TaggedCiphertext, Sp) := Unpack(LoginInitiateMessage)\n SH := ECDH(Gs, Sp)\n EncKey := HKDF_SHA256(SH, \"MATRIX_QR_CODE_LOGIN|\" || Gp || \"|\" || Sp, 0, 32)\n Plaintext := ChaCha20Poly1305_Decrypt(EncKey, Nonce_S, TaggedCiphertext)\n Nonce_S := Nonce_S + 2\n */\n // wait for the other side to send us their public key\n logger.info(\"Waiting for LoginInitiateMessage\");\n const loginInitiateMessage = await this.rendezvousSession.receive();\n if (!loginInitiateMessage) {\n throw new RendezvousError(\n \"No response from other device\",\n MSC4108FailureReason.UnexpectedMessageReceived,\n );\n }\n\n const { channel, message: candidateLoginInitiateMessage } =\n this.secureChannel.establish_inbound_channel(loginInitiateMessage);\n this.establishedChannel = channel;\n\n if (candidateLoginInitiateMessage !== \"MATRIX_QR_CODE_LOGIN_INITIATE\") {\n throw new RendezvousError(\n \"Invalid response from other device\",\n ClientRendezvousFailureReason.InsecureChannelDetected,\n );\n }\n logger.info(\"LoginInitiateMessage received\");\n\n logger.info(\"Sending LoginOkMessage\");\n const loginOkMessage = await this.encrypt(\"MATRIX_QR_CODE_LOGIN_OK\");\n await this.rendezvousSession.send(loginOkMessage);\n\n // Step 5 is complete. We don't yet trust the channel\n\n // next step will be for the user to confirm the check code on the other device\n }\n\n this.connected = true;\n }\n\n private async decrypt(ciphertext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.decrypt(ciphertext);\n }\n\n private async encrypt(plaintext: string): Promise<string> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n return this.establishedChannel.encrypt(plaintext);\n }\n\n /**\n * Sends a payload securely to the other device.\n * @param payload the payload to encrypt and send\n */\n public async secureSend<T extends MSC4108Payload>(payload: T): Promise<void> {\n if (!this.connected) {\n throw new Error(\"Channel closed\");\n }\n\n const stringifiedPayload = JSON.stringify(payload);\n logger.debug(`=> {\"type\": ${JSON.stringify(payload.type)}, ...}`);\n\n await this.rendezvousSession.send(await this.encrypt(stringifiedPayload));\n }\n\n /**\n * Receives an encrypted payload from the other device and decrypts it.\n */\n public async secureReceive<T extends MSC4108Payload>(): Promise<Partial<T> | undefined> {\n if (!this.establishedChannel) {\n throw new Error(\"Channel closed\");\n }\n\n const ciphertext = await this.rendezvousSession.receive();\n if (!ciphertext) {\n return undefined;\n }\n const plaintext = await this.decrypt(ciphertext);\n const json = JSON.parse(plaintext);\n\n logger.debug(`<= {\"type\": ${JSON.stringify(json.type)}, ...}`);\n return json as Partial<T> | undefined;\n }\n\n /**\n * Closes the secure channel.\n */\n public async close(): Promise<void> {\n await this.rendezvousSession.close();\n }\n\n /**\n * Cancels the secure channel.\n * @param reason the reason for the cancellation\n */\n public async cancel(reason: MSC4108FailureReason | ClientRendezvousFailureReason): Promise<void> {\n try {\n await this.rendezvousSession.cancel(reason);\n this.onFailure?.(reason);\n } finally {\n if (\n reason !== ClientRendezvousFailureReason.UserDeclined &&\n reason !== MSC4108FailureReason.UserCancelled\n ) {\n await this.close();\n }\n }\n }\n\n /**\n * Returns whether the rendezvous session has been cancelled.\n */\n public get cancelled(): boolean {\n return this.rendezvousSession.cancelled;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,3 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  /*
3
2
  Copyright 2022 The Matrix.org Foundation C.I.C.
4
3
 
@@ -35,8 +34,22 @@ export * from "./channels/index.js";
35
34
  * @param client the client to check for sign-in with QR support
36
35
  * @returns true if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use, false otherwise.
37
36
  */
38
- export function isSignInWithQRAvailable(_x) {
39
- return _isSignInWithQRAvailable.apply(this, arguments);
37
+ export async function isSignInWithQRAvailable(client) {
38
+ let metadata;
39
+ try {
40
+ metadata = await client.getAuthMetadata();
41
+ } catch (e) {
42
+ logger.warn("Failed to fetch auth metadata, assuming sign-in with QR is unavailable", e);
43
+ return false;
44
+ }
45
+
46
+ // check for support of device authorization grant
47
+ if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {
48
+ return false;
49
+ }
50
+
51
+ // check for unstable support for MSC4108 2024 version
52
+ return client.doesServerSupportUnstableFeature("org.matrix.msc4108");
40
53
  }
41
54
 
42
55
  /**
@@ -51,28 +64,9 @@ export function isSignInWithQRAvailable(_x) {
51
64
  * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.
52
65
  * @returns a promise that resolves to an instance of the linking flow
53
66
  */
54
- function _isSignInWithQRAvailable() {
55
- _isSignInWithQRAvailable = _asyncToGenerator(function* (client) {
56
- var metadata;
57
- try {
58
- metadata = yield client.getAuthMetadata();
59
- } catch (e) {
60
- logger.warn("Failed to fetch auth metadata, assuming sign-in with QR is unavailable", e);
61
- return false;
62
- }
63
-
64
- // check for support of device authorization grant
65
- if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {
66
- return false;
67
- }
68
-
69
- // check for unstable support for MSC4108 2024 version
70
- return client.doesServerSupportUnstableFeature("org.matrix.msc4108");
71
- });
72
- return _isSignInWithQRAvailable.apply(this, arguments);
73
- }
74
- export function linkNewDeviceByGeneratingQR(_x2, _x3, _x4) {
75
- return _linkNewDeviceByGeneratingQR.apply(this, arguments);
67
+ export async function linkNewDeviceByGeneratingQR(client, onFailure, abortSignal) {
68
+ // we assume rust crypto is already initialised
69
+ return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);
76
70
  }
77
71
 
78
72
  /**
@@ -87,52 +81,33 @@ export function linkNewDeviceByGeneratingQR(_x2, _x3, _x4) {
87
81
  * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.
88
82
  * @returns a promise that resolves to an instance of the sign-in flow
89
83
  */
90
- function _linkNewDeviceByGeneratingQR() {
91
- _linkNewDeviceByGeneratingQR = _asyncToGenerator(function* (client, onFailure, abortSignal) {
92
- // we assume rust crypto is already initialised
93
- return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);
94
- });
95
- return _linkNewDeviceByGeneratingQR.apply(this, arguments);
96
- }
97
- export function signInByGeneratingQR(_x5, _x6, _x7) {
98
- return _signInByGeneratingQR.apply(this, arguments);
84
+ export async function signInByGeneratingQR(tempClient, onFailure, abortSignal) {
85
+ // ensure rust crypto is initialized as needed for the secure channel
86
+ const RustSdkCryptoJs = await import("@matrix-org/matrix-sdk-crypto-wasm");
87
+ await RustSdkCryptoJs.initAsync();
88
+ return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);
99
89
  }
100
- function _signInByGeneratingQR() {
101
- _signInByGeneratingQR = _asyncToGenerator(function* (tempClient, onFailure, abortSignal) {
102
- // ensure rust crypto is initialized as needed for the secure channel
103
- var RustSdkCryptoJs = yield import("@matrix-org/matrix-sdk-crypto-wasm");
104
- yield RustSdkCryptoJs.initAsync();
105
- return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);
90
+ async function initGenerateQrFlow(intent, client, onFailure, abortSignal) {
91
+ const session = new MSC4108RendezvousSession({
92
+ onFailure,
93
+ client
106
94
  });
107
- return _signInByGeneratingQR.apply(this, arguments);
108
- }
109
- function initGenerateQrFlow(_x8, _x9, _x0, _x1) {
110
- return _initGenerateQrFlow.apply(this, arguments);
111
- }
112
- function _initGenerateQrFlow() {
113
- _initGenerateQrFlow = _asyncToGenerator(function* (intent, client, onFailure, abortSignal) {
114
- var session = new MSC4108RendezvousSession({
115
- onFailure,
116
- client
117
- });
118
- var channel = new MSC4108SecureChannel(session, undefined, onFailure);
119
- var flow = new MSC4108SignInWithQR(channel, false, intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client, onFailure);
120
- if (abortSignal.aborted) return flow;
121
- abortSignal.onabort = () => {
122
- // Detach failure handlers
123
- session.onFailure = undefined;
124
- channel.onFailure = undefined;
125
- flow.onFailure = undefined;
126
- // Cancel the session
127
- flow.cancel(MSC4108FailureReason.UserCancelled);
128
- };
129
- yield session.send(""); // open channel
95
+ const channel = new MSC4108SecureChannel(session, undefined, onFailure);
96
+ const flow = new MSC4108SignInWithQR(channel, false, intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client, onFailure);
97
+ if (abortSignal.aborted) return flow;
98
+ abortSignal.onabort = () => {
99
+ // Detach failure handlers
100
+ session.onFailure = undefined;
101
+ channel.onFailure = undefined;
102
+ flow.onFailure = undefined;
103
+ // Cancel the session
104
+ void flow.cancel(MSC4108FailureReason.UserCancelled);
105
+ };
106
+ await session.send(""); // open channel
130
107
 
131
- if (!abortSignal.aborted) {
132
- yield flow.generateCode();
133
- }
134
- return flow;
135
- });
136
- return _initGenerateQrFlow.apply(this, arguments);
108
+ if (!abortSignal.aborted) {
109
+ await flow.generateCode();
110
+ }
111
+ return flow;
137
112
  }
138
113
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["OAuthGrantType","MSC4108FailureReason","MSC4108SignInWithQR","MSC4108RendezvousSession","MSC4108SecureChannel","RendezvousIntent","logger","isSignInWithQRAvailable","_x","_isSignInWithQRAvailable","apply","arguments","_asyncToGenerator","client","metadata","getAuthMetadata","e","warn","grant_types_supported","includes","DeviceAuthorization","doesServerSupportUnstableFeature","linkNewDeviceByGeneratingQR","_x2","_x3","_x4","_linkNewDeviceByGeneratingQR","onFailure","abortSignal","initGenerateQrFlow","RECIPROCATE_LOGIN_ON_EXISTING_DEVICE","signInByGeneratingQR","_x5","_x6","_x7","_signInByGeneratingQR","tempClient","RustSdkCryptoJs","initAsync","LOGIN_ON_NEW_DEVICE","_x8","_x9","_x0","_x1","_initGenerateQrFlow","intent","session","channel","undefined","flow","aborted","onabort","cancel","UserCancelled","send","generateCode"],"sources":["../../src/rendezvous/index.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 { type MatrixClient, OAuthGrantType, type OidcClientConfig } from \"../matrix.ts\";\nimport { MSC4108FailureReason, type RendezvousFailureListener } from \"./RendezvousFailureReason.ts\";\nimport { MSC4108SignInWithQR } from \"./MSC4108SignInWithQR.ts\";\nimport { MSC4108RendezvousSession } from \"./transports/MSC4108RendezvousSession.ts\";\nimport { MSC4108SecureChannel } from \"./channels/MSC4108SecureChannel.ts\";\nimport { RendezvousIntent } from \"./RendezvousIntent.ts\";\nimport { logger } from \"../logger.ts\";\n\nexport * from \"./MSC4108SignInWithQR.ts\";\nexport type * from \"./RendezvousChannel.ts\";\nexport type * from \"./RendezvousCode.ts\";\nexport * from \"./RendezvousError.ts\";\nexport * from \"./RendezvousFailureReason.ts\";\nexport * from \"./RendezvousIntent.ts\";\nexport type * from \"./RendezvousTransport.ts\";\nexport * from \"./transports/index.ts\";\nexport * from \"./channels/index.ts\";\n\n/**\n * Check if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use.\n *\n * @param client the client to check for sign-in with QR support\n * @returns true if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use, false otherwise.\n */\nexport async function isSignInWithQRAvailable(client: MatrixClient): Promise<boolean> {\n let metadata: OidcClientConfig;\n try {\n metadata = await client.getAuthMetadata();\n } catch (e) {\n logger.warn(\"Failed to fetch auth metadata, assuming sign-in with QR is unavailable\", e);\n return false;\n }\n\n // check for support of device authorization grant\n if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n return false;\n }\n\n // check for unstable support for MSC4108 2024 version\n return client.doesServerSupportUnstableFeature(\"org.matrix.msc4108\");\n}\n\n/**\n * Start a linking flow from an existing authenticated client by generating a QR code that can be scanned by the new device.\n * The new device will then authenticate with the server and link itself to the same account as the existing client and\n * share the end-to-end encryption keys.\n *\n * @param client the existing client\n * @param onFailure callback for when the linking process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the linking flow\n */\nexport async function linkNewDeviceByGeneratingQR(\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // we assume rust crypto is already initialised\n return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);\n}\n\n/**\n * Start a sign-in flow by generating a QR code that can be scanned by an existing authenticated client.\n * The existing client will then help complete the authentication of the new device and link it to the same account,\n * sharing the end-to-end encryption keys.\n *\n * @param tempClient temporary client used during the flow for the rendezvous channel\n * @param onFailure callback for when the sign-in process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the sign-in flow\n */\nexport async function signInByGeneratingQR(\n tempClient: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // ensure rust crypto is initialized as needed for the secure channel\n const RustSdkCryptoJs = await import(\"@matrix-org/matrix-sdk-crypto-wasm\");\n await RustSdkCryptoJs.initAsync();\n\n return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);\n}\n\nasync function initGenerateQrFlow(\n intent: RendezvousIntent,\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n const session = new MSC4108RendezvousSession({\n onFailure,\n client,\n });\n const channel = new MSC4108SecureChannel(session, undefined, onFailure);\n const flow = new MSC4108SignInWithQR(\n channel,\n false,\n intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client,\n onFailure,\n );\n\n if (abortSignal.aborted) return flow;\n\n abortSignal.onabort = (): void => {\n // Detach failure handlers\n session.onFailure = undefined;\n channel.onFailure = undefined;\n flow.onFailure = undefined;\n // Cancel the session\n flow.cancel(MSC4108FailureReason.UserCancelled);\n };\n\n await session.send(\"\"); // open channel\n\n if (!abortSignal.aborted) {\n await flow.generateCode();\n }\n\n return flow;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/rendezvous/index.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 { type MatrixClient, OAuthGrantType, type OidcClientConfig } from \"../matrix.ts\";\nimport { MSC4108FailureReason, type RendezvousFailureListener } from \"./RendezvousFailureReason.ts\";\nimport { MSC4108SignInWithQR } from \"./MSC4108SignInWithQR.ts\";\nimport { MSC4108RendezvousSession } from \"./transports/MSC4108RendezvousSession.ts\";\nimport { MSC4108SecureChannel } from \"./channels/MSC4108SecureChannel.ts\";\nimport { RendezvousIntent } from \"./RendezvousIntent.ts\";\nimport { logger } from \"../logger.ts\";\n\nexport * from \"./MSC4108SignInWithQR.ts\";\nexport type * from \"./RendezvousChannel.ts\";\nexport type * from \"./RendezvousCode.ts\";\nexport * from \"./RendezvousError.ts\";\nexport * from \"./RendezvousFailureReason.ts\";\nexport * from \"./RendezvousIntent.ts\";\nexport type * from \"./RendezvousTransport.ts\";\nexport * from \"./transports/index.ts\";\nexport * from \"./channels/index.ts\";\n\n/**\n * Check if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use.\n *\n * @param client the client to check for sign-in with QR support\n * @returns true if the homeserver that the client is connected to supports a variant of sign-in with QR that we can use, false otherwise.\n */\nexport async function isSignInWithQRAvailable(client: MatrixClient): Promise<boolean> {\n let metadata: OidcClientConfig;\n try {\n metadata = await client.getAuthMetadata();\n } catch (e) {\n logger.warn(\"Failed to fetch auth metadata, assuming sign-in with QR is unavailable\", e);\n return false;\n }\n\n // check for support of device authorization grant\n if (!metadata.grant_types_supported.includes(OAuthGrantType.DeviceAuthorization)) {\n return false;\n }\n\n // check for unstable support for MSC4108 2024 version\n return client.doesServerSupportUnstableFeature(\"org.matrix.msc4108\");\n}\n\n/**\n * Start a linking flow from an existing authenticated client by generating a QR code that can be scanned by the new device.\n * The new device will then authenticate with the server and link itself to the same account as the existing client and\n * share the end-to-end encryption keys.\n *\n * @param client the existing client\n * @param onFailure callback for when the linking process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the linking flow\n */\nexport async function linkNewDeviceByGeneratingQR(\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // we assume rust crypto is already initialised\n return initGenerateQrFlow(RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE, client, onFailure, abortSignal);\n}\n\n/**\n * Start a sign-in flow by generating a QR code that can be scanned by an existing authenticated client.\n * The existing client will then help complete the authentication of the new device and link it to the same account,\n * sharing the end-to-end encryption keys.\n *\n * @param tempClient temporary client used during the flow for the rendezvous channel\n * @param onFailure callback for when the sign-in process fails\n * @param abortSignal an AbortSignal that can be used to cancel the linking process,\n * for example when the user cancels out of the flow.\n * This will unbind the {@link onFailure} callback and prevent any further steps in the flow from being executed.\n * @returns a promise that resolves to an instance of the sign-in flow\n */\nexport async function signInByGeneratingQR(\n tempClient: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n // ensure rust crypto is initialized as needed for the secure channel\n const RustSdkCryptoJs = await import(\"@matrix-org/matrix-sdk-crypto-wasm\");\n await RustSdkCryptoJs.initAsync();\n\n return initGenerateQrFlow(RendezvousIntent.LOGIN_ON_NEW_DEVICE, tempClient, onFailure, abortSignal);\n}\n\nasync function initGenerateQrFlow(\n intent: RendezvousIntent,\n client: MatrixClient,\n onFailure: RendezvousFailureListener,\n abortSignal: AbortSignal,\n): Promise<MSC4108SignInWithQR> {\n const session = new MSC4108RendezvousSession({\n onFailure,\n client,\n });\n const channel = new MSC4108SecureChannel(session, undefined, onFailure);\n const flow = new MSC4108SignInWithQR(\n channel,\n false,\n intent === RendezvousIntent.LOGIN_ON_NEW_DEVICE ? undefined : client,\n onFailure,\n );\n\n if (abortSignal.aborted) return flow;\n\n abortSignal.onabort = (): void => {\n // Detach failure handlers\n session.onFailure = undefined;\n channel.onFailure = undefined;\n flow.onFailure = undefined;\n // Cancel the session\n void flow.cancel(MSC4108FailureReason.UserCancelled);\n };\n\n await session.send(\"\"); // open channel\n\n if (!abortSignal.aborted) {\n await flow.generateCode();\n }\n\n return flow;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -44,7 +44,7 @@ export declare class MSC4108RendezvousSession {
44
44
  send(data: string): Promise<void>;
45
45
  /**
46
46
  * Receives data from the rendezvous channel.
47
- * @return the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
47
+ * @returns the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
48
48
  */
49
49
  receive(): Promise<string | undefined>;
50
50
  /**
@@ -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 2024 The Matrix.org Foundation C.I.C.
@@ -28,12 +27,13 @@ import { ClientPrefix } from "../../http-api/index.js";
28
27
  * @experimental Note that this is UNSTABLE and may have breaking changes without notice.
29
28
  */
30
29
  export class MSC4108RendezvousSession {
31
- constructor(_ref) {
32
- var fetchFn = _ref.fetchFn,
33
- onFailure = _ref.onFailure,
34
- url = _ref.url,
35
- client = _ref.client,
36
- fallbackRzServer = _ref.fallbackRzServer;
30
+ constructor({
31
+ fetchFn,
32
+ onFailure,
33
+ url,
34
+ client,
35
+ fallbackRzServer
36
+ }) {
37
37
  _defineProperty(this, "url", void 0);
38
38
  _defineProperty(this, "client", void 0);
39
39
  _defineProperty(this, "fallbackRzServer", void 0);
@@ -70,135 +70,124 @@ export class MSC4108RendezvousSession {
70
70
  }
71
71
  return globalThis.fetch(resource, options);
72
72
  }
73
- getPostEndpoint() {
74
- var _this = this;
75
- return _asyncToGenerator(function* () {
76
- if (_this.client) {
77
- try {
78
- if (yield _this.client.doesServerSupportUnstableFeature("org.matrix.msc4108")) {
79
- return _this.client.http.getUrl("/org.matrix.msc4108/rendezvous", undefined, ClientPrefix.Unstable).toString();
80
- }
81
- } catch (err) {
82
- logger.warn("Failed to get unstable features", err);
73
+ async getPostEndpoint() {
74
+ if (this.client) {
75
+ try {
76
+ if (await this.client.doesServerSupportUnstableFeature("org.matrix.msc4108")) {
77
+ return this.client.http.getUrl("/org.matrix.msc4108/rendezvous", undefined, ClientPrefix.Unstable).toString();
83
78
  }
79
+ } catch (err) {
80
+ logger.warn("Failed to get unstable features", err);
84
81
  }
85
- return _this.fallbackRzServer;
86
- })();
82
+ }
83
+ return this.fallbackRzServer;
87
84
  }
88
85
 
89
86
  /**
90
87
  * Sends data via the rendezvous channel.
91
88
  * @param data the payload to send
92
89
  */
93
- send(data) {
94
- var _this2 = this;
95
- return _asyncToGenerator(function* () {
96
- var _this2$url, _res$headers$get;
97
- if (_this2._cancelled) {
98
- return;
99
- }
100
- var method = _this2.url ? Method.Put : Method.Post;
101
- var uri = (_this2$url = _this2.url) !== null && _this2$url !== void 0 ? _this2$url : yield _this2.getPostEndpoint();
102
- if (!uri) {
103
- throw new Error("Invalid rendezvous URI");
104
- }
105
- var headers = {
106
- "content-type": "text/plain"
107
- };
90
+ async send(data) {
91
+ if (this._cancelled) {
92
+ return;
93
+ }
94
+ const method = this.url ? Method.Put : Method.Post;
95
+ const uri = this.url ?? (await this.getPostEndpoint());
96
+ if (!uri) {
97
+ throw new Error("Invalid rendezvous URI");
98
+ }
99
+ const headers = {
100
+ "content-type": "text/plain"
101
+ };
108
102
 
109
- // if we didn't create the rendezvous channel, we need to fetch the first etag if needed
110
- if (!_this2.etag && _this2.url) {
111
- yield _this2.receive();
112
- }
113
- if (_this2.etag) {
114
- headers["if-match"] = _this2.etag;
115
- }
116
- logger.info("=> ".concat(method, " ").concat(uri, " with ").concat(data, " if-match: ").concat(_this2.etag));
117
- var res = yield _this2.fetch(uri, {
118
- method,
119
- headers,
120
- body: data,
121
- redirect: "follow"
122
- });
123
- if (res.status === 404) {
124
- return _this2.cancel(ClientRendezvousFailureReason.Unknown);
125
- }
126
- _this2.etag = (_res$headers$get = res.headers.get("etag")) !== null && _res$headers$get !== void 0 ? _res$headers$get : undefined;
127
- logger.info("Received etag: ".concat(_this2.etag));
128
- if (method === Method.Post) {
129
- var expires = res.headers.get("expires");
130
- if (expires) {
131
- if (_this2.expiresTimer) {
132
- clearTimeout(_this2.expiresTimer);
133
- _this2.expiresTimer = undefined;
134
- }
135
- _this2.expiresAt = new Date(expires);
136
- _this2.expiresTimer = setTimeout(() => {
137
- _this2.expiresTimer = undefined;
138
- _this2.cancel(ClientRendezvousFailureReason.Expired);
139
- }, _this2.expiresAt.getTime() - Date.now());
140
- }
141
- // MSC4108: we expect a JSON response with a rendezvous URL
142
- var json = yield res.json();
143
- if (typeof json.url !== "string") {
144
- throw new Error("No rendezvous URL given");
103
+ // if we didn't create the rendezvous channel, we need to fetch the first etag if needed
104
+ if (!this.etag && this.url) {
105
+ await this.receive();
106
+ }
107
+ if (this.etag) {
108
+ headers["if-match"] = this.etag;
109
+ }
110
+ logger.info(`=> ${method} ${uri} with ${data} if-match: ${this.etag}`);
111
+ const res = await this.fetch(uri, {
112
+ method,
113
+ headers,
114
+ body: data,
115
+ redirect: "follow"
116
+ });
117
+ if (res.status === 404) {
118
+ return this.cancel(ClientRendezvousFailureReason.Unknown);
119
+ }
120
+ this.etag = res.headers.get("etag") ?? undefined;
121
+ logger.info(`Received etag: ${this.etag}`);
122
+ if (method === Method.Post) {
123
+ const expires = res.headers.get("expires");
124
+ if (expires) {
125
+ if (this.expiresTimer) {
126
+ clearTimeout(this.expiresTimer);
127
+ this.expiresTimer = undefined;
145
128
  }
146
- _this2.url = json.url;
147
- _this2._ready = true;
129
+ this.expiresAt = new Date(expires);
130
+ this.expiresTimer = setTimeout(() => {
131
+ this.expiresTimer = undefined;
132
+ void this.cancel(ClientRendezvousFailureReason.Expired);
133
+ }, this.expiresAt.getTime() - Date.now());
134
+ }
135
+ // MSC4108: we expect a JSON response with a rendezvous URL
136
+ const json = await res.json();
137
+ if (typeof json.url !== "string") {
138
+ throw new Error("No rendezvous URL given");
148
139
  }
149
- })();
140
+ this.url = json.url;
141
+ this._ready = true;
142
+ }
150
143
  }
151
144
 
152
145
  /**
153
146
  * Receives data from the rendezvous channel.
154
- * @return the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
147
+ * @returns the returned promise won't resolve until new data is acquired or the channel is closed either by the server or the other party.
155
148
  */
156
- receive() {
157
- var _this3 = this;
158
- return _asyncToGenerator(function* () {
159
- if (!_this3.url) {
160
- throw new Error("Rendezvous not set up");
149
+ async receive() {
150
+ if (!this.url) {
151
+ throw new Error("Rendezvous not set up");
152
+ }
153
+ // eslint-disable-next-line no-constant-condition
154
+ while (true) {
155
+ if (this._cancelled) {
156
+ return undefined;
157
+ }
158
+ const headers = {};
159
+ if (this.etag) {
160
+ headers["if-none-match"] = this.etag;
161
+ }
162
+ logger.info(`=> GET ${this.url} if-none-match: ${this.etag}`);
163
+ const poll = await this.fetch(this.url, {
164
+ method: Method.Get,
165
+ headers
166
+ });
167
+ if (poll.status === 404) {
168
+ await this.cancel(ClientRendezvousFailureReason.Unknown);
169
+ return undefined;
161
170
  }
162
- // eslint-disable-next-line no-constant-condition
163
- while (true) {
164
- var _poll$headers$get;
165
- if (_this3._cancelled) {
166
- return undefined;
167
- }
168
- var headers = {};
169
- if (_this3.etag) {
170
- headers["if-none-match"] = _this3.etag;
171
- }
172
- logger.info("=> GET ".concat(_this3.url, " if-none-match: ").concat(_this3.etag));
173
- var poll = yield _this3.fetch(_this3.url, {
174
- method: Method.Get,
175
- headers
176
- });
177
- if (poll.status === 404) {
178
- yield _this3.cancel(ClientRendezvousFailureReason.Unknown);
179
- return undefined;
180
- }
181
171
 
182
- // rely on server expiring the channel rather than checking ourselves
172
+ // rely on server expiring the channel rather than checking ourselves
183
173
 
184
- var etag = (_poll$headers$get = poll.headers.get("etag")) !== null && _poll$headers$get !== void 0 ? _poll$headers$get : undefined;
185
- if (poll.headers.get("content-type") !== "text/plain") {
186
- _this3.etag = etag;
187
- } else if (poll.status === 200) {
188
- if (!etag) {
189
- // Some browsers & extensions block the ETag header for anti-tracking purposes
190
- // We try and detect this so the client can give the user a somewhat helpful message
191
- yield _this3.cancel(ClientRendezvousFailureReason.ETagMissing);
192
- return undefined;
193
- }
194
- _this3.etag = etag;
195
- var text = yield poll.text();
196
- logger.info("Received: ".concat(text, " with etag ").concat(_this3.etag));
197
- return text;
174
+ const etag = poll.headers.get("etag") ?? undefined;
175
+ if (poll.headers.get("content-type") !== "text/plain") {
176
+ this.etag = etag;
177
+ } else if (poll.status === 200) {
178
+ if (!etag) {
179
+ // Some browsers & extensions block the ETag header for anti-tracking purposes
180
+ // We try and detect this so the client can give the user a somewhat helpful message
181
+ await this.cancel(ClientRendezvousFailureReason.ETagMissing);
182
+ return undefined;
198
183
  }
199
- yield sleep(1000);
184
+ this.etag = etag;
185
+ const text = await poll.text();
186
+ logger.info(`Received: ${text} with etag ${this.etag}`);
187
+ return text;
200
188
  }
201
- })();
189
+ await sleep(1000);
190
+ }
202
191
  }
203
192
 
204
193
  /**
@@ -206,48 +195,41 @@ export class MSC4108RendezvousSession {
206
195
  * If the reason is user_declined or user_cancelled then the channel will also be closed.
207
196
  * @param reason the reason to cancel with
208
197
  */
209
- cancel(reason) {
210
- var _this4 = this;
211
- return _asyncToGenerator(function* () {
212
- var _this4$onFailure;
213
- if (_this4._cancelled) return;
214
- if (_this4.expiresTimer) {
215
- clearTimeout(_this4.expiresTimer);
216
- _this4.expiresTimer = undefined;
217
- }
218
- if (reason === ClientRendezvousFailureReason.Unknown && _this4.expiresAt && _this4.expiresAt.getTime() < Date.now()) {
219
- reason = ClientRendezvousFailureReason.Expired;
220
- }
221
- _this4._cancelled = true;
222
- _this4._ready = false;
223
- (_this4$onFailure = _this4.onFailure) === null || _this4$onFailure === void 0 || _this4$onFailure.call(_this4, reason);
224
- if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {
225
- yield _this4.close();
226
- }
227
- })();
198
+ async cancel(reason) {
199
+ if (this._cancelled) return;
200
+ if (this.expiresTimer) {
201
+ clearTimeout(this.expiresTimer);
202
+ this.expiresTimer = undefined;
203
+ }
204
+ if (reason === ClientRendezvousFailureReason.Unknown && this.expiresAt && this.expiresAt.getTime() < Date.now()) {
205
+ reason = ClientRendezvousFailureReason.Expired;
206
+ }
207
+ this._cancelled = true;
208
+ this._ready = false;
209
+ this.onFailure?.(reason);
210
+ if (reason === ClientRendezvousFailureReason.UserDeclined || reason === MSC4108FailureReason.UserCancelled) {
211
+ await this.close();
212
+ }
228
213
  }
229
214
 
230
215
  /**
231
216
  * Closes the rendezvous channel.
232
217
  */
233
- close() {
234
- var _this5 = this;
235
- return _asyncToGenerator(function* () {
236
- if (_this5.expiresTimer) {
237
- clearTimeout(_this5.expiresTimer);
238
- _this5.expiresTimer = undefined;
239
- }
240
- if (!_this5.url) return;
241
- try {
242
- var method = Method.Delete;
243
- logger.info("=> ".concat(method, " ").concat(_this5.url));
244
- yield _this5.fetch(_this5.url, {
245
- method
246
- });
247
- } catch (e) {
248
- logger.warn(e);
249
- }
250
- })();
218
+ async close() {
219
+ if (this.expiresTimer) {
220
+ clearTimeout(this.expiresTimer);
221
+ this.expiresTimer = undefined;
222
+ }
223
+ if (!this.url) return;
224
+ try {
225
+ const method = Method.Delete;
226
+ logger.info(`=> ${method} ${this.url}`);
227
+ await this.fetch(this.url, {
228
+ method
229
+ });
230
+ } catch (e) {
231
+ logger.warn(e);
232
+ }
251
233
  }
252
234
  }
253
235
  //# sourceMappingURL=MSC4108RendezvousSession.js.map