@unwanted/matrix-sdk-mini 34.12.0-1

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 (1203) hide show
  1. package/CHANGELOG.md +5910 -0
  2. package/LICENSE +177 -0
  3. package/README.md +459 -0
  4. package/git-revision.txt +1 -0
  5. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts +14 -0
  6. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts.map +1 -0
  7. package/lib/@types/AESEncryptedSecretStoragePayload.js +1 -0
  8. package/lib/@types/AESEncryptedSecretStoragePayload.js.map +1 -0
  9. package/lib/@types/IIdentityServerProvider.d.ts +9 -0
  10. package/lib/@types/IIdentityServerProvider.d.ts.map +1 -0
  11. package/lib/@types/IIdentityServerProvider.js +1 -0
  12. package/lib/@types/IIdentityServerProvider.js.map +1 -0
  13. package/lib/@types/PushRules.d.ts +140 -0
  14. package/lib/@types/PushRules.d.ts.map +1 -0
  15. package/lib/@types/PushRules.js +94 -0
  16. package/lib/@types/PushRules.js.map +1 -0
  17. package/lib/@types/another-json.d.js +0 -0
  18. package/lib/@types/another-json.d.js.map +1 -0
  19. package/lib/@types/auth.d.ts +208 -0
  20. package/lib/@types/auth.d.ts.map +1 -0
  21. package/lib/@types/auth.js +99 -0
  22. package/lib/@types/auth.js.map +1 -0
  23. package/lib/@types/beacon.d.ts +106 -0
  24. package/lib/@types/beacon.d.ts.map +1 -0
  25. package/lib/@types/beacon.js +119 -0
  26. package/lib/@types/beacon.js.map +1 -0
  27. package/lib/@types/common.d.ts +9 -0
  28. package/lib/@types/common.d.ts.map +1 -0
  29. package/lib/@types/common.js +1 -0
  30. package/lib/@types/common.js.map +1 -0
  31. package/lib/@types/crypto.d.ts +47 -0
  32. package/lib/@types/crypto.d.ts.map +1 -0
  33. package/lib/@types/crypto.js +1 -0
  34. package/lib/@types/crypto.js.map +1 -0
  35. package/lib/@types/event.d.ts +258 -0
  36. package/lib/@types/event.d.ts.map +1 -0
  37. package/lib/@types/event.js +239 -0
  38. package/lib/@types/event.js.map +1 -0
  39. package/lib/@types/events.d.ts +92 -0
  40. package/lib/@types/events.d.ts.map +1 -0
  41. package/lib/@types/events.js +1 -0
  42. package/lib/@types/events.js.map +1 -0
  43. package/lib/@types/extensible_events.d.ts +98 -0
  44. package/lib/@types/extensible_events.d.ts.map +1 -0
  45. package/lib/@types/extensible_events.js +116 -0
  46. package/lib/@types/extensible_events.js.map +1 -0
  47. package/lib/@types/global.d.js +20 -0
  48. package/lib/@types/global.d.js.map +1 -0
  49. package/lib/@types/local_notifications.d.ts +4 -0
  50. package/lib/@types/local_notifications.d.ts.map +1 -0
  51. package/lib/@types/local_notifications.js +1 -0
  52. package/lib/@types/local_notifications.js.map +1 -0
  53. package/lib/@types/location.d.ts +60 -0
  54. package/lib/@types/location.d.ts.map +1 -0
  55. package/lib/@types/location.js +67 -0
  56. package/lib/@types/location.js.map +1 -0
  57. package/lib/@types/matrix-sdk-crypto-wasm.d.js +1 -0
  58. package/lib/@types/matrix-sdk-crypto-wasm.d.js.map +1 -0
  59. package/lib/@types/media.d.ts +220 -0
  60. package/lib/@types/media.d.ts.map +1 -0
  61. package/lib/@types/media.js +1 -0
  62. package/lib/@types/media.js.map +1 -0
  63. package/lib/@types/membership.d.ts +41 -0
  64. package/lib/@types/membership.d.ts.map +1 -0
  65. package/lib/@types/membership.js +37 -0
  66. package/lib/@types/membership.js.map +1 -0
  67. package/lib/@types/oidc-client-ts.d.js +18 -0
  68. package/lib/@types/oidc-client-ts.d.js.map +1 -0
  69. package/lib/@types/partials.d.ts +39 -0
  70. package/lib/@types/partials.d.ts.map +1 -0
  71. package/lib/@types/partials.js +53 -0
  72. package/lib/@types/partials.js.map +1 -0
  73. package/lib/@types/polls.d.ts +88 -0
  74. package/lib/@types/polls.d.ts.map +1 -0
  75. package/lib/@types/polls.js +86 -0
  76. package/lib/@types/polls.js.map +1 -0
  77. package/lib/@types/read_receipts.d.ts +36 -0
  78. package/lib/@types/read_receipts.d.ts.map +1 -0
  79. package/lib/@types/read_receipts.js +27 -0
  80. package/lib/@types/read_receipts.js.map +1 -0
  81. package/lib/@types/registration.d.ts +85 -0
  82. package/lib/@types/registration.d.ts.map +1 -0
  83. package/lib/@types/registration.js +1 -0
  84. package/lib/@types/registration.js.map +1 -0
  85. package/lib/@types/requests.d.ts +241 -0
  86. package/lib/@types/requests.d.ts.map +1 -0
  87. package/lib/@types/requests.js +28 -0
  88. package/lib/@types/requests.js.map +1 -0
  89. package/lib/@types/search.d.ts +90 -0
  90. package/lib/@types/search.d.ts.map +1 -0
  91. package/lib/@types/search.js +30 -0
  92. package/lib/@types/search.js.map +1 -0
  93. package/lib/@types/signed.d.ts +9 -0
  94. package/lib/@types/signed.d.ts.map +1 -0
  95. package/lib/@types/signed.js +1 -0
  96. package/lib/@types/signed.js.map +1 -0
  97. package/lib/@types/spaces.d.ts +16 -0
  98. package/lib/@types/spaces.d.ts.map +1 -0
  99. package/lib/@types/spaces.js +1 -0
  100. package/lib/@types/spaces.js.map +1 -0
  101. package/lib/@types/state_events.d.ts +116 -0
  102. package/lib/@types/state_events.d.ts.map +1 -0
  103. package/lib/@types/state_events.js +1 -0
  104. package/lib/@types/state_events.js.map +1 -0
  105. package/lib/@types/synapse.d.ts +19 -0
  106. package/lib/@types/synapse.d.ts.map +1 -0
  107. package/lib/@types/synapse.js +1 -0
  108. package/lib/@types/synapse.js.map +1 -0
  109. package/lib/@types/sync.d.ts +8 -0
  110. package/lib/@types/sync.d.ts.map +1 -0
  111. package/lib/@types/sync.js +25 -0
  112. package/lib/@types/sync.js.map +1 -0
  113. package/lib/@types/threepids.d.ts +12 -0
  114. package/lib/@types/threepids.d.ts.map +1 -0
  115. package/lib/@types/threepids.js +24 -0
  116. package/lib/@types/threepids.js.map +1 -0
  117. package/lib/@types/topic.d.ts +48 -0
  118. package/lib/@types/topic.d.ts.map +1 -0
  119. package/lib/@types/topic.js +57 -0
  120. package/lib/@types/topic.js.map +1 -0
  121. package/lib/@types/uia.d.ts +12 -0
  122. package/lib/@types/uia.d.ts.map +1 -0
  123. package/lib/@types/uia.js +1 -0
  124. package/lib/@types/uia.js.map +1 -0
  125. package/lib/NamespacedValue.d.ts +33 -0
  126. package/lib/NamespacedValue.d.ts.map +1 -0
  127. package/lib/NamespacedValue.js +113 -0
  128. package/lib/NamespacedValue.js.map +1 -0
  129. package/lib/ReEmitter.d.ts +15 -0
  130. package/lib/ReEmitter.d.ts.map +1 -0
  131. package/lib/ReEmitter.js +87 -0
  132. package/lib/ReEmitter.js.map +1 -0
  133. package/lib/ToDeviceMessageQueue.d.ts +28 -0
  134. package/lib/ToDeviceMessageQueue.d.ts.map +1 -0
  135. package/lib/ToDeviceMessageQueue.js +135 -0
  136. package/lib/ToDeviceMessageQueue.js.map +1 -0
  137. package/lib/autodiscovery.d.ts +136 -0
  138. package/lib/autodiscovery.d.ts.map +1 -0
  139. package/lib/autodiscovery.js +464 -0
  140. package/lib/autodiscovery.js.map +1 -0
  141. package/lib/base64.d.ts +28 -0
  142. package/lib/base64.d.ts.map +1 -0
  143. package/lib/base64.js +88 -0
  144. package/lib/base64.js.map +1 -0
  145. package/lib/browser-index.d.ts +8 -0
  146. package/lib/browser-index.d.ts.map +1 -0
  147. package/lib/browser-index.js +35 -0
  148. package/lib/browser-index.js.map +1 -0
  149. package/lib/client.d.ts +4232 -0
  150. package/lib/client.d.ts.map +1 -0
  151. package/lib/client.js +8622 -0
  152. package/lib/client.js.map +1 -0
  153. package/lib/common-crypto/CryptoBackend.d.ts +240 -0
  154. package/lib/common-crypto/CryptoBackend.d.ts.map +1 -0
  155. package/lib/common-crypto/CryptoBackend.js +73 -0
  156. package/lib/common-crypto/CryptoBackend.js.map +1 -0
  157. package/lib/common-crypto/key-passphrase.d.ts +14 -0
  158. package/lib/common-crypto/key-passphrase.d.ts.map +1 -0
  159. package/lib/common-crypto/key-passphrase.js +33 -0
  160. package/lib/common-crypto/key-passphrase.js.map +1 -0
  161. package/lib/content-helpers.d.ts +90 -0
  162. package/lib/content-helpers.d.ts.map +1 -0
  163. package/lib/content-helpers.js +250 -0
  164. package/lib/content-helpers.js.map +1 -0
  165. package/lib/content-repo.d.ts +24 -0
  166. package/lib/content-repo.d.ts.map +1 -0
  167. package/lib/content-repo.js +104 -0
  168. package/lib/content-repo.js.map +1 -0
  169. package/lib/crypto/CrossSigning.d.ts +184 -0
  170. package/lib/crypto/CrossSigning.d.ts.map +1 -0
  171. package/lib/crypto/CrossSigning.js +718 -0
  172. package/lib/crypto/CrossSigning.js.map +1 -0
  173. package/lib/crypto/DeviceList.d.ts +216 -0
  174. package/lib/crypto/DeviceList.d.ts.map +1 -0
  175. package/lib/crypto/DeviceList.js +892 -0
  176. package/lib/crypto/DeviceList.js.map +1 -0
  177. package/lib/crypto/EncryptionSetup.d.ts +152 -0
  178. package/lib/crypto/EncryptionSetup.d.ts.map +1 -0
  179. package/lib/crypto/EncryptionSetup.js +356 -0
  180. package/lib/crypto/EncryptionSetup.js.map +1 -0
  181. package/lib/crypto/OlmDevice.d.ts +457 -0
  182. package/lib/crypto/OlmDevice.d.ts.map +1 -0
  183. package/lib/crypto/OlmDevice.js +1241 -0
  184. package/lib/crypto/OlmDevice.js.map +1 -0
  185. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts +109 -0
  186. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts.map +1 -0
  187. package/lib/crypto/OutgoingRoomKeyRequestManager.js +415 -0
  188. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +1 -0
  189. package/lib/crypto/RoomList.d.ts +26 -0
  190. package/lib/crypto/RoomList.d.ts.map +1 -0
  191. package/lib/crypto/RoomList.js +71 -0
  192. package/lib/crypto/RoomList.js.map +1 -0
  193. package/lib/crypto/SecretSharing.d.ts +24 -0
  194. package/lib/crypto/SecretSharing.d.ts.map +1 -0
  195. package/lib/crypto/SecretSharing.js +194 -0
  196. package/lib/crypto/SecretSharing.js.map +1 -0
  197. package/lib/crypto/SecretStorage.d.ts +55 -0
  198. package/lib/crypto/SecretStorage.d.ts.map +1 -0
  199. package/lib/crypto/SecretStorage.js +118 -0
  200. package/lib/crypto/SecretStorage.js.map +1 -0
  201. package/lib/crypto/aes.d.ts +6 -0
  202. package/lib/crypto/aes.d.ts.map +1 -0
  203. package/lib/crypto/aes.js +24 -0
  204. package/lib/crypto/aes.js.map +1 -0
  205. package/lib/crypto/algorithms/base.d.ts +156 -0
  206. package/lib/crypto/algorithms/base.d.ts.map +1 -0
  207. package/lib/crypto/algorithms/base.js +187 -0
  208. package/lib/crypto/algorithms/base.js.map +1 -0
  209. package/lib/crypto/algorithms/index.d.ts +4 -0
  210. package/lib/crypto/algorithms/index.d.ts.map +1 -0
  211. package/lib/crypto/algorithms/index.js +20 -0
  212. package/lib/crypto/algorithms/index.js.map +1 -0
  213. package/lib/crypto/algorithms/megolm.d.ts +385 -0
  214. package/lib/crypto/algorithms/megolm.d.ts.map +1 -0
  215. package/lib/crypto/algorithms/megolm.js +1822 -0
  216. package/lib/crypto/algorithms/megolm.js.map +1 -0
  217. package/lib/crypto/algorithms/olm.d.ts +5 -0
  218. package/lib/crypto/algorithms/olm.d.ts.map +1 -0
  219. package/lib/crypto/algorithms/olm.js +299 -0
  220. package/lib/crypto/algorithms/olm.js.map +1 -0
  221. package/lib/crypto/api.d.ts +32 -0
  222. package/lib/crypto/api.d.ts.map +1 -0
  223. package/lib/crypto/api.js +22 -0
  224. package/lib/crypto/api.js.map +1 -0
  225. package/lib/crypto/backup.d.ts +227 -0
  226. package/lib/crypto/backup.d.ts.map +1 -0
  227. package/lib/crypto/backup.js +824 -0
  228. package/lib/crypto/backup.js.map +1 -0
  229. package/lib/crypto/crypto.d.ts +3 -0
  230. package/lib/crypto/crypto.d.ts.map +1 -0
  231. package/lib/crypto/crypto.js +19 -0
  232. package/lib/crypto/crypto.js.map +1 -0
  233. package/lib/crypto/dehydration.d.ts +34 -0
  234. package/lib/crypto/dehydration.d.ts.map +1 -0
  235. package/lib/crypto/dehydration.js +252 -0
  236. package/lib/crypto/dehydration.js.map +1 -0
  237. package/lib/crypto/device-converter.d.ts +9 -0
  238. package/lib/crypto/device-converter.d.ts.map +1 -0
  239. package/lib/crypto/device-converter.js +42 -0
  240. package/lib/crypto/device-converter.js.map +1 -0
  241. package/lib/crypto/deviceinfo.d.ts +99 -0
  242. package/lib/crypto/deviceinfo.d.ts.map +1 -0
  243. package/lib/crypto/deviceinfo.js +148 -0
  244. package/lib/crypto/deviceinfo.js.map +1 -0
  245. package/lib/crypto/index.d.ts +1209 -0
  246. package/lib/crypto/index.d.ts.map +1 -0
  247. package/lib/crypto/index.js +4097 -0
  248. package/lib/crypto/index.js.map +1 -0
  249. package/lib/crypto/key_passphrase.d.ts +14 -0
  250. package/lib/crypto/key_passphrase.d.ts.map +1 -0
  251. package/lib/crypto/key_passphrase.js +44 -0
  252. package/lib/crypto/key_passphrase.js.map +1 -0
  253. package/lib/crypto/keybackup.d.ts +18 -0
  254. package/lib/crypto/keybackup.d.ts.map +1 -0
  255. package/lib/crypto/keybackup.js +1 -0
  256. package/lib/crypto/keybackup.js.map +1 -0
  257. package/lib/crypto/olmlib.d.ts +129 -0
  258. package/lib/crypto/olmlib.d.ts.map +1 -0
  259. package/lib/crypto/olmlib.js +492 -0
  260. package/lib/crypto/olmlib.js.map +1 -0
  261. package/lib/crypto/recoverykey.d.ts +2 -0
  262. package/lib/crypto/recoverykey.d.ts.map +1 -0
  263. package/lib/crypto/recoverykey.js +19 -0
  264. package/lib/crypto/recoverykey.js.map +1 -0
  265. package/lib/crypto/store/base.d.ts +252 -0
  266. package/lib/crypto/store/base.d.ts.map +1 -0
  267. package/lib/crypto/store/base.js +64 -0
  268. package/lib/crypto/store/base.js.map +1 -0
  269. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts +187 -0
  270. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts.map +1 -0
  271. package/lib/crypto/store/indexeddb-crypto-store-backend.js +1145 -0
  272. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -0
  273. package/lib/crypto/store/indexeddb-crypto-store.d.ts +432 -0
  274. package/lib/crypto/store/indexeddb-crypto-store.d.ts.map +1 -0
  275. package/lib/crypto/store/indexeddb-crypto-store.js +728 -0
  276. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -0
  277. package/lib/crypto/store/localStorage-crypto-store.d.ts +119 -0
  278. package/lib/crypto/store/localStorage-crypto-store.d.ts.map +1 -0
  279. package/lib/crypto/store/localStorage-crypto-store.js +531 -0
  280. package/lib/crypto/store/localStorage-crypto-store.js.map +1 -0
  281. package/lib/crypto/store/memory-crypto-store.d.ts +215 -0
  282. package/lib/crypto/store/memory-crypto-store.d.ts.map +1 -0
  283. package/lib/crypto/store/memory-crypto-store.js +622 -0
  284. package/lib/crypto/store/memory-crypto-store.js.map +1 -0
  285. package/lib/crypto/verification/Base.d.ts +105 -0
  286. package/lib/crypto/verification/Base.d.ts.map +1 -0
  287. package/lib/crypto/verification/Base.js +372 -0
  288. package/lib/crypto/verification/Base.js.map +1 -0
  289. package/lib/crypto/verification/Error.d.ts +35 -0
  290. package/lib/crypto/verification/Error.d.ts.map +1 -0
  291. package/lib/crypto/verification/Error.js +86 -0
  292. package/lib/crypto/verification/Error.js.map +1 -0
  293. package/lib/crypto/verification/IllegalMethod.d.ts +15 -0
  294. package/lib/crypto/verification/IllegalMethod.d.ts.map +1 -0
  295. package/lib/crypto/verification/IllegalMethod.js +43 -0
  296. package/lib/crypto/verification/IllegalMethod.js.map +1 -0
  297. package/lib/crypto/verification/QRCode.d.ts +51 -0
  298. package/lib/crypto/verification/QRCode.d.ts.map +1 -0
  299. package/lib/crypto/verification/QRCode.js +277 -0
  300. package/lib/crypto/verification/QRCode.js.map +1 -0
  301. package/lib/crypto/verification/SAS.d.ts +27 -0
  302. package/lib/crypto/verification/SAS.d.ts.map +1 -0
  303. package/lib/crypto/verification/SAS.js +485 -0
  304. package/lib/crypto/verification/SAS.js.map +1 -0
  305. package/lib/crypto/verification/SASDecimal.d.ts +8 -0
  306. package/lib/crypto/verification/SASDecimal.d.ts.map +1 -0
  307. package/lib/crypto/verification/SASDecimal.js +34 -0
  308. package/lib/crypto/verification/SASDecimal.js.map +1 -0
  309. package/lib/crypto/verification/request/Channel.d.ts +18 -0
  310. package/lib/crypto/verification/request/Channel.d.ts.map +1 -0
  311. package/lib/crypto/verification/request/Channel.js +1 -0
  312. package/lib/crypto/verification/request/Channel.js.map +1 -0
  313. package/lib/crypto/verification/request/InRoomChannel.d.ts +113 -0
  314. package/lib/crypto/verification/request/InRoomChannel.d.ts.map +1 -0
  315. package/lib/crypto/verification/request/InRoomChannel.js +351 -0
  316. package/lib/crypto/verification/request/InRoomChannel.js.map +1 -0
  317. package/lib/crypto/verification/request/ToDeviceChannel.d.ts +105 -0
  318. package/lib/crypto/verification/request/ToDeviceChannel.d.ts.map +1 -0
  319. package/lib/crypto/verification/request/ToDeviceChannel.js +328 -0
  320. package/lib/crypto/verification/request/ToDeviceChannel.js.map +1 -0
  321. package/lib/crypto/verification/request/VerificationRequest.d.ts +227 -0
  322. package/lib/crypto/verification/request/VerificationRequest.d.ts.map +1 -0
  323. package/lib/crypto/verification/request/VerificationRequest.js +937 -0
  324. package/lib/crypto/verification/request/VerificationRequest.js.map +1 -0
  325. package/lib/crypto-api/CryptoEvent.d.ts +69 -0
  326. package/lib/crypto-api/CryptoEvent.d.ts.map +1 -0
  327. package/lib/crypto-api/CryptoEvent.js +33 -0
  328. package/lib/crypto-api/CryptoEvent.js.map +1 -0
  329. package/lib/crypto-api/CryptoEventHandlerMap.d.ts +16 -0
  330. package/lib/crypto-api/CryptoEventHandlerMap.d.ts.map +1 -0
  331. package/lib/crypto-api/CryptoEventHandlerMap.js +22 -0
  332. package/lib/crypto-api/CryptoEventHandlerMap.js.map +1 -0
  333. package/lib/crypto-api/index.d.ts +978 -0
  334. package/lib/crypto-api/index.d.ts.map +1 -0
  335. package/lib/crypto-api/index.js +304 -0
  336. package/lib/crypto-api/index.js.map +1 -0
  337. package/lib/crypto-api/key-passphrase.d.ts +11 -0
  338. package/lib/crypto-api/key-passphrase.d.ts.map +1 -0
  339. package/lib/crypto-api/key-passphrase.js +51 -0
  340. package/lib/crypto-api/key-passphrase.js.map +1 -0
  341. package/lib/crypto-api/keybackup.d.ts +88 -0
  342. package/lib/crypto-api/keybackup.d.ts.map +1 -0
  343. package/lib/crypto-api/keybackup.js +1 -0
  344. package/lib/crypto-api/keybackup.js.map +1 -0
  345. package/lib/crypto-api/recovery-key.d.ts +11 -0
  346. package/lib/crypto-api/recovery-key.d.ts.map +1 -0
  347. package/lib/crypto-api/recovery-key.js +65 -0
  348. package/lib/crypto-api/recovery-key.js.map +1 -0
  349. package/lib/crypto-api/verification.d.ts +344 -0
  350. package/lib/crypto-api/verification.d.ts.map +1 -0
  351. package/lib/crypto-api/verification.js +91 -0
  352. package/lib/crypto-api/verification.js.map +1 -0
  353. package/lib/digest.d.ts +10 -0
  354. package/lib/digest.d.ts.map +1 -0
  355. package/lib/digest.js +40 -0
  356. package/lib/digest.js.map +1 -0
  357. package/lib/embedded.d.ts +143 -0
  358. package/lib/embedded.d.ts.map +1 -0
  359. package/lib/embedded.js +567 -0
  360. package/lib/embedded.js.map +1 -0
  361. package/lib/errors.d.ts +24 -0
  362. package/lib/errors.d.ts.map +1 -0
  363. package/lib/errors.js +51 -0
  364. package/lib/errors.js.map +1 -0
  365. package/lib/event-mapper.d.ts +10 -0
  366. package/lib/event-mapper.d.ts.map +1 -0
  367. package/lib/event-mapper.js +81 -0
  368. package/lib/event-mapper.js.map +1 -0
  369. package/lib/extensible_events_v1/ExtensibleEvent.d.ts +38 -0
  370. package/lib/extensible_events_v1/ExtensibleEvent.d.ts.map +1 -0
  371. package/lib/extensible_events_v1/ExtensibleEvent.js +57 -0
  372. package/lib/extensible_events_v1/ExtensibleEvent.js.map +1 -0
  373. package/lib/extensible_events_v1/InvalidEventError.d.ts +7 -0
  374. package/lib/extensible_events_v1/InvalidEventError.d.ts.map +1 -0
  375. package/lib/extensible_events_v1/InvalidEventError.js +25 -0
  376. package/lib/extensible_events_v1/InvalidEventError.js.map +1 -0
  377. package/lib/extensible_events_v1/MessageEvent.d.ts +45 -0
  378. package/lib/extensible_events_v1/MessageEvent.d.ts.map +1 -0
  379. package/lib/extensible_events_v1/MessageEvent.js +134 -0
  380. package/lib/extensible_events_v1/MessageEvent.js.map +1 -0
  381. package/lib/extensible_events_v1/PollEndEvent.d.ts +33 -0
  382. package/lib/extensible_events_v1/PollEndEvent.d.ts.map +1 -0
  383. package/lib/extensible_events_v1/PollEndEvent.js +88 -0
  384. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -0
  385. package/lib/extensible_events_v1/PollResponseEvent.d.ts +49 -0
  386. package/lib/extensible_events_v1/PollResponseEvent.d.ts.map +1 -0
  387. package/lib/extensible_events_v1/PollResponseEvent.js +135 -0
  388. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -0
  389. package/lib/extensible_events_v1/PollStartEvent.d.ts +71 -0
  390. package/lib/extensible_events_v1/PollStartEvent.d.ts.map +1 -0
  391. package/lib/extensible_events_v1/PollStartEvent.js +185 -0
  392. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -0
  393. package/lib/extensible_events_v1/utilities.d.ts +14 -0
  394. package/lib/extensible_events_v1/utilities.d.ts.map +1 -0
  395. package/lib/extensible_events_v1/utilities.js +34 -0
  396. package/lib/extensible_events_v1/utilities.js.map +1 -0
  397. package/lib/feature.d.ts +20 -0
  398. package/lib/feature.d.ts.map +1 -0
  399. package/lib/feature.js +85 -0
  400. package/lib/feature.js.map +1 -0
  401. package/lib/filter-component.d.ts +64 -0
  402. package/lib/filter-component.d.ts.map +1 -0
  403. package/lib/filter-component.js +167 -0
  404. package/lib/filter-component.js.map +1 -0
  405. package/lib/filter.d.ts +97 -0
  406. package/lib/filter.d.ts.map +1 -0
  407. package/lib/filter.js +207 -0
  408. package/lib/filter.js.map +1 -0
  409. package/lib/http-api/errors.d.ts +80 -0
  410. package/lib/http-api/errors.d.ts.map +1 -0
  411. package/lib/http-api/errors.js +185 -0
  412. package/lib/http-api/errors.js.map +1 -0
  413. package/lib/http-api/fetch.d.ts +114 -0
  414. package/lib/http-api/fetch.d.ts.map +1 -0
  415. package/lib/http-api/fetch.js +346 -0
  416. package/lib/http-api/fetch.js.map +1 -0
  417. package/lib/http-api/index.d.ts +33 -0
  418. package/lib/http-api/index.d.ts.map +1 -0
  419. package/lib/http-api/index.js +180 -0
  420. package/lib/http-api/index.js.map +1 -0
  421. package/lib/http-api/interface.d.ts +142 -0
  422. package/lib/http-api/interface.d.ts.map +1 -0
  423. package/lib/http-api/interface.js +35 -0
  424. package/lib/http-api/interface.js.map +1 -0
  425. package/lib/http-api/method.d.ts +10 -0
  426. package/lib/http-api/method.d.ts.map +1 -0
  427. package/lib/http-api/method.js +27 -0
  428. package/lib/http-api/method.js.map +1 -0
  429. package/lib/http-api/prefix.d.ts +31 -0
  430. package/lib/http-api/prefix.d.ts.map +1 -0
  431. package/lib/http-api/prefix.js +32 -0
  432. package/lib/http-api/prefix.js.map +1 -0
  433. package/lib/http-api/utils.d.ts +37 -0
  434. package/lib/http-api/utils.d.ts.map +1 -0
  435. package/lib/http-api/utils.js +178 -0
  436. package/lib/http-api/utils.js.map +1 -0
  437. package/lib/index.d.ts +4 -0
  438. package/lib/index.d.ts.map +1 -0
  439. package/lib/index.js +24 -0
  440. package/lib/index.js.map +1 -0
  441. package/lib/indexeddb-helpers.d.ts +10 -0
  442. package/lib/indexeddb-helpers.d.ts.map +1 -0
  443. package/lib/indexeddb-helpers.js +51 -0
  444. package/lib/indexeddb-helpers.js.map +1 -0
  445. package/lib/indexeddb-worker.d.ts +7 -0
  446. package/lib/indexeddb-worker.d.ts.map +1 -0
  447. package/lib/indexeddb-worker.js +25 -0
  448. package/lib/indexeddb-worker.js.map +1 -0
  449. package/lib/interactive-auth.d.ts +337 -0
  450. package/lib/interactive-auth.d.ts.map +1 -0
  451. package/lib/interactive-auth.js +557 -0
  452. package/lib/interactive-auth.js.map +1 -0
  453. package/lib/logger.d.ts +81 -0
  454. package/lib/logger.d.ts.map +1 -0
  455. package/lib/logger.js +139 -0
  456. package/lib/logger.js.map +1 -0
  457. package/lib/matrix.d.ts +118 -0
  458. package/lib/matrix.d.ts.map +1 -0
  459. package/lib/matrix.js +146 -0
  460. package/lib/matrix.js.map +1 -0
  461. package/lib/matrixrtc/CallMembership.d.ts +66 -0
  462. package/lib/matrixrtc/CallMembership.d.ts.map +1 -0
  463. package/lib/matrixrtc/CallMembership.js +197 -0
  464. package/lib/matrixrtc/CallMembership.js.map +1 -0
  465. package/lib/matrixrtc/LivekitFocus.d.ts +16 -0
  466. package/lib/matrixrtc/LivekitFocus.d.ts.map +1 -0
  467. package/lib/matrixrtc/LivekitFocus.js +20 -0
  468. package/lib/matrixrtc/LivekitFocus.js.map +1 -0
  469. package/lib/matrixrtc/MatrixRTCSession.d.ts +295 -0
  470. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -0
  471. package/lib/matrixrtc/MatrixRTCSession.js +1043 -0
  472. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -0
  473. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +40 -0
  474. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -0
  475. package/lib/matrixrtc/MatrixRTCSessionManager.js +146 -0
  476. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -0
  477. package/lib/matrixrtc/focus.d.ts +10 -0
  478. package/lib/matrixrtc/focus.d.ts.map +1 -0
  479. package/lib/matrixrtc/focus.js +1 -0
  480. package/lib/matrixrtc/focus.js.map +1 -0
  481. package/lib/matrixrtc/index.d.ts +7 -0
  482. package/lib/matrixrtc/index.d.ts.map +1 -0
  483. package/lib/matrixrtc/index.js +21 -0
  484. package/lib/matrixrtc/index.js.map +1 -0
  485. package/lib/matrixrtc/types.d.ts +19 -0
  486. package/lib/matrixrtc/types.d.ts.map +1 -0
  487. package/lib/matrixrtc/types.js +1 -0
  488. package/lib/matrixrtc/types.js.map +1 -0
  489. package/lib/models/MSC3089Branch.d.ts +98 -0
  490. package/lib/models/MSC3089Branch.d.ts.map +1 -0
  491. package/lib/models/MSC3089Branch.js +240 -0
  492. package/lib/models/MSC3089Branch.js.map +1 -0
  493. package/lib/models/MSC3089TreeSpace.d.ts +165 -0
  494. package/lib/models/MSC3089TreeSpace.d.ts.map +1 -0
  495. package/lib/models/MSC3089TreeSpace.js +520 -0
  496. package/lib/models/MSC3089TreeSpace.js.map +1 -0
  497. package/lib/models/ToDeviceMessage.d.ts +17 -0
  498. package/lib/models/ToDeviceMessage.d.ts.map +1 -0
  499. package/lib/models/ToDeviceMessage.js +1 -0
  500. package/lib/models/ToDeviceMessage.js.map +1 -0
  501. package/lib/models/beacon.d.ts +53 -0
  502. package/lib/models/beacon.d.ts.map +1 -0
  503. package/lib/models/beacon.js +174 -0
  504. package/lib/models/beacon.js.map +1 -0
  505. package/lib/models/compare-event-ordering.d.ts +24 -0
  506. package/lib/models/compare-event-ordering.d.ts.map +1 -0
  507. package/lib/models/compare-event-ordering.js +120 -0
  508. package/lib/models/compare-event-ordering.js.map +1 -0
  509. package/lib/models/device.d.ts +45 -0
  510. package/lib/models/device.d.ts.map +1 -0
  511. package/lib/models/device.js +77 -0
  512. package/lib/models/device.js.map +1 -0
  513. package/lib/models/event-context.d.ts +62 -0
  514. package/lib/models/event-context.d.ts.map +1 -0
  515. package/lib/models/event-context.js +113 -0
  516. package/lib/models/event-context.js.map +1 -0
  517. package/lib/models/event-status.d.ts +19 -0
  518. package/lib/models/event-status.d.ts.map +1 -0
  519. package/lib/models/event-status.js +30 -0
  520. package/lib/models/event-status.js.map +1 -0
  521. package/lib/models/event-timeline-set.d.ts +312 -0
  522. package/lib/models/event-timeline-set.d.ts.map +1 -0
  523. package/lib/models/event-timeline-set.js +813 -0
  524. package/lib/models/event-timeline-set.js.map +1 -0
  525. package/lib/models/event-timeline.d.ts +219 -0
  526. package/lib/models/event-timeline.d.ts.map +1 -0
  527. package/lib/models/event-timeline.js +455 -0
  528. package/lib/models/event-timeline.js.map +1 -0
  529. package/lib/models/event.d.ts +811 -0
  530. package/lib/models/event.d.ts.map +1 -0
  531. package/lib/models/event.js +1520 -0
  532. package/lib/models/event.js.map +1 -0
  533. package/lib/models/invites-ignorer.d.ts +136 -0
  534. package/lib/models/invites-ignorer.d.ts.map +1 -0
  535. package/lib/models/invites-ignorer.js +382 -0
  536. package/lib/models/invites-ignorer.js.map +1 -0
  537. package/lib/models/poll.d.ts +67 -0
  538. package/lib/models/poll.d.ts.map +1 -0
  539. package/lib/models/poll.js +241 -0
  540. package/lib/models/poll.js.map +1 -0
  541. package/lib/models/profile-keys.d.ts +8 -0
  542. package/lib/models/profile-keys.d.ts.map +1 -0
  543. package/lib/models/profile-keys.js +8 -0
  544. package/lib/models/profile-keys.js.map +1 -0
  545. package/lib/models/read-receipt.d.ts +115 -0
  546. package/lib/models/read-receipt.d.ts.map +1 -0
  547. package/lib/models/read-receipt.js +366 -0
  548. package/lib/models/read-receipt.js.map +1 -0
  549. package/lib/models/related-relations.d.ts +11 -0
  550. package/lib/models/related-relations.d.ts.map +1 -0
  551. package/lib/models/related-relations.js +33 -0
  552. package/lib/models/related-relations.js.map +1 -0
  553. package/lib/models/relations-container.d.ts +44 -0
  554. package/lib/models/relations-container.d.ts.map +1 -0
  555. package/lib/models/relations-container.js +132 -0
  556. package/lib/models/relations-container.js.map +1 -0
  557. package/lib/models/relations.d.ts +114 -0
  558. package/lib/models/relations.d.ts.map +1 -0
  559. package/lib/models/relations.js +354 -0
  560. package/lib/models/relations.js.map +1 -0
  561. package/lib/models/room-member.d.ts +204 -0
  562. package/lib/models/room-member.d.ts.map +1 -0
  563. package/lib/models/room-member.js +360 -0
  564. package/lib/models/room-member.js.map +1 -0
  565. package/lib/models/room-receipts.d.ts +39 -0
  566. package/lib/models/room-receipts.d.ts.map +1 -0
  567. package/lib/models/room-receipts.js +392 -0
  568. package/lib/models/room-receipts.js.map +1 -0
  569. package/lib/models/room-state.d.ts +468 -0
  570. package/lib/models/room-state.d.ts.map +1 -0
  571. package/lib/models/room-state.js +984 -0
  572. package/lib/models/room-state.js.map +1 -0
  573. package/lib/models/room-summary.d.ts +29 -0
  574. package/lib/models/room-summary.d.ts.map +1 -0
  575. package/lib/models/room-summary.js +28 -0
  576. package/lib/models/room-summary.js.map +1 -0
  577. package/lib/models/room.d.ts +1203 -0
  578. package/lib/models/room.d.ts.map +1 -0
  579. package/lib/models/room.js +3336 -0
  580. package/lib/models/room.js.map +1 -0
  581. package/lib/models/search-result.d.ts +20 -0
  582. package/lib/models/search-result.d.ts.map +1 -0
  583. package/lib/models/search-result.js +52 -0
  584. package/lib/models/search-result.js.map +1 -0
  585. package/lib/models/thread.d.ts +246 -0
  586. package/lib/models/thread.d.ts.map +1 -0
  587. package/lib/models/thread.js +861 -0
  588. package/lib/models/thread.js.map +1 -0
  589. package/lib/models/typed-event-emitter.d.ts +157 -0
  590. package/lib/models/typed-event-emitter.d.ts.map +1 -0
  591. package/lib/models/typed-event-emitter.js +227 -0
  592. package/lib/models/typed-event-emitter.js.map +1 -0
  593. package/lib/models/user.d.ts +195 -0
  594. package/lib/models/user.d.ts.map +1 -0
  595. package/lib/models/user.js +218 -0
  596. package/lib/models/user.js.map +1 -0
  597. package/lib/oidc/authorize.d.ts +90 -0
  598. package/lib/oidc/authorize.d.ts.map +1 -0
  599. package/lib/oidc/authorize.js +278 -0
  600. package/lib/oidc/authorize.js.map +1 -0
  601. package/lib/oidc/discovery.d.ts +14 -0
  602. package/lib/oidc/discovery.d.ts.map +1 -0
  603. package/lib/oidc/discovery.js +66 -0
  604. package/lib/oidc/discovery.js.map +1 -0
  605. package/lib/oidc/error.d.ts +18 -0
  606. package/lib/oidc/error.d.ts.map +1 -0
  607. package/lib/oidc/error.js +35 -0
  608. package/lib/oidc/error.js.map +1 -0
  609. package/lib/oidc/index.d.ts +17 -0
  610. package/lib/oidc/index.d.ts.map +1 -0
  611. package/lib/oidc/index.js +29 -0
  612. package/lib/oidc/index.js.map +1 -0
  613. package/lib/oidc/register.d.ts +43 -0
  614. package/lib/oidc/register.d.ts.map +1 -0
  615. package/lib/oidc/register.js +96 -0
  616. package/lib/oidc/register.js.map +1 -0
  617. package/lib/oidc/tokenRefresher.d.ts +69 -0
  618. package/lib/oidc/tokenRefresher.d.ts.map +1 -0
  619. package/lib/oidc/tokenRefresher.js +148 -0
  620. package/lib/oidc/tokenRefresher.js.map +1 -0
  621. package/lib/oidc/validate.d.ts +90 -0
  622. package/lib/oidc/validate.d.ts.map +1 -0
  623. package/lib/oidc/validate.js +194 -0
  624. package/lib/oidc/validate.js.map +1 -0
  625. package/lib/pushprocessor.d.ts +128 -0
  626. package/lib/pushprocessor.d.ts.map +1 -0
  627. package/lib/pushprocessor.js +685 -0
  628. package/lib/pushprocessor.js.map +1 -0
  629. package/lib/randomstring.d.ts +5 -0
  630. package/lib/randomstring.d.ts.map +1 -0
  631. package/lib/randomstring.js +43 -0
  632. package/lib/randomstring.js.map +1 -0
  633. package/lib/realtime-callbacks.d.ts +18 -0
  634. package/lib/realtime-callbacks.d.ts.map +1 -0
  635. package/lib/realtime-callbacks.js +177 -0
  636. package/lib/realtime-callbacks.js.map +1 -0
  637. package/lib/receipt-accumulator.d.ts +51 -0
  638. package/lib/receipt-accumulator.d.ts.map +1 -0
  639. package/lib/receipt-accumulator.js +164 -0
  640. package/lib/receipt-accumulator.js.map +1 -0
  641. package/lib/rendezvous/MSC4108SignInWithQR.d.ts +112 -0
  642. package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +1 -0
  643. package/lib/rendezvous/MSC4108SignInWithQR.js +392 -0
  644. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -0
  645. package/lib/rendezvous/RendezvousChannel.d.ts +27 -0
  646. package/lib/rendezvous/RendezvousChannel.d.ts.map +1 -0
  647. package/lib/rendezvous/RendezvousChannel.js +1 -0
  648. package/lib/rendezvous/RendezvousChannel.js.map +1 -0
  649. package/lib/rendezvous/RendezvousCode.d.ts +9 -0
  650. package/lib/rendezvous/RendezvousCode.d.ts.map +1 -0
  651. package/lib/rendezvous/RendezvousCode.js +1 -0
  652. package/lib/rendezvous/RendezvousCode.js.map +1 -0
  653. package/lib/rendezvous/RendezvousError.d.ts +6 -0
  654. package/lib/rendezvous/RendezvousError.d.ts.map +1 -0
  655. package/lib/rendezvous/RendezvousError.js +23 -0
  656. package/lib/rendezvous/RendezvousError.js.map +1 -0
  657. package/lib/rendezvous/RendezvousFailureReason.d.ts +31 -0
  658. package/lib/rendezvous/RendezvousFailureReason.d.ts.map +1 -0
  659. package/lib/rendezvous/RendezvousFailureReason.js +38 -0
  660. package/lib/rendezvous/RendezvousFailureReason.js.map +1 -0
  661. package/lib/rendezvous/RendezvousIntent.d.ts +5 -0
  662. package/lib/rendezvous/RendezvousIntent.d.ts.map +1 -0
  663. package/lib/rendezvous/RendezvousIntent.js +22 -0
  664. package/lib/rendezvous/RendezvousIntent.js.map +1 -0
  665. package/lib/rendezvous/RendezvousTransport.d.ts +36 -0
  666. package/lib/rendezvous/RendezvousTransport.d.ts.map +1 -0
  667. package/lib/rendezvous/RendezvousTransport.js +1 -0
  668. package/lib/rendezvous/RendezvousTransport.js.map +1 -0
  669. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts +58 -0
  670. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts.map +1 -0
  671. package/lib/rendezvous/channels/MSC4108SecureChannel.js +246 -0
  672. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -0
  673. package/lib/rendezvous/channels/index.d.ts +2 -0
  674. package/lib/rendezvous/channels/index.d.ts.map +1 -0
  675. package/lib/rendezvous/channels/index.js +18 -0
  676. package/lib/rendezvous/channels/index.js.map +1 -0
  677. package/lib/rendezvous/index.d.ts +10 -0
  678. package/lib/rendezvous/index.d.ts.map +1 -0
  679. package/lib/rendezvous/index.js +23 -0
  680. package/lib/rendezvous/index.js.map +1 -0
  681. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +61 -0
  682. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts.map +1 -0
  683. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +253 -0
  684. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -0
  685. package/lib/rendezvous/transports/index.d.ts +2 -0
  686. package/lib/rendezvous/transports/index.d.ts.map +1 -0
  687. package/lib/rendezvous/transports/index.js +18 -0
  688. package/lib/rendezvous/transports/index.js.map +1 -0
  689. package/lib/room-hierarchy.d.ts +35 -0
  690. package/lib/room-hierarchy.d.ts.map +1 -0
  691. package/lib/room-hierarchy.js +136 -0
  692. package/lib/room-hierarchy.js.map +1 -0
  693. package/lib/rust-crypto/CrossSigningIdentity.d.ts +33 -0
  694. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +1 -0
  695. package/lib/rust-crypto/CrossSigningIdentity.js +157 -0
  696. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -0
  697. package/lib/rust-crypto/DehydratedDeviceManager.d.ts +98 -0
  698. package/lib/rust-crypto/DehydratedDeviceManager.d.ts.map +1 -0
  699. package/lib/rust-crypto/DehydratedDeviceManager.js +285 -0
  700. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -0
  701. package/lib/rust-crypto/KeyClaimManager.d.ts +33 -0
  702. package/lib/rust-crypto/KeyClaimManager.d.ts.map +1 -0
  703. package/lib/rust-crypto/KeyClaimManager.js +82 -0
  704. package/lib/rust-crypto/KeyClaimManager.js.map +1 -0
  705. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts +43 -0
  706. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +1 -0
  707. package/lib/rust-crypto/OutgoingRequestProcessor.js +195 -0
  708. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -0
  709. package/lib/rust-crypto/OutgoingRequestsManager.d.ts +47 -0
  710. package/lib/rust-crypto/OutgoingRequestsManager.d.ts.map +1 -0
  711. package/lib/rust-crypto/OutgoingRequestsManager.js +148 -0
  712. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -0
  713. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +120 -0
  714. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts.map +1 -0
  715. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +467 -0
  716. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -0
  717. package/lib/rust-crypto/RoomEncryptor.d.ts +98 -0
  718. package/lib/rust-crypto/RoomEncryptor.d.ts.map +1 -0
  719. package/lib/rust-crypto/RoomEncryptor.js +299 -0
  720. package/lib/rust-crypto/RoomEncryptor.js.map +1 -0
  721. package/lib/rust-crypto/backup.d.ts +254 -0
  722. package/lib/rust-crypto/backup.d.ts.map +1 -0
  723. package/lib/rust-crypto/backup.js +837 -0
  724. package/lib/rust-crypto/backup.js.map +1 -0
  725. package/lib/rust-crypto/constants.d.ts +3 -0
  726. package/lib/rust-crypto/constants.d.ts.map +1 -0
  727. package/lib/rust-crypto/constants.js +19 -0
  728. package/lib/rust-crypto/constants.js.map +1 -0
  729. package/lib/rust-crypto/device-converter.d.ts +28 -0
  730. package/lib/rust-crypto/device-converter.d.ts.map +1 -0
  731. package/lib/rust-crypto/device-converter.js +123 -0
  732. package/lib/rust-crypto/device-converter.js.map +1 -0
  733. package/lib/rust-crypto/index.d.ts +61 -0
  734. package/lib/rust-crypto/index.d.ts.map +1 -0
  735. package/lib/rust-crypto/index.js +152 -0
  736. package/lib/rust-crypto/index.js.map +1 -0
  737. package/lib/rust-crypto/libolm_migration.d.ts +81 -0
  738. package/lib/rust-crypto/libolm_migration.d.ts.map +1 -0
  739. package/lib/rust-crypto/libolm_migration.js +459 -0
  740. package/lib/rust-crypto/libolm_migration.js.map +1 -0
  741. package/lib/rust-crypto/rust-crypto.d.ts +556 -0
  742. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -0
  743. package/lib/rust-crypto/rust-crypto.js +2016 -0
  744. package/lib/rust-crypto/rust-crypto.js.map +1 -0
  745. package/lib/rust-crypto/secret-storage.d.ts +22 -0
  746. package/lib/rust-crypto/secret-storage.d.ts.map +1 -0
  747. package/lib/rust-crypto/secret-storage.js +63 -0
  748. package/lib/rust-crypto/secret-storage.js.map +1 -0
  749. package/lib/rust-crypto/verification.d.ts +319 -0
  750. package/lib/rust-crypto/verification.d.ts.map +1 -0
  751. package/lib/rust-crypto/verification.js +816 -0
  752. package/lib/rust-crypto/verification.js.map +1 -0
  753. package/lib/scheduler.d.ts +132 -0
  754. package/lib/scheduler.d.ts.map +1 -0
  755. package/lib/scheduler.js +259 -0
  756. package/lib/scheduler.js.map +1 -0
  757. package/lib/secret-storage.d.ts +370 -0
  758. package/lib/secret-storage.d.ts.map +1 -0
  759. package/lib/secret-storage.js +466 -0
  760. package/lib/secret-storage.js.map +1 -0
  761. package/lib/serverCapabilities.d.ts +72 -0
  762. package/lib/serverCapabilities.d.ts.map +1 -0
  763. package/lib/serverCapabilities.js +105 -0
  764. package/lib/serverCapabilities.js.map +1 -0
  765. package/lib/service-types.d.ts +5 -0
  766. package/lib/service-types.d.ts.map +1 -0
  767. package/lib/service-types.js +22 -0
  768. package/lib/service-types.js.map +1 -0
  769. package/lib/sliding-sync-sdk.d.ts +107 -0
  770. package/lib/sliding-sync-sdk.d.ts.map +1 -0
  771. package/lib/sliding-sync-sdk.js +903 -0
  772. package/lib/sliding-sync-sdk.js.map +1 -0
  773. package/lib/sliding-sync.d.ts +343 -0
  774. package/lib/sliding-sync.d.ts.map +1 -0
  775. package/lib/sliding-sync.js +817 -0
  776. package/lib/sliding-sync.js.map +1 -0
  777. package/lib/store/index.d.ts +201 -0
  778. package/lib/store/index.d.ts.map +1 -0
  779. package/lib/store/index.js +1 -0
  780. package/lib/store/index.js.map +1 -0
  781. package/lib/store/indexeddb-backend.d.ts +24 -0
  782. package/lib/store/indexeddb-backend.d.ts.map +1 -0
  783. package/lib/store/indexeddb-backend.js +1 -0
  784. package/lib/store/indexeddb-backend.js.map +1 -0
  785. package/lib/store/indexeddb-local-backend.d.ts +129 -0
  786. package/lib/store/indexeddb-local-backend.d.ts.map +1 -0
  787. package/lib/store/indexeddb-local-backend.js +597 -0
  788. package/lib/store/indexeddb-local-backend.js.map +1 -0
  789. package/lib/store/indexeddb-remote-backend.d.ts +79 -0
  790. package/lib/store/indexeddb-remote-backend.d.ts.map +1 -0
  791. package/lib/store/indexeddb-remote-backend.js +210 -0
  792. package/lib/store/indexeddb-remote-backend.js.map +1 -0
  793. package/lib/store/indexeddb-store-worker.d.ts +35 -0
  794. package/lib/store/indexeddb-store-worker.d.ts.map +1 -0
  795. package/lib/store/indexeddb-store-worker.js +146 -0
  796. package/lib/store/indexeddb-store-worker.js.map +1 -0
  797. package/lib/store/indexeddb.d.ts +142 -0
  798. package/lib/store/indexeddb.d.ts.map +1 -0
  799. package/lib/store/indexeddb.js +347 -0
  800. package/lib/store/indexeddb.js.map +1 -0
  801. package/lib/store/local-storage-events-emitter.d.ts +30 -0
  802. package/lib/store/local-storage-events-emitter.d.ts.map +1 -0
  803. package/lib/store/local-storage-events-emitter.js +37 -0
  804. package/lib/store/local-storage-events-emitter.js.map +1 -0
  805. package/lib/store/memory.d.ts +209 -0
  806. package/lib/store/memory.d.ts.map +1 -0
  807. package/lib/store/memory.js +432 -0
  808. package/lib/store/memory.js.map +1 -0
  809. package/lib/store/stub.d.ts +161 -0
  810. package/lib/store/stub.d.ts.map +1 -0
  811. package/lib/store/stub.js +268 -0
  812. package/lib/store/stub.js.map +1 -0
  813. package/lib/sync-accumulator.d.ts +172 -0
  814. package/lib/sync-accumulator.d.ts.map +1 -0
  815. package/lib/sync-accumulator.js +532 -0
  816. package/lib/sync-accumulator.js.map +1 -0
  817. package/lib/sync.d.ts +260 -0
  818. package/lib/sync.d.ts.map +1 -0
  819. package/lib/sync.js +1686 -0
  820. package/lib/sync.js.map +1 -0
  821. package/lib/testing.d.ts +81 -0
  822. package/lib/testing.d.ts.map +1 -0
  823. package/lib/testing.js +162 -0
  824. package/lib/testing.js.map +1 -0
  825. package/lib/thread-utils.d.ts +10 -0
  826. package/lib/thread-utils.d.ts.map +1 -0
  827. package/lib/thread-utils.js +31 -0
  828. package/lib/thread-utils.js.map +1 -0
  829. package/lib/timeline-window.d.ts +168 -0
  830. package/lib/timeline-window.d.ts.map +1 -0
  831. package/lib/timeline-window.js +494 -0
  832. package/lib/timeline-window.js.map +1 -0
  833. package/lib/types.d.ts +33 -0
  834. package/lib/types.d.ts.map +1 -0
  835. package/lib/types.js +33 -0
  836. package/lib/types.js.map +1 -0
  837. package/lib/utils/decryptAESSecretStorageItem.d.ts +12 -0
  838. package/lib/utils/decryptAESSecretStorageItem.d.ts.map +1 -0
  839. package/lib/utils/decryptAESSecretStorageItem.js +50 -0
  840. package/lib/utils/decryptAESSecretStorageItem.js.map +1 -0
  841. package/lib/utils/encryptAESSecretStorageItem.d.ts +16 -0
  842. package/lib/utils/encryptAESSecretStorageItem.d.ts.map +1 -0
  843. package/lib/utils/encryptAESSecretStorageItem.js +68 -0
  844. package/lib/utils/encryptAESSecretStorageItem.js.map +1 -0
  845. package/lib/utils/internal/deriveKeys.d.ts +10 -0
  846. package/lib/utils/internal/deriveKeys.d.ts.map +1 -0
  847. package/lib/utils/internal/deriveKeys.js +60 -0
  848. package/lib/utils/internal/deriveKeys.js.map +1 -0
  849. package/lib/utils.d.ts +267 -0
  850. package/lib/utils.d.ts.map +1 -0
  851. package/lib/utils.js +749 -0
  852. package/lib/utils.js.map +1 -0
  853. package/lib/version-support.d.ts +19 -0
  854. package/lib/version-support.d.ts.map +1 -0
  855. package/lib/version-support.js +37 -0
  856. package/lib/version-support.js.map +1 -0
  857. package/lib/webrtc/audioContext.d.ts +15 -0
  858. package/lib/webrtc/audioContext.d.ts.map +1 -0
  859. package/lib/webrtc/audioContext.js +46 -0
  860. package/lib/webrtc/audioContext.js.map +1 -0
  861. package/lib/webrtc/call.d.ts +560 -0
  862. package/lib/webrtc/call.d.ts.map +1 -0
  863. package/lib/webrtc/call.js +2541 -0
  864. package/lib/webrtc/call.js.map +1 -0
  865. package/lib/webrtc/callEventHandler.d.ts +37 -0
  866. package/lib/webrtc/callEventHandler.d.ts.map +1 -0
  867. package/lib/webrtc/callEventHandler.js +344 -0
  868. package/lib/webrtc/callEventHandler.js.map +1 -0
  869. package/lib/webrtc/callEventTypes.d.ts +73 -0
  870. package/lib/webrtc/callEventTypes.d.ts.map +1 -0
  871. package/lib/webrtc/callEventTypes.js +13 -0
  872. package/lib/webrtc/callEventTypes.js.map +1 -0
  873. package/lib/webrtc/callFeed.d.ts +128 -0
  874. package/lib/webrtc/callFeed.d.ts.map +1 -0
  875. package/lib/webrtc/callFeed.js +289 -0
  876. package/lib/webrtc/callFeed.js.map +1 -0
  877. package/lib/webrtc/groupCall.d.ts +323 -0
  878. package/lib/webrtc/groupCall.d.ts.map +1 -0
  879. package/lib/webrtc/groupCall.js +1337 -0
  880. package/lib/webrtc/groupCall.js.map +1 -0
  881. package/lib/webrtc/groupCallEventHandler.d.ts +31 -0
  882. package/lib/webrtc/groupCallEventHandler.d.ts.map +1 -0
  883. package/lib/webrtc/groupCallEventHandler.js +178 -0
  884. package/lib/webrtc/groupCallEventHandler.js.map +1 -0
  885. package/lib/webrtc/mediaHandler.d.ts +89 -0
  886. package/lib/webrtc/mediaHandler.d.ts.map +1 -0
  887. package/lib/webrtc/mediaHandler.js +437 -0
  888. package/lib/webrtc/mediaHandler.js.map +1 -0
  889. package/lib/webrtc/stats/callFeedStatsReporter.d.ts +8 -0
  890. package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +1 -0
  891. package/lib/webrtc/stats/callFeedStatsReporter.js +82 -0
  892. package/lib/webrtc/stats/callFeedStatsReporter.js.map +1 -0
  893. package/lib/webrtc/stats/callStatsReportGatherer.d.ts +25 -0
  894. package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +1 -0
  895. package/lib/webrtc/stats/callStatsReportGatherer.js +199 -0
  896. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -0
  897. package/lib/webrtc/stats/callStatsReportSummary.d.ts +17 -0
  898. package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +1 -0
  899. package/lib/webrtc/stats/callStatsReportSummary.js +1 -0
  900. package/lib/webrtc/stats/callStatsReportSummary.js.map +1 -0
  901. package/lib/webrtc/stats/connectionStats.d.ts +28 -0
  902. package/lib/webrtc/stats/connectionStats.d.ts.map +1 -0
  903. package/lib/webrtc/stats/connectionStats.js +26 -0
  904. package/lib/webrtc/stats/connectionStats.js.map +1 -0
  905. package/lib/webrtc/stats/connectionStatsBuilder.d.ts +5 -0
  906. package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +1 -0
  907. package/lib/webrtc/stats/connectionStatsBuilder.js +27 -0
  908. package/lib/webrtc/stats/connectionStatsBuilder.js.map +1 -0
  909. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +7 -0
  910. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +1 -0
  911. package/lib/webrtc/stats/connectionStatsReportBuilder.js +121 -0
  912. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -0
  913. package/lib/webrtc/stats/groupCallStats.d.ts +22 -0
  914. package/lib/webrtc/stats/groupCallStats.d.ts.map +1 -0
  915. package/lib/webrtc/stats/groupCallStats.js +78 -0
  916. package/lib/webrtc/stats/groupCallStats.js.map +1 -0
  917. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +10 -0
  918. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +1 -0
  919. package/lib/webrtc/stats/media/mediaSsrcHandler.js +57 -0
  920. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -0
  921. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +12 -0
  922. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +1 -0
  923. package/lib/webrtc/stats/media/mediaTrackHandler.js +62 -0
  924. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +1 -0
  925. package/lib/webrtc/stats/media/mediaTrackStats.d.ts +86 -0
  926. package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +1 -0
  927. package/lib/webrtc/stats/media/mediaTrackStats.js +142 -0
  928. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -0
  929. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +22 -0
  930. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +1 -0
  931. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +76 -0
  932. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -0
  933. package/lib/webrtc/stats/statsReport.d.ts +99 -0
  934. package/lib/webrtc/stats/statsReport.d.ts.map +1 -0
  935. package/lib/webrtc/stats/statsReport.js +32 -0
  936. package/lib/webrtc/stats/statsReport.js.map +1 -0
  937. package/lib/webrtc/stats/statsReportEmitter.d.ts +15 -0
  938. package/lib/webrtc/stats/statsReportEmitter.d.ts.map +1 -0
  939. package/lib/webrtc/stats/statsReportEmitter.js +33 -0
  940. package/lib/webrtc/stats/statsReportEmitter.js.map +1 -0
  941. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +16 -0
  942. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +1 -0
  943. package/lib/webrtc/stats/summaryStatsReportGatherer.js +116 -0
  944. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +1 -0
  945. package/lib/webrtc/stats/trackStatsBuilder.d.ts +19 -0
  946. package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +1 -0
  947. package/lib/webrtc/stats/trackStatsBuilder.js +168 -0
  948. package/lib/webrtc/stats/trackStatsBuilder.js.map +1 -0
  949. package/lib/webrtc/stats/transportStats.d.ts +11 -0
  950. package/lib/webrtc/stats/transportStats.d.ts.map +1 -0
  951. package/lib/webrtc/stats/transportStats.js +1 -0
  952. package/lib/webrtc/stats/transportStats.js.map +1 -0
  953. package/lib/webrtc/stats/transportStatsBuilder.d.ts +5 -0
  954. package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +1 -0
  955. package/lib/webrtc/stats/transportStatsBuilder.js +34 -0
  956. package/lib/webrtc/stats/transportStatsBuilder.js.map +1 -0
  957. package/lib/webrtc/stats/valueFormatter.d.ts +4 -0
  958. package/lib/webrtc/stats/valueFormatter.d.ts.map +1 -0
  959. package/lib/webrtc/stats/valueFormatter.js +25 -0
  960. package/lib/webrtc/stats/valueFormatter.js.map +1 -0
  961. package/package.json +134 -0
  962. package/src/@types/AESEncryptedSecretStoragePayload.ts +29 -0
  963. package/src/@types/IIdentityServerProvider.ts +24 -0
  964. package/src/@types/PushRules.ts +209 -0
  965. package/src/@types/another-json.d.ts +19 -0
  966. package/src/@types/auth.ts +252 -0
  967. package/src/@types/beacon.ts +140 -0
  968. package/src/@types/common.ts +22 -0
  969. package/src/@types/crypto.ts +73 -0
  970. package/src/@types/event.ts +370 -0
  971. package/src/@types/events.ts +119 -0
  972. package/src/@types/extensible_events.ts +150 -0
  973. package/src/@types/global.d.ts +70 -0
  974. package/src/@types/local_notifications.ts +19 -0
  975. package/src/@types/location.ts +92 -0
  976. package/src/@types/matrix-sdk-crypto-wasm.d.ts +44 -0
  977. package/src/@types/media.ts +245 -0
  978. package/src/@types/membership.ts +57 -0
  979. package/src/@types/oidc-client-ts.d.ts +24 -0
  980. package/src/@types/partials.ts +67 -0
  981. package/src/@types/polls.ts +119 -0
  982. package/src/@types/read_receipts.ts +61 -0
  983. package/src/@types/registration.ts +102 -0
  984. package/src/@types/requests.ts +314 -0
  985. package/src/@types/search.ts +119 -0
  986. package/src/@types/signed.ts +25 -0
  987. package/src/@types/spaces.ts +37 -0
  988. package/src/@types/state_events.ts +147 -0
  989. package/src/@types/synapse.ts +40 -0
  990. package/src/@types/sync.ts +27 -0
  991. package/src/@types/threepids.ts +29 -0
  992. package/src/@types/topic.ts +63 -0
  993. package/src/@types/uia.ts +29 -0
  994. package/src/NamespacedValue.ts +123 -0
  995. package/src/ReEmitter.ts +93 -0
  996. package/src/ToDeviceMessageQueue.ts +153 -0
  997. package/src/autodiscovery.ts +505 -0
  998. package/src/base64.ts +88 -0
  999. package/src/browser-index.ts +44 -0
  1000. package/src/client.ts +10474 -0
  1001. package/src/common-crypto/CryptoBackend.ts +302 -0
  1002. package/src/common-crypto/README.md +4 -0
  1003. package/src/common-crypto/key-passphrase.ts +43 -0
  1004. package/src/content-helpers.ts +288 -0
  1005. package/src/content-repo.ts +117 -0
  1006. package/src/crypto/CrossSigning.ts +773 -0
  1007. package/src/crypto/DeviceList.ts +989 -0
  1008. package/src/crypto/EncryptionSetup.ts +351 -0
  1009. package/src/crypto/OlmDevice.ts +1500 -0
  1010. package/src/crypto/OutgoingRoomKeyRequestManager.ts +485 -0
  1011. package/src/crypto/RoomList.ts +70 -0
  1012. package/src/crypto/SecretSharing.ts +240 -0
  1013. package/src/crypto/SecretStorage.ts +136 -0
  1014. package/src/crypto/aes.ts +23 -0
  1015. package/src/crypto/algorithms/base.ts +236 -0
  1016. package/src/crypto/algorithms/index.ts +20 -0
  1017. package/src/crypto/algorithms/megolm.ts +2216 -0
  1018. package/src/crypto/algorithms/olm.ts +381 -0
  1019. package/src/crypto/api.ts +70 -0
  1020. package/src/crypto/backup.ts +922 -0
  1021. package/src/crypto/crypto.ts +18 -0
  1022. package/src/crypto/dehydration.ts +272 -0
  1023. package/src/crypto/device-converter.ts +45 -0
  1024. package/src/crypto/deviceinfo.ts +158 -0
  1025. package/src/crypto/index.ts +4414 -0
  1026. package/src/crypto/key_passphrase.ts +42 -0
  1027. package/src/crypto/keybackup.ts +47 -0
  1028. package/src/crypto/olmlib.ts +539 -0
  1029. package/src/crypto/recoverykey.ts +18 -0
  1030. package/src/crypto/store/base.ts +348 -0
  1031. package/src/crypto/store/indexeddb-crypto-store-backend.ts +1250 -0
  1032. package/src/crypto/store/indexeddb-crypto-store.ts +845 -0
  1033. package/src/crypto/store/localStorage-crypto-store.ts +579 -0
  1034. package/src/crypto/store/memory-crypto-store.ts +680 -0
  1035. package/src/crypto/verification/Base.ts +409 -0
  1036. package/src/crypto/verification/Error.ts +76 -0
  1037. package/src/crypto/verification/IllegalMethod.ts +50 -0
  1038. package/src/crypto/verification/QRCode.ts +310 -0
  1039. package/src/crypto/verification/SAS.ts +494 -0
  1040. package/src/crypto/verification/SASDecimal.ts +37 -0
  1041. package/src/crypto/verification/request/Channel.ts +34 -0
  1042. package/src/crypto/verification/request/InRoomChannel.ts +371 -0
  1043. package/src/crypto/verification/request/ToDeviceChannel.ts +354 -0
  1044. package/src/crypto/verification/request/VerificationRequest.ts +976 -0
  1045. package/src/crypto-api/CryptoEvent.ts +93 -0
  1046. package/src/crypto-api/CryptoEventHandlerMap.ts +32 -0
  1047. package/src/crypto-api/index.ts +1175 -0
  1048. package/src/crypto-api/key-passphrase.ts +58 -0
  1049. package/src/crypto-api/keybackup.ts +115 -0
  1050. package/src/crypto-api/recovery-key.ts +69 -0
  1051. package/src/crypto-api/verification.ts +408 -0
  1052. package/src/digest.ts +34 -0
  1053. package/src/embedded.ts +631 -0
  1054. package/src/errors.ts +54 -0
  1055. package/src/event-mapper.ts +97 -0
  1056. package/src/extensible_events_v1/ExtensibleEvent.ts +58 -0
  1057. package/src/extensible_events_v1/InvalidEventError.ts +24 -0
  1058. package/src/extensible_events_v1/MessageEvent.ts +145 -0
  1059. package/src/extensible_events_v1/PollEndEvent.ts +97 -0
  1060. package/src/extensible_events_v1/PollResponseEvent.ts +148 -0
  1061. package/src/extensible_events_v1/PollStartEvent.ts +207 -0
  1062. package/src/extensible_events_v1/utilities.ts +35 -0
  1063. package/src/feature.ts +87 -0
  1064. package/src/filter-component.ts +207 -0
  1065. package/src/filter.ts +245 -0
  1066. package/src/http-api/errors.ts +199 -0
  1067. package/src/http-api/fetch.ts +383 -0
  1068. package/src/http-api/index.ts +191 -0
  1069. package/src/http-api/interface.ts +178 -0
  1070. package/src/http-api/method.ts +25 -0
  1071. package/src/http-api/prefix.ts +48 -0
  1072. package/src/http-api/utils.ts +200 -0
  1073. package/src/index.ts +25 -0
  1074. package/src/indexeddb-helpers.ts +50 -0
  1075. package/src/indexeddb-worker.ts +24 -0
  1076. package/src/interactive-auth.ts +694 -0
  1077. package/src/logger.ts +185 -0
  1078. package/src/matrix.ts +177 -0
  1079. package/src/matrixrtc/CallMembership.ts +247 -0
  1080. package/src/matrixrtc/LivekitFocus.ts +39 -0
  1081. package/src/matrixrtc/MatrixRTCSession.ts +1319 -0
  1082. package/src/matrixrtc/MatrixRTCSessionManager.ts +166 -0
  1083. package/src/matrixrtc/focus.ts +25 -0
  1084. package/src/matrixrtc/index.ts +22 -0
  1085. package/src/matrixrtc/types.ts +36 -0
  1086. package/src/models/MSC3089Branch.ts +272 -0
  1087. package/src/models/MSC3089TreeSpace.ts +565 -0
  1088. package/src/models/ToDeviceMessage.ts +38 -0
  1089. package/src/models/beacon.ts +214 -0
  1090. package/src/models/compare-event-ordering.ts +139 -0
  1091. package/src/models/device.ts +85 -0
  1092. package/src/models/event-context.ts +110 -0
  1093. package/src/models/event-status.ts +39 -0
  1094. package/src/models/event-timeline-set.ts +979 -0
  1095. package/src/models/event-timeline.ts +476 -0
  1096. package/src/models/event.ts +1751 -0
  1097. package/src/models/invites-ignorer.ts +376 -0
  1098. package/src/models/poll.ts +285 -0
  1099. package/src/models/profile-keys.ts +7 -0
  1100. package/src/models/read-receipt.ts +422 -0
  1101. package/src/models/related-relations.ts +39 -0
  1102. package/src/models/relations-container.ts +149 -0
  1103. package/src/models/relations.ts +368 -0
  1104. package/src/models/room-member.ts +457 -0
  1105. package/src/models/room-receipts.ts +439 -0
  1106. package/src/models/room-state.ts +1130 -0
  1107. package/src/models/room-summary.ts +47 -0
  1108. package/src/models/room.ts +3822 -0
  1109. package/src/models/search-result.ts +57 -0
  1110. package/src/models/thread.ts +923 -0
  1111. package/src/models/typed-event-emitter.ts +246 -0
  1112. package/src/models/user.ts +302 -0
  1113. package/src/oidc/authorize.ts +274 -0
  1114. package/src/oidc/discovery.ts +60 -0
  1115. package/src/oidc/error.ts +33 -0
  1116. package/src/oidc/index.ts +34 -0
  1117. package/src/oidc/register.ts +123 -0
  1118. package/src/oidc/tokenRefresher.ts +149 -0
  1119. package/src/oidc/validate.ts +282 -0
  1120. package/src/pushprocessor.ts +837 -0
  1121. package/src/randomstring.ts +51 -0
  1122. package/src/realtime-callbacks.ts +191 -0
  1123. package/src/receipt-accumulator.ts +189 -0
  1124. package/src/rendezvous/MSC4108SignInWithQR.ts +444 -0
  1125. package/src/rendezvous/RendezvousChannel.ts +48 -0
  1126. package/src/rendezvous/RendezvousCode.ts +25 -0
  1127. package/src/rendezvous/RendezvousError.ts +26 -0
  1128. package/src/rendezvous/RendezvousFailureReason.ts +49 -0
  1129. package/src/rendezvous/RendezvousIntent.ts +20 -0
  1130. package/src/rendezvous/RendezvousTransport.ts +58 -0
  1131. package/src/rendezvous/channels/MSC4108SecureChannel.ts +270 -0
  1132. package/src/rendezvous/channels/index.ts +17 -0
  1133. package/src/rendezvous/index.ts +25 -0
  1134. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +270 -0
  1135. package/src/rendezvous/transports/index.ts +17 -0
  1136. package/src/room-hierarchy.ts +152 -0
  1137. package/src/rust-crypto/CrossSigningIdentity.ts +183 -0
  1138. package/src/rust-crypto/DehydratedDeviceManager.ts +306 -0
  1139. package/src/rust-crypto/KeyClaimManager.ts +86 -0
  1140. package/src/rust-crypto/OutgoingRequestProcessor.ts +236 -0
  1141. package/src/rust-crypto/OutgoingRequestsManager.ts +143 -0
  1142. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +501 -0
  1143. package/src/rust-crypto/RoomEncryptor.ts +352 -0
  1144. package/src/rust-crypto/backup.ts +881 -0
  1145. package/src/rust-crypto/constants.ts +18 -0
  1146. package/src/rust-crypto/device-converter.ts +128 -0
  1147. package/src/rust-crypto/index.ts +237 -0
  1148. package/src/rust-crypto/libolm_migration.ts +530 -0
  1149. package/src/rust-crypto/rust-crypto.ts +2205 -0
  1150. package/src/rust-crypto/secret-storage.ts +60 -0
  1151. package/src/rust-crypto/verification.ts +830 -0
  1152. package/src/scheduler.ts +309 -0
  1153. package/src/secret-storage.ts +693 -0
  1154. package/src/serverCapabilities.ts +139 -0
  1155. package/src/service-types.ts +20 -0
  1156. package/src/sliding-sync-sdk.ts +1026 -0
  1157. package/src/sliding-sync.ts +965 -0
  1158. package/src/store/index.ts +261 -0
  1159. package/src/store/indexeddb-backend.ts +41 -0
  1160. package/src/store/indexeddb-local-backend.ts +610 -0
  1161. package/src/store/indexeddb-remote-backend.ts +213 -0
  1162. package/src/store/indexeddb-store-worker.ts +157 -0
  1163. package/src/store/indexeddb.ts +397 -0
  1164. package/src/store/local-storage-events-emitter.ts +46 -0
  1165. package/src/store/memory.ts +448 -0
  1166. package/src/store/stub.ts +280 -0
  1167. package/src/sync-accumulator.ts +689 -0
  1168. package/src/sync.ts +1920 -0
  1169. package/src/testing.ts +191 -0
  1170. package/src/thread-utils.ts +31 -0
  1171. package/src/timeline-window.ts +536 -0
  1172. package/src/types.ts +59 -0
  1173. package/src/utils/decryptAESSecretStorageItem.ts +54 -0
  1174. package/src/utils/encryptAESSecretStorageItem.ts +73 -0
  1175. package/src/utils/internal/deriveKeys.ts +63 -0
  1176. package/src/utils.ts +763 -0
  1177. package/src/version-support.ts +36 -0
  1178. package/src/webrtc/audioContext.ts +44 -0
  1179. package/src/webrtc/call.ts +3074 -0
  1180. package/src/webrtc/callEventHandler.ts +425 -0
  1181. package/src/webrtc/callEventTypes.ts +93 -0
  1182. package/src/webrtc/callFeed.ts +364 -0
  1183. package/src/webrtc/groupCall.ts +1735 -0
  1184. package/src/webrtc/groupCallEventHandler.ts +234 -0
  1185. package/src/webrtc/mediaHandler.ts +484 -0
  1186. package/src/webrtc/stats/callFeedStatsReporter.ts +94 -0
  1187. package/src/webrtc/stats/callStatsReportGatherer.ts +219 -0
  1188. package/src/webrtc/stats/callStatsReportSummary.ts +30 -0
  1189. package/src/webrtc/stats/connectionStats.ts +47 -0
  1190. package/src/webrtc/stats/connectionStatsBuilder.ts +28 -0
  1191. package/src/webrtc/stats/connectionStatsReportBuilder.ts +140 -0
  1192. package/src/webrtc/stats/groupCallStats.ts +93 -0
  1193. package/src/webrtc/stats/media/mediaSsrcHandler.ts +57 -0
  1194. package/src/webrtc/stats/media/mediaTrackHandler.ts +76 -0
  1195. package/src/webrtc/stats/media/mediaTrackStats.ts +176 -0
  1196. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +90 -0
  1197. package/src/webrtc/stats/statsReport.ts +133 -0
  1198. package/src/webrtc/stats/statsReportEmitter.ts +49 -0
  1199. package/src/webrtc/stats/summaryStatsReportGatherer.ts +148 -0
  1200. package/src/webrtc/stats/trackStatsBuilder.ts +207 -0
  1201. package/src/webrtc/stats/transportStats.ts +26 -0
  1202. package/src/webrtc/stats/transportStatsBuilder.ts +48 -0
  1203. package/src/webrtc/stats/valueFormatter.ts +27 -0
package/src/sync.ts ADDED
@@ -0,0 +1,1920 @@
1
+ /*
2
+ Copyright 2015 - 2023 The Matrix.org Foundation C.I.C.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+
17
+ /*
18
+ * TODO:
19
+ * This class mainly serves to take all the syncing logic out of client.js and
20
+ * into a separate file. It's all very fluid, and this class gut wrenches a lot
21
+ * of MatrixClient props (e.g. http). Given we want to support WebSockets as
22
+ * an alternative syncing API, we may want to have a proper syncing interface
23
+ * for HTTP and WS at some point.
24
+ */
25
+
26
+ import { Optional } from "matrix-events-sdk";
27
+
28
+ import type { SyncCryptoCallbacks } from "./common-crypto/CryptoBackend.ts";
29
+ import { User } from "./models/user.ts";
30
+ import { NotificationCountType, Room, RoomEvent } from "./models/room.ts";
31
+ import { deepCopy, defer, IDeferred, noUnsafeEventProps, promiseMapSeries, unsafeProp } from "./utils.ts";
32
+ import { Filter } from "./filter.ts";
33
+ import { EventTimeline } from "./models/event-timeline.ts";
34
+ import { logger } from "./logger.ts";
35
+ import { ClientEvent, IStoredClientOpts, MatrixClient, PendingEventOrdering, ResetTimelineCallback } from "./client.ts";
36
+ import {
37
+ IEphemeral,
38
+ IInvitedRoom,
39
+ IInviteState,
40
+ IJoinedRoom,
41
+ ILeftRoom,
42
+ IKnockedRoom,
43
+ IMinimalEvent,
44
+ IRoomEvent,
45
+ IStateEvent,
46
+ IStrippedState,
47
+ ISyncResponse,
48
+ ITimeline,
49
+ IToDeviceEvent,
50
+ } from "./sync-accumulator.ts";
51
+ import { MatrixEvent } from "./models/event.ts";
52
+ import { MatrixError, Method } from "./http-api/index.ts";
53
+ import { ISavedSync } from "./store/index.ts";
54
+ import { EventType } from "./@types/event.ts";
55
+ import { IPushRules } from "./@types/PushRules.ts";
56
+ import { RoomStateEvent, IMarkerFoundOptions } from "./models/room-state.ts";
57
+ import { RoomMemberEvent } from "./models/room-member.ts";
58
+ import { BeaconEvent } from "./models/beacon.ts";
59
+ import { IEventsResponse } from "./@types/requests.ts";
60
+ import { UNREAD_THREAD_NOTIFICATIONS } from "./@types/sync.ts";
61
+ import { Feature, ServerSupport } from "./feature.ts";
62
+ import { Crypto } from "./crypto/index.ts";
63
+ import { KnownMembership } from "./@types/membership.ts";
64
+
65
+ const DEBUG = true;
66
+
67
+ // /sync requests allow you to set a timeout= but the request may continue
68
+ // beyond that and wedge forever, so we need to track how long we are willing
69
+ // to keep open the connection. This constant is *ADDED* to the timeout= value
70
+ // to determine the max time we're willing to wait.
71
+ const BUFFER_PERIOD_MS = 80 * 1000;
72
+
73
+ // Number of consecutive failed syncs that will lead to a syncState of ERROR as opposed
74
+ // to RECONNECTING. This is needed to inform the client of server issues when the
75
+ // keepAlive is successful but the server /sync fails.
76
+ const FAILED_SYNC_ERROR_THRESHOLD = 3;
77
+
78
+ export enum SyncState {
79
+ /** Emitted after we try to sync more than `FAILED_SYNC_ERROR_THRESHOLD`
80
+ * times and are still failing. Or when we enounter a hard error like the
81
+ * token being invalid. */
82
+ Error = "ERROR",
83
+ /** Emitted after the first sync events are ready (this could even be sync
84
+ * events from the cache) */
85
+ Prepared = "PREPARED",
86
+ /** Emitted when the sync loop is no longer running */
87
+ Stopped = "STOPPED",
88
+ /** Emitted after each sync request happens */
89
+ Syncing = "SYNCING",
90
+ /** Emitted after a connectivity error and we're ready to start syncing again */
91
+ Catchup = "CATCHUP",
92
+ /** Emitted for each time we try reconnecting. Will switch to `Error` after
93
+ * we reach the `FAILED_SYNC_ERROR_THRESHOLD`
94
+ */
95
+ Reconnecting = "RECONNECTING",
96
+ }
97
+
98
+ // Room versions where "insertion", "batch", and "marker" events are controlled
99
+ // by power-levels. MSC2716 is supported in existing room versions but they
100
+ // should only have special meaning when the room creator sends them.
101
+ const MSC2716_ROOM_VERSIONS = ["org.matrix.msc2716v3"];
102
+
103
+ function getFilterName(userId: string, suffix?: string): string {
104
+ // scope this on the user ID because people may login on many accounts
105
+ // and they all need to be stored!
106
+ return `FILTER_SYNC_${userId}` + (suffix ? "_" + suffix : "");
107
+ }
108
+
109
+ /* istanbul ignore next */
110
+ function debuglog(...params: any[]): void {
111
+ if (!DEBUG) return;
112
+ logger.log(...params);
113
+ }
114
+
115
+ /**
116
+ * Options passed into the constructor of SyncApi by MatrixClient
117
+ */
118
+ export interface SyncApiOptions {
119
+ /**
120
+ * Crypto manager
121
+ *
122
+ * @deprecated in favour of cryptoCallbacks
123
+ */
124
+ crypto?: Crypto;
125
+
126
+ /**
127
+ * If crypto is enabled on our client, callbacks into the crypto module
128
+ */
129
+ cryptoCallbacks?: SyncCryptoCallbacks;
130
+
131
+ /**
132
+ * A function which is called
133
+ * with a room ID and returns a boolean. It should return 'true' if the SDK can
134
+ * SAFELY remove events from this room. It may not be safe to remove events if
135
+ * there are other references to the timelines for this room.
136
+ */
137
+ canResetEntireTimeline?: ResetTimelineCallback;
138
+ }
139
+
140
+ interface ISyncOptions {
141
+ filter?: string;
142
+ hasSyncedBefore?: boolean;
143
+ }
144
+
145
+ export interface ISyncStateData {
146
+ /**
147
+ * The matrix error if `state=ERROR`.
148
+ */
149
+ error?: Error;
150
+ /**
151
+ * The 'since' token passed to /sync.
152
+ * `null` for the first successful sync since this client was
153
+ * started. Only present if `state=PREPARED` or
154
+ * `state=SYNCING`.
155
+ */
156
+ oldSyncToken?: string;
157
+ /**
158
+ * The 'next_batch' result from /sync, which
159
+ * will become the 'since' token for the next call to /sync. Only present if
160
+ * `state=PREPARED</code> or <code>state=SYNCING`.
161
+ */
162
+ nextSyncToken?: string;
163
+ /**
164
+ * True if we are working our way through a
165
+ * backlog of events after connecting. Only present if `state=SYNCING`.
166
+ */
167
+ catchingUp?: boolean;
168
+ fromCache?: boolean;
169
+ }
170
+
171
+ export enum SetPresence {
172
+ Offline = "offline",
173
+ Online = "online",
174
+ Unavailable = "unavailable",
175
+ }
176
+
177
+ interface ISyncParams {
178
+ filter?: string;
179
+ timeout: number;
180
+ since?: string;
181
+ // eslint-disable-next-line camelcase
182
+ full_state?: boolean;
183
+ // eslint-disable-next-line camelcase
184
+ set_presence?: SetPresence;
185
+ _cacheBuster?: string | number; // not part of the API itself
186
+ }
187
+
188
+ type WrappedRoom<T> = T & {
189
+ room: Room;
190
+ isBrandNewRoom: boolean;
191
+ };
192
+
193
+ /** add default settings to an IStoredClientOpts */
194
+ export function defaultClientOpts(opts?: IStoredClientOpts): IStoredClientOpts {
195
+ return {
196
+ initialSyncLimit: 8,
197
+ resolveInvitesToProfiles: false,
198
+ pollTimeout: 30 * 1000,
199
+ pendingEventOrdering: PendingEventOrdering.Chronological,
200
+ threadSupport: false,
201
+ ...opts,
202
+ };
203
+ }
204
+
205
+ export function defaultSyncApiOpts(syncOpts?: SyncApiOptions): SyncApiOptions {
206
+ return {
207
+ canResetEntireTimeline: (_roomId): boolean => false,
208
+ ...syncOpts,
209
+ };
210
+ }
211
+
212
+ export class SyncApi {
213
+ private readonly opts: IStoredClientOpts;
214
+ private readonly syncOpts: SyncApiOptions;
215
+
216
+ private _peekRoom: Optional<Room> = null;
217
+ private currentSyncRequest?: Promise<ISyncResponse>;
218
+ private abortController?: AbortController;
219
+ private syncState: SyncState | null = null;
220
+ private syncStateData?: ISyncStateData; // additional data (eg. error object for failed sync)
221
+ private catchingUp = false;
222
+ private running = false;
223
+ private keepAliveTimer?: ReturnType<typeof setTimeout>;
224
+ private connectionReturnedDefer?: IDeferred<boolean>;
225
+ private notifEvents: MatrixEvent[] = []; // accumulator of sync events in the current sync response
226
+ private failedSyncCount = 0; // Number of consecutive failed /sync requests
227
+ private storeIsInvalid = false; // flag set if the store needs to be cleared before we can start
228
+ private presence?: SetPresence;
229
+
230
+ /**
231
+ * Construct an entity which is able to sync with a homeserver.
232
+ * @param client - The matrix client instance to use.
233
+ * @param opts - client config options
234
+ * @param syncOpts - sync-specific options passed by the client
235
+ * @internal
236
+ */
237
+ public constructor(
238
+ private readonly client: MatrixClient,
239
+ opts?: IStoredClientOpts,
240
+ syncOpts?: SyncApiOptions,
241
+ ) {
242
+ this.opts = defaultClientOpts(opts);
243
+ this.syncOpts = defaultSyncApiOpts(syncOpts);
244
+
245
+ if (client.getNotifTimelineSet()) {
246
+ client.reEmitter.reEmit(client.getNotifTimelineSet()!, [RoomEvent.Timeline, RoomEvent.TimelineReset]);
247
+ }
248
+ }
249
+
250
+ public createRoom(roomId: string): Room {
251
+ const room = _createAndReEmitRoom(this.client, roomId, this.opts);
252
+
253
+ room.on(RoomStateEvent.Marker, (markerEvent, markerFoundOptions) => {
254
+ this.onMarkerStateEvent(room, markerEvent, markerFoundOptions);
255
+ });
256
+
257
+ return room;
258
+ }
259
+
260
+ /** When we see the marker state change in the room, we know there is some
261
+ * new historical messages imported by MSC2716 `/batch_send` somewhere in
262
+ * the room and we need to throw away the timeline to make sure the
263
+ * historical messages are shown when we paginate `/messages` again.
264
+ * @param room - The room where the marker event was sent
265
+ * @param markerEvent - The new marker event
266
+ * @param setStateOptions - When `timelineWasEmpty` is set
267
+ * as `true`, the given marker event will be ignored
268
+ */
269
+ private onMarkerStateEvent(
270
+ room: Room,
271
+ markerEvent: MatrixEvent,
272
+ { timelineWasEmpty }: IMarkerFoundOptions = {},
273
+ ): void {
274
+ // We don't need to refresh the timeline if it was empty before the
275
+ // marker arrived. This could be happen in a variety of cases:
276
+ // 1. From the initial sync
277
+ // 2. If it's from the first state we're seeing after joining the room
278
+ // 3. Or whether it's coming from `syncFromCache`
279
+ if (timelineWasEmpty) {
280
+ logger.debug(
281
+ `MarkerState: Ignoring markerEventId=${markerEvent.getId()} in roomId=${room.roomId} ` +
282
+ `because the timeline was empty before the marker arrived which means there is nothing to refresh.`,
283
+ );
284
+ return;
285
+ }
286
+
287
+ const isValidMsc2716Event =
288
+ // Check whether the room version directly supports MSC2716, in
289
+ // which case, "marker" events are already auth'ed by
290
+ // power_levels
291
+ MSC2716_ROOM_VERSIONS.includes(room.getVersion()) ||
292
+ // MSC2716 is also supported in all existing room versions but
293
+ // special meaning should only be given to "insertion", "batch",
294
+ // and "marker" events when they come from the room creator
295
+ markerEvent.getSender() === room.getCreator();
296
+
297
+ // It would be nice if we could also specifically tell whether the
298
+ // historical messages actually affected the locally cached client
299
+ // timeline or not. The problem is we can't see the prev_events of
300
+ // the base insertion event that the marker was pointing to because
301
+ // prev_events aren't available in the client API's. In most cases,
302
+ // the history won't be in people's locally cached timelines in the
303
+ // client, so we don't need to bother everyone about refreshing
304
+ // their timeline. This works for a v1 though and there are use
305
+ // cases like initially bootstrapping your bridged room where people
306
+ // are likely to encounter the historical messages affecting their
307
+ // current timeline (think someone signing up for Beeper and
308
+ // importing their Whatsapp history).
309
+ if (isValidMsc2716Event) {
310
+ // Saw new marker event, let's let the clients know they should
311
+ // refresh the timeline.
312
+ logger.debug(
313
+ `MarkerState: Timeline needs to be refreshed because ` +
314
+ `a new markerEventId=${markerEvent.getId()} was sent in roomId=${room.roomId}`,
315
+ );
316
+ room.setTimelineNeedsRefresh(true);
317
+ room.emit(RoomEvent.HistoryImportedWithinTimeline, markerEvent, room);
318
+ } else {
319
+ logger.debug(
320
+ `MarkerState: Ignoring markerEventId=${markerEvent.getId()} in roomId=${room.roomId} because ` +
321
+ `MSC2716 is not supported in the room version or for any room version, the marker wasn't sent ` +
322
+ `by the room creator.`,
323
+ );
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Sync rooms the user has left.
329
+ * @returns Resolved when they've been added to the store.
330
+ */
331
+ public async syncLeftRooms(): Promise<Room[]> {
332
+ const client = this.client;
333
+
334
+ // grab a filter with limit=1 and include_leave=true
335
+ const filter = new Filter(this.client.credentials.userId);
336
+ filter.setTimelineLimit(1);
337
+ filter.setIncludeLeaveRooms(true);
338
+
339
+ const localTimeoutMs = this.opts.pollTimeout! + BUFFER_PERIOD_MS;
340
+
341
+ const filterId = await client.getOrCreateFilter(
342
+ getFilterName(client.credentials.userId!, "LEFT_ROOMS"),
343
+ filter,
344
+ );
345
+
346
+ const qps: ISyncParams = {
347
+ timeout: 0, // don't want to block since this is a single isolated req
348
+ filter: filterId,
349
+ };
350
+
351
+ const data = await client.http.authedRequest<ISyncResponse>(Method.Get, "/sync", qps as any, undefined, {
352
+ localTimeoutMs,
353
+ });
354
+
355
+ let leaveRooms: WrappedRoom<ILeftRoom>[] = [];
356
+ if (data.rooms?.leave) {
357
+ leaveRooms = this.mapSyncResponseToRoomArray(data.rooms.leave);
358
+ }
359
+
360
+ const rooms = await Promise.all(
361
+ leaveRooms.map(async (leaveObj) => {
362
+ const room = leaveObj.room;
363
+ if (!leaveObj.isBrandNewRoom) {
364
+ // the intention behind syncLeftRooms is to add in rooms which were
365
+ // *omitted* from the initial /sync. Rooms the user were joined to
366
+ // but then left whilst the app is running will appear in this list
367
+ // and we do not want to bother with them since they will have the
368
+ // current state already (and may get dupe messages if we add
369
+ // yet more timeline events!), so skip them.
370
+ // NB: When we persist rooms to localStorage this will be more
371
+ // complicated...
372
+ return;
373
+ }
374
+ leaveObj.timeline = leaveObj.timeline || {
375
+ prev_batch: null,
376
+ events: [],
377
+ };
378
+ const events = this.mapSyncEventsFormat(leaveObj.timeline, room);
379
+
380
+ const stateEvents = this.mapSyncEventsFormat(leaveObj.state, room);
381
+
382
+ // set the back-pagination token. Do this *before* adding any
383
+ // events so that clients can start back-paginating.
384
+ room.getLiveTimeline().setPaginationToken(leaveObj.timeline.prev_batch, EventTimeline.BACKWARDS);
385
+
386
+ await this.injectRoomEvents(room, stateEvents, events);
387
+
388
+ room.recalculate();
389
+ client.store.storeRoom(room);
390
+ client.emit(ClientEvent.Room, room);
391
+
392
+ this.processEventsForNotifs(room, events);
393
+ return room;
394
+ }),
395
+ );
396
+
397
+ return rooms.filter(Boolean) as Room[];
398
+ }
399
+
400
+ /**
401
+ * Peek into a room. This will result in the room in question being synced so it
402
+ * is accessible via getRooms(). Live updates for the room will be provided.
403
+ * @param roomId - The room ID to peek into.
404
+ * @param limit - The number of timeline events to initially retrieve.
405
+ * @returns A promise which resolves once the room has been added to the
406
+ * store.
407
+ */
408
+ public peek(roomId: string, limit: number = 20): Promise<Room> {
409
+ if (this._peekRoom?.roomId === roomId) {
410
+ return Promise.resolve(this._peekRoom);
411
+ }
412
+
413
+ const client = this.client;
414
+ this._peekRoom = this.createRoom(roomId);
415
+ return this.client.roomInitialSync(roomId, limit).then((response) => {
416
+ if (this._peekRoom?.roomId !== roomId) {
417
+ throw new Error("Peeking aborted");
418
+ }
419
+
420
+ // make sure things are init'd
421
+ response.messages = response.messages || { chunk: [] };
422
+ response.messages.chunk = response.messages.chunk || [];
423
+ response.state = response.state || [];
424
+
425
+ // FIXME: Mostly duplicated from injectRoomEvents but not entirely
426
+ // because "state" in this API is at the BEGINNING of the chunk
427
+ const oldStateEvents = deepCopy(response.state).map(client.getEventMapper());
428
+ const stateEvents = response.state.map(client.getEventMapper());
429
+ const messages = response.messages.chunk.map(client.getEventMapper());
430
+
431
+ // XXX: copypasted from /sync until we kill off this minging v1 API stuff)
432
+ // handle presence events (User objects)
433
+ if (Array.isArray(response.presence)) {
434
+ response.presence.map(client.getEventMapper()).forEach(function (presenceEvent) {
435
+ let user = client.store.getUser(presenceEvent.getContent().user_id);
436
+ if (user) {
437
+ user.setPresenceEvent(presenceEvent);
438
+ } else {
439
+ user = User.createUser(presenceEvent.getContent().user_id, client);
440
+ user.setPresenceEvent(presenceEvent);
441
+ client.store.storeUser(user);
442
+ }
443
+ client.emit(ClientEvent.Event, presenceEvent);
444
+ });
445
+ }
446
+
447
+ // set the pagination token before adding the events in case people
448
+ // fire off pagination requests in response to the Room.timeline
449
+ // events.
450
+ if (response.messages.start) {
451
+ this._peekRoom.oldState.paginationToken = response.messages.start;
452
+ }
453
+
454
+ // set the state of the room to as it was after the timeline executes
455
+ this._peekRoom.oldState.setStateEvents(oldStateEvents);
456
+ this._peekRoom.currentState.setStateEvents(stateEvents);
457
+
458
+ this.resolveInvites(this._peekRoom);
459
+ this._peekRoom.recalculate();
460
+
461
+ // roll backwards to diverge old state. addEventsToTimeline
462
+ // will overwrite the pagination token, so make sure it overwrites
463
+ // it with the right thing.
464
+ this._peekRoom.addEventsToTimeline(
465
+ messages.reverse(),
466
+ true,
467
+ this._peekRoom.getLiveTimeline(),
468
+ response.messages.start,
469
+ );
470
+
471
+ client.store.storeRoom(this._peekRoom);
472
+ client.emit(ClientEvent.Room, this._peekRoom);
473
+
474
+ this.peekPoll(this._peekRoom);
475
+ return this._peekRoom;
476
+ });
477
+ }
478
+
479
+ /**
480
+ * Stop polling for updates in the peeked room. NOPs if there is no room being
481
+ * peeked.
482
+ */
483
+ public stopPeeking(): void {
484
+ this._peekRoom = null;
485
+ }
486
+
487
+ /**
488
+ * Do a peek room poll.
489
+ * @param token - from= token
490
+ */
491
+ private peekPoll(peekRoom: Room, token?: string): void {
492
+ if (this._peekRoom !== peekRoom) {
493
+ debuglog("Stopped peeking in room %s", peekRoom.roomId);
494
+ return;
495
+ }
496
+
497
+ // FIXME: gut wrenching; hard-coded timeout values
498
+ this.client.http
499
+ .authedRequest<IEventsResponse>(
500
+ Method.Get,
501
+ "/events",
502
+ {
503
+ room_id: peekRoom.roomId,
504
+ timeout: String(30 * 1000),
505
+ from: token,
506
+ },
507
+ undefined,
508
+ {
509
+ localTimeoutMs: 50 * 1000,
510
+ abortSignal: this.abortController?.signal,
511
+ },
512
+ )
513
+ .then(
514
+ async (res) => {
515
+ if (this._peekRoom !== peekRoom) {
516
+ debuglog("Stopped peeking in room %s", peekRoom.roomId);
517
+ return;
518
+ }
519
+ // We have a problem that we get presence both from /events and /sync
520
+ // however, /sync only returns presence for users in rooms
521
+ // you're actually joined to.
522
+ // in order to be sure to get presence for all of the users in the
523
+ // peeked room, we handle presence explicitly here. This may result
524
+ // in duplicate presence events firing for some users, which is a
525
+ // performance drain, but such is life.
526
+ // XXX: copypasted from /sync until we can kill this minging v1 stuff.
527
+
528
+ res.chunk
529
+ .filter(function (e) {
530
+ return e.type === "m.presence";
531
+ })
532
+ .map(this.client.getEventMapper())
533
+ .forEach((presenceEvent) => {
534
+ let user = this.client.store.getUser(presenceEvent.getContent().user_id);
535
+ if (user) {
536
+ user.setPresenceEvent(presenceEvent);
537
+ } else {
538
+ user = User.createUser(presenceEvent.getContent().user_id, this.client);
539
+ user.setPresenceEvent(presenceEvent);
540
+ this.client.store.storeUser(user);
541
+ }
542
+ this.client.emit(ClientEvent.Event, presenceEvent);
543
+ });
544
+
545
+ // strip out events which aren't for the given room_id (e.g presence)
546
+ // and also ephemeral events (which we're assuming is anything without
547
+ // and event ID because the /events API doesn't separate them).
548
+ const events = res.chunk
549
+ .filter(function (e) {
550
+ return e.room_id === peekRoom.roomId && e.event_id;
551
+ })
552
+ .map(this.client.getEventMapper());
553
+
554
+ await peekRoom.addLiveEvents(events);
555
+ this.peekPoll(peekRoom, res.end);
556
+ },
557
+ (err) => {
558
+ logger.error("[%s] Peek poll failed: %s", peekRoom.roomId, err);
559
+ setTimeout(() => {
560
+ this.peekPoll(peekRoom, token);
561
+ }, 30 * 1000);
562
+ },
563
+ );
564
+ }
565
+
566
+ /**
567
+ * Returns the current state of this sync object
568
+ * @see MatrixClient#event:"sync"
569
+ */
570
+ public getSyncState(): SyncState | null {
571
+ return this.syncState;
572
+ }
573
+
574
+ /**
575
+ * Returns the additional data object associated with
576
+ * the current sync state, or null if there is no
577
+ * such data.
578
+ * Sync errors, if available, are put in the 'error' key of
579
+ * this object.
580
+ */
581
+ public getSyncStateData(): ISyncStateData | null {
582
+ return this.syncStateData ?? null;
583
+ }
584
+
585
+ public async recoverFromSyncStartupError(savedSyncPromise: Promise<void> | undefined, error: Error): Promise<void> {
586
+ // Wait for the saved sync to complete - we send the pushrules and filter requests
587
+ // before the saved sync has finished so they can run in parallel, but only process
588
+ // the results after the saved sync is done. Equivalently, we wait for it to finish
589
+ // before reporting failures from these functions.
590
+ await savedSyncPromise;
591
+ const keepaliveProm = this.startKeepAlives();
592
+ this.updateSyncState(SyncState.Error, { error });
593
+ await keepaliveProm;
594
+ }
595
+
596
+ private shouldAbortSync(error: MatrixError): boolean {
597
+ if (error.errcode === "M_UNKNOWN_TOKEN") {
598
+ // The logout already happened, we just need to stop.
599
+ logger.warn("Token no longer valid - assuming logout");
600
+ this.stop();
601
+ this.updateSyncState(SyncState.Error, { error });
602
+ return true;
603
+ }
604
+ return false;
605
+ }
606
+
607
+ private getPushRules = async (): Promise<void> => {
608
+ try {
609
+ debuglog("Getting push rules...");
610
+ const result = await this.client.getPushRules();
611
+ debuglog("Got push rules");
612
+
613
+ this.client.pushRules = result;
614
+ } catch (err) {
615
+ logger.error("Getting push rules failed", err);
616
+ if (this.shouldAbortSync(<MatrixError>err)) return;
617
+ // wait for saved sync to complete before doing anything else,
618
+ // otherwise the sync state will end up being incorrect
619
+ debuglog("Waiting for saved sync before retrying push rules...");
620
+ await this.recoverFromSyncStartupError(this.savedSyncPromise, <Error>err);
621
+ return this.getPushRules(); // try again
622
+ }
623
+ };
624
+
625
+ private buildDefaultFilter = (): Filter => {
626
+ const filter = new Filter(this.client.credentials.userId);
627
+ if (this.client.canSupport.get(Feature.ThreadUnreadNotifications) !== ServerSupport.Unsupported) {
628
+ filter.setUnreadThreadNotifications(true);
629
+ }
630
+ return filter;
631
+ };
632
+
633
+ private prepareLazyLoadingForSync = async (): Promise<void> => {
634
+ debuglog("Prepare lazy loading for sync...");
635
+ if (this.client.isGuest()) {
636
+ this.opts.lazyLoadMembers = false;
637
+ }
638
+ if (this.opts.lazyLoadMembers) {
639
+ debuglog("Enabling lazy load on sync filter...");
640
+ if (!this.opts.filter) {
641
+ this.opts.filter = this.buildDefaultFilter();
642
+ }
643
+ this.opts.filter.setLazyLoadMembers(true);
644
+ }
645
+ if (this.opts.lazyLoadMembers) {
646
+ this.syncOpts.crypto?.enableLazyLoading();
647
+ }
648
+ };
649
+
650
+ private storeClientOptions = async (): Promise<void> => {
651
+ try {
652
+ debuglog("Storing client options...");
653
+ await this.client.storeClientOptions();
654
+ debuglog("Stored client options");
655
+ } catch (err) {
656
+ logger.error("Storing client options failed", err);
657
+ throw err;
658
+ }
659
+ };
660
+
661
+ private getFilter = async (): Promise<{
662
+ filterId?: string;
663
+ filter?: Filter;
664
+ }> => {
665
+ debuglog("Getting filter...");
666
+ let filter: Filter;
667
+ if (this.opts.filter) {
668
+ filter = this.opts.filter;
669
+ } else {
670
+ filter = this.buildDefaultFilter();
671
+ }
672
+
673
+ let filterId: string;
674
+ try {
675
+ filterId = await this.client.getOrCreateFilter(getFilterName(this.client.credentials.userId!), filter);
676
+ } catch (err) {
677
+ logger.error("Getting filter failed", err);
678
+ if (this.shouldAbortSync(<MatrixError>err)) return {};
679
+ // wait for saved sync to complete before doing anything else,
680
+ // otherwise the sync state will end up being incorrect
681
+ debuglog("Waiting for saved sync before retrying filter...");
682
+ await this.recoverFromSyncStartupError(this.savedSyncPromise, <Error>err);
683
+ return this.getFilter(); // try again
684
+ }
685
+ return { filter, filterId };
686
+ };
687
+
688
+ private savedSyncPromise?: Promise<void>;
689
+
690
+ /**
691
+ * Main entry point
692
+ */
693
+ public async sync(): Promise<void> {
694
+ this.running = true;
695
+ this.abortController = new AbortController();
696
+
697
+ globalThis.window?.addEventListener?.("online", this.onOnline, false);
698
+
699
+ if (this.client.isGuest()) {
700
+ // no push rules for guests, no access to POST filter for guests.
701
+ return this.doSync({});
702
+ }
703
+
704
+ // Pull the saved sync token out first, before the worker starts sending
705
+ // all the sync data which could take a while. This will let us send our
706
+ // first incremental sync request before we've processed our saved data.
707
+ debuglog("Getting saved sync token...");
708
+ const savedSyncTokenPromise = this.client.store.getSavedSyncToken().then((tok) => {
709
+ debuglog("Got saved sync token");
710
+ return tok;
711
+ });
712
+
713
+ this.savedSyncPromise = this.client.store
714
+ .getSavedSync()
715
+ .then((savedSync) => {
716
+ debuglog(`Got reply from saved sync, exists? ${!!savedSync}`);
717
+ if (savedSync) {
718
+ return this.syncFromCache(savedSync);
719
+ }
720
+ })
721
+ .catch((err) => {
722
+ logger.error("Getting saved sync failed", err);
723
+ });
724
+
725
+ // We need to do one-off checks before we can begin the /sync loop.
726
+ // These are:
727
+ // 1) We need to get push rules so we can check if events should bing as we get
728
+ // them from /sync.
729
+ // 2) We need to get/create a filter which we can use for /sync.
730
+ // 3) We need to prepare lazy loading for sync
731
+ // 4) We need to store the client options
732
+
733
+ // Now start the first incremental sync request: this can also
734
+ // take a while so if we set it going now, we can wait for it
735
+ // to finish while we process our saved sync data.
736
+ await this.getPushRules();
737
+ await this.prepareLazyLoadingForSync();
738
+ await this.storeClientOptions();
739
+
740
+ const { filterId, filter } = await this.getFilter();
741
+ if (!filter) return; // bail, getFilter failed
742
+
743
+ // reset the notifications timeline to prepare it to paginate from
744
+ // the current point in time.
745
+ // The right solution would be to tie /sync pagination tokens into
746
+ // /notifications API somehow.
747
+ this.client.resetNotifTimelineSet();
748
+
749
+ if (!this.currentSyncRequest) {
750
+ let firstSyncFilter = filterId;
751
+ const savedSyncToken = await savedSyncTokenPromise;
752
+
753
+ if (savedSyncToken) {
754
+ debuglog("Sending first sync request...");
755
+ } else {
756
+ debuglog("Sending initial sync request...");
757
+ const initialFilter = this.buildDefaultFilter();
758
+ initialFilter.setDefinition(filter.getDefinition());
759
+ initialFilter.setTimelineLimit(this.opts.initialSyncLimit!);
760
+ // Use an inline filter, no point uploading it for a single usage
761
+ firstSyncFilter = JSON.stringify(initialFilter.getDefinition());
762
+ }
763
+
764
+ // Send this first sync request here so we can then wait for the saved
765
+ // sync data to finish processing before we process the results of this one.
766
+ this.currentSyncRequest = this.doSyncRequest({ filter: firstSyncFilter }, savedSyncToken);
767
+ }
768
+
769
+ // Now wait for the saved sync to finish...
770
+ debuglog("Waiting for saved sync before starting sync processing...");
771
+ await this.savedSyncPromise;
772
+ // process the first sync request and continue syncing with the normal filterId
773
+ return this.doSync({ filter: filterId });
774
+ }
775
+
776
+ /**
777
+ * Stops the sync object from syncing.
778
+ */
779
+ public stop(): void {
780
+ debuglog("SyncApi.stop");
781
+ // It is necessary to check for the existance of
782
+ // globalThis.window AND globalThis.window.removeEventListener.
783
+ // Some platforms (e.g. React Native) register globalThis.window,
784
+ // but do not have globalThis.window.removeEventListener.
785
+ globalThis.window?.removeEventListener?.("online", this.onOnline, false);
786
+ this.running = false;
787
+ this.abortController?.abort();
788
+ if (this.keepAliveTimer) {
789
+ clearTimeout(this.keepAliveTimer);
790
+ this.keepAliveTimer = undefined;
791
+ }
792
+ }
793
+
794
+ /**
795
+ * Retry a backed off syncing request immediately. This should only be used when
796
+ * the user <b>explicitly</b> attempts to retry their lost connection.
797
+ * @returns True if this resulted in a request being retried.
798
+ */
799
+ public retryImmediately(): boolean {
800
+ if (!this.connectionReturnedDefer) {
801
+ return false;
802
+ }
803
+ this.startKeepAlives(0);
804
+ return true;
805
+ }
806
+ /**
807
+ * Process a single set of cached sync data.
808
+ * @param savedSync - a saved sync that was persisted by a store. This
809
+ * should have been acquired via client.store.getSavedSync().
810
+ */
811
+ private async syncFromCache(savedSync: ISavedSync): Promise<void> {
812
+ debuglog("sync(): not doing HTTP hit, instead returning stored /sync data");
813
+
814
+ const nextSyncToken = savedSync.nextBatch;
815
+
816
+ // Set sync token for future incremental syncing
817
+ this.client.store.setSyncToken(nextSyncToken);
818
+
819
+ // No previous sync, set old token to null
820
+ const syncEventData: ISyncStateData = {
821
+ nextSyncToken,
822
+ catchingUp: false,
823
+ fromCache: true,
824
+ };
825
+
826
+ const data: ISyncResponse = {
827
+ next_batch: nextSyncToken,
828
+ rooms: savedSync.roomsData,
829
+ account_data: {
830
+ events: savedSync.accountData,
831
+ },
832
+ };
833
+
834
+ try {
835
+ await this.processSyncResponse(syncEventData, data);
836
+ } catch (e) {
837
+ logger.error("Error processing cached sync", e);
838
+ }
839
+
840
+ // Don't emit a prepared if we've bailed because the store is invalid:
841
+ // in this case the client will not be usable until stopped & restarted
842
+ // so this would be useless and misleading.
843
+ if (!this.storeIsInvalid) {
844
+ this.updateSyncState(SyncState.Prepared, syncEventData);
845
+ }
846
+ }
847
+
848
+ /**
849
+ * Invoke me to do /sync calls
850
+ */
851
+ private async doSync(syncOptions: ISyncOptions): Promise<void> {
852
+ while (this.running) {
853
+ const syncToken = this.client.store.getSyncToken();
854
+
855
+ let data: ISyncResponse;
856
+ try {
857
+ if (!this.currentSyncRequest) {
858
+ this.currentSyncRequest = this.doSyncRequest(syncOptions, syncToken);
859
+ }
860
+ data = await this.currentSyncRequest;
861
+ } catch (e) {
862
+ const abort = await this.onSyncError(<MatrixError>e);
863
+ if (abort) return;
864
+ continue;
865
+ } finally {
866
+ this.currentSyncRequest = undefined;
867
+ }
868
+
869
+ // set the sync token NOW *before* processing the events. We do this so
870
+ // if something barfs on an event we can skip it rather than constantly
871
+ // polling with the same token.
872
+ this.client.store.setSyncToken(data.next_batch);
873
+
874
+ // Reset after a successful sync
875
+ this.failedSyncCount = 0;
876
+
877
+ const syncEventData = {
878
+ oldSyncToken: syncToken ?? undefined,
879
+ nextSyncToken: data.next_batch,
880
+ catchingUp: this.catchingUp,
881
+ };
882
+
883
+ if (this.syncOpts.crypto) {
884
+ // tell the crypto module we're about to process a sync
885
+ // response
886
+ await this.syncOpts.crypto.onSyncWillProcess(syncEventData);
887
+ }
888
+
889
+ try {
890
+ await this.processSyncResponse(syncEventData, data);
891
+ } catch (e) {
892
+ // log the exception with stack if we have it, else fall back
893
+ // to the plain description
894
+ logger.error("Caught /sync error", e);
895
+
896
+ // Emit the exception for client handling
897
+ this.client.emit(ClientEvent.SyncUnexpectedError, <Error>e);
898
+ }
899
+
900
+ // Persist after processing as `unsigned` may get mutated
901
+ // with an `org.matrix.msc4023.thread_id`
902
+ await this.client.store.setSyncData(data);
903
+
904
+ // update this as it may have changed
905
+ syncEventData.catchingUp = this.catchingUp;
906
+
907
+ // emit synced events
908
+ if (!syncOptions.hasSyncedBefore) {
909
+ this.updateSyncState(SyncState.Prepared, syncEventData);
910
+ syncOptions.hasSyncedBefore = true;
911
+ }
912
+
913
+ // tell the crypto module to do its processing. It may block (to do a
914
+ // /keys/changes request).
915
+ if (this.syncOpts.cryptoCallbacks) {
916
+ await this.syncOpts.cryptoCallbacks.onSyncCompleted(syncEventData);
917
+ }
918
+
919
+ // keep emitting SYNCING -> SYNCING for clients who want to do bulk updates
920
+ this.updateSyncState(SyncState.Syncing, syncEventData);
921
+
922
+ if (this.client.store.wantsSave()) {
923
+ // We always save the device list (if it's dirty) before saving the sync data:
924
+ // this means we know the saved device list data is at least as fresh as the
925
+ // stored sync data which means we don't have to worry that we may have missed
926
+ // device changes. We can also skip the delay since we're not calling this very
927
+ // frequently (and we don't really want to delay the sync for it).
928
+ if (this.syncOpts.crypto) {
929
+ await this.syncOpts.crypto.saveDeviceList(0);
930
+ }
931
+
932
+ // tell databases that everything is now in a consistent state and can be saved.
933
+ await this.client.store.save();
934
+ }
935
+ }
936
+
937
+ if (!this.running) {
938
+ debuglog("Sync no longer running: exiting.");
939
+ if (this.connectionReturnedDefer) {
940
+ this.connectionReturnedDefer.reject();
941
+ this.connectionReturnedDefer = undefined;
942
+ }
943
+ this.updateSyncState(SyncState.Stopped);
944
+ }
945
+ }
946
+
947
+ private doSyncRequest(syncOptions: ISyncOptions, syncToken: string | null): Promise<ISyncResponse> {
948
+ const qps = this.getSyncParams(syncOptions, syncToken);
949
+ return this.client.http.authedRequest<ISyncResponse>(Method.Get, "/sync", qps as any, undefined, {
950
+ localTimeoutMs: qps.timeout + BUFFER_PERIOD_MS,
951
+ abortSignal: this.abortController?.signal,
952
+ });
953
+ }
954
+
955
+ private getSyncParams(syncOptions: ISyncOptions, syncToken: string | null): ISyncParams {
956
+ let timeout = this.opts.pollTimeout!;
957
+
958
+ if (this.getSyncState() !== SyncState.Syncing || this.catchingUp) {
959
+ // unless we are happily syncing already, we want the server to return
960
+ // as quickly as possible, even if there are no events queued. This
961
+ // serves two purposes:
962
+ //
963
+ // * When the connection dies, we want to know asap when it comes back,
964
+ // so that we can hide the error from the user. (We don't want to
965
+ // have to wait for an event or a timeout).
966
+ //
967
+ // * We want to know if the server has any to_device messages queued up
968
+ // for us. We do that by calling it with a zero timeout until it
969
+ // doesn't give us any more to_device messages.
970
+ this.catchingUp = true;
971
+ timeout = 0;
972
+ }
973
+
974
+ let filter = syncOptions.filter;
975
+ if (this.client.isGuest() && !filter) {
976
+ filter = this.getGuestFilter();
977
+ }
978
+
979
+ const qps: ISyncParams = { filter, timeout };
980
+
981
+ if (this.opts.disablePresence) {
982
+ qps.set_presence = SetPresence.Offline;
983
+ } else if (this.presence !== undefined) {
984
+ qps.set_presence = this.presence;
985
+ }
986
+
987
+ if (syncToken) {
988
+ qps.since = syncToken;
989
+ } else {
990
+ // use a cachebuster for initialsyncs, to make sure that
991
+ // we don't get a stale sync
992
+ // (https://github.com/vector-im/vector-web/issues/1354)
993
+ qps._cacheBuster = Date.now();
994
+ }
995
+
996
+ if ([SyncState.Reconnecting, SyncState.Error].includes(this.getSyncState()!)) {
997
+ // we think the connection is dead. If it comes back up, we won't know
998
+ // about it till /sync returns. If the timeout= is high, this could
999
+ // be a long time. Set it to 0 when doing retries so we don't have to wait
1000
+ // for an event or a timeout before emiting the SYNCING event.
1001
+ qps.timeout = 0;
1002
+ }
1003
+
1004
+ return qps;
1005
+ }
1006
+
1007
+ /**
1008
+ * Specify the set_presence value to be used for subsequent calls to the Sync API.
1009
+ * @param presence - the presence to specify to set_presence of sync calls
1010
+ */
1011
+ public setPresence(presence?: SetPresence): void {
1012
+ this.presence = presence;
1013
+ }
1014
+
1015
+ private async onSyncError(err: MatrixError): Promise<boolean> {
1016
+ if (!this.running) {
1017
+ debuglog("Sync no longer running: exiting");
1018
+ if (this.connectionReturnedDefer) {
1019
+ this.connectionReturnedDefer.reject();
1020
+ this.connectionReturnedDefer = undefined;
1021
+ }
1022
+ this.updateSyncState(SyncState.Stopped);
1023
+ return true; // abort
1024
+ }
1025
+
1026
+ logger.error("/sync error %s", err);
1027
+
1028
+ if (this.shouldAbortSync(err)) {
1029
+ return true; // abort
1030
+ }
1031
+
1032
+ this.failedSyncCount++;
1033
+ logger.log("Number of consecutive failed sync requests:", this.failedSyncCount);
1034
+
1035
+ debuglog("Starting keep-alive");
1036
+ // Note that we do *not* mark the sync connection as
1037
+ // lost yet: we only do this if a keepalive poke
1038
+ // fails, since long lived HTTP connections will
1039
+ // go away sometimes and we shouldn't treat this as
1040
+ // erroneous. We set the state to 'reconnecting'
1041
+ // instead, so that clients can observe this state
1042
+ // if they wish.
1043
+ const keepAlivePromise = this.startKeepAlives();
1044
+
1045
+ this.currentSyncRequest = undefined;
1046
+ // Transition from RECONNECTING to ERROR after a given number of failed syncs
1047
+ this.updateSyncState(
1048
+ this.failedSyncCount >= FAILED_SYNC_ERROR_THRESHOLD ? SyncState.Error : SyncState.Reconnecting,
1049
+ { error: err },
1050
+ );
1051
+
1052
+ const connDidFail = await keepAlivePromise;
1053
+
1054
+ // Only emit CATCHUP if we detected a connectivity error: if we didn't,
1055
+ // it's quite likely the sync will fail again for the same reason and we
1056
+ // want to stay in ERROR rather than keep flip-flopping between ERROR
1057
+ // and CATCHUP.
1058
+ if (connDidFail && this.getSyncState() === SyncState.Error) {
1059
+ this.updateSyncState(SyncState.Catchup, {
1060
+ catchingUp: true,
1061
+ });
1062
+ }
1063
+ return false;
1064
+ }
1065
+
1066
+ /**
1067
+ * Process data returned from a sync response and propagate it
1068
+ * into the model objects
1069
+ *
1070
+ * @param syncEventData - Object containing sync tokens associated with this sync
1071
+ * @param data - The response from /sync
1072
+ */
1073
+ private async processSyncResponse(syncEventData: ISyncStateData, data: ISyncResponse): Promise<void> {
1074
+ const client = this.client;
1075
+
1076
+ // data looks like:
1077
+ // {
1078
+ // next_batch: $token,
1079
+ // presence: { events: [] },
1080
+ // account_data: { events: [] },
1081
+ // device_lists: { changed: ["@user:server", ... ]},
1082
+ // to_device: { events: [] },
1083
+ // device_one_time_keys_count: { signed_curve25519: 42 },
1084
+ // rooms: {
1085
+ // invite: {
1086
+ // $roomid: {
1087
+ // invite_state: { events: [] }
1088
+ // }
1089
+ // },
1090
+ // join: {
1091
+ // $roomid: {
1092
+ // state: { events: [] },
1093
+ // timeline: { events: [], prev_batch: $token, limited: true },
1094
+ // ephemeral: { events: [] },
1095
+ // summary: {
1096
+ // m.heroes: [ $user_id ],
1097
+ // m.joined_member_count: $count,
1098
+ // m.invited_member_count: $count
1099
+ // },
1100
+ // account_data: { events: [] },
1101
+ // unread_notifications: {
1102
+ // highlight_count: 0,
1103
+ // notification_count: 0,
1104
+ // }
1105
+ // }
1106
+ // },
1107
+ // leave: {
1108
+ // $roomid: {
1109
+ // state: { events: [] },
1110
+ // timeline: { events: [], prev_batch: $token }
1111
+ // }
1112
+ // }
1113
+ // }
1114
+ // }
1115
+
1116
+ // TODO-arch:
1117
+ // - Each event we pass through needs to be emitted via 'event', can we
1118
+ // do this in one place?
1119
+ // - The isBrandNewRoom boilerplate is boilerplatey.
1120
+
1121
+ // handle presence events (User objects)
1122
+ if (Array.isArray(data.presence?.events)) {
1123
+ data.presence!.events.filter(noUnsafeEventProps)
1124
+ .map(client.getEventMapper())
1125
+ .forEach(function (presenceEvent) {
1126
+ let user = client.store.getUser(presenceEvent.getSender()!);
1127
+ if (user) {
1128
+ user.setPresenceEvent(presenceEvent);
1129
+ } else {
1130
+ user = User.createUser(presenceEvent.getSender()!, client);
1131
+ user.setPresenceEvent(presenceEvent);
1132
+ client.store.storeUser(user);
1133
+ }
1134
+ client.emit(ClientEvent.Event, presenceEvent);
1135
+ });
1136
+ }
1137
+
1138
+ // handle non-room account_data
1139
+ if (Array.isArray(data.account_data?.events)) {
1140
+ const events = data.account_data.events.filter(noUnsafeEventProps).map(client.getEventMapper());
1141
+ const prevEventsMap = events.reduce<Record<string, MatrixEvent | undefined>>((m, c) => {
1142
+ m[c.getType()!] = client.store.getAccountData(c.getType());
1143
+ return m;
1144
+ }, {});
1145
+ client.store.storeAccountDataEvents(events);
1146
+ events.forEach(function (accountDataEvent) {
1147
+ // Honour push rules that come down the sync stream but also
1148
+ // honour push rules that were previously cached. Base rules
1149
+ // will be updated when we receive push rules via getPushRules
1150
+ // (see sync) before syncing over the network.
1151
+ if (accountDataEvent.getType() === EventType.PushRules) {
1152
+ const rules = accountDataEvent.getContent<IPushRules>();
1153
+ client.setPushRules(rules);
1154
+ }
1155
+ const prevEvent = prevEventsMap[accountDataEvent.getType()!];
1156
+ client.emit(ClientEvent.AccountData, accountDataEvent, prevEvent);
1157
+ return accountDataEvent;
1158
+ });
1159
+ }
1160
+
1161
+ // handle to-device events
1162
+ if (data.to_device && Array.isArray(data.to_device.events) && data.to_device.events.length > 0) {
1163
+ let toDeviceMessages: IToDeviceEvent[] = data.to_device.events.filter(noUnsafeEventProps);
1164
+
1165
+ if (this.syncOpts.cryptoCallbacks) {
1166
+ toDeviceMessages = await this.syncOpts.cryptoCallbacks.preprocessToDeviceMessages(toDeviceMessages);
1167
+ }
1168
+
1169
+ const cancelledKeyVerificationTxns: string[] = [];
1170
+ toDeviceMessages
1171
+ .map(client.getEventMapper({ toDevice: true }))
1172
+ .map((toDeviceEvent) => {
1173
+ // map is a cheap inline forEach
1174
+ // We want to flag m.key.verification.start events as cancelled
1175
+ // if there's an accompanying m.key.verification.cancel event, so
1176
+ // we pull out the transaction IDs from the cancellation events
1177
+ // so we can flag the verification events as cancelled in the loop
1178
+ // below.
1179
+ if (toDeviceEvent.getType() === "m.key.verification.cancel") {
1180
+ const txnId: string = toDeviceEvent.getContent()["transaction_id"];
1181
+ if (txnId) {
1182
+ cancelledKeyVerificationTxns.push(txnId);
1183
+ }
1184
+ }
1185
+
1186
+ // as mentioned above, .map is a cheap inline forEach, so return
1187
+ // the unmodified event.
1188
+ return toDeviceEvent;
1189
+ })
1190
+ .forEach(function (toDeviceEvent) {
1191
+ const content = toDeviceEvent.getContent();
1192
+ if (toDeviceEvent.getType() == "m.room.message" && content.msgtype == "m.bad.encrypted") {
1193
+ // the mapper already logged a warning.
1194
+ logger.log("Ignoring undecryptable to-device event from " + toDeviceEvent.getSender());
1195
+ return;
1196
+ }
1197
+
1198
+ if (
1199
+ toDeviceEvent.getType() === "m.key.verification.start" ||
1200
+ toDeviceEvent.getType() === "m.key.verification.request"
1201
+ ) {
1202
+ const txnId = content["transaction_id"];
1203
+ if (cancelledKeyVerificationTxns.includes(txnId)) {
1204
+ toDeviceEvent.flagCancelled();
1205
+ }
1206
+ }
1207
+
1208
+ client.emit(ClientEvent.ToDeviceEvent, toDeviceEvent);
1209
+ });
1210
+ } else {
1211
+ // no more to-device events: we can stop polling with a short timeout.
1212
+ this.catchingUp = false;
1213
+ }
1214
+
1215
+ // the returned json structure is a bit crap, so make it into a
1216
+ // nicer form (array) after applying sanity to make sure we don't fail
1217
+ // on missing keys (on the off chance)
1218
+ let inviteRooms: WrappedRoom<IInvitedRoom>[] = [];
1219
+ let joinRooms: WrappedRoom<IJoinedRoom>[] = [];
1220
+ let leaveRooms: WrappedRoom<ILeftRoom>[] = [];
1221
+ let knockRooms: WrappedRoom<IKnockedRoom>[] = [];
1222
+
1223
+ if (data.rooms) {
1224
+ if (data.rooms.invite) {
1225
+ inviteRooms = this.mapSyncResponseToRoomArray(data.rooms.invite);
1226
+ }
1227
+ if (data.rooms.join) {
1228
+ joinRooms = this.mapSyncResponseToRoomArray(data.rooms.join);
1229
+ }
1230
+ if (data.rooms.leave) {
1231
+ leaveRooms = this.mapSyncResponseToRoomArray(data.rooms.leave);
1232
+ }
1233
+ if (data.rooms.knock) {
1234
+ knockRooms = this.mapSyncResponseToRoomArray(data.rooms.knock);
1235
+ }
1236
+ }
1237
+
1238
+ this.notifEvents = [];
1239
+
1240
+ // Handle invites
1241
+ await promiseMapSeries(inviteRooms, async (inviteObj) => {
1242
+ const room = inviteObj.room;
1243
+ const stateEvents = this.mapSyncEventsFormat(inviteObj.invite_state, room);
1244
+
1245
+ await this.injectRoomEvents(room, stateEvents);
1246
+
1247
+ const inviter = room.currentState.getStateEvents(EventType.RoomMember, client.getUserId()!)?.getSender();
1248
+
1249
+ const crypto = client.crypto;
1250
+ if (crypto) {
1251
+ const parkedHistory = await crypto.cryptoStore.takeParkedSharedHistory(room.roomId);
1252
+ for (const parked of parkedHistory) {
1253
+ if (parked.senderId === inviter) {
1254
+ await crypto.olmDevice.addInboundGroupSession(
1255
+ room.roomId,
1256
+ parked.senderKey,
1257
+ parked.forwardingCurve25519KeyChain,
1258
+ parked.sessionId,
1259
+ parked.sessionKey,
1260
+ parked.keysClaimed,
1261
+ true,
1262
+ { sharedHistory: true, untrusted: true },
1263
+ );
1264
+ }
1265
+ }
1266
+ }
1267
+
1268
+ if (inviteObj.isBrandNewRoom) {
1269
+ room.recalculate();
1270
+ client.store.storeRoom(room);
1271
+ client.emit(ClientEvent.Room, room);
1272
+ } else {
1273
+ // Update room state for invite->reject->invite cycles
1274
+ room.recalculate();
1275
+ }
1276
+ stateEvents.forEach(function (e) {
1277
+ client.emit(ClientEvent.Event, e);
1278
+ });
1279
+ });
1280
+
1281
+ // Handle joins
1282
+ await promiseMapSeries(joinRooms, async (joinObj) => {
1283
+ const room = joinObj.room;
1284
+ const stateEvents = this.mapSyncEventsFormat(joinObj.state, room);
1285
+ // Prevent events from being decrypted ahead of time
1286
+ // this helps large account to speed up faster
1287
+ // room::decryptCriticalEvent is in charge of decrypting all the events
1288
+ // required for a client to function properly
1289
+ const events = this.mapSyncEventsFormat(joinObj.timeline, room, false);
1290
+ const ephemeralEvents = this.mapSyncEventsFormat(joinObj.ephemeral);
1291
+ const accountDataEvents = this.mapSyncEventsFormat(joinObj.account_data);
1292
+
1293
+ const encrypted = this.isRoomEncrypted(room, stateEvents, events);
1294
+ // We store the server-provided value first so it's correct when any of the events fire.
1295
+ if (joinObj.unread_notifications) {
1296
+ /**
1297
+ * We track unread notifications ourselves in encrypted rooms, so don't
1298
+ * bother setting it here. We trust our calculations better than the
1299
+ * server's for this case, and therefore will assume that our non-zero
1300
+ * count is accurate.
1301
+ * XXX: this is known faulty as the push rule for `.m.room.encrypted` may be disabled so server
1302
+ * may issue notification counts of 0 which we wrongly trust.
1303
+ * https://github.com/matrix-org/matrix-spec-proposals/pull/2654 would fix this
1304
+ *
1305
+ * @see import("./client").fixNotificationCountOnDecryption
1306
+ */
1307
+ if (!encrypted || joinObj.unread_notifications.notification_count === 0) {
1308
+ // In an encrypted room, if the room has notifications enabled then it's typical for
1309
+ // the server to flag all new messages as notifying. However, some push rules calculate
1310
+ // events as ignored based on their event contents (e.g. ignoring msgtype=m.notice messages)
1311
+ // so we want to calculate this figure on the client in all cases.
1312
+ room.setUnreadNotificationCount(
1313
+ NotificationCountType.Total,
1314
+ joinObj.unread_notifications.notification_count ?? 0,
1315
+ );
1316
+ }
1317
+
1318
+ if (!encrypted || room.getUnreadNotificationCount(NotificationCountType.Highlight) <= 0) {
1319
+ // If the locally stored highlight count is zero, use the server provided value.
1320
+ room.setUnreadNotificationCount(
1321
+ NotificationCountType.Highlight,
1322
+ joinObj.unread_notifications.highlight_count ?? 0,
1323
+ );
1324
+ }
1325
+ }
1326
+
1327
+ const unreadThreadNotifications =
1328
+ joinObj[UNREAD_THREAD_NOTIFICATIONS.name] ?? joinObj[UNREAD_THREAD_NOTIFICATIONS.altName!];
1329
+ if (unreadThreadNotifications) {
1330
+ // This mirrors the logic above for rooms: take the *total* notification count from
1331
+ // the server for unencrypted rooms or is it's zero. Any threads not present in this
1332
+ // object implicitly have zero notifications, so start by clearing the total counts
1333
+ // for all such threads.
1334
+ room.resetThreadUnreadNotificationCountFromSync(Object.keys(unreadThreadNotifications));
1335
+ for (const [threadId, unreadNotification] of Object.entries(unreadThreadNotifications)) {
1336
+ if (!encrypted || unreadNotification.notification_count === 0) {
1337
+ room.setThreadUnreadNotificationCount(
1338
+ threadId,
1339
+ NotificationCountType.Total,
1340
+ unreadNotification.notification_count ?? 0,
1341
+ );
1342
+ }
1343
+
1344
+ const hasNoNotifications =
1345
+ room.getThreadUnreadNotificationCount(threadId, NotificationCountType.Highlight) <= 0;
1346
+ if (!encrypted || (encrypted && hasNoNotifications)) {
1347
+ room.setThreadUnreadNotificationCount(
1348
+ threadId,
1349
+ NotificationCountType.Highlight,
1350
+ unreadNotification.highlight_count ?? 0,
1351
+ );
1352
+ }
1353
+ }
1354
+ } else {
1355
+ room.resetThreadUnreadNotificationCountFromSync();
1356
+ }
1357
+
1358
+ joinObj.timeline = joinObj.timeline || ({} as ITimeline);
1359
+
1360
+ if (joinObj.isBrandNewRoom) {
1361
+ // set the back-pagination token. Do this *before* adding any
1362
+ // events so that clients can start back-paginating.
1363
+ if (joinObj.timeline.prev_batch !== null) {
1364
+ room.getLiveTimeline().setPaginationToken(joinObj.timeline.prev_batch, EventTimeline.BACKWARDS);
1365
+ }
1366
+ } else if (joinObj.timeline.limited) {
1367
+ let limited = true;
1368
+
1369
+ // we've got a limited sync, so we *probably* have a gap in the
1370
+ // timeline, so should reset. But we might have been peeking or
1371
+ // paginating and already have some of the events, in which
1372
+ // case we just want to append any subsequent events to the end
1373
+ // of the existing timeline.
1374
+ //
1375
+ // This is particularly important in the case that we already have
1376
+ // *all* of the events in the timeline - in that case, if we reset
1377
+ // the timeline, we'll end up with an entirely empty timeline,
1378
+ // which we'll try to paginate but not get any new events (which
1379
+ // will stop us linking the empty timeline into the chain).
1380
+ //
1381
+ for (let i = events.length - 1; i >= 0; i--) {
1382
+ const eventId = events[i].getId()!;
1383
+ if (room.getTimelineForEvent(eventId)) {
1384
+ debuglog(`Already have event ${eventId} in limited sync - not resetting`);
1385
+ limited = false;
1386
+
1387
+ // we might still be missing some of the events before i;
1388
+ // we don't want to be adding them to the end of the
1389
+ // timeline because that would put them out of order.
1390
+ events.splice(0, i);
1391
+
1392
+ // XXX: there's a problem here if the skipped part of the
1393
+ // timeline modifies the state set in stateEvents, because
1394
+ // we'll end up using the state from stateEvents rather
1395
+ // than the later state from timelineEvents. We probably
1396
+ // need to wind stateEvents forward over the events we're
1397
+ // skipping.
1398
+
1399
+ break;
1400
+ }
1401
+ }
1402
+
1403
+ if (limited) {
1404
+ room.resetLiveTimeline(
1405
+ joinObj.timeline.prev_batch,
1406
+ this.syncOpts.canResetEntireTimeline!(room.roomId)
1407
+ ? null
1408
+ : (syncEventData.oldSyncToken ?? null),
1409
+ );
1410
+
1411
+ // We have to assume any gap in any timeline is
1412
+ // reason to stop incrementally tracking notifications and
1413
+ // reset the timeline.
1414
+ client.resetNotifTimelineSet();
1415
+ }
1416
+ }
1417
+
1418
+ // process any crypto events *before* emitting the RoomStateEvent events. This
1419
+ // avoids a race condition if the application tries to send a message after the
1420
+ // state event is processed, but before crypto is enabled, which then causes the
1421
+ // crypto layer to complain.
1422
+ if (this.syncOpts.cryptoCallbacks) {
1423
+ for (const e of stateEvents.concat(events)) {
1424
+ if (e.isState() && e.getType() === EventType.RoomEncryption && e.getStateKey() === "") {
1425
+ await this.syncOpts.cryptoCallbacks.onCryptoEvent(room, e);
1426
+ }
1427
+ }
1428
+ }
1429
+
1430
+ try {
1431
+ await this.injectRoomEvents(room, stateEvents, events, syncEventData.fromCache);
1432
+ } catch (e) {
1433
+ logger.error(`Failed to process events on room ${room.roomId}:`, e);
1434
+ }
1435
+
1436
+ // set summary after processing events,
1437
+ // because it will trigger a name calculation
1438
+ // which needs the room state to be up to date
1439
+ if (joinObj.summary) {
1440
+ room.setSummary(joinObj.summary);
1441
+ }
1442
+
1443
+ // we deliberately don't add ephemeral events to the timeline
1444
+ room.addEphemeralEvents(ephemeralEvents);
1445
+
1446
+ // we deliberately don't add accountData to the timeline
1447
+ room.addAccountData(accountDataEvents);
1448
+
1449
+ room.recalculate();
1450
+ if (joinObj.isBrandNewRoom) {
1451
+ client.store.storeRoom(room);
1452
+ client.emit(ClientEvent.Room, room);
1453
+ }
1454
+
1455
+ this.processEventsForNotifs(room, events);
1456
+
1457
+ const emitEvent = (e: MatrixEvent): boolean => client.emit(ClientEvent.Event, e);
1458
+ stateEvents.forEach(emitEvent);
1459
+ events.forEach(emitEvent);
1460
+ ephemeralEvents.forEach(emitEvent);
1461
+ accountDataEvents.forEach(emitEvent);
1462
+
1463
+ // Decrypt only the last message in all rooms to make sure we can generate a preview
1464
+ // And decrypt all events after the recorded read receipt to ensure an accurate
1465
+ // notification count
1466
+ room.decryptCriticalEvents();
1467
+ });
1468
+
1469
+ // Handle leaves (e.g. kicked rooms)
1470
+ await promiseMapSeries(leaveRooms, async (leaveObj) => {
1471
+ const room = leaveObj.room;
1472
+ const stateEvents = this.mapSyncEventsFormat(leaveObj.state, room);
1473
+ const events = this.mapSyncEventsFormat(leaveObj.timeline, room);
1474
+ const accountDataEvents = this.mapSyncEventsFormat(leaveObj.account_data);
1475
+
1476
+ await this.injectRoomEvents(room, stateEvents, events);
1477
+ room.addAccountData(accountDataEvents);
1478
+
1479
+ room.recalculate();
1480
+ if (leaveObj.isBrandNewRoom) {
1481
+ client.store.storeRoom(room);
1482
+ client.emit(ClientEvent.Room, room);
1483
+ }
1484
+
1485
+ this.processEventsForNotifs(room, events);
1486
+
1487
+ stateEvents.forEach(function (e) {
1488
+ client.emit(ClientEvent.Event, e);
1489
+ });
1490
+ events.forEach(function (e) {
1491
+ client.emit(ClientEvent.Event, e);
1492
+ });
1493
+ accountDataEvents.forEach(function (e) {
1494
+ client.emit(ClientEvent.Event, e);
1495
+ });
1496
+ });
1497
+
1498
+ // Handle knocks
1499
+ await promiseMapSeries(knockRooms, async (knockObj) => {
1500
+ const room = knockObj.room;
1501
+ const stateEvents = this.mapSyncEventsFormat(knockObj.knock_state, room);
1502
+
1503
+ await this.injectRoomEvents(room, stateEvents);
1504
+
1505
+ if (knockObj.isBrandNewRoom) {
1506
+ room.recalculate();
1507
+ client.store.storeRoom(room);
1508
+ client.emit(ClientEvent.Room, room);
1509
+ } else {
1510
+ // Update room state for knock->leave->knock cycles
1511
+ room.recalculate();
1512
+ }
1513
+ stateEvents.forEach(function (e) {
1514
+ client.emit(ClientEvent.Event, e);
1515
+ });
1516
+ });
1517
+
1518
+ // update the notification timeline, if appropriate.
1519
+ // we only do this for live events, as otherwise we can't order them sanely
1520
+ // in the timeline relative to ones paginated in by /notifications.
1521
+ // XXX: we could fix this by making EventTimeline support chronological
1522
+ // ordering... but it doesn't, right now.
1523
+ if (syncEventData.oldSyncToken && this.notifEvents.length) {
1524
+ this.notifEvents.sort(function (a, b) {
1525
+ return a.getTs() - b.getTs();
1526
+ });
1527
+ this.notifEvents.forEach(function (event) {
1528
+ client.getNotifTimelineSet()?.addLiveEvent(event);
1529
+ });
1530
+ }
1531
+
1532
+ // Handle device list updates
1533
+ if (data.device_lists) {
1534
+ if (this.syncOpts.cryptoCallbacks) {
1535
+ await this.syncOpts.cryptoCallbacks.processDeviceLists(data.device_lists);
1536
+ } else {
1537
+ // FIXME if we *don't* have a crypto module, we still need to
1538
+ // invalidate the device lists. But that would require a
1539
+ // substantial bit of rework :/.
1540
+ }
1541
+ }
1542
+
1543
+ // Handle one_time_keys_count and unused fallback keys
1544
+ await this.syncOpts.cryptoCallbacks?.processKeyCounts(
1545
+ data.device_one_time_keys_count,
1546
+ data.device_unused_fallback_key_types ?? data["org.matrix.msc2732.device_unused_fallback_key_types"],
1547
+ );
1548
+ }
1549
+
1550
+ /**
1551
+ * Starts polling the connectivity check endpoint
1552
+ * @param delay - How long to delay until the first poll.
1553
+ * defaults to a short, randomised interval (to prevent
1554
+ * tight-looping if /versions succeeds but /sync etc. fail).
1555
+ * @returns which resolves once the connection returns
1556
+ */
1557
+ private startKeepAlives(delay?: number): Promise<boolean> {
1558
+ if (delay === undefined) {
1559
+ delay = 2000 + Math.floor(Math.random() * 5000);
1560
+ }
1561
+
1562
+ if (this.keepAliveTimer !== null) {
1563
+ clearTimeout(this.keepAliveTimer);
1564
+ }
1565
+ if (delay > 0) {
1566
+ this.keepAliveTimer = setTimeout(this.pokeKeepAlive.bind(this), delay);
1567
+ } else {
1568
+ this.pokeKeepAlive();
1569
+ }
1570
+ if (!this.connectionReturnedDefer) {
1571
+ this.connectionReturnedDefer = defer();
1572
+ }
1573
+ return this.connectionReturnedDefer.promise;
1574
+ }
1575
+
1576
+ /**
1577
+ * Make a dummy call to /_matrix/client/versions, to see if the HS is
1578
+ * reachable.
1579
+ *
1580
+ * On failure, schedules a call back to itself. On success, resolves
1581
+ * this.connectionReturnedDefer.
1582
+ *
1583
+ * @param connDidFail - True if a connectivity failure has been detected. Optional.
1584
+ */
1585
+ private pokeKeepAlive(connDidFail = false): void {
1586
+ if (!this.running) {
1587
+ // we are in a keepAlive, retrying to connect, but the syncronization
1588
+ // was stopped, so we are stopping the retry.
1589
+ clearTimeout(this.keepAliveTimer);
1590
+ if (this.connectionReturnedDefer) {
1591
+ this.connectionReturnedDefer.reject("SyncApi.stop() was called");
1592
+ this.connectionReturnedDefer = undefined;
1593
+ }
1594
+ return;
1595
+ }
1596
+
1597
+ const success = (): void => {
1598
+ clearTimeout(this.keepAliveTimer);
1599
+ if (this.connectionReturnedDefer) {
1600
+ this.connectionReturnedDefer.resolve(connDidFail);
1601
+ this.connectionReturnedDefer = undefined;
1602
+ }
1603
+ };
1604
+
1605
+ this.client.http
1606
+ .request(
1607
+ Method.Get,
1608
+ "/_matrix/client/versions",
1609
+ undefined, // queryParams
1610
+ undefined, // data
1611
+ {
1612
+ prefix: "",
1613
+ localTimeoutMs: 15 * 1000,
1614
+ abortSignal: this.abortController?.signal,
1615
+ },
1616
+ )
1617
+ .then(
1618
+ () => {
1619
+ success();
1620
+ },
1621
+ (err) => {
1622
+ if (err.httpStatus == 400 || err.httpStatus == 404) {
1623
+ // treat this as a success because the server probably just doesn't
1624
+ // support /versions: point is, we're getting a response.
1625
+ // We wait a short time though, just in case somehow the server
1626
+ // is in a mode where it 400s /versions responses and sync etc.
1627
+ // responses fail, this will mean we don't hammer in a loop.
1628
+ this.keepAliveTimer = setTimeout(success, 2000);
1629
+ } else {
1630
+ connDidFail = true;
1631
+ this.keepAliveTimer = setTimeout(
1632
+ this.pokeKeepAlive.bind(this, connDidFail),
1633
+ 5000 + Math.floor(Math.random() * 5000),
1634
+ );
1635
+ // A keepalive has failed, so we emit the
1636
+ // error state (whether or not this is the
1637
+ // first failure).
1638
+ // Note we do this after setting the timer:
1639
+ // this lets the unit tests advance the mock
1640
+ // clock when they get the error.
1641
+ this.updateSyncState(SyncState.Error, { error: err });
1642
+ }
1643
+ },
1644
+ );
1645
+ }
1646
+
1647
+ private mapSyncResponseToRoomArray<T extends ILeftRoom | IJoinedRoom | IInvitedRoom | IKnockedRoom>(
1648
+ obj: Record<string, T>,
1649
+ ): Array<WrappedRoom<T>> {
1650
+ // Maps { roomid: {stuff}, roomid: {stuff} }
1651
+ // to
1652
+ // [{stuff+Room+isBrandNewRoom}, {stuff+Room+isBrandNewRoom}]
1653
+ const client = this.client;
1654
+ return Object.keys(obj)
1655
+ .filter((k) => !unsafeProp(k))
1656
+ .map((roomId) => {
1657
+ let room = client.store.getRoom(roomId);
1658
+ let isBrandNewRoom = false;
1659
+ if (!room) {
1660
+ room = this.createRoom(roomId);
1661
+ isBrandNewRoom = true;
1662
+ }
1663
+ return {
1664
+ ...obj[roomId],
1665
+ room,
1666
+ isBrandNewRoom,
1667
+ };
1668
+ });
1669
+ }
1670
+
1671
+ private mapSyncEventsFormat(
1672
+ obj: IInviteState | ITimeline | IEphemeral,
1673
+ room?: Room,
1674
+ decrypt = true,
1675
+ ): MatrixEvent[] {
1676
+ if (!obj || !Array.isArray(obj.events)) {
1677
+ return [];
1678
+ }
1679
+ const mapper = this.client.getEventMapper({ decrypt });
1680
+ type TaggedEvent = (IStrippedState | IRoomEvent | IStateEvent | IMinimalEvent) & { room_id?: string };
1681
+ return (obj.events as TaggedEvent[]).filter(noUnsafeEventProps).map(function (e) {
1682
+ if (room) {
1683
+ e.room_id = room.roomId;
1684
+ }
1685
+ return mapper(e);
1686
+ });
1687
+ }
1688
+
1689
+ /**
1690
+ */
1691
+ private resolveInvites(room: Room): void {
1692
+ if (!room || !this.opts.resolveInvitesToProfiles) {
1693
+ return;
1694
+ }
1695
+ const client = this.client;
1696
+ // For each invited room member we want to give them a displayname/avatar url
1697
+ // if they have one (the m.room.member invites don't contain this).
1698
+ room.getMembersWithMembership(KnownMembership.Invite).forEach(function (member) {
1699
+ if (member.requestedProfileInfo) return;
1700
+ member.requestedProfileInfo = true;
1701
+ // try to get a cached copy first.
1702
+ const user = client.getUser(member.userId);
1703
+ let promise;
1704
+ if (user) {
1705
+ promise = Promise.resolve({
1706
+ avatar_url: user.avatarUrl,
1707
+ displayname: user.displayName,
1708
+ });
1709
+ } else {
1710
+ promise = client.getProfileInfo(member.userId);
1711
+ }
1712
+ promise.then(
1713
+ function (info) {
1714
+ // slightly naughty by doctoring the invite event but this means all
1715
+ // the code paths remain the same between invite/join display name stuff
1716
+ // which is a worthy trade-off for some minor pollution.
1717
+ const inviteEvent = member.events.member;
1718
+ if (inviteEvent?.getContent().membership !== KnownMembership.Invite) {
1719
+ // between resolving and now they have since joined, so don't clobber
1720
+ return;
1721
+ }
1722
+ inviteEvent.getContent().avatar_url = info.avatar_url;
1723
+ inviteEvent.getContent().displayname = info.displayname;
1724
+ // fire listeners
1725
+ member.setMembershipEvent(inviteEvent, room.currentState);
1726
+ },
1727
+ function (err) {
1728
+ // OH WELL.
1729
+ },
1730
+ );
1731
+ });
1732
+ }
1733
+
1734
+ private findEncryptionEvent(events?: MatrixEvent[]): MatrixEvent | undefined {
1735
+ return events?.find((e) => e.getType() === EventType.RoomEncryption && e.getStateKey() === "");
1736
+ }
1737
+
1738
+ // When processing the sync response we cannot rely on Room.hasEncryptionStateEvent we actually
1739
+ // inject the events into the room object, so we have to inspect the events themselves.
1740
+ private isRoomEncrypted(room: Room, stateEventList: MatrixEvent[], timelineEventList?: MatrixEvent[]): boolean {
1741
+ return (
1742
+ room.hasEncryptionStateEvent() ||
1743
+ !!this.findEncryptionEvent(stateEventList) ||
1744
+ !!this.findEncryptionEvent(timelineEventList)
1745
+ );
1746
+ }
1747
+
1748
+ /**
1749
+ * Injects events into a room's model.
1750
+ * @param stateEventList - A list of state events. This is the state
1751
+ * at the *START* of the timeline list if it is supplied.
1752
+ * @param timelineEventList - A list of timeline events, including threaded. Lower index
1753
+ * is earlier in time. Higher index is later.
1754
+ * @param fromCache - whether the sync response came from cache
1755
+ */
1756
+ public async injectRoomEvents(
1757
+ room: Room,
1758
+ stateEventList: MatrixEvent[],
1759
+ timelineEventList?: MatrixEvent[],
1760
+ fromCache = false,
1761
+ ): Promise<void> {
1762
+ // If there are no events in the timeline yet, initialise it with
1763
+ // the given state events
1764
+ const liveTimeline = room.getLiveTimeline();
1765
+ const timelineWasEmpty = liveTimeline.getEvents().length == 0;
1766
+ if (timelineWasEmpty) {
1767
+ // Passing these events into initialiseState will freeze them, so we need
1768
+ // to compute and cache the push actions for them now, otherwise sync dies
1769
+ // with an attempt to assign to read only property.
1770
+ // XXX: This is pretty horrible and is assuming all sorts of behaviour from
1771
+ // these functions that it shouldn't be. We should probably either store the
1772
+ // push actions cache elsewhere so we can freeze MatrixEvents, or otherwise
1773
+ // find some solution where MatrixEvents are immutable but allow for a cache
1774
+ // field.
1775
+ for (const ev of stateEventList) {
1776
+ this.client.getPushActionsForEvent(ev);
1777
+ }
1778
+ liveTimeline.initialiseState(stateEventList, {
1779
+ timelineWasEmpty,
1780
+ });
1781
+ }
1782
+
1783
+ this.resolveInvites(room);
1784
+
1785
+ // recalculate the room name at this point as adding events to the timeline
1786
+ // may make notifications appear which should have the right name.
1787
+ // XXX: This looks suspect: we'll end up recalculating the room once here
1788
+ // and then again after adding events (processSyncResponse calls it after
1789
+ // calling us) even if no state events were added. It also means that if
1790
+ // one of the room events in timelineEventList is something that needs
1791
+ // a recalculation (like m.room.name) we won't recalculate until we've
1792
+ // finished adding all the events, which will cause the notification to have
1793
+ // the old room name rather than the new one.
1794
+ room.recalculate();
1795
+
1796
+ // If the timeline wasn't empty, we process the state events here: they're
1797
+ // defined as updates to the state before the start of the timeline, so this
1798
+ // starts to roll the state forward.
1799
+ // XXX: That's what we *should* do, but this can happen if we were previously
1800
+ // peeking in a room, in which case we obviously do *not* want to add the
1801
+ // state events here onto the end of the timeline. Historically, the js-sdk
1802
+ // has just set these new state events on the old and new state. This seems
1803
+ // very wrong because there could be events in the timeline that diverge the
1804
+ // state, in which case this is going to leave things out of sync. However,
1805
+ // for now I think it;s best to behave the same as the code has done previously.
1806
+ if (!timelineWasEmpty) {
1807
+ // XXX: As above, don't do this...
1808
+ //room.addLiveEvents(stateEventList || []);
1809
+ // Do this instead...
1810
+ room.oldState.setStateEvents(stateEventList || []);
1811
+ room.currentState.setStateEvents(stateEventList || []);
1812
+ }
1813
+
1814
+ // Execute the timeline events. This will continue to diverge the current state
1815
+ // if the timeline has any state events in it.
1816
+ // This also needs to be done before running push rules on the events as they need
1817
+ // to be decorated with sender etc.
1818
+ await room.addLiveEvents(timelineEventList || [], {
1819
+ fromCache,
1820
+ timelineWasEmpty,
1821
+ });
1822
+ this.client.processBeaconEvents(room, timelineEventList);
1823
+ }
1824
+
1825
+ /**
1826
+ * Takes a list of timelineEvents and adds and adds to notifEvents
1827
+ * as appropriate.
1828
+ * This must be called after the room the events belong to has been stored.
1829
+ *
1830
+ * @param timelineEventList - A list of timeline events. Lower index
1831
+ * is earlier in time. Higher index is later.
1832
+ */
1833
+ private processEventsForNotifs(room: Room, timelineEventList: MatrixEvent[]): void {
1834
+ // gather our notifications into this.notifEvents
1835
+ if (this.client.getNotifTimelineSet()) {
1836
+ for (const event of timelineEventList) {
1837
+ const pushActions = this.client.getPushActionsForEvent(event);
1838
+ if (pushActions?.notify && pushActions.tweaks?.highlight) {
1839
+ this.notifEvents.push(event);
1840
+ }
1841
+ }
1842
+ }
1843
+ }
1844
+
1845
+ private getGuestFilter(): string {
1846
+ // Dev note: This used to be conditional to return a filter of 20 events maximum, but
1847
+ // the condition never went to the other branch. This is now hardcoded.
1848
+ return "{}";
1849
+ }
1850
+
1851
+ /**
1852
+ * Sets the sync state and emits an event to say so
1853
+ * @param newState - The new state string
1854
+ * @param data - Object of additional data to emit in the event
1855
+ */
1856
+ private updateSyncState(newState: SyncState, data?: ISyncStateData): void {
1857
+ const old = this.syncState;
1858
+ this.syncState = newState;
1859
+ this.syncStateData = data;
1860
+ this.client.emit(ClientEvent.Sync, this.syncState, old, data);
1861
+ }
1862
+
1863
+ /**
1864
+ * Event handler for the 'online' event
1865
+ * This event is generally unreliable and precise behaviour
1866
+ * varies between browsers, so we poll for connectivity too,
1867
+ * but this might help us reconnect a little faster.
1868
+ */
1869
+ private onOnline = (): void => {
1870
+ debuglog("Browser thinks we are back online");
1871
+ this.startKeepAlives(0);
1872
+ };
1873
+ }
1874
+
1875
+ // /!\ This function is not intended for public use! It's only exported from
1876
+ // here in order to share some common logic with sliding-sync-sdk.ts.
1877
+ export function _createAndReEmitRoom(client: MatrixClient, roomId: string, opts: Partial<IStoredClientOpts>): Room {
1878
+ const { timelineSupport } = client;
1879
+
1880
+ const room = new Room(roomId, client, client.getUserId()!, {
1881
+ lazyLoadMembers: opts.lazyLoadMembers,
1882
+ pendingEventOrdering: opts.pendingEventOrdering,
1883
+ timelineSupport,
1884
+ });
1885
+
1886
+ client.reEmitter.reEmit(room, [
1887
+ RoomEvent.Name,
1888
+ RoomEvent.Redaction,
1889
+ RoomEvent.RedactionCancelled,
1890
+ RoomEvent.Receipt,
1891
+ RoomEvent.Tags,
1892
+ RoomEvent.LocalEchoUpdated,
1893
+ RoomEvent.AccountData,
1894
+ RoomEvent.MyMembership,
1895
+ RoomEvent.Timeline,
1896
+ RoomEvent.TimelineReset,
1897
+ RoomStateEvent.Events,
1898
+ RoomStateEvent.Members,
1899
+ RoomStateEvent.NewMember,
1900
+ RoomStateEvent.Update,
1901
+ BeaconEvent.New,
1902
+ BeaconEvent.Update,
1903
+ BeaconEvent.Destroy,
1904
+ BeaconEvent.LivenessChange,
1905
+ ]);
1906
+
1907
+ // We need to add a listener for RoomState.members in order to hook them
1908
+ // correctly.
1909
+ room.on(RoomStateEvent.NewMember, (event, state, member) => {
1910
+ member.user = client.getUser(member.userId) ?? undefined;
1911
+ client.reEmitter.reEmit(member, [
1912
+ RoomMemberEvent.Name,
1913
+ RoomMemberEvent.Typing,
1914
+ RoomMemberEvent.PowerLevel,
1915
+ RoomMemberEvent.Membership,
1916
+ ]);
1917
+ });
1918
+
1919
+ return room;
1920
+ }