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":"embedded.js","names":["WidgetApiToWidgetAction","WidgetApiResponseError","MatrixCapabilities","UnstableApiVersion","MatrixEvent","EventStatus","UpdateDelayedEventAction","isSendDelayedEventRequestOpts","EventType","logger","MatrixClient","ClientEvent","UNSTABLE_MSC4140_DELAYED_EVENTS","SyncApi","SyncState","SlidingSyncSdk","ConnectionError","MatrixError","User","MapWithDefault","recursiveMapToObject","TypedEventEmitter","UnsupportedDelayedEventsEndpointError","RoomWidgetClientEvent","RoomWidgetClient","constructor","widgetApi","capabilities","roomId","opts","sendContentLoaded","_this","_capabilities$receive","this","_defineProperty","Promise","withResolvers","_ref","_asyncToGenerator","event","getSender","getUserId","pendingSendingEventsTxId","some","p","getType","type","_this$pendingSendingE","matchingTxId","find","id","getId","txId","length","_this$pendingSendingE2","resolve","eventEmitter","once","PendingEventsChanged","setTxnId","setUnsigned","_objectSpread","getUnsigned","transaction_id","filter","emit","_x","apply","arguments","_ref2","ev","preventDefault","detail","data","room_id","updateTxId","syncApiResolver","promise","syncApi","supportUpdateState","injectRoomEvents","room","undefined","error","Event","unstableStickyInfo","_unstable_addStickyEvents","setSyncState","Syncing","info","concat","_ev$detail$data","eventId","event_id","ack","_x2","_ref3","sender","content","encrypted","makeEncrypted","RoomMessageEncrypted","ToDeviceEvent","_x3","_ref4","warn","rawEvent","state","debug","getStateKey","_ev$detail$data2","_x4","transportSend","transport","send","bind","_ref5","action","processAndThrow","_x5","_x6","transportSendComplete","sendComplete","_ref6","_x7","_x8","widgetApiReady","roomStateSynced","receiveState","UpdateState","requestInitialCapabilities","on","SendEvent","onEvent","SendToDevice","onToDevice","onStateUpdate","start","_capabilities$sendEve","_capabilities$receive2","_capabilities$sendSta","_capabilities$receive3","_capabilities$sendEve2","_capabilities$receive4","_capabilities$sendSta2","_capabilities$receive5","_capabilities$sendToD","_capabilities$receive6","_capabilities$sendEve3","_capabilities$sendSta3","sendEvent","receiveEvent","sendMessage","Array","isArray","receiveMessage","sendState","requestCapabilityForRoomTimeline","forEach","eventType","requestCapabilityToSendEvent","requestCapabilityToReceiveEvent","requestCapabilityToSendMessage","msgType","requestCapabilityToReceiveMessage","_ref7","stateKey","requestCapabilityToSendState","_ref8","requestCapabilityToReceiveState","sendToDevice","requestCapabilityToSendToDevice","receiveToDevice","requestCapabilityToReceiveToDevice","sendDelayedEvents","requestCapability","MSC4157SendDelayedEvent","updateDelayedEvents","MSC4157UpdateDelayedEvent","sendSticky","MSC4407SendStickyEvent","receiveSticky","MSC4407ReceiveStickyEvent","turnServers","MSC3846TurnServers","_this2","getClientVersions","includes","MSC2762_UPDATE_STATE","startClient","_arguments","_this3","lifecycle","AbortController","userId","store","storeUser","slidingSync","buildSyncApiOptions","createRoom","storeRoom","_this3$capabilities$r","_this3$capabilities$r2","all","map","_ref0","_ref9","rawEvents","readStateEvents","events","_x9","clientWellKnownPollPeriod","clientWellKnownIntervalID","setInterval","fetchClientWellKnown","matrixRTC","watchTurnServers","stopClient","off","abort","joinRoom","roomIdOrAlias","_this4","Error","encryptAndSendEvent","delayOptsOrQuery","queryDict","_this5","_queryOpts","queryOpts","delayOpts","stickyDurationMs","stickyDurationMsAsNumber","redacts","getContent","response","sendRoomEvent","delay","parent_delay_id","catch","timeoutToConnectionError","validateSendDelayedEventResponse","getTxnId","push","e","updatePendingEventStatus","NOT_SENT","updatePendingEvent","SENT","sendStateEvent","_arguments2","_this6","_unstable_sendDelayedStateEvent","_arguments3","_this7","doesServerSupportUnstableFeature","delay_id","_unstable_updateDelayedEvent","delayId","_this8","updateDelayedEvent","Cancel","cancelScheduledDelayedEvent","Restart","Send","sendScheduledDelayedEvent","call","_unstable_cancelScheduledDelayedEvent","_this9","_unstable_restartScheduledDelayedEvent","_this0","restartScheduledDelayedEvent","_unstable_sendScheduledDelayedEvent","_this1","encryptAndSendToDevice","devices","payload","_this10","contentMap","Map","_ref10","deviceId","getOrCreate","set","_this11","getOpenIdToken","_this12","token","requestOpenIDConnectToken","access_token","expires_in","matrix_server_name","token_type","queueToDevice","_ref11","_this13","batch","_ref13","sendToDeviceViaWidgetApi","_this14","checkTurnServers","_this15","getSyncState","syncState","oldState","Sync","_this16","reply","_this17","servers","getTurnServers","onClientStopped","return","signal","addEventListener","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_asyncIterator","_step","next","done","server","value","urls","uris","username","credential","password","TurnServers","log","err","removeEventListener","matrix_api_error","fromWidgetApiErrorData","message"],"sources":["../src/embedded.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 {\n type WidgetApi,\n WidgetApiToWidgetAction,\n WidgetApiResponseError,\n MatrixCapabilities,\n type IWidgetApiRequest,\n type IWidgetApiAcknowledgeResponseData,\n type ISendEventToWidgetActionRequest,\n type ISendToDeviceToWidgetActionRequest,\n type ISendEventFromWidgetResponseData,\n type IWidgetApiRequestData,\n type WidgetApiAction,\n type IWidgetApiResponse,\n type IWidgetApiResponseData,\n type IUpdateStateToWidgetActionRequest,\n UnstableApiVersion,\n} from \"matrix-widget-api\";\n\nimport { MatrixEvent, type IEvent, type IContent, EventStatus } from \"./models/event.ts\";\nimport {\n type ISendEventResponse,\n type SendDelayedEventRequestOpts,\n type SendDelayedEventResponse,\n UpdateDelayedEventAction,\n isSendDelayedEventRequestOpts,\n} from \"./@types/requests.ts\";\nimport { EventType, type StateEvents } from \"./@types/event.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n MatrixClient,\n ClientEvent,\n type IMatrixClientCreateOpts,\n type IStartClientOpts,\n type SendToDeviceContentMap,\n type IOpenIDToken,\n UNSTABLE_MSC4140_DELAYED_EVENTS,\n} from \"./client.ts\";\nimport { SyncApi, SyncState } from \"./sync.ts\";\nimport { SlidingSyncSdk } from \"./sliding-sync-sdk.ts\";\nimport { ConnectionError, MatrixError } from \"./http-api/errors.ts\";\nimport { User } from \"./models/user.ts\";\nimport { type Room } from \"./models/room.ts\";\nimport { type ToDeviceBatch, type ToDevicePayload } from \"./models/ToDeviceMessage.ts\";\nimport { MapWithDefault, type QueryDict, recursiveMapToObject } from \"./utils.ts\";\nimport { type EmptyObject, TypedEventEmitter, UnsupportedDelayedEventsEndpointError } from \"./matrix.ts\";\n\ninterface IStateEventRequest {\n eventType: string;\n stateKey?: string;\n}\n\nexport interface ICapabilities {\n /**\n * Event types that this client expects to send.\n */\n sendEvent?: string[];\n /**\n * Event types that this client expects to receive.\n */\n receiveEvent?: string[];\n\n /**\n * Message types that this client expects to send, or true for all message\n * types.\n */\n sendMessage?: string[] | true;\n /**\n * Message types that this client expects to receive, or true for all\n * message types.\n */\n receiveMessage?: string[] | true;\n\n /**\n * Types of state events that this client expects to send.\n */\n sendState?: IStateEventRequest[];\n /**\n * Types of state events that this client expects to receive.\n */\n receiveState?: IStateEventRequest[];\n\n /**\n * To-device event types that this client expects to send.\n */\n sendToDevice?: string[];\n /**\n * To-device event types that this client expects to receive.\n */\n receiveToDevice?: string[];\n\n /**\n * Whether this client needs access to TURN servers.\n * @defaultValue false\n */\n turnServers?: boolean;\n\n /**\n * Whether this client needs to be able to send delayed events.\n * @experimental Part of MSC4140 & MSC4157\n * @defaultValue false\n */\n sendDelayedEvents?: boolean;\n\n /**\n * Whether this client needs to be able to update delayed events.\n * @experimental Part of MSC4140 & MSC4157\n * @defaultValue false\n */\n updateDelayedEvents?: boolean;\n\n /**\n * Whether this client needs to be able to send sticky events.\n * @experimental Part of MSC4354 & MSC4407\n * @defaultValue false\n */\n sendSticky?: boolean;\n\n /**\n * Whether this client needs to be able to receive sticky events.\n * @experimental Part of MSC4354 & MSC4407\n * @defaultValue false\n */\n receiveSticky?: boolean;\n}\n\nexport enum RoomWidgetClientEvent {\n PendingEventsChanged = \"PendingEvent.pendingEventsChanged\",\n}\nexport type EventHandlerMap = { [RoomWidgetClientEvent.PendingEventsChanged]: () => void };\n\n/**\n * A MatrixClient that routes its requests through the widget API instead of the\n * real CS API.\n * @experimental This class is considered unstable!\n */\nexport class RoomWidgetClient extends MatrixClient {\n private room?: Room;\n private readonly widgetApiReady: Promise<void>;\n private readonly roomStateSynced: Promise<void>;\n private lifecycle?: AbortController;\n private syncState: SyncState | null = null;\n\n private pendingSendingEventsTxId: { type: string; id: string | undefined; txId: string }[] = [];\n private eventEmitter = new TypedEventEmitter<keyof EventHandlerMap, EventHandlerMap>();\n\n /**\n *\n * @param widgetApi - The widget api to use for communication.\n * @param capabilities - The capabilities the widget client will request.\n * @param roomId - The room id the widget is associated with.\n * @param opts - The configuration options for this client.\n * @param sendContentLoaded - Whether to send a content loaded widget action immediately after initial setup.\n * Set to `false` if the widget uses `waitForIFrameLoad=true` (in this case the client does not expect a content loaded action at all),\n * or if the the widget wants to send the `ContentLoaded` action at a later point in time after the initial setup.\n */\n public constructor(\n private readonly widgetApi: WidgetApi,\n private readonly capabilities: ICapabilities,\n private readonly roomId: string,\n opts: IMatrixClientCreateOpts,\n sendContentLoaded: boolean,\n ) {\n super(opts);\n\n const transportSend = this.widgetApi.transport.send.bind(this.widgetApi.transport);\n this.widgetApi.transport.send = async <\n T extends IWidgetApiRequestData,\n R extends IWidgetApiResponseData = IWidgetApiAcknowledgeResponseData,\n >(\n action: WidgetApiAction,\n data: T,\n ): Promise<R> => {\n try {\n return await transportSend(action, data);\n } catch (error) {\n processAndThrow(error);\n }\n };\n\n const transportSendComplete = this.widgetApi.transport.sendComplete.bind(this.widgetApi.transport);\n this.widgetApi.transport.sendComplete = async <T extends IWidgetApiRequestData, R extends IWidgetApiResponse>(\n action: WidgetApiAction,\n data: T,\n ): Promise<R> => {\n try {\n return await transportSendComplete(action, data);\n } catch (error) {\n processAndThrow(error);\n }\n };\n\n this.widgetApiReady = new Promise<void>((resolve) => this.widgetApi.once(\"ready\", resolve));\n this.roomStateSynced = capabilities.receiveState?.length\n ? new Promise<void>((resolve) =>\n this.widgetApi.once(`action:${WidgetApiToWidgetAction.UpdateState}`, resolve),\n )\n : Promise.resolve();\n\n this.requestInitialCapabilities(capabilities, roomId);\n\n widgetApi.on(`action:${WidgetApiToWidgetAction.SendEvent}`, this.onEvent);\n widgetApi.on(`action:${WidgetApiToWidgetAction.SendToDevice}`, this.onToDevice);\n widgetApi.on(`action:${WidgetApiToWidgetAction.UpdateState}`, this.onStateUpdate);\n\n // Open communication with the host\n widgetApi.start();\n // Send a content loaded event now we've started the widget API\n // Note that element-web currently does not use waitForIFrameLoad=false and so\n // does *not* (yes, that is the right way around) wait for this event. Let's\n // start sending this, then once this has rolled out, we can change element-web to\n // use waitForIFrameLoad=false and have a widget API that's less racy.\n if (sendContentLoaded) widgetApi.sendContentLoaded();\n }\n\n private requestInitialCapabilities(capabilities: ICapabilities, roomId: string): void {\n // Request capabilities for the functionality this client needs to support\n if (\n capabilities.sendEvent?.length ||\n capabilities.receiveEvent?.length ||\n capabilities.sendMessage === true ||\n (Array.isArray(capabilities.sendMessage) && capabilities.sendMessage.length) ||\n capabilities.receiveMessage === true ||\n (Array.isArray(capabilities.receiveMessage) && capabilities.receiveMessage.length) ||\n capabilities.sendState?.length ||\n capabilities.receiveState?.length\n ) {\n this.widgetApi.requestCapabilityForRoomTimeline(roomId);\n }\n capabilities.sendEvent?.forEach((eventType) => this.widgetApi.requestCapabilityToSendEvent(eventType));\n capabilities.receiveEvent?.forEach((eventType) => this.widgetApi.requestCapabilityToReceiveEvent(eventType));\n if (capabilities.sendMessage === true) {\n this.widgetApi.requestCapabilityToSendMessage();\n } else if (Array.isArray(capabilities.sendMessage)) {\n capabilities.sendMessage.forEach((msgType) => this.widgetApi.requestCapabilityToSendMessage(msgType));\n }\n if (capabilities.receiveMessage === true) {\n this.widgetApi.requestCapabilityToReceiveMessage();\n } else if (Array.isArray(capabilities.receiveMessage)) {\n capabilities.receiveMessage.forEach((msgType) => this.widgetApi.requestCapabilityToReceiveMessage(msgType));\n }\n capabilities.sendState?.forEach(({ eventType, stateKey }) =>\n this.widgetApi.requestCapabilityToSendState(eventType, stateKey),\n );\n capabilities.receiveState?.forEach(({ eventType, stateKey }) =>\n this.widgetApi.requestCapabilityToReceiveState(eventType, stateKey),\n );\n capabilities.sendToDevice?.forEach((eventType) => this.widgetApi.requestCapabilityToSendToDevice(eventType));\n capabilities.receiveToDevice?.forEach((eventType) =>\n this.widgetApi.requestCapabilityToReceiveToDevice(eventType),\n );\n if (\n capabilities.sendDelayedEvents &&\n (capabilities.sendEvent?.length ||\n capabilities.sendMessage === true ||\n (Array.isArray(capabilities.sendMessage) && capabilities.sendMessage.length) ||\n capabilities.sendState?.length)\n ) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4157SendDelayedEvent);\n }\n if (capabilities.updateDelayedEvents) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4157UpdateDelayedEvent);\n }\n if (capabilities.sendSticky) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4407SendStickyEvent);\n }\n if (capabilities.receiveSticky) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4407ReceiveStickyEvent);\n }\n if (capabilities.turnServers) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC3846TurnServers);\n }\n }\n\n public async supportUpdateState(): Promise<boolean> {\n return (await this.widgetApi.getClientVersions()).includes(UnstableApiVersion.MSC2762_UPDATE_STATE);\n }\n\n private readonly syncApiResolver = Promise.withResolvers<void>();\n public async startClient(opts: IStartClientOpts = {}): Promise<void> {\n this.lifecycle = new AbortController();\n\n // Create our own user object artificially (instead of waiting for sync)\n // so it's always available, even if the user is not in any rooms etc.\n const userId = this.getUserId();\n if (userId) {\n this.store.storeUser(new User(userId));\n }\n\n // Even though we have no access token and cannot sync, the sync class\n // still has some valuable helper methods that we make use of, so we\n // instantiate it anyways\n if (opts.slidingSync) {\n this.syncApi = new SlidingSyncSdk(opts.slidingSync, this, opts, this.buildSyncApiOptions());\n } else {\n this.syncApi = new SyncApi(this, opts, this.buildSyncApiOptions());\n }\n this.syncApiResolver.resolve();\n\n this.room = this.syncApi.createRoom(this.roomId);\n this.store.storeRoom(this.room);\n\n await this.widgetApiReady;\n\n // sync room state:\n if (await this.supportUpdateState()) {\n // This will resolve once the client driver has sent us all the allowed room state.\n await this.roomStateSynced;\n } else {\n // Backfill the requested events\n // We only get the most recent event for every type + state key combo,\n // so it doesn't really matter what order we inject them in\n await Promise.all(\n this.capabilities.receiveState?.map(async ({ eventType, stateKey }) => {\n const rawEvents = await this.widgetApi.readStateEvents(eventType, undefined, stateKey, [\n this.roomId,\n ]);\n const events = rawEvents.map((rawEvent) => new MatrixEvent(rawEvent as Partial<IEvent>));\n\n if (this.syncApi instanceof SyncApi) {\n // Passing events as `stateAfterEventList` will update the state.\n await this.syncApi.injectRoomEvents(this.room!, undefined, events);\n } else {\n await this.syncApi!.injectRoomEvents(this.room!, events); // Sliding Sync\n }\n events.forEach((event) => {\n this.emit(ClientEvent.Event, event);\n logger.info(`Backfilled event ${event.getId()} ${event.getType()} ${event.getStateKey()}`);\n });\n }) ?? [],\n );\n }\n\n if (opts.clientWellKnownPollPeriod !== undefined) {\n this.clientWellKnownIntervalID = setInterval(() => {\n this.fetchClientWellKnown();\n }, 1000 * opts.clientWellKnownPollPeriod);\n this.fetchClientWellKnown();\n }\n this.setSyncState(SyncState.Syncing);\n logger.info(\"Finished initial sync\");\n\n this.matrixRTC.start();\n\n // Watch for TURN servers, if requested\n if (this.capabilities.turnServers) this.watchTurnServers();\n }\n\n public stopClient(): void {\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.SendEvent}`, this.onEvent);\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.SendToDevice}`, this.onToDevice);\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.UpdateState}`, this.onStateUpdate);\n\n super.stopClient();\n this.lifecycle!.abort(); // Signal to other async tasks that the client has stopped\n }\n\n public async joinRoom(roomIdOrAlias: string): Promise<Room> {\n if (roomIdOrAlias === this.roomId) return this.room!;\n throw new Error(`Unknown room: ${roomIdOrAlias}`);\n }\n\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse>;\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n delayOpts: SendDelayedEventRequestOpts,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse>;\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n delayOptsOrQuery?: SendDelayedEventRequestOpts | QueryDict,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse | SendDelayedEventResponse> {\n let queryOpts = queryDict;\n let delayOpts: SendDelayedEventRequestOpts | undefined;\n if (delayOptsOrQuery && isSendDelayedEventRequestOpts(delayOptsOrQuery)) {\n delayOpts = delayOptsOrQuery;\n } else if (!queryOpts) {\n queryOpts = delayOptsOrQuery;\n }\n\n const stickyDurationMs = queryOpts?.[\"org.matrix.msc4354.sticky_duration_ms\"];\n if (stickyDurationMs !== undefined && typeof stickyDurationMs !== \"number\") {\n throw new Error(\"Sticky duration must be a number when defined\");\n }\n // This is save since we just checked that above\n // We need the additional as assertion for the EW linter to be happy.\n // It is not capable of implying the type based on the throw if `stickyDurationMs !== undefined && typeof stickyDurationMs !== \"number\"`\n // above\n const stickyDurationMsAsNumber: number | undefined = stickyDurationMs as number | undefined;\n\n // We need to extend the content with the redacts parameter\n // The js sdk uses event.redacts but the widget api uses event.content.redacts\n // This will be converted back to event.redacts in the widget driver.\n const content = event.event.redacts\n ? { ...event.getContent(), redacts: event.event.redacts }\n : event.getContent();\n\n // Delayed event special case.\n if (delayOpts) {\n // TODO: updatePendingEvent for delayed events?\n const response = await this.widgetApi\n .sendRoomEvent(\n event.getType(),\n content,\n room.roomId,\n \"delay\" in delayOpts ? delayOpts.delay : undefined,\n \"parent_delay_id\" in delayOpts ? delayOpts.parent_delay_id : undefined,\n stickyDurationMsAsNumber,\n )\n .catch(timeoutToConnectionError);\n return this.validateSendDelayedEventResponse(response);\n }\n\n const txId = event.getTxnId();\n // Add the txnId to the pending list (still with unknown evID)\n if (txId) this.pendingSendingEventsTxId.push({ type: event.getType(), id: undefined, txId });\n\n let response: ISendEventFromWidgetResponseData;\n try {\n response = await this.widgetApi\n .sendRoomEvent(event.getType(), content, room.roomId, undefined, undefined, stickyDurationMsAsNumber)\n .catch(timeoutToConnectionError);\n } catch (e) {\n this.updatePendingEventStatus(room, event, EventStatus.NOT_SENT);\n throw e;\n }\n // This also checks for an event id on the response\n room.updatePendingEvent(event, EventStatus.SENT, response.event_id);\n\n // Update the pending events list with the eventId\n this.pendingSendingEventsTxId.forEach((p) => {\n if (p.txId === txId) p.id = response.event_id;\n });\n this.eventEmitter.emit(RoomWidgetClientEvent.PendingEventsChanged);\n\n return { event_id: response.event_id! };\n }\n\n public async sendStateEvent(\n roomId: string,\n eventType: string,\n content: any,\n stateKey = \"\",\n ): Promise<ISendEventResponse> {\n const response = await this.widgetApi\n .sendStateEvent(eventType, stateKey, content, roomId)\n .catch(timeoutToConnectionError);\n if (response.event_id === undefined) {\n throw new Error(\"'event_id' absent from response to an event request\");\n }\n return { event_id: response.event_id };\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line\n public async _unstable_sendDelayedStateEvent<K extends keyof StateEvents>(\n roomId: string,\n delayOpts: SendDelayedEventRequestOpts,\n eventType: K,\n content: StateEvents[K],\n stateKey = \"\",\n ): Promise<SendDelayedEventResponse> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"sendDelayedStateEvent\",\n );\n }\n\n const response = await this.widgetApi\n .sendStateEvent(\n eventType,\n stateKey,\n content,\n roomId,\n \"delay\" in delayOpts ? delayOpts.delay : undefined,\n \"parent_delay_id\" in delayOpts ? delayOpts.parent_delay_id : undefined,\n )\n .catch(timeoutToConnectionError);\n return this.validateSendDelayedEventResponse(response);\n }\n\n private validateSendDelayedEventResponse(response: ISendEventFromWidgetResponseData): SendDelayedEventResponse {\n if (response.delay_id === undefined) {\n throw new Error(\"'delay_id' absent from response to a delayed event request\");\n }\n return { delay_id: response.delay_id };\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n * @deprecated Instead use one of:\n * - {@link _unstable_cancelScheduledDelayedEvent}\n * - {@link _unstable_restartScheduledDelayedEvent}\n * - {@link _unstable_sendScheduledDelayedEvent}\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_updateDelayedEvent(delayId: string, action: UpdateDelayedEventAction): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"updateDelayedEvent\",\n );\n }\n\n let updateDelayedEvent: (delayId: string) => Promise<unknown>;\n switch (action) {\n case UpdateDelayedEventAction.Cancel:\n updateDelayedEvent = this.widgetApi.cancelScheduledDelayedEvent;\n break;\n case UpdateDelayedEventAction.Restart:\n updateDelayedEvent = this.widgetApi.cancelScheduledDelayedEvent;\n break;\n case UpdateDelayedEventAction.Send:\n updateDelayedEvent = this.widgetApi.sendScheduledDelayedEvent;\n break;\n }\n await updateDelayedEvent.call(this.widgetApi, delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_cancelScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"cancelScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.cancelScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_restartScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"restartScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.restartScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_sendScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"sendScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.sendScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * by {@link MatrixClient.encryptAndSendToDevice}.\n */\n public async encryptAndSendToDevice(\n eventType: string,\n devices: { userId: string; deviceId: string }[],\n payload: ToDevicePayload,\n ): Promise<void> {\n // map: user Id → device Id → payload\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const { userId, deviceId } of devices) {\n contentMap.getOrCreate(userId).set(deviceId, payload);\n }\n\n await this.widgetApi\n .sendToDevice(eventType, true, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n public async sendToDevice(eventType: string, contentMap: SendToDeviceContentMap): Promise<EmptyObject> {\n await this.widgetApi\n .sendToDevice(eventType, false, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n return {};\n }\n\n public async getOpenIdToken(): Promise<IOpenIDToken> {\n const token = await this.widgetApi.requestOpenIDConnectToken().catch(timeoutToConnectionError);\n // the IOpenIDCredentials from the widget-api and IOpenIDToken form the matrix-js-sdk are compatible.\n // we still recreate the token to make this transparent and catch'able by the linter in case the types change in the future.\n return <IOpenIDToken>{\n access_token: token.access_token,\n expires_in: token.expires_in,\n matrix_server_name: token.matrix_server_name,\n token_type: token.token_type,\n };\n }\n\n public async queueToDevice({ eventType, batch }: ToDeviceBatch): Promise<void> {\n // map: user Id → device Id → payload\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const { userId, deviceId, payload } of batch) {\n contentMap.getOrCreate(userId).set(deviceId, payload);\n }\n\n await this.widgetApi\n .sendToDevice(eventType, false, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n /**\n * Send an event to a specific list of devices via the widget API. Optionally encrypts the event.\n *\n * If you are using a full MatrixClient you would be calling {@link MatrixClient.getCrypto().encryptToDeviceMessages()} followed\n * by {@link MatrixClient.queueToDevice}.\n *\n * However, this is combined into a single step when running as an embedded widget client. So, we expose this method for those\n * that need it.\n *\n * @param eventType - Type of the event to send.\n * @param encrypted - Whether the event should be encrypted.\n * @param contentMap - The content to send. Map from user_id to device_id to content object.\n */\n public async sendToDeviceViaWidgetApi(\n eventType: string,\n encrypted: boolean,\n contentMap: SendToDeviceContentMap,\n ): Promise<void> {\n await this.widgetApi\n .sendToDevice(eventType, encrypted, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n // Overridden since we get TURN servers automatically over the widget API,\n // and this method would otherwise complain about missing an access token\n public async checkTurnServers(): Promise<boolean> {\n return this.turnServers.length > 0;\n }\n\n // Overridden since we 'sync' manually without the sync API\n public getSyncState(): SyncState | null {\n return this.syncState;\n }\n\n private setSyncState(state: SyncState): void {\n const oldState = this.syncState;\n this.syncState = state;\n this.emit(ClientEvent.Sync, state, oldState);\n }\n\n private async ack(ev: CustomEvent<IWidgetApiRequest>): Promise<void> {\n await this.widgetApi.transport.reply<IWidgetApiAcknowledgeResponseData>(ev.detail, {});\n }\n\n private updateTxId = async (event: MatrixEvent): Promise<void> => {\n // We update the txId for remote echos that originate from this client.\n // This happens with the help of `pendingSendingEventsTxId` where we store all events that are currently sending\n // with their widget txId and once ready the final evId.\n if (\n // This could theoretically be an event send by this device\n // In that case we need to update the txId of the event because the embedded client/widget\n // knows this event with a different transaction Id than what was used by the host client.\n event.getSender() === this.getUserId() &&\n // We optimize by not blocking events from types that we have not send\n // with this client.\n this.pendingSendingEventsTxId.some((p) => event.getType() === p.type)\n ) {\n // Compare by event Id if we have a matching pending event where we know the txId.\n let matchingTxId = this.pendingSendingEventsTxId.find((p) => p.id === event.getId())?.txId;\n // Block any further processing of this event until we have received the sending response.\n // -> until we know the event id.\n // -> until we have not pending events anymore.\n while (!matchingTxId && this.pendingSendingEventsTxId.length > 0) {\n // Recheck whenever the PendingEventsChanged\n await new Promise<void>((resolve) =>\n this.eventEmitter.once(RoomWidgetClientEvent.PendingEventsChanged, () => resolve()),\n );\n matchingTxId = this.pendingSendingEventsTxId.find((p) => p.id === event.getId())?.txId;\n }\n\n // We found the correct txId: we update the event and delete the entry of the pending events.\n if (matchingTxId) {\n event.setTxnId(matchingTxId);\n event.setUnsigned({ ...event.getUnsigned(), transaction_id: matchingTxId });\n }\n this.pendingSendingEventsTxId = this.pendingSendingEventsTxId.filter((p) => p.id !== event.getId());\n\n // Emit once there are no pending events anymore to release all other events that got\n // awaited in the `while (!matchingTxId && this.pendingSendingEventsTxId.length > 0)` loop\n // but are not send by this client.\n if (this.pendingSendingEventsTxId.length === 0) {\n this.eventEmitter.emit(RoomWidgetClientEvent.PendingEventsChanged);\n }\n }\n };\n\n private onEvent = async (ev: CustomEvent<ISendEventToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n\n // Verify the room ID matches, since it's possible for the client to\n // send us events from other rooms if this widget is always on screen\n if (ev.detail.data.room_id === this.roomId) {\n const event = new MatrixEvent(ev.detail.data as Partial<IEvent>);\n\n // Only inject once we have update the txId\n await this.updateTxId(event);\n await this.syncApiResolver.promise;\n if (this.syncApi instanceof SyncApi) {\n if (await this.supportUpdateState()) {\n await this.syncApi.injectRoomEvents(this.room!, undefined, [], [event]);\n } else {\n // Passing undefined for `stateAfterEventList` will make `injectRoomEvents` run in legacy mode\n // -> state events in `timelineEventList` will update the state.\n await this.syncApi.injectRoomEvents(this.room!, [], undefined, [event]);\n }\n } else {\n // Sliding Sync\n if (await this.supportUpdateState()) {\n await this.syncApi!.injectRoomEvents(this.room!, [], [event]);\n } else {\n logger.error(\n \"slididng sync cannot be used in widget mode if the client widget driver does not support the version: 'org.matrix.msc2762_update_state'\",\n );\n }\n }\n\n this.emit(ClientEvent.Event, event);\n if (event.unstableStickyInfo !== undefined) this.room!._unstable_addStickyEvents([event]);\n this.setSyncState(SyncState.Syncing);\n logger.info(`Received event ${event.getId()} ${event.getType()}`);\n } else {\n const { event_id: eventId, room_id: roomId } = ev.detail.data;\n logger.info(`Received event ${eventId} for a different room ${roomId}; discarding`);\n }\n\n await this.ack(ev);\n };\n\n private onToDevice = async (ev: CustomEvent<ISendToDeviceToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n\n const event = new MatrixEvent({\n type: ev.detail.data.type,\n sender: ev.detail.data.sender,\n content: ev.detail.data.content as IContent,\n });\n // Mark the event as encrypted if it was, using fake contents and keys since those are unknown to us\n if (ev.detail.data.encrypted) event.makeEncrypted(EventType.RoomMessageEncrypted, {}, \"\", \"\");\n\n this.emit(ClientEvent.ToDeviceEvent, event);\n this.setSyncState(SyncState.Syncing);\n await this.ack(ev);\n };\n\n private onStateUpdate = async (ev: CustomEvent<IUpdateStateToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n if (!(await this.supportUpdateState())) {\n logger.warn(\n \"received update_state widget action but the widget driver did not claim to support 'org.matrix.msc2762_update_state'\",\n );\n }\n await this.syncApiResolver.promise;\n for (const rawEvent of ev.detail.data.state) {\n // Verify the room ID matches, since it's possible for the client to\n // send us state updates from other rooms if this widget is always\n // on screen\n if (rawEvent.room_id === this.roomId) {\n const event = new MatrixEvent(rawEvent as Partial<IEvent>);\n\n if (this.syncApi instanceof SyncApi) {\n await this.syncApi.injectRoomEvents(this.room!, undefined, [event]);\n } else {\n // Sliding Sync\n await this.syncApi!.injectRoomEvents(this.room!, [event]);\n }\n logger.debug(`Updated state entry ${event.getType()} ${event.getStateKey()} to ${event.getId()}`);\n } else {\n const { event_id: eventId, room_id: roomId } = ev.detail.data;\n logger.info(`Received state entry ${eventId} for a different room ${roomId}; discarding`);\n }\n }\n\n await this.ack(ev);\n };\n\n private async watchTurnServers(): Promise<void> {\n const servers = this.widgetApi.getTurnServers();\n const onClientStopped = (): void => {\n servers.return(undefined);\n };\n this.lifecycle!.signal.addEventListener(\"abort\", onClientStopped);\n\n try {\n for await (const server of servers) {\n this.turnServers = [\n {\n urls: server.uris,\n username: server.username,\n credential: server.password,\n },\n ];\n this.emit(ClientEvent.TurnServers, this.turnServers);\n logger.log(`Received TURN server: ${server.uris}`);\n }\n } catch (e) {\n logger.warn(\"Error watching TURN servers\", e);\n } finally {\n this.lifecycle!.signal.removeEventListener(\"abort\", onClientStopped);\n }\n }\n}\n\nfunction processAndThrow(error: unknown): never {\n if (error instanceof WidgetApiResponseError && error.data.matrix_api_error) {\n throw MatrixError.fromWidgetApiErrorData(error.data.matrix_api_error);\n } else {\n throw error;\n }\n}\n\n/**\n * This converts an \"Request timed out\" error from the PostmessageTransport into a ConnectionError.\n * It either throws the original error or a new ConnectionError.\n **/\nfunction timeoutToConnectionError(error: unknown): never {\n // TODO: this should not check on error.message but instead it should be a specific type\n // error instanceof WidgetTimeoutError\n if (error instanceof Error && error.message === \"Request timed out\") {\n throw new ConnectionError(\"widget api timeout\");\n }\n throw error;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"embedded.js","names":["roomId"],"sources":["../src/embedded.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 {\n type WidgetApi,\n WidgetApiToWidgetAction,\n WidgetApiResponseError,\n MatrixCapabilities,\n type IWidgetApiRequest,\n type IWidgetApiAcknowledgeResponseData,\n type ISendEventToWidgetActionRequest,\n type ISendToDeviceToWidgetActionRequest,\n type ISendEventFromWidgetResponseData,\n type IWidgetApiRequestData,\n type WidgetApiAction,\n type IWidgetApiResponse,\n type IWidgetApiResponseData,\n type IUpdateStateToWidgetActionRequest,\n UnstableApiVersion,\n} from \"matrix-widget-api\";\n\nimport { MatrixEvent, type IEvent, type IContent, EventStatus } from \"./models/event.ts\";\nimport {\n type ISendEventResponse,\n type SendDelayedEventRequestOpts,\n type SendDelayedEventResponse,\n UpdateDelayedEventAction,\n isSendDelayedEventRequestOpts,\n} from \"./@types/requests.ts\";\nimport { EventType, type StateEvents } from \"./@types/event.ts\";\nimport { logger } from \"./logger.ts\";\nimport {\n MatrixClient,\n ClientEvent,\n type IMatrixClientCreateOpts,\n type IStartClientOpts,\n type SendToDeviceContentMap,\n type IOpenIDToken,\n UNSTABLE_MSC4140_DELAYED_EVENTS,\n} from \"./client.ts\";\nimport { SyncApi, SyncState } from \"./sync.ts\";\nimport { SlidingSyncSdk } from \"./sliding-sync-sdk.ts\";\nimport { ConnectionError, MatrixError } from \"./http-api/errors.ts\";\nimport { User } from \"./models/user.ts\";\nimport { type Room } from \"./models/room.ts\";\nimport { type ToDeviceBatch, type ToDevicePayload } from \"./models/ToDeviceMessage.ts\";\nimport { MapWithDefault, type QueryDict, recursiveMapToObject } from \"./utils.ts\";\nimport { type EmptyObject, TypedEventEmitter, UnsupportedDelayedEventsEndpointError } from \"./matrix.ts\";\n\ninterface IStateEventRequest {\n eventType: string;\n stateKey?: string;\n}\n\nexport interface ICapabilities {\n /**\n * Event types that this client expects to send.\n */\n sendEvent?: string[];\n /**\n * Event types that this client expects to receive.\n */\n receiveEvent?: string[];\n\n /**\n * Message types that this client expects to send, or true for all message\n * types.\n */\n sendMessage?: string[] | true;\n /**\n * Message types that this client expects to receive, or true for all\n * message types.\n */\n receiveMessage?: string[] | true;\n\n /**\n * Types of state events that this client expects to send.\n */\n sendState?: IStateEventRequest[];\n /**\n * Types of state events that this client expects to receive.\n */\n receiveState?: IStateEventRequest[];\n\n /**\n * To-device event types that this client expects to send.\n */\n sendToDevice?: string[];\n /**\n * To-device event types that this client expects to receive.\n */\n receiveToDevice?: string[];\n\n /**\n * Whether this client needs access to TURN servers.\n * @defaultValue false\n */\n turnServers?: boolean;\n\n /**\n * Whether this client needs to be able to send delayed events.\n * @experimental Part of MSC4140 & MSC4157\n * @defaultValue false\n */\n sendDelayedEvents?: boolean;\n\n /**\n * Whether this client needs to be able to update delayed events.\n * @experimental Part of MSC4140 & MSC4157\n * @defaultValue false\n */\n updateDelayedEvents?: boolean;\n\n /**\n * Whether this client needs to be able to send sticky events.\n * @experimental Part of MSC4354 & MSC4407\n * @defaultValue false\n */\n sendSticky?: boolean;\n\n /**\n * Whether this client needs to be able to receive sticky events.\n * @experimental Part of MSC4354 & MSC4407\n * @defaultValue false\n */\n receiveSticky?: boolean;\n}\n\nexport enum RoomWidgetClientEvent {\n PendingEventsChanged = \"PendingEvent.pendingEventsChanged\",\n}\nexport type EventHandlerMap = { [RoomWidgetClientEvent.PendingEventsChanged]: () => void };\n\n/**\n * A MatrixClient that routes its requests through the widget API instead of the\n * real CS API.\n * @experimental This class is considered unstable!\n */\nexport class RoomWidgetClient extends MatrixClient {\n private room?: Room;\n private readonly widgetApiReady: Promise<void>;\n private readonly roomStateSynced: Promise<void>;\n private lifecycle?: AbortController;\n private syncState: SyncState | null = null;\n\n private pendingSendingEventsTxId: { type: string; id: string | undefined; txId: string }[] = [];\n private eventEmitter = new TypedEventEmitter<keyof EventHandlerMap, EventHandlerMap>();\n\n /**\n *\n * @param widgetApi - The widget api to use for communication.\n * @param capabilities - The capabilities the widget client will request.\n * @param roomId - The room id the widget is associated with.\n * @param opts - The configuration options for this client.\n * @param sendContentLoaded - Whether to send a content loaded widget action immediately after initial setup.\n * Set to `false` if the widget uses `waitForIFrameLoad=true` (in this case the client does not expect a content loaded action at all),\n * or if the the widget wants to send the `ContentLoaded` action at a later point in time after the initial setup.\n */\n public constructor(\n private readonly widgetApi: WidgetApi,\n private readonly capabilities: ICapabilities,\n private readonly roomId: string,\n opts: IMatrixClientCreateOpts,\n sendContentLoaded: boolean,\n ) {\n super(opts);\n\n const transportSend = this.widgetApi.transport.send.bind(this.widgetApi.transport);\n this.widgetApi.transport.send = async <\n T extends IWidgetApiRequestData,\n R extends IWidgetApiResponseData = IWidgetApiAcknowledgeResponseData,\n >(\n action: WidgetApiAction,\n data: T,\n ): Promise<R> => {\n try {\n return await transportSend(action, data);\n } catch (error) {\n processAndThrow(error);\n }\n };\n\n const transportSendComplete = this.widgetApi.transport.sendComplete.bind(this.widgetApi.transport);\n this.widgetApi.transport.sendComplete = async <T extends IWidgetApiRequestData, R extends IWidgetApiResponse>(\n action: WidgetApiAction,\n data: T,\n ): Promise<R> => {\n try {\n return await transportSendComplete(action, data);\n } catch (error) {\n processAndThrow(error);\n }\n };\n\n this.widgetApiReady = new Promise<void>((resolve) => this.widgetApi.once(\"ready\", resolve));\n this.roomStateSynced = capabilities.receiveState?.length\n ? new Promise<void>((resolve) =>\n this.widgetApi.once(`action:${WidgetApiToWidgetAction.UpdateState}`, resolve),\n )\n : Promise.resolve();\n\n this.requestInitialCapabilities(capabilities, roomId);\n\n widgetApi.on(`action:${WidgetApiToWidgetAction.SendEvent}`, this.onEvent);\n widgetApi.on(`action:${WidgetApiToWidgetAction.SendToDevice}`, this.onToDevice);\n widgetApi.on(`action:${WidgetApiToWidgetAction.UpdateState}`, this.onStateUpdate);\n\n // Open communication with the host\n widgetApi.start();\n // Send a content loaded event now we've started the widget API\n // Note that element-web currently does not use waitForIFrameLoad=false and so\n // does *not* (yes, that is the right way around) wait for this event. Let's\n // start sending this, then once this has rolled out, we can change element-web to\n // use waitForIFrameLoad=false and have a widget API that's less racy.\n if (sendContentLoaded) widgetApi.sendContentLoaded();\n }\n\n private requestInitialCapabilities(capabilities: ICapabilities, roomId: string): void {\n // Request capabilities for the functionality this client needs to support\n if (\n capabilities.sendEvent?.length ||\n capabilities.receiveEvent?.length ||\n capabilities.sendMessage === true ||\n (Array.isArray(capabilities.sendMessage) && capabilities.sendMessage.length) ||\n capabilities.receiveMessage === true ||\n (Array.isArray(capabilities.receiveMessage) && capabilities.receiveMessage.length) ||\n capabilities.sendState?.length ||\n capabilities.receiveState?.length\n ) {\n this.widgetApi.requestCapabilityForRoomTimeline(roomId);\n }\n capabilities.sendEvent?.forEach((eventType) => this.widgetApi.requestCapabilityToSendEvent(eventType));\n capabilities.receiveEvent?.forEach((eventType) => this.widgetApi.requestCapabilityToReceiveEvent(eventType));\n if (capabilities.sendMessage === true) {\n this.widgetApi.requestCapabilityToSendMessage();\n } else if (Array.isArray(capabilities.sendMessage)) {\n capabilities.sendMessage.forEach((msgType) => this.widgetApi.requestCapabilityToSendMessage(msgType));\n }\n if (capabilities.receiveMessage === true) {\n this.widgetApi.requestCapabilityToReceiveMessage();\n } else if (Array.isArray(capabilities.receiveMessage)) {\n capabilities.receiveMessage.forEach((msgType) => this.widgetApi.requestCapabilityToReceiveMessage(msgType));\n }\n capabilities.sendState?.forEach(({ eventType, stateKey }) =>\n this.widgetApi.requestCapabilityToSendState(eventType, stateKey),\n );\n capabilities.receiveState?.forEach(({ eventType, stateKey }) =>\n this.widgetApi.requestCapabilityToReceiveState(eventType, stateKey),\n );\n capabilities.sendToDevice?.forEach((eventType) => this.widgetApi.requestCapabilityToSendToDevice(eventType));\n capabilities.receiveToDevice?.forEach((eventType) =>\n this.widgetApi.requestCapabilityToReceiveToDevice(eventType),\n );\n if (\n capabilities.sendDelayedEvents &&\n (capabilities.sendEvent?.length ||\n capabilities.sendMessage === true ||\n (Array.isArray(capabilities.sendMessage) && capabilities.sendMessage.length) ||\n capabilities.sendState?.length)\n ) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4157SendDelayedEvent);\n }\n if (capabilities.updateDelayedEvents) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4157UpdateDelayedEvent);\n }\n if (capabilities.sendSticky) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4407SendStickyEvent);\n }\n if (capabilities.receiveSticky) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC4407ReceiveStickyEvent);\n }\n if (capabilities.turnServers) {\n this.widgetApi.requestCapability(MatrixCapabilities.MSC3846TurnServers);\n }\n }\n\n public async supportUpdateState(): Promise<boolean> {\n return (await this.widgetApi.getClientVersions()).includes(UnstableApiVersion.MSC2762_UPDATE_STATE);\n }\n\n private readonly syncApiResolver = Promise.withResolvers<void>();\n public async startClient(opts: IStartClientOpts = {}): Promise<void> {\n this.lifecycle = new AbortController();\n\n // Create our own user object artificially (instead of waiting for sync)\n // so it's always available, even if the user is not in any rooms etc.\n const userId = this.getUserId();\n if (userId) {\n this.store.storeUser(new User(userId));\n }\n\n // Even though we have no access token and cannot sync, the sync class\n // still has some valuable helper methods that we make use of, so we\n // instantiate it anyways\n if (opts.slidingSync) {\n this.syncApi = new SlidingSyncSdk(opts.slidingSync, this, opts, this.buildSyncApiOptions());\n } else {\n this.syncApi = new SyncApi(this, opts, this.buildSyncApiOptions());\n }\n this.syncApiResolver.resolve();\n\n this.room = this.syncApi.createRoom(this.roomId);\n this.store.storeRoom(this.room);\n\n await this.widgetApiReady;\n\n // sync room state:\n if (await this.supportUpdateState()) {\n // This will resolve once the client driver has sent us all the allowed room state.\n await this.roomStateSynced;\n } else {\n // Backfill the requested events\n // We only get the most recent event for every type + state key combo,\n // so it doesn't really matter what order we inject them in\n await Promise.all(\n this.capabilities.receiveState?.map(async ({ eventType, stateKey }) => {\n const rawEvents = await this.widgetApi.readStateEvents(eventType, undefined, stateKey, [\n this.roomId,\n ]);\n const events = rawEvents.map((rawEvent) => new MatrixEvent(rawEvent as Partial<IEvent>));\n\n if (this.syncApi instanceof SyncApi) {\n // Passing events as `stateAfterEventList` will update the state.\n await this.syncApi.injectRoomEvents(this.room!, undefined, events);\n } else {\n await this.syncApi!.injectRoomEvents(this.room!, events); // Sliding Sync\n }\n events.forEach((event) => {\n this.emit(ClientEvent.Event, event);\n logger.info(`Backfilled event ${event.getId()} ${event.getType()} ${event.getStateKey()}`);\n });\n }) ?? [],\n );\n }\n\n if (opts.clientWellKnownPollPeriod !== undefined) {\n this.clientWellKnownIntervalID = setInterval(() => {\n this.fetchClientWellKnown();\n }, 1000 * opts.clientWellKnownPollPeriod);\n this.fetchClientWellKnown();\n }\n this.setSyncState(SyncState.Syncing);\n logger.info(\"Finished initial sync\");\n\n this.matrixRTC.start();\n\n // Watch for TURN servers, if requested\n if (this.capabilities.turnServers) this.watchTurnServers();\n }\n\n public stopClient(): void {\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.SendEvent}`, this.onEvent);\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.SendToDevice}`, this.onToDevice);\n this.widgetApi.off(`action:${WidgetApiToWidgetAction.UpdateState}`, this.onStateUpdate);\n\n super.stopClient();\n this.lifecycle!.abort(); // Signal to other async tasks that the client has stopped\n }\n\n public async joinRoom(roomIdOrAlias: string): Promise<Room> {\n if (roomIdOrAlias === this.roomId) return this.room!;\n throw new Error(`Unknown room: ${roomIdOrAlias}`);\n }\n\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse>;\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n delayOpts: SendDelayedEventRequestOpts,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse>;\n protected async encryptAndSendEvent(\n room: Room,\n event: MatrixEvent,\n delayOptsOrQuery?: SendDelayedEventRequestOpts | QueryDict,\n queryDict?: QueryDict,\n ): Promise<ISendEventResponse | SendDelayedEventResponse> {\n let queryOpts = queryDict;\n let delayOpts: SendDelayedEventRequestOpts | undefined;\n if (delayOptsOrQuery && isSendDelayedEventRequestOpts(delayOptsOrQuery)) {\n delayOpts = delayOptsOrQuery;\n } else if (!queryOpts) {\n queryOpts = delayOptsOrQuery;\n }\n\n const stickyDurationMs = queryOpts?.[\"org.matrix.msc4354.sticky_duration_ms\"];\n if (stickyDurationMs !== undefined && typeof stickyDurationMs !== \"number\") {\n throw new Error(\"Sticky duration must be a number when defined\");\n }\n // This is save since we just checked that above\n // We need the additional as assertion for the EW linter to be happy.\n // It is not capable of implying the type based on the throw if `stickyDurationMs !== undefined && typeof stickyDurationMs !== \"number\"`\n // above\n const stickyDurationMsAsNumber: number | undefined = stickyDurationMs as number | undefined;\n\n // We need to extend the content with the redacts parameter\n // The js sdk uses event.redacts but the widget api uses event.content.redacts\n // This will be converted back to event.redacts in the widget driver.\n const content = event.event.redacts\n ? { ...event.getContent(), redacts: event.event.redacts }\n : event.getContent();\n\n // Delayed event special case.\n if (delayOpts) {\n // TODO: updatePendingEvent for delayed events?\n const response = await this.widgetApi\n .sendRoomEvent(\n event.getType(),\n content,\n room.roomId,\n \"delay\" in delayOpts ? delayOpts.delay : undefined,\n \"parent_delay_id\" in delayOpts ? delayOpts.parent_delay_id : undefined,\n stickyDurationMsAsNumber,\n )\n .catch(timeoutToConnectionError);\n return this.validateSendDelayedEventResponse(response);\n }\n\n const txId = event.getTxnId();\n // Add the txnId to the pending list (still with unknown evID)\n if (txId) this.pendingSendingEventsTxId.push({ type: event.getType(), id: undefined, txId });\n\n let response: ISendEventFromWidgetResponseData;\n try {\n response = await this.widgetApi\n .sendRoomEvent(event.getType(), content, room.roomId, undefined, undefined, stickyDurationMsAsNumber)\n .catch(timeoutToConnectionError);\n } catch (e) {\n this.updatePendingEventStatus(room, event, EventStatus.NOT_SENT);\n throw e;\n }\n // This also checks for an event id on the response\n room.updatePendingEvent(event, EventStatus.SENT, response.event_id);\n\n // Update the pending events list with the eventId\n this.pendingSendingEventsTxId.forEach((p) => {\n if (p.txId === txId) p.id = response.event_id;\n });\n this.eventEmitter.emit(RoomWidgetClientEvent.PendingEventsChanged);\n\n return { event_id: response.event_id! };\n }\n\n public async sendStateEvent(\n roomId: string,\n eventType: string,\n content: any,\n stateKey = \"\",\n ): Promise<ISendEventResponse> {\n const response = await this.widgetApi\n .sendStateEvent(eventType, stateKey, content, roomId)\n .catch(timeoutToConnectionError);\n if (response.event_id === undefined) {\n throw new Error(\"'event_id' absent from response to an event request\");\n }\n return { event_id: response.event_id };\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line\n public async _unstable_sendDelayedStateEvent<K extends keyof StateEvents>(\n roomId: string,\n delayOpts: SendDelayedEventRequestOpts,\n eventType: K,\n content: StateEvents[K],\n stateKey = \"\",\n ): Promise<SendDelayedEventResponse> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"sendDelayedStateEvent\",\n );\n }\n\n const response = await this.widgetApi\n .sendStateEvent(\n eventType,\n stateKey,\n content,\n roomId,\n \"delay\" in delayOpts ? delayOpts.delay : undefined,\n \"parent_delay_id\" in delayOpts ? delayOpts.parent_delay_id : undefined,\n )\n .catch(timeoutToConnectionError);\n return this.validateSendDelayedEventResponse(response);\n }\n\n private validateSendDelayedEventResponse(response: ISendEventFromWidgetResponseData): SendDelayedEventResponse {\n if (response.delay_id === undefined) {\n throw new Error(\"'delay_id' absent from response to a delayed event request\");\n }\n return { delay_id: response.delay_id };\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n * @deprecated Instead use one of:\n * - {@link _unstable_cancelScheduledDelayedEvent}\n * - {@link _unstable_restartScheduledDelayedEvent}\n * - {@link _unstable_sendScheduledDelayedEvent}\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_updateDelayedEvent(delayId: string, action: UpdateDelayedEventAction): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"updateDelayedEvent\",\n );\n }\n\n switch (action) {\n case UpdateDelayedEventAction.Cancel:\n await this.widgetApi.cancelScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n break;\n case UpdateDelayedEventAction.Restart:\n await this.widgetApi.restartScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n break;\n case UpdateDelayedEventAction.Send:\n await this.widgetApi.sendScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n break;\n }\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_cancelScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"cancelScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.cancelScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_restartScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"restartScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.restartScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * @experimental This currently relies on an unstable MSC (MSC4140).\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public async _unstable_sendScheduledDelayedEvent(delayId: string): Promise<EmptyObject> {\n if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {\n throw new UnsupportedDelayedEventsEndpointError(\n \"Server does not support the delayed events API\",\n \"sendScheduledDelayedEvent\",\n );\n }\n\n await this.widgetApi.sendScheduledDelayedEvent(delayId).catch(timeoutToConnectionError);\n return {};\n }\n\n /**\n * by {@link MatrixClient.encryptAndSendToDevice}.\n */\n public async encryptAndSendToDevice(\n eventType: string,\n devices: { userId: string; deviceId: string }[],\n payload: ToDevicePayload,\n ): Promise<void> {\n // map: user Id → device Id → payload\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const { userId, deviceId } of devices) {\n contentMap.getOrCreate(userId).set(deviceId, payload);\n }\n\n await this.widgetApi\n .sendToDevice(eventType, true, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n public async sendToDevice(eventType: string, contentMap: SendToDeviceContentMap): Promise<EmptyObject> {\n await this.widgetApi\n .sendToDevice(eventType, false, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n return {};\n }\n\n public async getOpenIdToken(): Promise<IOpenIDToken> {\n const token = await this.widgetApi.requestOpenIDConnectToken().catch(timeoutToConnectionError);\n // the IOpenIDCredentials from the widget-api and IOpenIDToken form the matrix-js-sdk are compatible.\n // we still recreate the token to make this transparent and catch'able by the linter in case the types change in the future.\n return <IOpenIDToken>{\n access_token: token.access_token,\n expires_in: token.expires_in,\n matrix_server_name: token.matrix_server_name,\n token_type: token.token_type,\n };\n }\n\n public async queueToDevice({ eventType, batch }: ToDeviceBatch): Promise<void> {\n // map: user Id → device Id → payload\n const contentMap: MapWithDefault<string, Map<string, ToDevicePayload>> = new MapWithDefault(() => new Map());\n for (const { userId, deviceId, payload } of batch) {\n contentMap.getOrCreate(userId).set(deviceId, payload);\n }\n\n await this.widgetApi\n .sendToDevice(eventType, false, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n /**\n * Send an event to a specific list of devices via the widget API. Optionally encrypts the event.\n *\n * If you are using a full MatrixClient you would be calling {@link MatrixClient.getCrypto().encryptToDeviceMessages()} followed\n * by {@link MatrixClient.queueToDevice}.\n *\n * However, this is combined into a single step when running as an embedded widget client. So, we expose this method for those\n * that need it.\n *\n * @param eventType - Type of the event to send.\n * @param encrypted - Whether the event should be encrypted.\n * @param contentMap - The content to send. Map from user_id to device_id to content object.\n */\n public async sendToDeviceViaWidgetApi(\n eventType: string,\n encrypted: boolean,\n contentMap: SendToDeviceContentMap,\n ): Promise<void> {\n await this.widgetApi\n .sendToDevice(eventType, encrypted, recursiveMapToObject(contentMap))\n .catch(timeoutToConnectionError);\n }\n\n // Overridden since we get TURN servers automatically over the widget API,\n // and this method would otherwise complain about missing an access token\n public async checkTurnServers(): Promise<boolean> {\n return this.turnServers.length > 0;\n }\n\n // Overridden since we 'sync' manually without the sync API\n public getSyncState(): SyncState | null {\n return this.syncState;\n }\n\n private setSyncState(state: SyncState): void {\n const oldState = this.syncState;\n this.syncState = state;\n this.emit(ClientEvent.Sync, state, oldState);\n }\n\n private async ack(ev: CustomEvent<IWidgetApiRequest>): Promise<void> {\n this.widgetApi.transport.reply<IWidgetApiAcknowledgeResponseData>(ev.detail, {});\n }\n\n private updateTxId = async (event: MatrixEvent): Promise<void> => {\n // We update the txId for remote echos that originate from this client.\n // This happens with the help of `pendingSendingEventsTxId` where we store all events that are currently sending\n // with their widget txId and once ready the final evId.\n if (\n // This could theoretically be an event send by this device\n // In that case we need to update the txId of the event because the embedded client/widget\n // knows this event with a different transaction Id than what was used by the host client.\n event.getSender() === this.getUserId() &&\n // We optimize by not blocking events from types that we have not send\n // with this client.\n this.pendingSendingEventsTxId.some((p) => event.getType() === p.type)\n ) {\n // Compare by event Id if we have a matching pending event where we know the txId.\n let matchingTxId = this.pendingSendingEventsTxId.find((p) => p.id === event.getId())?.txId;\n // Block any further processing of this event until we have received the sending response.\n // -> until we know the event id.\n // -> until we have not pending events anymore.\n while (!matchingTxId && this.pendingSendingEventsTxId.length > 0) {\n // Recheck whenever the PendingEventsChanged\n await new Promise<void>((resolve) =>\n this.eventEmitter.once(RoomWidgetClientEvent.PendingEventsChanged, () => resolve()),\n );\n matchingTxId = this.pendingSendingEventsTxId.find((p) => p.id === event.getId())?.txId;\n }\n\n // We found the correct txId: we update the event and delete the entry of the pending events.\n if (matchingTxId) {\n event.setTxnId(matchingTxId);\n event.setUnsigned({ ...event.getUnsigned(), transaction_id: matchingTxId });\n }\n this.pendingSendingEventsTxId = this.pendingSendingEventsTxId.filter((p) => p.id !== event.getId());\n\n // Emit once there are no pending events anymore to release all other events that got\n // awaited in the `while (!matchingTxId && this.pendingSendingEventsTxId.length > 0)` loop\n // but are not send by this client.\n if (this.pendingSendingEventsTxId.length === 0) {\n this.eventEmitter.emit(RoomWidgetClientEvent.PendingEventsChanged);\n }\n }\n };\n\n private onEvent = async (ev: CustomEvent<ISendEventToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n\n // Verify the room ID matches, since it's possible for the client to\n // send us events from other rooms if this widget is always on screen\n if (ev.detail.data.room_id === this.roomId) {\n const event = new MatrixEvent(ev.detail.data as Partial<IEvent>);\n\n // Only inject once we have update the txId\n await this.updateTxId(event);\n await this.syncApiResolver.promise;\n if (this.syncApi instanceof SyncApi) {\n if (await this.supportUpdateState()) {\n await this.syncApi.injectRoomEvents(this.room!, undefined, [], [event]);\n } else {\n // Passing undefined for `stateAfterEventList` will make `injectRoomEvents` run in legacy mode\n // -> state events in `timelineEventList` will update the state.\n await this.syncApi.injectRoomEvents(this.room!, [], undefined, [event]);\n }\n } else {\n // Sliding Sync\n if (await this.supportUpdateState()) {\n await this.syncApi!.injectRoomEvents(this.room!, [], [event]);\n } else {\n logger.error(\n \"slididng sync cannot be used in widget mode if the client widget driver does not support the version: 'org.matrix.msc2762_update_state'\",\n );\n }\n }\n\n this.emit(ClientEvent.Event, event);\n if (event.unstableStickyInfo !== undefined) this.room!._unstable_addStickyEvents([event]);\n this.setSyncState(SyncState.Syncing);\n logger.info(`Received event ${event.getId()} ${event.getType()}`);\n } else {\n const { event_id: eventId, room_id: roomId } = ev.detail.data;\n logger.info(`Received event ${eventId} for a different room ${roomId}; discarding`);\n }\n\n await this.ack(ev);\n };\n\n private onToDevice = async (ev: CustomEvent<ISendToDeviceToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n\n const event = new MatrixEvent({\n type: ev.detail.data.type,\n sender: ev.detail.data.sender,\n content: ev.detail.data.content as IContent,\n });\n // Mark the event as encrypted if it was, using fake contents and keys since those are unknown to us\n if (ev.detail.data.encrypted) event.makeEncrypted(EventType.RoomMessageEncrypted, {}, \"\", \"\");\n\n this.emit(ClientEvent.ToDeviceEvent, event);\n this.setSyncState(SyncState.Syncing);\n await this.ack(ev);\n };\n\n private onStateUpdate = async (ev: CustomEvent<IUpdateStateToWidgetActionRequest>): Promise<void> => {\n ev.preventDefault();\n if (!(await this.supportUpdateState())) {\n logger.warn(\n \"received update_state widget action but the widget driver did not claim to support 'org.matrix.msc2762_update_state'\",\n );\n }\n await this.syncApiResolver.promise;\n for (const rawEvent of ev.detail.data.state) {\n // Verify the room ID matches, since it's possible for the client to\n // send us state updates from other rooms if this widget is always\n // on screen\n if (rawEvent.room_id === this.roomId) {\n const event = new MatrixEvent(rawEvent as Partial<IEvent>);\n\n if (this.syncApi instanceof SyncApi) {\n await this.syncApi.injectRoomEvents(this.room!, undefined, [event]);\n } else {\n // Sliding Sync\n await this.syncApi!.injectRoomEvents(this.room!, [event]);\n }\n logger.debug(`Updated state entry ${event.getType()} ${event.getStateKey()} to ${event.getId()}`);\n } else {\n const { event_id: eventId, room_id: roomId } = ev.detail.data;\n logger.info(`Received state entry ${eventId} for a different room ${roomId}; discarding`);\n }\n }\n\n await this.ack(ev);\n };\n\n private async watchTurnServers(): Promise<void> {\n const servers = this.widgetApi.getTurnServers();\n const onClientStopped = (): void => {\n servers.return(undefined);\n };\n this.lifecycle!.signal.addEventListener(\"abort\", onClientStopped);\n\n try {\n for await (const server of servers) {\n this.turnServers = [\n {\n urls: server.uris,\n username: server.username,\n credential: server.password,\n },\n ];\n this.emit(ClientEvent.TurnServers, this.turnServers);\n logger.log(`Received TURN server: ${server.uris}`);\n }\n } catch (e) {\n logger.warn(\"Error watching TURN servers\", e);\n } finally {\n this.lifecycle!.signal.removeEventListener(\"abort\", onClientStopped);\n }\n }\n}\n\nfunction processAndThrow(error: unknown): never {\n if (error instanceof WidgetApiResponseError && error.data.matrix_api_error) {\n throw MatrixError.fromWidgetApiErrorData(error.data.matrix_api_error);\n } else {\n throw error;\n }\n}\n\n/**\n * This converts an \"Request timed out\" error from the PostmessageTransport into a ConnectionError.\n * It either throws the original error or a new ConnectionError.\n **/\nfunction timeoutToConnectionError(error: unknown): never {\n // TODO: this should not check on error.message but instead it should be a specific type\n // error instanceof WidgetTimeoutError\n if (error instanceof Error && error.message === \"Request timed out\") {\n throw new ConnectionError(\"widget api timeout\");\n }\n throw error;\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/errors.js CHANGED
@@ -15,13 +15,13 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  */
17
17
 
18
- export var InvalidCryptoStoreState = /*#__PURE__*/function (InvalidCryptoStoreState) {
18
+ export let InvalidCryptoStoreState = /*#__PURE__*/function (InvalidCryptoStoreState) {
19
19
  InvalidCryptoStoreState["TooNew"] = "TOO_NEW";
20
20
  return InvalidCryptoStoreState;
21
21
  }({});
22
22
  export class InvalidCryptoStoreError extends Error {
23
23
  constructor(reason) {
24
- var message = "Crypto store is invalid because ".concat(reason, ", ") + "please stop the client, delete all data and start the client again";
24
+ const message = `Crypto store is invalid because ${reason}, ` + `please stop the client, delete all data and start the client again`;
25
25
  super(message);
26
26
  this.reason = reason;
27
27
  this.name = "InvalidCryptoStoreError";
package/lib/errors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":["InvalidCryptoStoreState","InvalidCryptoStoreError","Error","constructor","reason","message","concat","name","_defineProperty","TooNew","KeySignatureUploadError","value","ClientStoppedError","UnsupportedDelayedEventsEndpointError","clientEndpoint","UnsupportedStickyEventsEndpointError"],"sources":["../src/errors.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\nexport enum InvalidCryptoStoreState {\n TooNew = \"TOO_NEW\",\n}\n\nexport class InvalidCryptoStoreError extends Error {\n public static TOO_NEW = InvalidCryptoStoreState.TooNew;\n\n public constructor(public readonly reason: InvalidCryptoStoreState) {\n const message =\n `Crypto store is invalid because ${reason}, ` +\n `please stop the client, delete all data and start the client again`;\n super(message);\n this.name = \"InvalidCryptoStoreError\";\n }\n}\n\nexport class KeySignatureUploadError extends Error {\n public constructor(\n message: string,\n public readonly value: any,\n ) {\n super(message);\n }\n}\n\n/**\n * It is invalid to call most methods once {@link MatrixClient#stopClient} has been called.\n *\n * This error will be thrown if you attempt to do so.\n *\n * {@link MatrixClient#stopClient} itself is an exception to this: it may safely be called multiple times on the same\n * instance.\n */\nexport class ClientStoppedError extends Error {\n public constructor() {\n super(\"MatrixClient has been stopped\");\n }\n}\n\n/**\n * This error is thrown when the Homeserver does not support the delayed events endpoints.\n */\nexport class UnsupportedDelayedEventsEndpointError extends Error {\n public constructor(\n message: string,\n public clientEndpoint:\n | \"sendDelayedEvent\"\n | \"updateDelayedEvent\"\n | \"cancelScheduledDelayedEvent\"\n | \"restartScheduledDelayedEvent\"\n | \"sendScheduledDelayedEvent\"\n | \"sendDelayedStateEvent\"\n | \"getDelayedEvents\",\n ) {\n super(message);\n this.name = \"UnsupportedDelayedEventsEndpointError\";\n }\n}\n\n/**\n * This error is thrown when the Homeserver does not support the sticky events endpoints.\n */\nexport class UnsupportedStickyEventsEndpointError extends Error {\n public constructor(\n message: string,\n public clientEndpoint: \"sendStickyEvent\" | \"sendStickyStateEvent\",\n ) {\n super(message);\n this.name = \"UnsupportedStickyEventsEndpointError\";\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAYA,uBAAuB,0BAAvBA,uBAAuB;EAAvBA,uBAAuB;EAAA,OAAvBA,uBAAuB;AAAA;AAInC,OAAO,MAAMC,uBAAuB,SAASC,KAAK,CAAC;EAGxCC,WAAWA,CAAiBC,MAA+B,EAAE;IAChE,IAAMC,OAAO,GACT,mCAAAC,MAAA,CAAmCF,MAAM,8EAC2B;IACxE,KAAK,CAACC,OAAO,CAAC;IAAC,KAJgBD,MAA+B,GAA/BA,MAA+B;IAK9D,IAAI,CAACG,IAAI,GAAG,yBAAyB;EACzC;AACJ;AAACC,eAAA,CAVYP,uBAAuB,aACRD,uBAAuB,CAACS,MAAM;AAW1D,OAAO,MAAMC,uBAAuB,SAASR,KAAK,CAAC;EACxCC,WAAWA,CACdE,OAAe,EACCM,KAAU,EAC5B;IACE,KAAK,CAACN,OAAO,CAAC;IAAC,KAFCM,KAAU,GAAVA,KAAU;EAG9B;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,SAASV,KAAK,CAAC;EACnCC,WAAWA,CAAA,EAAG;IACjB,KAAK,CAAC,+BAA+B,CAAC;EAC1C;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAMU,qCAAqC,SAASX,KAAK,CAAC;EACtDC,WAAWA,CACdE,OAAe,EACRS,cAOiB,EAC1B;IACE,KAAK,CAACT,OAAO,CAAC;IAAC,KATRS,cAOiB,GAPjBA,cAOiB;IAGxB,IAAI,CAACP,IAAI,GAAG,uCAAuC;EACvD;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAMQ,oCAAoC,SAASb,KAAK,CAAC;EACrDC,WAAWA,CACdE,OAAe,EACRS,cAA0D,EACnE;IACE,KAAK,CAACT,OAAO,CAAC;IAAC,KAFRS,cAA0D,GAA1DA,cAA0D;IAGjE,IAAI,CAACP,IAAI,GAAG,sCAAsC;EACtD;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.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\nexport enum InvalidCryptoStoreState {\n TooNew = \"TOO_NEW\",\n}\n\nexport class InvalidCryptoStoreError extends Error {\n public static TOO_NEW = InvalidCryptoStoreState.TooNew;\n\n public constructor(public readonly reason: InvalidCryptoStoreState) {\n const message =\n `Crypto store is invalid because ${reason}, ` +\n `please stop the client, delete all data and start the client again`;\n super(message);\n this.name = \"InvalidCryptoStoreError\";\n }\n}\n\nexport class KeySignatureUploadError extends Error {\n public constructor(\n message: string,\n public readonly value: any,\n ) {\n super(message);\n }\n}\n\n/**\n * It is invalid to call most methods once {@link MatrixClient#stopClient} has been called.\n *\n * This error will be thrown if you attempt to do so.\n *\n * {@link MatrixClient#stopClient} itself is an exception to this: it may safely be called multiple times on the same\n * instance.\n */\nexport class ClientStoppedError extends Error {\n public constructor() {\n super(\"MatrixClient has been stopped\");\n }\n}\n\n/**\n * This error is thrown when the Homeserver does not support the delayed events endpoints.\n */\nexport class UnsupportedDelayedEventsEndpointError extends Error {\n public constructor(\n message: string,\n public clientEndpoint:\n | \"sendDelayedEvent\"\n | \"updateDelayedEvent\"\n | \"cancelScheduledDelayedEvent\"\n | \"restartScheduledDelayedEvent\"\n | \"sendScheduledDelayedEvent\"\n | \"sendDelayedStateEvent\"\n | \"getDelayedEvents\",\n ) {\n super(message);\n this.name = \"UnsupportedDelayedEventsEndpointError\";\n }\n}\n\n/**\n * This error is thrown when the Homeserver does not support the sticky events endpoints.\n */\nexport class UnsupportedStickyEventsEndpointError extends Error {\n public constructor(\n message: string,\n public clientEndpoint: \"sendStickyEvent\" | \"sendStickyStateEvent\",\n ) {\n super(message);\n this.name = \"UnsupportedStickyEventsEndpointError\";\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAY,uBAAuB,0BAAvB,uBAAuB;EAAvB,uBAAuB;EAAA,OAAvB,uBAAuB;AAAA;AAInC,OAAO,MAAM,uBAAuB,SAAS,KAAK,CAAC;EAGxC,WAAW,CAAiB,MAA+B,EAAE;IAChE,MAAM,OAAO,GACT,mCAAmC,MAAM,IAAI,GAC7C,oEAAoE;IACxE,KAAK,CAAC,OAAO,CAAC;IAAC,KAJgB,MAA+B,GAA/B,MAA+B;IAK9D,IAAI,CAAC,IAAI,GAAG,yBAAyB;EACzC;AACJ;AAAC,gBAVY,uBAAuB,aACR,uBAAuB,CAAC,MAAM;AAW1D,OAAO,MAAM,uBAAuB,SAAS,KAAK,CAAC;EACxC,WAAW,CACd,OAAe,EACC,KAAU,EAC5B;IACE,KAAK,CAAC,OAAO,CAAC;IAAC,KAFC,KAAU,GAAV,KAAU;EAG9B;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,kBAAkB,SAAS,KAAK,CAAC;EACnC,WAAW,GAAG;IACjB,KAAK,CAAC,+BAA+B,CAAC;EAC1C;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAM,qCAAqC,SAAS,KAAK,CAAC;EACtD,WAAW,CACd,OAAe,EACR,cAOiB,EAC1B;IACE,KAAK,CAAC,OAAO,CAAC;IAAC,KATR,cAOiB,GAPjB,cAOiB;IAGxB,IAAI,CAAC,IAAI,GAAG,uCAAuC;EACvD;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAM,oCAAoC,SAAS,KAAK,CAAC;EACrD,WAAW,CACd,OAAe,EACR,cAA0D,EACnE;IACE,KAAK,CAAC,OAAO,CAAC;IAAC,KAFR,cAA0D,GAA1D,cAA0D;IAGjE,IAAI,CAAC,IAAI,GAAG,sCAAsC;EACtD;AACJ","ignoreList":[]}
@@ -1,6 +1,4 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- 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; }
3
- 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; }
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
4
2
  /*
5
3
  Copyright 2021 The Matrix.org Foundation C.I.C.
6
4
 
@@ -20,11 +18,11 @@ limitations under the License.
20
18
  import { MatrixEvent, MatrixEventEvent } from "./models/event.js";
21
19
  import { RelationType } from "./@types/event.js";
22
20
  export function eventMapperFor(client, options) {
23
- var preventReEmit = Boolean(options.preventReEmit);
24
- var decrypt = options.decrypt !== false;
21
+ let preventReEmit = Boolean(options.preventReEmit);
22
+ const decrypt = options.decrypt !== false;
25
23
  function mapper(plainOldJsObject) {
26
- var room = client.getRoom(plainOldJsObject.room_id);
27
- var event;
24
+ const room = client.getRoom(plainOldJsObject.room_id);
25
+ let event;
28
26
  // If the event is already known to the room, let's re-use the model rather than duplicating.
29
27
  // We avoid doing this to state events as they may be forward or backwards looking which tweaks behaviour.
30
28
  if (room && plainOldJsObject.state_key === undefined) {
@@ -42,16 +40,16 @@ export function eventMapperFor(client, options) {
42
40
  // if there is a complete edit bundled alongside the event, perform the replacement.
43
41
  // (prior to MSC3925, events were automatically replaced on the server-side. MSC3925 proposes that that doesn't
44
42
  // happen automatically but the server does provide us with the whole content of the edit event.)
45
- var bundledEdit = event.getServerAggregatedRelation(RelationType.Replace);
46
- if (bundledEdit !== null && bundledEdit !== void 0 && bundledEdit.content) {
47
- var replacement = mapper(bundledEdit);
43
+ const bundledEdit = event.getServerAggregatedRelation(RelationType.Replace);
44
+ if (bundledEdit?.content) {
45
+ const replacement = mapper(bundledEdit);
48
46
  // XXX: it's worth noting that the spec says we should only respect encrypted edits if, once decrypted, the
49
47
  // replacement has a `m.new_content` property. The problem is that we haven't yet decrypted the replacement
50
48
  // (it should be happening in the background), so we can't enforce this. Possibly we should for decryption
51
49
  // to complete, but that sounds a bit racy. For now, we just assume it's ok.
52
50
  event.makeReplaced(replacement);
53
51
  }
54
- var thread = room === null || room === void 0 ? void 0 : room.findThreadForEvent(event);
52
+ const thread = room?.findThreadForEvent(event);
55
53
  if (thread) {
56
54
  event.setThread(thread);
57
55
  }
@@ -65,7 +63,7 @@ export function eventMapperFor(client, options) {
65
63
  }
66
64
  if (!preventReEmit) {
67
65
  client.reEmitter.reEmit(event, [MatrixEventEvent.Replaced, MatrixEventEvent.VisibilityChange]);
68
- room === null || room === void 0 || room.reEmitter.reEmit(event, [MatrixEventEvent.BeforeRedaction]);
66
+ room?.reEmitter.reEmit(event, [MatrixEventEvent.BeforeRedaction]);
69
67
  }
70
68
  return event;
71
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-mapper.js","names":["MatrixEvent","MatrixEventEvent","RelationType","eventMapperFor","client","options","preventReEmit","Boolean","decrypt","mapper","plainOldJsObject","room","getRoom","room_id","event","state_key","undefined","findEventById","event_id","status","setUnsigned","_objectSpread","getUnsigned","unsigned","bundledEdit","getServerAggregatedRelation","Replace","content","replacement","makeReplaced","thread","findThreadForEvent","setThread","isEncrypted","reEmitter","reEmit","Decrypted","decryptEventIfNeeded","Replaced","VisibilityChange","BeforeRedaction"],"sources":["../src/event-mapper.ts"],"sourcesContent":["/*\nCopyright 2021 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 } from \"./client.ts\";\nimport { type IEvent, MatrixEvent, MatrixEventEvent } from \"./models/event.ts\";\nimport { RelationType } from \"./@types/event.ts\";\n\nexport type EventMapper = (obj: Partial<IEvent>) => MatrixEvent;\n\nexport interface MapperOpts {\n // don't re-emit events emitted on an event mapped by this mapper on the client\n preventReEmit?: boolean;\n // decrypt event proactively\n decrypt?: boolean;\n}\n\nexport function eventMapperFor(client: MatrixClient, options: MapperOpts): EventMapper {\n let preventReEmit = Boolean(options.preventReEmit);\n const decrypt = options.decrypt !== false;\n\n function mapper(plainOldJsObject: Partial<IEvent>): MatrixEvent {\n const room = client.getRoom(plainOldJsObject.room_id);\n\n let event: MatrixEvent | undefined;\n // If the event is already known to the room, let's re-use the model rather than duplicating.\n // We avoid doing this to state events as they may be forward or backwards looking which tweaks behaviour.\n if (room && plainOldJsObject.state_key === undefined) {\n event = room.findEventById(plainOldJsObject.event_id!);\n }\n\n if (!event || event.status) {\n event = new MatrixEvent(plainOldJsObject);\n } else {\n // merge the latest unsigned data from the server\n event.setUnsigned({ ...event.getUnsigned(), ...plainOldJsObject.unsigned });\n // prevent doubling up re-emitters\n preventReEmit = true;\n }\n\n // if there is a complete edit bundled alongside the event, perform the replacement.\n // (prior to MSC3925, events were automatically replaced on the server-side. MSC3925 proposes that that doesn't\n // happen automatically but the server does provide us with the whole content of the edit event.)\n const bundledEdit = event.getServerAggregatedRelation<Partial<IEvent>>(RelationType.Replace);\n if (bundledEdit?.content) {\n const replacement = mapper(bundledEdit);\n // XXX: it's worth noting that the spec says we should only respect encrypted edits if, once decrypted, the\n // replacement has a `m.new_content` property. The problem is that we haven't yet decrypted the replacement\n // (it should be happening in the background), so we can't enforce this. Possibly we should for decryption\n // to complete, but that sounds a bit racy. For now, we just assume it's ok.\n event.makeReplaced(replacement);\n }\n\n const thread = room?.findThreadForEvent(event);\n if (thread) {\n event.setThread(thread);\n }\n\n if (event.isEncrypted()) {\n if (!preventReEmit) {\n client.reEmitter.reEmit(event, [MatrixEventEvent.Decrypted]);\n }\n if (decrypt) {\n client.decryptEventIfNeeded(event);\n }\n }\n\n if (!preventReEmit) {\n client.reEmitter.reEmit(event, [MatrixEventEvent.Replaced, MatrixEventEvent.VisibilityChange]);\n room?.reEmitter.reEmit(event, [MatrixEventEvent.BeforeRedaction]);\n }\n return event;\n }\n\n return mapper;\n}\n"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAAsBA,WAAW,EAAEC,gBAAgB,QAAQ,mBAAmB;AAC9E,SAASC,YAAY,QAAQ,mBAAmB;AAWhD,OAAO,SAASC,cAAcA,CAACC,MAAoB,EAAEC,OAAmB,EAAe;EACnF,IAAIC,aAAa,GAAGC,OAAO,CAACF,OAAO,CAACC,aAAa,CAAC;EAClD,IAAME,OAAO,GAAGH,OAAO,CAACG,OAAO,KAAK,KAAK;EAEzC,SAASC,MAAMA,CAACC,gBAAiC,EAAe;IAC5D,IAAMC,IAAI,GAAGP,MAAM,CAACQ,OAAO,CAACF,gBAAgB,CAACG,OAAO,CAAC;IAErD,IAAIC,KAA8B;IAClC;IACA;IACA,IAAIH,IAAI,IAAID,gBAAgB,CAACK,SAAS,KAAKC,SAAS,EAAE;MAClDF,KAAK,GAAGH,IAAI,CAACM,aAAa,CAACP,gBAAgB,CAACQ,QAAS,CAAC;IAC1D;IAEA,IAAI,CAACJ,KAAK,IAAIA,KAAK,CAACK,MAAM,EAAE;MACxBL,KAAK,GAAG,IAAId,WAAW,CAACU,gBAAgB,CAAC;IAC7C,CAAC,MAAM;MACH;MACAI,KAAK,CAACM,WAAW,CAAAC,aAAA,CAAAA,aAAA,KAAMP,KAAK,CAACQ,WAAW,CAAC,CAAC,GAAKZ,gBAAgB,CAACa,QAAQ,CAAE,CAAC;MAC3E;MACAjB,aAAa,GAAG,IAAI;IACxB;;IAEA;IACA;IACA;IACA,IAAMkB,WAAW,GAAGV,KAAK,CAACW,2BAA2B,CAAkBvB,YAAY,CAACwB,OAAO,CAAC;IAC5F,IAAIF,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEG,OAAO,EAAE;MACtB,IAAMC,WAAW,GAAGnB,MAAM,CAACe,WAAW,CAAC;MACvC;MACA;MACA;MACA;MACAV,KAAK,CAACe,YAAY,CAACD,WAAW,CAAC;IACnC;IAEA,IAAME,MAAM,GAAGnB,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEoB,kBAAkB,CAACjB,KAAK,CAAC;IAC9C,IAAIgB,MAAM,EAAE;MACRhB,KAAK,CAACkB,SAAS,CAACF,MAAM,CAAC;IAC3B;IAEA,IAAIhB,KAAK,CAACmB,WAAW,CAAC,CAAC,EAAE;MACrB,IAAI,CAAC3B,aAAa,EAAE;QAChBF,MAAM,CAAC8B,SAAS,CAACC,MAAM,CAACrB,KAAK,EAAE,CAACb,gBAAgB,CAACmC,SAAS,CAAC,CAAC;MAChE;MACA,IAAI5B,OAAO,EAAE;QACTJ,MAAM,CAACiC,oBAAoB,CAACvB,KAAK,CAAC;MACtC;IACJ;IAEA,IAAI,CAACR,aAAa,EAAE;MAChBF,MAAM,CAAC8B,SAAS,CAACC,MAAM,CAACrB,KAAK,EAAE,CAACb,gBAAgB,CAACqC,QAAQ,EAAErC,gBAAgB,CAACsC,gBAAgB,CAAC,CAAC;MAC9F5B,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEuB,SAAS,CAACC,MAAM,CAACrB,KAAK,EAAE,CAACb,gBAAgB,CAACuC,eAAe,CAAC,CAAC;IACrE;IACA,OAAO1B,KAAK;EAChB;EAEA,OAAOL,MAAM;AACjB","ignoreList":[]}
1
+ {"version":3,"file":"event-mapper.js","names":[],"sources":["../src/event-mapper.ts"],"sourcesContent":["/*\nCopyright 2021 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 } from \"./client.ts\";\nimport { type IEvent, MatrixEvent, MatrixEventEvent } from \"./models/event.ts\";\nimport { RelationType } from \"./@types/event.ts\";\n\nexport type EventMapper = (obj: Partial<IEvent>) => MatrixEvent;\n\nexport interface MapperOpts {\n // don't re-emit events emitted on an event mapped by this mapper on the client\n preventReEmit?: boolean;\n // decrypt event proactively\n decrypt?: boolean;\n}\n\nexport function eventMapperFor(client: MatrixClient, options: MapperOpts): EventMapper {\n let preventReEmit = Boolean(options.preventReEmit);\n const decrypt = options.decrypt !== false;\n\n function mapper(plainOldJsObject: Partial<IEvent>): MatrixEvent {\n const room = client.getRoom(plainOldJsObject.room_id);\n\n let event: MatrixEvent | undefined;\n // If the event is already known to the room, let's re-use the model rather than duplicating.\n // We avoid doing this to state events as they may be forward or backwards looking which tweaks behaviour.\n if (room && plainOldJsObject.state_key === undefined) {\n event = room.findEventById(plainOldJsObject.event_id!);\n }\n\n if (!event || event.status) {\n event = new MatrixEvent(plainOldJsObject);\n } else {\n // merge the latest unsigned data from the server\n event.setUnsigned({ ...event.getUnsigned(), ...plainOldJsObject.unsigned });\n // prevent doubling up re-emitters\n preventReEmit = true;\n }\n\n // if there is a complete edit bundled alongside the event, perform the replacement.\n // (prior to MSC3925, events were automatically replaced on the server-side. MSC3925 proposes that that doesn't\n // happen automatically but the server does provide us with the whole content of the edit event.)\n const bundledEdit = event.getServerAggregatedRelation<Partial<IEvent>>(RelationType.Replace);\n if (bundledEdit?.content) {\n const replacement = mapper(bundledEdit);\n // XXX: it's worth noting that the spec says we should only respect encrypted edits if, once decrypted, the\n // replacement has a `m.new_content` property. The problem is that we haven't yet decrypted the replacement\n // (it should be happening in the background), so we can't enforce this. Possibly we should for decryption\n // to complete, but that sounds a bit racy. For now, we just assume it's ok.\n event.makeReplaced(replacement);\n }\n\n const thread = room?.findThreadForEvent(event);\n if (thread) {\n event.setThread(thread);\n }\n\n if (event.isEncrypted()) {\n if (!preventReEmit) {\n client.reEmitter.reEmit(event, [MatrixEventEvent.Decrypted]);\n }\n if (decrypt) {\n client.decryptEventIfNeeded(event);\n }\n }\n\n if (!preventReEmit) {\n client.reEmitter.reEmit(event, [MatrixEventEvent.Replaced, MatrixEventEvent.VisibilityChange]);\n room?.reEmitter.reEmit(event, [MatrixEventEvent.BeforeRedaction]);\n }\n return event;\n }\n\n return mapper;\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAAsB,WAAW,EAAE,gBAAgB,QAAQ,mBAAmB;AAC9E,SAAS,YAAY,QAAQ,mBAAmB;AAWhD,OAAO,SAAS,cAAc,CAAC,MAAoB,EAAE,OAAmB,EAAe;EACnF,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;EAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK;EAEzC,SAAS,MAAM,CAAC,gBAAiC,EAAe;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAErD,IAAI,KAA8B;IAClC;IACA;IACA,IAAI,IAAI,IAAI,gBAAgB,CAAC,SAAS,KAAK,SAAS,EAAE;MAClD,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAS,CAAC;IAC1D;IAEA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;MACxB,KAAK,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC;IAC7C,CAAC,MAAM;MACH;MACA,KAAK,CAAC,WAAW,iCAAM,KAAK,CAAC,WAAW,CAAC,CAAC,GAAK,gBAAgB,CAAC,QAAQ,CAAE,CAAC;MAC3E;MACA,aAAa,GAAG,IAAI;IACxB;;IAEA;IACA;IACA;IACA,MAAM,WAAW,GAAG,KAAK,CAAC,2BAA2B,CAAkB,YAAY,CAAC,OAAO,CAAC;IAC5F,IAAI,WAAW,EAAE,OAAO,EAAE;MACtB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;MACvC;MACA;MACA;MACA;MACA,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC;IACnC;IAEA,MAAM,MAAM,GAAG,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC;IAC9C,IAAI,MAAM,EAAE;MACR,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IAC3B;IAEA,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE;MACrB,IAAI,CAAC,aAAa,EAAE;QAChB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;MAChE;MACA,IAAI,OAAO,EAAE;QACT,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC;MACtC;IACJ;IAEA,IAAI,CAAC,aAAa,EAAE;MAChB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;MAC9F,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACrE;IACA,OAAO,KAAK;EAChB;EAEA,OAAO,MAAM;AACjB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensibleEvent.js","names":["ExtensibleEvent","constructor","wireFormat","wireContent","content"],"sources":["../../src/extensible_events_v1/ExtensibleEvent.ts"],"sourcesContent":["/*\nCopyright 2021 - 2023 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 ExtensibleEventType, type IPartialEvent } from \"../@types/extensible_events.ts\";\n\n/**\n * Represents an Extensible Event in Matrix.\n */\nexport abstract class ExtensibleEvent<TContent extends object = object> {\n protected constructor(public readonly wireFormat: IPartialEvent<TContent>) {}\n\n /**\n * Shortcut to wireFormat.content\n */\n public get wireContent(): TContent {\n return this.wireFormat.content;\n }\n\n /**\n * Serializes the event into a format which can be used to send the\n * event to the room.\n * @returns The serialized event.\n */\n public abstract serialize(): IPartialEvent<object>;\n\n /**\n * Determines if this event is equivalent to the provided event type.\n * This is recommended over `instanceof` checks due to issues in the JS\n * runtime (and layering of dependencies in some projects).\n *\n * Implementations should pass this check off to their super classes\n * if their own checks fail. Some primary implementations do not extend\n * fallback classes given they support the primary type first. Thus,\n * those classes may return false if asked about their fallback\n * representation.\n *\n * Note that this only checks primary event types: legacy events, like\n * m.room.message, should/will fail this check.\n * @param primaryEventType - The (potentially namespaced) event\n * type.\n * @returns True if this event *could* be represented as the\n * given type.\n */\n public abstract isEquivalentTo(primaryEventType: ExtensibleEventType): boolean;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA,OAAO,MAAeA,eAAe,CAAmC;EAC1DC,WAAWA,CAAiBC,UAAmC,EAAE;IAAA,KAArCA,UAAmC,GAAnCA,UAAmC;EAAG;;EAE5E;AACJ;AACA;EACI,IAAWC,WAAWA,CAAA,EAAa;IAC/B,OAAO,IAAI,CAACD,UAAU,CAACE,OAAO;EAClC;;EAEA;AACJ;AACA;AACA;AACA;;EAGI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA","ignoreList":[]}
1
+ {"version":3,"file":"ExtensibleEvent.js","names":[],"sources":["../../src/extensible_events_v1/ExtensibleEvent.ts"],"sourcesContent":["/*\nCopyright 2021 - 2023 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 ExtensibleEventType, type IPartialEvent } from \"../@types/extensible_events.ts\";\n\n/**\n * Represents an Extensible Event in Matrix.\n */\nexport abstract class ExtensibleEvent<TContent extends object = object> {\n protected constructor(public readonly wireFormat: IPartialEvent<TContent>) {}\n\n /**\n * Shortcut to wireFormat.content\n */\n public get wireContent(): TContent {\n return this.wireFormat.content;\n }\n\n /**\n * Serializes the event into a format which can be used to send the\n * event to the room.\n * @returns The serialized event.\n */\n public abstract serialize(): IPartialEvent<object>;\n\n /**\n * Determines if this event is equivalent to the provided event type.\n * This is recommended over `instanceof` checks due to issues in the JS\n * runtime (and layering of dependencies in some projects).\n *\n * Implementations should pass this check off to their super classes\n * if their own checks fail. Some primary implementations do not extend\n * fallback classes given they support the primary type first. Thus,\n * those classes may return false if asked about their fallback\n * representation.\n *\n * Note that this only checks primary event types: legacy events, like\n * m.room.message, should/will fail this check.\n * @param primaryEventType - The (potentially namespaced) event\n * type.\n * @returns True if this event *could* be represented as the\n * given type.\n */\n public abstract isEquivalentTo(primaryEventType: ExtensibleEventType): boolean;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA,OAAO,MAAe,eAAe,CAAmC;EAC1D,WAAW,CAAiB,UAAmC,EAAE;IAAA,KAArC,UAAmC,GAAnC,UAAmC;EAAG;;EAE5E;AACJ;AACA;EACI,IAAW,WAAW,GAAa;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO;EAClC;;EAEA;AACJ;AACA;AACA;AACA;;EAGI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"InvalidEventError.js","names":["InvalidEventError","Error","constructor","message"],"sources":["../../src/extensible_events_v1/InvalidEventError.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 * Thrown when an event is unforgivably unparsable.\n */\nexport class InvalidEventError extends Error {\n public constructor(message: string) {\n super(message);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,SAASC,KAAK,CAAC;EAClCC,WAAWA,CAACC,OAAe,EAAE;IAChC,KAAK,CAACA,OAAO,CAAC;EAClB;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"InvalidEventError.js","names":[],"sources":["../../src/extensible_events_v1/InvalidEventError.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 * Thrown when an event is unforgivably unparsable.\n */\nexport class InvalidEventError extends Error {\n public constructor(message: string) {\n super(message);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,SAAS,KAAK,CAAC;EAClC,WAAW,CAAC,OAAe,EAAE;IAChC,KAAK,CAAC,OAAO,CAAC;EAClB;AACJ","ignoreList":[]}
@@ -1,6 +1,5 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
1
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- 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; }
3
- 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; }
4
3
  /*
5
4
  Copyright 2022 - 2023 The Matrix.org Foundation C.I.C.
6
5
 
@@ -53,22 +52,22 @@ export class MessageEvent extends ExtensibleEvent {
53
52
  * other information available in the event.
54
53
  */
55
54
  _defineProperty(this, "renderings", void 0);
56
- var mmessage = M_MESSAGE.findIn(this.wireContent);
57
- var mtext = M_TEXT.findIn(this.wireContent);
58
- var mhtml = M_HTML.findIn(this.wireContent);
55
+ const mmessage = M_MESSAGE.findIn(this.wireContent);
56
+ const mtext = M_TEXT.findIn(this.wireContent);
57
+ const mhtml = M_HTML.findIn(this.wireContent);
59
58
  if (isProvided(mmessage)) {
60
59
  if (!Array.isArray(mmessage)) {
61
60
  throw new InvalidEventError("m.message contents must be an array");
62
61
  }
63
- var text = mmessage.find(r => !isProvided(r.mimetype) || r.mimetype === "text/plain");
64
- var html = mmessage.find(r => r.mimetype === "text/html");
62
+ const text = mmessage.find(r => !isProvided(r.mimetype) || r.mimetype === "text/plain");
63
+ const html = mmessage.find(r => r.mimetype === "text/html");
65
64
  if (!text) throw new InvalidEventError("m.message is missing a plain text representation");
66
65
  this.text = text.body;
67
- this.html = html === null || html === void 0 ? void 0 : html.body;
66
+ this.html = html?.body;
68
67
  this.renderings = mmessage;
69
68
  } else if (isOptionalAString(mtext)) {
70
69
  this.text = mtext;
71
- this.html = mhtml !== null && mhtml !== void 0 ? mhtml : undefined;
70
+ this.html = mhtml ?? undefined;
72
71
  this.renderings = [{
73
72
  body: mtext,
74
73
  mimetype: "text/plain"
@@ -87,13 +86,13 @@ export class MessageEvent extends ExtensibleEvent {
87
86
  return isEventTypeSame(primaryEventType, M_MESSAGE);
88
87
  }
89
88
  serializeMMessageOnly() {
90
- var messageRendering = {
89
+ let messageRendering = {
91
90
  [M_MESSAGE.name]: this.renderings
92
91
  };
93
92
 
94
93
  // Use the shorthand if it's just a simple text event
95
94
  if (this.renderings.length === 1) {
96
- var mime = this.renderings[0].mimetype;
95
+ const mime = this.renderings[0].mimetype;
97
96
  if (mime === undefined || mime === "text/plain") {
98
97
  messageRendering = {
99
98
  [M_TEXT.name]: this.renderings[0].body
@@ -103,14 +102,13 @@ export class MessageEvent extends ExtensibleEvent {
103
102
  return messageRendering;
104
103
  }
105
104
  serialize() {
106
- var _this$html;
107
105
  return {
108
106
  type: "m.room.message",
109
107
  content: _objectSpread(_objectSpread({}, this.serializeMMessageOnly()), {}, {
110
108
  body: this.text,
111
109
  msgtype: "m.text",
112
110
  format: this.html ? "org.matrix.custom.html" : undefined,
113
- formatted_body: (_this$html = this.html) !== null && _this$html !== void 0 ? _this$html : undefined
111
+ formatted_body: this.html ?? undefined
114
112
  })
115
113
  };
116
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MessageEvent.js","names":["ExtensibleEvent","isEventTypeSame","M_HTML","M_MESSAGE","M_TEXT","isOptionalAString","isProvided","InvalidEventError","MessageEvent","constructor","wireFormat","_defineProperty","mmessage","findIn","wireContent","mtext","mhtml","Array","isArray","text","find","r","mimetype","html","body","renderings","undefined","push","isEquivalentTo","primaryEventType","serializeMMessageOnly","messageRendering","name","length","mime","serialize","_this$html","type","content","_objectSpread","msgtype","format","formatted_body","from"],"sources":["../../src/extensible_events_v1/MessageEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport {\n type ExtensibleEventType,\n type IMessageRendering,\n type IPartialEvent,\n isEventTypeSame,\n M_HTML,\n M_MESSAGE,\n type ExtensibleAnyMessageEventContent,\n M_TEXT,\n} from \"../@types/extensible_events.ts\";\nimport { isOptionalAString, isProvided } from \"./utilities.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\n\n/**\n * Represents a message event. Message events are the simplest form of event with\n * just text (optionally of different mimetypes, like HTML).\n *\n * Message events can additionally be an Emote or Notice, though typically those\n * are represented as EmoteEvent and NoticeEvent respectively.\n */\nexport class MessageEvent extends ExtensibleEvent<ExtensibleAnyMessageEventContent> {\n /**\n * The default text for the event.\n */\n public readonly text: string;\n\n /**\n * The default HTML for the event, if provided.\n */\n public readonly html?: string;\n\n /**\n * All the different renderings of the message. Note that this is the same\n * format as an m.message body but may contain elements not found directly\n * in the event content: this is because this is interpreted based off the\n * other information available in the event.\n */\n public readonly renderings: IMessageRendering[];\n\n /**\n * Creates a new MessageEvent from a pure format. Note that the event is\n * *not* parsed here: it will be treated as a literal m.message primary\n * typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<ExtensibleAnyMessageEventContent>) {\n super(wireFormat);\n\n const mmessage = M_MESSAGE.findIn(this.wireContent);\n const mtext = M_TEXT.findIn<string>(this.wireContent);\n const mhtml = M_HTML.findIn<string>(this.wireContent);\n if (isProvided(mmessage)) {\n if (!Array.isArray(mmessage)) {\n throw new InvalidEventError(\"m.message contents must be an array\");\n }\n const text = mmessage.find((r) => !isProvided(r.mimetype) || r.mimetype === \"text/plain\");\n const html = mmessage.find((r) => r.mimetype === \"text/html\");\n\n if (!text) throw new InvalidEventError(\"m.message is missing a plain text representation\");\n\n this.text = text.body;\n this.html = html?.body;\n this.renderings = mmessage;\n } else if (isOptionalAString(mtext)) {\n this.text = mtext;\n this.html = mhtml ?? undefined;\n this.renderings = [{ body: mtext, mimetype: \"text/plain\" }];\n if (this.html) {\n this.renderings.push({ body: this.html, mimetype: \"text/html\" });\n }\n } else {\n throw new InvalidEventError(\"Missing textual representation for event\");\n }\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_MESSAGE);\n }\n\n protected serializeMMessageOnly(): ExtensibleAnyMessageEventContent {\n let messageRendering: ExtensibleAnyMessageEventContent = {\n [M_MESSAGE.name]: this.renderings,\n };\n\n // Use the shorthand if it's just a simple text event\n if (this.renderings.length === 1) {\n const mime = this.renderings[0].mimetype;\n if (mime === undefined || mime === \"text/plain\") {\n messageRendering = {\n [M_TEXT.name]: this.renderings[0].body,\n };\n }\n }\n\n return messageRendering;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"m.room.message\",\n content: {\n ...this.serializeMMessageOnly(),\n body: this.text,\n msgtype: \"m.text\",\n format: this.html ? \"org.matrix.custom.html\" : undefined,\n formatted_body: this.html ?? undefined,\n },\n };\n }\n\n /**\n * Creates a new MessageEvent from text and HTML.\n * @param text - The text.\n * @param html - Optional HTML.\n * @returns The representative message event.\n */\n public static from(text: string, html?: string): MessageEvent {\n return new MessageEvent({\n type: M_MESSAGE.name,\n content: {\n [M_TEXT.name]: text,\n [M_HTML.name]: html,\n },\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MessageEvent.js","names":[],"sources":["../../src/extensible_events_v1/MessageEvent.ts"],"sourcesContent":["/*\nCopyright 2022 - 2023 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 { ExtensibleEvent } from \"./ExtensibleEvent.ts\";\nimport {\n type ExtensibleEventType,\n type IMessageRendering,\n type IPartialEvent,\n isEventTypeSame,\n M_HTML,\n M_MESSAGE,\n type ExtensibleAnyMessageEventContent,\n M_TEXT,\n} from \"../@types/extensible_events.ts\";\nimport { isOptionalAString, isProvided } from \"./utilities.ts\";\nimport { InvalidEventError } from \"./InvalidEventError.ts\";\n\n/**\n * Represents a message event. Message events are the simplest form of event with\n * just text (optionally of different mimetypes, like HTML).\n *\n * Message events can additionally be an Emote or Notice, though typically those\n * are represented as EmoteEvent and NoticeEvent respectively.\n */\nexport class MessageEvent extends ExtensibleEvent<ExtensibleAnyMessageEventContent> {\n /**\n * The default text for the event.\n */\n public readonly text: string;\n\n /**\n * The default HTML for the event, if provided.\n */\n public readonly html?: string;\n\n /**\n * All the different renderings of the message. Note that this is the same\n * format as an m.message body but may contain elements not found directly\n * in the event content: this is because this is interpreted based off the\n * other information available in the event.\n */\n public readonly renderings: IMessageRendering[];\n\n /**\n * Creates a new MessageEvent from a pure format. Note that the event is\n * *not* parsed here: it will be treated as a literal m.message primary\n * typed event.\n * @param wireFormat - The event.\n */\n public constructor(wireFormat: IPartialEvent<ExtensibleAnyMessageEventContent>) {\n super(wireFormat);\n\n const mmessage = M_MESSAGE.findIn(this.wireContent);\n const mtext = M_TEXT.findIn<string>(this.wireContent);\n const mhtml = M_HTML.findIn<string>(this.wireContent);\n if (isProvided(mmessage)) {\n if (!Array.isArray(mmessage)) {\n throw new InvalidEventError(\"m.message contents must be an array\");\n }\n const text = mmessage.find((r) => !isProvided(r.mimetype) || r.mimetype === \"text/plain\");\n const html = mmessage.find((r) => r.mimetype === \"text/html\");\n\n if (!text) throw new InvalidEventError(\"m.message is missing a plain text representation\");\n\n this.text = text.body;\n this.html = html?.body;\n this.renderings = mmessage;\n } else if (isOptionalAString(mtext)) {\n this.text = mtext;\n this.html = mhtml ?? undefined;\n this.renderings = [{ body: mtext, mimetype: \"text/plain\" }];\n if (this.html) {\n this.renderings.push({ body: this.html, mimetype: \"text/html\" });\n }\n } else {\n throw new InvalidEventError(\"Missing textual representation for event\");\n }\n }\n\n public isEquivalentTo(primaryEventType: ExtensibleEventType): boolean {\n return isEventTypeSame(primaryEventType, M_MESSAGE);\n }\n\n protected serializeMMessageOnly(): ExtensibleAnyMessageEventContent {\n let messageRendering: ExtensibleAnyMessageEventContent = {\n [M_MESSAGE.name]: this.renderings,\n };\n\n // Use the shorthand if it's just a simple text event\n if (this.renderings.length === 1) {\n const mime = this.renderings[0].mimetype;\n if (mime === undefined || mime === \"text/plain\") {\n messageRendering = {\n [M_TEXT.name]: this.renderings[0].body,\n };\n }\n }\n\n return messageRendering;\n }\n\n public serialize(): IPartialEvent<object> {\n return {\n type: \"m.room.message\",\n content: {\n ...this.serializeMMessageOnly(),\n body: this.text,\n msgtype: \"m.text\",\n format: this.html ? \"org.matrix.custom.html\" : undefined,\n formatted_body: this.html ?? undefined,\n },\n };\n }\n\n /**\n * Creates a new MessageEvent from text and HTML.\n * @param text - The text.\n * @param html - Optional HTML.\n * @returns The representative message event.\n */\n public static from(text: string, html?: string): MessageEvent {\n return new MessageEvent({\n type: M_MESSAGE.name,\n content: {\n [M_TEXT.name]: text,\n [M_HTML.name]: html,\n },\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}