@unwanted/matrix-sdk-mini 34.12.0-1 → 34.12.0-3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (636) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/@types/event.d.ts +0 -19
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js.map +1 -1
  5. package/lib/@types/global.d.js +0 -2
  6. package/lib/@types/global.d.js.map +1 -1
  7. package/lib/browser-index.d.ts.map +1 -1
  8. package/lib/browser-index.js +0 -11
  9. package/lib/browser-index.js.map +1 -1
  10. package/lib/client.d.ts +2 -1224
  11. package/lib/client.d.ts.map +1 -1
  12. package/lib/client.js +345 -2826
  13. package/lib/client.js.map +1 -1
  14. package/lib/embedded.d.ts +0 -22
  15. package/lib/embedded.d.ts.map +1 -1
  16. package/lib/embedded.js +24 -167
  17. package/lib/embedded.js.map +1 -1
  18. package/lib/event-mapper.d.ts.map +1 -1
  19. package/lib/event-mapper.js +0 -4
  20. package/lib/event-mapper.js.map +1 -1
  21. package/lib/matrix.d.ts +0 -25
  22. package/lib/matrix.d.ts.map +1 -1
  23. package/lib/matrix.js +1 -30
  24. package/lib/matrix.js.map +1 -1
  25. package/lib/models/MSC3089Branch.d.ts.map +1 -1
  26. package/lib/models/MSC3089Branch.js +0 -3
  27. package/lib/models/MSC3089Branch.js.map +1 -1
  28. package/lib/models/event.d.ts +0 -94
  29. package/lib/models/event.d.ts.map +1 -1
  30. package/lib/models/event.js +0 -274
  31. package/lib/models/event.js.map +1 -1
  32. package/lib/models/poll.d.ts.map +1 -1
  33. package/lib/models/poll.js +1 -5
  34. package/lib/models/poll.js.map +1 -1
  35. package/lib/models/relations-container.d.ts.map +1 -1
  36. package/lib/models/relations-container.js +1 -7
  37. package/lib/models/relations-container.js.map +1 -1
  38. package/lib/models/relations.d.ts +0 -1
  39. package/lib/models/relations.d.ts.map +1 -1
  40. package/lib/models/relations.js +0 -8
  41. package/lib/models/relations.js.map +1 -1
  42. package/lib/models/room-state.d.ts.map +1 -1
  43. package/lib/models/room-state.js +10 -26
  44. package/lib/models/room-state.js.map +1 -1
  45. package/lib/models/room.d.ts +0 -18
  46. package/lib/models/room.d.ts.map +1 -1
  47. package/lib/models/room.js +94 -148
  48. package/lib/models/room.js.map +1 -1
  49. package/lib/models/thread.d.ts.map +1 -1
  50. package/lib/models/thread.js +0 -1
  51. package/lib/models/thread.js.map +1 -1
  52. package/lib/sliding-sync-sdk.d.ts +2 -3
  53. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  54. package/lib/sliding-sync-sdk.js +41 -90
  55. package/lib/sliding-sync-sdk.js.map +1 -1
  56. package/lib/sync.d.ts +0 -12
  57. package/lib/sync.d.ts.map +1 -1
  58. package/lib/sync.js +1 -73
  59. package/lib/sync.js.map +1 -1
  60. package/lib/testing.d.ts +0 -48
  61. package/lib/testing.d.ts.map +1 -1
  62. package/lib/testing.js +0 -105
  63. package/lib/testing.js.map +1 -1
  64. package/package.json +1 -3
  65. package/src/@types/event.ts +2 -36
  66. package/src/@types/global.d.ts +0 -3
  67. package/src/browser-index.ts +0 -11
  68. package/src/client.ts +52 -2876
  69. package/src/embedded.ts +3 -132
  70. package/src/event-mapper.ts +0 -4
  71. package/src/matrix.ts +0 -41
  72. package/src/models/MSC3089Branch.ts +0 -3
  73. package/src/models/event.ts +0 -289
  74. package/src/models/poll.ts +0 -6
  75. package/src/models/relations-container.ts +1 -8
  76. package/src/models/relations.ts +0 -8
  77. package/src/models/room-state.ts +2 -8
  78. package/src/models/room.ts +0 -62
  79. package/src/models/thread.ts +0 -1
  80. package/src/sliding-sync-sdk.ts +2 -72
  81. package/src/sync.ts +1 -98
  82. package/src/testing.ts +0 -108
  83. package/lib/@types/crypto.d.ts +0 -47
  84. package/lib/@types/crypto.d.ts.map +0 -1
  85. package/lib/@types/crypto.js +0 -1
  86. package/lib/@types/crypto.js.map +0 -1
  87. package/lib/@types/matrix-sdk-crypto-wasm.d.js +0 -1
  88. package/lib/@types/matrix-sdk-crypto-wasm.d.js.map +0 -1
  89. package/lib/common-crypto/CryptoBackend.d.ts +0 -240
  90. package/lib/common-crypto/CryptoBackend.d.ts.map +0 -1
  91. package/lib/common-crypto/CryptoBackend.js +0 -73
  92. package/lib/common-crypto/CryptoBackend.js.map +0 -1
  93. package/lib/common-crypto/key-passphrase.d.ts +0 -14
  94. package/lib/common-crypto/key-passphrase.d.ts.map +0 -1
  95. package/lib/common-crypto/key-passphrase.js +0 -33
  96. package/lib/common-crypto/key-passphrase.js.map +0 -1
  97. package/lib/crypto/CrossSigning.d.ts +0 -184
  98. package/lib/crypto/CrossSigning.d.ts.map +0 -1
  99. package/lib/crypto/CrossSigning.js +0 -718
  100. package/lib/crypto/CrossSigning.js.map +0 -1
  101. package/lib/crypto/DeviceList.d.ts +0 -216
  102. package/lib/crypto/DeviceList.d.ts.map +0 -1
  103. package/lib/crypto/DeviceList.js +0 -892
  104. package/lib/crypto/DeviceList.js.map +0 -1
  105. package/lib/crypto/EncryptionSetup.d.ts +0 -152
  106. package/lib/crypto/EncryptionSetup.d.ts.map +0 -1
  107. package/lib/crypto/EncryptionSetup.js +0 -356
  108. package/lib/crypto/EncryptionSetup.js.map +0 -1
  109. package/lib/crypto/OlmDevice.d.ts +0 -457
  110. package/lib/crypto/OlmDevice.d.ts.map +0 -1
  111. package/lib/crypto/OlmDevice.js +0 -1241
  112. package/lib/crypto/OlmDevice.js.map +0 -1
  113. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts +0 -109
  114. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts.map +0 -1
  115. package/lib/crypto/OutgoingRoomKeyRequestManager.js +0 -415
  116. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +0 -1
  117. package/lib/crypto/RoomList.d.ts +0 -26
  118. package/lib/crypto/RoomList.d.ts.map +0 -1
  119. package/lib/crypto/RoomList.js +0 -71
  120. package/lib/crypto/RoomList.js.map +0 -1
  121. package/lib/crypto/SecretSharing.d.ts +0 -24
  122. package/lib/crypto/SecretSharing.d.ts.map +0 -1
  123. package/lib/crypto/SecretSharing.js +0 -194
  124. package/lib/crypto/SecretSharing.js.map +0 -1
  125. package/lib/crypto/SecretStorage.d.ts +0 -55
  126. package/lib/crypto/SecretStorage.d.ts.map +0 -1
  127. package/lib/crypto/SecretStorage.js +0 -118
  128. package/lib/crypto/SecretStorage.js.map +0 -1
  129. package/lib/crypto/aes.d.ts +0 -6
  130. package/lib/crypto/aes.d.ts.map +0 -1
  131. package/lib/crypto/aes.js +0 -24
  132. package/lib/crypto/aes.js.map +0 -1
  133. package/lib/crypto/algorithms/base.d.ts +0 -156
  134. package/lib/crypto/algorithms/base.d.ts.map +0 -1
  135. package/lib/crypto/algorithms/base.js +0 -187
  136. package/lib/crypto/algorithms/base.js.map +0 -1
  137. package/lib/crypto/algorithms/index.d.ts +0 -4
  138. package/lib/crypto/algorithms/index.d.ts.map +0 -1
  139. package/lib/crypto/algorithms/index.js +0 -20
  140. package/lib/crypto/algorithms/index.js.map +0 -1
  141. package/lib/crypto/algorithms/megolm.d.ts +0 -385
  142. package/lib/crypto/algorithms/megolm.d.ts.map +0 -1
  143. package/lib/crypto/algorithms/megolm.js +0 -1822
  144. package/lib/crypto/algorithms/megolm.js.map +0 -1
  145. package/lib/crypto/algorithms/olm.d.ts +0 -5
  146. package/lib/crypto/algorithms/olm.d.ts.map +0 -1
  147. package/lib/crypto/algorithms/olm.js +0 -299
  148. package/lib/crypto/algorithms/olm.js.map +0 -1
  149. package/lib/crypto/api.d.ts +0 -32
  150. package/lib/crypto/api.d.ts.map +0 -1
  151. package/lib/crypto/api.js +0 -22
  152. package/lib/crypto/api.js.map +0 -1
  153. package/lib/crypto/backup.d.ts +0 -227
  154. package/lib/crypto/backup.d.ts.map +0 -1
  155. package/lib/crypto/backup.js +0 -824
  156. package/lib/crypto/backup.js.map +0 -1
  157. package/lib/crypto/crypto.d.ts +0 -3
  158. package/lib/crypto/crypto.d.ts.map +0 -1
  159. package/lib/crypto/crypto.js +0 -19
  160. package/lib/crypto/crypto.js.map +0 -1
  161. package/lib/crypto/dehydration.d.ts +0 -34
  162. package/lib/crypto/dehydration.d.ts.map +0 -1
  163. package/lib/crypto/dehydration.js +0 -252
  164. package/lib/crypto/dehydration.js.map +0 -1
  165. package/lib/crypto/device-converter.d.ts +0 -9
  166. package/lib/crypto/device-converter.d.ts.map +0 -1
  167. package/lib/crypto/device-converter.js +0 -42
  168. package/lib/crypto/device-converter.js.map +0 -1
  169. package/lib/crypto/deviceinfo.d.ts +0 -99
  170. package/lib/crypto/deviceinfo.d.ts.map +0 -1
  171. package/lib/crypto/deviceinfo.js +0 -148
  172. package/lib/crypto/deviceinfo.js.map +0 -1
  173. package/lib/crypto/index.d.ts +0 -1209
  174. package/lib/crypto/index.d.ts.map +0 -1
  175. package/lib/crypto/index.js +0 -4097
  176. package/lib/crypto/index.js.map +0 -1
  177. package/lib/crypto/key_passphrase.d.ts +0 -14
  178. package/lib/crypto/key_passphrase.d.ts.map +0 -1
  179. package/lib/crypto/key_passphrase.js +0 -44
  180. package/lib/crypto/key_passphrase.js.map +0 -1
  181. package/lib/crypto/keybackup.d.ts +0 -18
  182. package/lib/crypto/keybackup.d.ts.map +0 -1
  183. package/lib/crypto/keybackup.js +0 -1
  184. package/lib/crypto/keybackup.js.map +0 -1
  185. package/lib/crypto/olmlib.d.ts +0 -129
  186. package/lib/crypto/olmlib.d.ts.map +0 -1
  187. package/lib/crypto/olmlib.js +0 -492
  188. package/lib/crypto/olmlib.js.map +0 -1
  189. package/lib/crypto/recoverykey.d.ts +0 -2
  190. package/lib/crypto/recoverykey.d.ts.map +0 -1
  191. package/lib/crypto/recoverykey.js +0 -19
  192. package/lib/crypto/recoverykey.js.map +0 -1
  193. package/lib/crypto/store/base.d.ts +0 -252
  194. package/lib/crypto/store/base.d.ts.map +0 -1
  195. package/lib/crypto/store/base.js +0 -64
  196. package/lib/crypto/store/base.js.map +0 -1
  197. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts +0 -187
  198. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts.map +0 -1
  199. package/lib/crypto/store/indexeddb-crypto-store-backend.js +0 -1145
  200. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +0 -1
  201. package/lib/crypto/store/indexeddb-crypto-store.d.ts +0 -432
  202. package/lib/crypto/store/indexeddb-crypto-store.d.ts.map +0 -1
  203. package/lib/crypto/store/indexeddb-crypto-store.js +0 -728
  204. package/lib/crypto/store/indexeddb-crypto-store.js.map +0 -1
  205. package/lib/crypto/store/localStorage-crypto-store.d.ts +0 -119
  206. package/lib/crypto/store/localStorage-crypto-store.d.ts.map +0 -1
  207. package/lib/crypto/store/localStorage-crypto-store.js +0 -531
  208. package/lib/crypto/store/localStorage-crypto-store.js.map +0 -1
  209. package/lib/crypto/store/memory-crypto-store.d.ts +0 -215
  210. package/lib/crypto/store/memory-crypto-store.d.ts.map +0 -1
  211. package/lib/crypto/store/memory-crypto-store.js +0 -622
  212. package/lib/crypto/store/memory-crypto-store.js.map +0 -1
  213. package/lib/crypto/verification/Base.d.ts +0 -105
  214. package/lib/crypto/verification/Base.d.ts.map +0 -1
  215. package/lib/crypto/verification/Base.js +0 -372
  216. package/lib/crypto/verification/Base.js.map +0 -1
  217. package/lib/crypto/verification/Error.d.ts +0 -35
  218. package/lib/crypto/verification/Error.d.ts.map +0 -1
  219. package/lib/crypto/verification/Error.js +0 -86
  220. package/lib/crypto/verification/Error.js.map +0 -1
  221. package/lib/crypto/verification/IllegalMethod.d.ts +0 -15
  222. package/lib/crypto/verification/IllegalMethod.d.ts.map +0 -1
  223. package/lib/crypto/verification/IllegalMethod.js +0 -43
  224. package/lib/crypto/verification/IllegalMethod.js.map +0 -1
  225. package/lib/crypto/verification/QRCode.d.ts +0 -51
  226. package/lib/crypto/verification/QRCode.d.ts.map +0 -1
  227. package/lib/crypto/verification/QRCode.js +0 -277
  228. package/lib/crypto/verification/QRCode.js.map +0 -1
  229. package/lib/crypto/verification/SAS.d.ts +0 -27
  230. package/lib/crypto/verification/SAS.d.ts.map +0 -1
  231. package/lib/crypto/verification/SAS.js +0 -485
  232. package/lib/crypto/verification/SAS.js.map +0 -1
  233. package/lib/crypto/verification/SASDecimal.d.ts +0 -8
  234. package/lib/crypto/verification/SASDecimal.d.ts.map +0 -1
  235. package/lib/crypto/verification/SASDecimal.js +0 -34
  236. package/lib/crypto/verification/SASDecimal.js.map +0 -1
  237. package/lib/crypto/verification/request/Channel.d.ts +0 -18
  238. package/lib/crypto/verification/request/Channel.d.ts.map +0 -1
  239. package/lib/crypto/verification/request/Channel.js +0 -1
  240. package/lib/crypto/verification/request/Channel.js.map +0 -1
  241. package/lib/crypto/verification/request/InRoomChannel.d.ts +0 -113
  242. package/lib/crypto/verification/request/InRoomChannel.d.ts.map +0 -1
  243. package/lib/crypto/verification/request/InRoomChannel.js +0 -351
  244. package/lib/crypto/verification/request/InRoomChannel.js.map +0 -1
  245. package/lib/crypto/verification/request/ToDeviceChannel.d.ts +0 -105
  246. package/lib/crypto/verification/request/ToDeviceChannel.d.ts.map +0 -1
  247. package/lib/crypto/verification/request/ToDeviceChannel.js +0 -328
  248. package/lib/crypto/verification/request/ToDeviceChannel.js.map +0 -1
  249. package/lib/crypto/verification/request/VerificationRequest.d.ts +0 -227
  250. package/lib/crypto/verification/request/VerificationRequest.d.ts.map +0 -1
  251. package/lib/crypto/verification/request/VerificationRequest.js +0 -937
  252. package/lib/crypto/verification/request/VerificationRequest.js.map +0 -1
  253. package/lib/crypto-api/CryptoEvent.d.ts +0 -69
  254. package/lib/crypto-api/CryptoEvent.d.ts.map +0 -1
  255. package/lib/crypto-api/CryptoEvent.js +0 -33
  256. package/lib/crypto-api/CryptoEvent.js.map +0 -1
  257. package/lib/crypto-api/CryptoEventHandlerMap.d.ts +0 -16
  258. package/lib/crypto-api/CryptoEventHandlerMap.d.ts.map +0 -1
  259. package/lib/crypto-api/CryptoEventHandlerMap.js +0 -22
  260. package/lib/crypto-api/CryptoEventHandlerMap.js.map +0 -1
  261. package/lib/crypto-api/index.d.ts +0 -978
  262. package/lib/crypto-api/index.d.ts.map +0 -1
  263. package/lib/crypto-api/index.js +0 -304
  264. package/lib/crypto-api/index.js.map +0 -1
  265. package/lib/crypto-api/key-passphrase.d.ts +0 -11
  266. package/lib/crypto-api/key-passphrase.d.ts.map +0 -1
  267. package/lib/crypto-api/key-passphrase.js +0 -51
  268. package/lib/crypto-api/key-passphrase.js.map +0 -1
  269. package/lib/crypto-api/keybackup.d.ts +0 -88
  270. package/lib/crypto-api/keybackup.d.ts.map +0 -1
  271. package/lib/crypto-api/keybackup.js +0 -1
  272. package/lib/crypto-api/keybackup.js.map +0 -1
  273. package/lib/crypto-api/recovery-key.d.ts +0 -11
  274. package/lib/crypto-api/recovery-key.d.ts.map +0 -1
  275. package/lib/crypto-api/recovery-key.js +0 -65
  276. package/lib/crypto-api/recovery-key.js.map +0 -1
  277. package/lib/crypto-api/verification.d.ts +0 -344
  278. package/lib/crypto-api/verification.d.ts.map +0 -1
  279. package/lib/crypto-api/verification.js +0 -91
  280. package/lib/crypto-api/verification.js.map +0 -1
  281. package/lib/matrixrtc/CallMembership.d.ts +0 -66
  282. package/lib/matrixrtc/CallMembership.d.ts.map +0 -1
  283. package/lib/matrixrtc/CallMembership.js +0 -197
  284. package/lib/matrixrtc/CallMembership.js.map +0 -1
  285. package/lib/matrixrtc/LivekitFocus.d.ts +0 -16
  286. package/lib/matrixrtc/LivekitFocus.d.ts.map +0 -1
  287. package/lib/matrixrtc/LivekitFocus.js +0 -20
  288. package/lib/matrixrtc/LivekitFocus.js.map +0 -1
  289. package/lib/matrixrtc/MatrixRTCSession.d.ts +0 -295
  290. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +0 -1
  291. package/lib/matrixrtc/MatrixRTCSession.js +0 -1043
  292. package/lib/matrixrtc/MatrixRTCSession.js.map +0 -1
  293. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +0 -40
  294. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +0 -1
  295. package/lib/matrixrtc/MatrixRTCSessionManager.js +0 -146
  296. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +0 -1
  297. package/lib/matrixrtc/focus.d.ts +0 -10
  298. package/lib/matrixrtc/focus.d.ts.map +0 -1
  299. package/lib/matrixrtc/focus.js +0 -1
  300. package/lib/matrixrtc/focus.js.map +0 -1
  301. package/lib/matrixrtc/index.d.ts +0 -7
  302. package/lib/matrixrtc/index.d.ts.map +0 -1
  303. package/lib/matrixrtc/index.js +0 -21
  304. package/lib/matrixrtc/index.js.map +0 -1
  305. package/lib/matrixrtc/types.d.ts +0 -19
  306. package/lib/matrixrtc/types.d.ts.map +0 -1
  307. package/lib/matrixrtc/types.js +0 -1
  308. package/lib/matrixrtc/types.js.map +0 -1
  309. package/lib/rendezvous/MSC4108SignInWithQR.d.ts +0 -112
  310. package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +0 -1
  311. package/lib/rendezvous/MSC4108SignInWithQR.js +0 -392
  312. package/lib/rendezvous/MSC4108SignInWithQR.js.map +0 -1
  313. package/lib/rendezvous/RendezvousChannel.d.ts +0 -27
  314. package/lib/rendezvous/RendezvousChannel.d.ts.map +0 -1
  315. package/lib/rendezvous/RendezvousChannel.js +0 -1
  316. package/lib/rendezvous/RendezvousChannel.js.map +0 -1
  317. package/lib/rendezvous/RendezvousCode.d.ts +0 -9
  318. package/lib/rendezvous/RendezvousCode.d.ts.map +0 -1
  319. package/lib/rendezvous/RendezvousCode.js +0 -1
  320. package/lib/rendezvous/RendezvousCode.js.map +0 -1
  321. package/lib/rendezvous/RendezvousError.d.ts +0 -6
  322. package/lib/rendezvous/RendezvousError.d.ts.map +0 -1
  323. package/lib/rendezvous/RendezvousError.js +0 -23
  324. package/lib/rendezvous/RendezvousError.js.map +0 -1
  325. package/lib/rendezvous/RendezvousFailureReason.d.ts +0 -31
  326. package/lib/rendezvous/RendezvousFailureReason.d.ts.map +0 -1
  327. package/lib/rendezvous/RendezvousFailureReason.js +0 -38
  328. package/lib/rendezvous/RendezvousFailureReason.js.map +0 -1
  329. package/lib/rendezvous/RendezvousIntent.d.ts +0 -5
  330. package/lib/rendezvous/RendezvousIntent.d.ts.map +0 -1
  331. package/lib/rendezvous/RendezvousIntent.js +0 -22
  332. package/lib/rendezvous/RendezvousIntent.js.map +0 -1
  333. package/lib/rendezvous/RendezvousTransport.d.ts +0 -36
  334. package/lib/rendezvous/RendezvousTransport.d.ts.map +0 -1
  335. package/lib/rendezvous/RendezvousTransport.js +0 -1
  336. package/lib/rendezvous/RendezvousTransport.js.map +0 -1
  337. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts +0 -58
  338. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts.map +0 -1
  339. package/lib/rendezvous/channels/MSC4108SecureChannel.js +0 -246
  340. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +0 -1
  341. package/lib/rendezvous/channels/index.d.ts +0 -2
  342. package/lib/rendezvous/channels/index.d.ts.map +0 -1
  343. package/lib/rendezvous/channels/index.js +0 -18
  344. package/lib/rendezvous/channels/index.js.map +0 -1
  345. package/lib/rendezvous/index.d.ts +0 -10
  346. package/lib/rendezvous/index.d.ts.map +0 -1
  347. package/lib/rendezvous/index.js +0 -23
  348. package/lib/rendezvous/index.js.map +0 -1
  349. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +0 -61
  350. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts.map +0 -1
  351. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +0 -253
  352. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +0 -1
  353. package/lib/rendezvous/transports/index.d.ts +0 -2
  354. package/lib/rendezvous/transports/index.d.ts.map +0 -1
  355. package/lib/rendezvous/transports/index.js +0 -18
  356. package/lib/rendezvous/transports/index.js.map +0 -1
  357. package/lib/rust-crypto/CrossSigningIdentity.d.ts +0 -33
  358. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +0 -1
  359. package/lib/rust-crypto/CrossSigningIdentity.js +0 -157
  360. package/lib/rust-crypto/CrossSigningIdentity.js.map +0 -1
  361. package/lib/rust-crypto/DehydratedDeviceManager.d.ts +0 -98
  362. package/lib/rust-crypto/DehydratedDeviceManager.d.ts.map +0 -1
  363. package/lib/rust-crypto/DehydratedDeviceManager.js +0 -285
  364. package/lib/rust-crypto/DehydratedDeviceManager.js.map +0 -1
  365. package/lib/rust-crypto/KeyClaimManager.d.ts +0 -33
  366. package/lib/rust-crypto/KeyClaimManager.d.ts.map +0 -1
  367. package/lib/rust-crypto/KeyClaimManager.js +0 -82
  368. package/lib/rust-crypto/KeyClaimManager.js.map +0 -1
  369. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts +0 -43
  370. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +0 -1
  371. package/lib/rust-crypto/OutgoingRequestProcessor.js +0 -195
  372. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +0 -1
  373. package/lib/rust-crypto/OutgoingRequestsManager.d.ts +0 -47
  374. package/lib/rust-crypto/OutgoingRequestsManager.d.ts.map +0 -1
  375. package/lib/rust-crypto/OutgoingRequestsManager.js +0 -148
  376. package/lib/rust-crypto/OutgoingRequestsManager.js.map +0 -1
  377. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +0 -120
  378. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts.map +0 -1
  379. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +0 -467
  380. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +0 -1
  381. package/lib/rust-crypto/RoomEncryptor.d.ts +0 -98
  382. package/lib/rust-crypto/RoomEncryptor.d.ts.map +0 -1
  383. package/lib/rust-crypto/RoomEncryptor.js +0 -299
  384. package/lib/rust-crypto/RoomEncryptor.js.map +0 -1
  385. package/lib/rust-crypto/backup.d.ts +0 -254
  386. package/lib/rust-crypto/backup.d.ts.map +0 -1
  387. package/lib/rust-crypto/backup.js +0 -837
  388. package/lib/rust-crypto/backup.js.map +0 -1
  389. package/lib/rust-crypto/constants.d.ts +0 -3
  390. package/lib/rust-crypto/constants.d.ts.map +0 -1
  391. package/lib/rust-crypto/constants.js +0 -19
  392. package/lib/rust-crypto/constants.js.map +0 -1
  393. package/lib/rust-crypto/device-converter.d.ts +0 -28
  394. package/lib/rust-crypto/device-converter.d.ts.map +0 -1
  395. package/lib/rust-crypto/device-converter.js +0 -123
  396. package/lib/rust-crypto/device-converter.js.map +0 -1
  397. package/lib/rust-crypto/index.d.ts +0 -61
  398. package/lib/rust-crypto/index.d.ts.map +0 -1
  399. package/lib/rust-crypto/index.js +0 -152
  400. package/lib/rust-crypto/index.js.map +0 -1
  401. package/lib/rust-crypto/libolm_migration.d.ts +0 -81
  402. package/lib/rust-crypto/libolm_migration.d.ts.map +0 -1
  403. package/lib/rust-crypto/libolm_migration.js +0 -459
  404. package/lib/rust-crypto/libolm_migration.js.map +0 -1
  405. package/lib/rust-crypto/rust-crypto.d.ts +0 -556
  406. package/lib/rust-crypto/rust-crypto.d.ts.map +0 -1
  407. package/lib/rust-crypto/rust-crypto.js +0 -2016
  408. package/lib/rust-crypto/rust-crypto.js.map +0 -1
  409. package/lib/rust-crypto/secret-storage.d.ts +0 -22
  410. package/lib/rust-crypto/secret-storage.d.ts.map +0 -1
  411. package/lib/rust-crypto/secret-storage.js +0 -63
  412. package/lib/rust-crypto/secret-storage.js.map +0 -1
  413. package/lib/rust-crypto/verification.d.ts +0 -319
  414. package/lib/rust-crypto/verification.d.ts.map +0 -1
  415. package/lib/rust-crypto/verification.js +0 -816
  416. package/lib/rust-crypto/verification.js.map +0 -1
  417. package/lib/secret-storage.d.ts +0 -370
  418. package/lib/secret-storage.d.ts.map +0 -1
  419. package/lib/secret-storage.js +0 -466
  420. package/lib/secret-storage.js.map +0 -1
  421. package/lib/webrtc/audioContext.d.ts +0 -15
  422. package/lib/webrtc/audioContext.d.ts.map +0 -1
  423. package/lib/webrtc/audioContext.js +0 -46
  424. package/lib/webrtc/audioContext.js.map +0 -1
  425. package/lib/webrtc/call.d.ts +0 -560
  426. package/lib/webrtc/call.d.ts.map +0 -1
  427. package/lib/webrtc/call.js +0 -2541
  428. package/lib/webrtc/call.js.map +0 -1
  429. package/lib/webrtc/callEventHandler.d.ts +0 -37
  430. package/lib/webrtc/callEventHandler.d.ts.map +0 -1
  431. package/lib/webrtc/callEventHandler.js +0 -344
  432. package/lib/webrtc/callEventHandler.js.map +0 -1
  433. package/lib/webrtc/callEventTypes.d.ts +0 -73
  434. package/lib/webrtc/callEventTypes.d.ts.map +0 -1
  435. package/lib/webrtc/callEventTypes.js +0 -13
  436. package/lib/webrtc/callEventTypes.js.map +0 -1
  437. package/lib/webrtc/callFeed.d.ts +0 -128
  438. package/lib/webrtc/callFeed.d.ts.map +0 -1
  439. package/lib/webrtc/callFeed.js +0 -289
  440. package/lib/webrtc/callFeed.js.map +0 -1
  441. package/lib/webrtc/groupCall.d.ts +0 -323
  442. package/lib/webrtc/groupCall.d.ts.map +0 -1
  443. package/lib/webrtc/groupCall.js +0 -1337
  444. package/lib/webrtc/groupCall.js.map +0 -1
  445. package/lib/webrtc/groupCallEventHandler.d.ts +0 -31
  446. package/lib/webrtc/groupCallEventHandler.d.ts.map +0 -1
  447. package/lib/webrtc/groupCallEventHandler.js +0 -178
  448. package/lib/webrtc/groupCallEventHandler.js.map +0 -1
  449. package/lib/webrtc/mediaHandler.d.ts +0 -89
  450. package/lib/webrtc/mediaHandler.d.ts.map +0 -1
  451. package/lib/webrtc/mediaHandler.js +0 -437
  452. package/lib/webrtc/mediaHandler.js.map +0 -1
  453. package/lib/webrtc/stats/callFeedStatsReporter.d.ts +0 -8
  454. package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +0 -1
  455. package/lib/webrtc/stats/callFeedStatsReporter.js +0 -82
  456. package/lib/webrtc/stats/callFeedStatsReporter.js.map +0 -1
  457. package/lib/webrtc/stats/callStatsReportGatherer.d.ts +0 -25
  458. package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +0 -1
  459. package/lib/webrtc/stats/callStatsReportGatherer.js +0 -199
  460. package/lib/webrtc/stats/callStatsReportGatherer.js.map +0 -1
  461. package/lib/webrtc/stats/callStatsReportSummary.d.ts +0 -17
  462. package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +0 -1
  463. package/lib/webrtc/stats/callStatsReportSummary.js +0 -1
  464. package/lib/webrtc/stats/callStatsReportSummary.js.map +0 -1
  465. package/lib/webrtc/stats/connectionStats.d.ts +0 -28
  466. package/lib/webrtc/stats/connectionStats.d.ts.map +0 -1
  467. package/lib/webrtc/stats/connectionStats.js +0 -26
  468. package/lib/webrtc/stats/connectionStats.js.map +0 -1
  469. package/lib/webrtc/stats/connectionStatsBuilder.d.ts +0 -5
  470. package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +0 -1
  471. package/lib/webrtc/stats/connectionStatsBuilder.js +0 -27
  472. package/lib/webrtc/stats/connectionStatsBuilder.js.map +0 -1
  473. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +0 -7
  474. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +0 -1
  475. package/lib/webrtc/stats/connectionStatsReportBuilder.js +0 -121
  476. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +0 -1
  477. package/lib/webrtc/stats/groupCallStats.d.ts +0 -22
  478. package/lib/webrtc/stats/groupCallStats.d.ts.map +0 -1
  479. package/lib/webrtc/stats/groupCallStats.js +0 -78
  480. package/lib/webrtc/stats/groupCallStats.js.map +0 -1
  481. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +0 -10
  482. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +0 -1
  483. package/lib/webrtc/stats/media/mediaSsrcHandler.js +0 -57
  484. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +0 -1
  485. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +0 -12
  486. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +0 -1
  487. package/lib/webrtc/stats/media/mediaTrackHandler.js +0 -62
  488. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +0 -1
  489. package/lib/webrtc/stats/media/mediaTrackStats.d.ts +0 -86
  490. package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +0 -1
  491. package/lib/webrtc/stats/media/mediaTrackStats.js +0 -142
  492. package/lib/webrtc/stats/media/mediaTrackStats.js.map +0 -1
  493. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +0 -22
  494. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +0 -1
  495. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +0 -76
  496. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +0 -1
  497. package/lib/webrtc/stats/statsReport.d.ts +0 -99
  498. package/lib/webrtc/stats/statsReport.d.ts.map +0 -1
  499. package/lib/webrtc/stats/statsReport.js +0 -32
  500. package/lib/webrtc/stats/statsReport.js.map +0 -1
  501. package/lib/webrtc/stats/statsReportEmitter.d.ts +0 -15
  502. package/lib/webrtc/stats/statsReportEmitter.d.ts.map +0 -1
  503. package/lib/webrtc/stats/statsReportEmitter.js +0 -33
  504. package/lib/webrtc/stats/statsReportEmitter.js.map +0 -1
  505. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +0 -16
  506. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +0 -1
  507. package/lib/webrtc/stats/summaryStatsReportGatherer.js +0 -116
  508. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +0 -1
  509. package/lib/webrtc/stats/trackStatsBuilder.d.ts +0 -19
  510. package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +0 -1
  511. package/lib/webrtc/stats/trackStatsBuilder.js +0 -168
  512. package/lib/webrtc/stats/trackStatsBuilder.js.map +0 -1
  513. package/lib/webrtc/stats/transportStats.d.ts +0 -11
  514. package/lib/webrtc/stats/transportStats.d.ts.map +0 -1
  515. package/lib/webrtc/stats/transportStats.js +0 -1
  516. package/lib/webrtc/stats/transportStats.js.map +0 -1
  517. package/lib/webrtc/stats/transportStatsBuilder.d.ts +0 -5
  518. package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +0 -1
  519. package/lib/webrtc/stats/transportStatsBuilder.js +0 -34
  520. package/lib/webrtc/stats/transportStatsBuilder.js.map +0 -1
  521. package/lib/webrtc/stats/valueFormatter.d.ts +0 -4
  522. package/lib/webrtc/stats/valueFormatter.d.ts.map +0 -1
  523. package/lib/webrtc/stats/valueFormatter.js +0 -25
  524. package/lib/webrtc/stats/valueFormatter.js.map +0 -1
  525. package/src/@types/crypto.ts +0 -73
  526. package/src/@types/matrix-sdk-crypto-wasm.d.ts +0 -44
  527. package/src/common-crypto/CryptoBackend.ts +0 -302
  528. package/src/common-crypto/README.md +0 -4
  529. package/src/common-crypto/key-passphrase.ts +0 -43
  530. package/src/crypto/CrossSigning.ts +0 -773
  531. package/src/crypto/DeviceList.ts +0 -989
  532. package/src/crypto/EncryptionSetup.ts +0 -351
  533. package/src/crypto/OlmDevice.ts +0 -1500
  534. package/src/crypto/OutgoingRoomKeyRequestManager.ts +0 -485
  535. package/src/crypto/RoomList.ts +0 -70
  536. package/src/crypto/SecretSharing.ts +0 -240
  537. package/src/crypto/SecretStorage.ts +0 -136
  538. package/src/crypto/aes.ts +0 -23
  539. package/src/crypto/algorithms/base.ts +0 -236
  540. package/src/crypto/algorithms/index.ts +0 -20
  541. package/src/crypto/algorithms/megolm.ts +0 -2216
  542. package/src/crypto/algorithms/olm.ts +0 -381
  543. package/src/crypto/api.ts +0 -70
  544. package/src/crypto/backup.ts +0 -922
  545. package/src/crypto/crypto.ts +0 -18
  546. package/src/crypto/dehydration.ts +0 -272
  547. package/src/crypto/device-converter.ts +0 -45
  548. package/src/crypto/deviceinfo.ts +0 -158
  549. package/src/crypto/index.ts +0 -4414
  550. package/src/crypto/key_passphrase.ts +0 -42
  551. package/src/crypto/keybackup.ts +0 -47
  552. package/src/crypto/olmlib.ts +0 -539
  553. package/src/crypto/recoverykey.ts +0 -18
  554. package/src/crypto/store/base.ts +0 -348
  555. package/src/crypto/store/indexeddb-crypto-store-backend.ts +0 -1250
  556. package/src/crypto/store/indexeddb-crypto-store.ts +0 -845
  557. package/src/crypto/store/localStorage-crypto-store.ts +0 -579
  558. package/src/crypto/store/memory-crypto-store.ts +0 -680
  559. package/src/crypto/verification/Base.ts +0 -409
  560. package/src/crypto/verification/Error.ts +0 -76
  561. package/src/crypto/verification/IllegalMethod.ts +0 -50
  562. package/src/crypto/verification/QRCode.ts +0 -310
  563. package/src/crypto/verification/SAS.ts +0 -494
  564. package/src/crypto/verification/SASDecimal.ts +0 -37
  565. package/src/crypto/verification/request/Channel.ts +0 -34
  566. package/src/crypto/verification/request/InRoomChannel.ts +0 -371
  567. package/src/crypto/verification/request/ToDeviceChannel.ts +0 -354
  568. package/src/crypto/verification/request/VerificationRequest.ts +0 -976
  569. package/src/crypto-api/CryptoEvent.ts +0 -93
  570. package/src/crypto-api/CryptoEventHandlerMap.ts +0 -32
  571. package/src/crypto-api/index.ts +0 -1175
  572. package/src/crypto-api/key-passphrase.ts +0 -58
  573. package/src/crypto-api/keybackup.ts +0 -115
  574. package/src/crypto-api/recovery-key.ts +0 -69
  575. package/src/crypto-api/verification.ts +0 -408
  576. package/src/matrixrtc/CallMembership.ts +0 -247
  577. package/src/matrixrtc/LivekitFocus.ts +0 -39
  578. package/src/matrixrtc/MatrixRTCSession.ts +0 -1319
  579. package/src/matrixrtc/MatrixRTCSessionManager.ts +0 -166
  580. package/src/matrixrtc/focus.ts +0 -25
  581. package/src/matrixrtc/index.ts +0 -22
  582. package/src/matrixrtc/types.ts +0 -36
  583. package/src/rendezvous/MSC4108SignInWithQR.ts +0 -444
  584. package/src/rendezvous/RendezvousChannel.ts +0 -48
  585. package/src/rendezvous/RendezvousCode.ts +0 -25
  586. package/src/rendezvous/RendezvousError.ts +0 -26
  587. package/src/rendezvous/RendezvousFailureReason.ts +0 -49
  588. package/src/rendezvous/RendezvousIntent.ts +0 -20
  589. package/src/rendezvous/RendezvousTransport.ts +0 -58
  590. package/src/rendezvous/channels/MSC4108SecureChannel.ts +0 -270
  591. package/src/rendezvous/channels/index.ts +0 -17
  592. package/src/rendezvous/index.ts +0 -25
  593. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +0 -270
  594. package/src/rendezvous/transports/index.ts +0 -17
  595. package/src/rust-crypto/CrossSigningIdentity.ts +0 -183
  596. package/src/rust-crypto/DehydratedDeviceManager.ts +0 -306
  597. package/src/rust-crypto/KeyClaimManager.ts +0 -86
  598. package/src/rust-crypto/OutgoingRequestProcessor.ts +0 -236
  599. package/src/rust-crypto/OutgoingRequestsManager.ts +0 -143
  600. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +0 -501
  601. package/src/rust-crypto/RoomEncryptor.ts +0 -352
  602. package/src/rust-crypto/backup.ts +0 -881
  603. package/src/rust-crypto/constants.ts +0 -18
  604. package/src/rust-crypto/device-converter.ts +0 -128
  605. package/src/rust-crypto/index.ts +0 -237
  606. package/src/rust-crypto/libolm_migration.ts +0 -530
  607. package/src/rust-crypto/rust-crypto.ts +0 -2205
  608. package/src/rust-crypto/secret-storage.ts +0 -60
  609. package/src/rust-crypto/verification.ts +0 -830
  610. package/src/secret-storage.ts +0 -693
  611. package/src/webrtc/audioContext.ts +0 -44
  612. package/src/webrtc/call.ts +0 -3074
  613. package/src/webrtc/callEventHandler.ts +0 -425
  614. package/src/webrtc/callEventTypes.ts +0 -93
  615. package/src/webrtc/callFeed.ts +0 -364
  616. package/src/webrtc/groupCall.ts +0 -1735
  617. package/src/webrtc/groupCallEventHandler.ts +0 -234
  618. package/src/webrtc/mediaHandler.ts +0 -484
  619. package/src/webrtc/stats/callFeedStatsReporter.ts +0 -94
  620. package/src/webrtc/stats/callStatsReportGatherer.ts +0 -219
  621. package/src/webrtc/stats/callStatsReportSummary.ts +0 -30
  622. package/src/webrtc/stats/connectionStats.ts +0 -47
  623. package/src/webrtc/stats/connectionStatsBuilder.ts +0 -28
  624. package/src/webrtc/stats/connectionStatsReportBuilder.ts +0 -140
  625. package/src/webrtc/stats/groupCallStats.ts +0 -93
  626. package/src/webrtc/stats/media/mediaSsrcHandler.ts +0 -57
  627. package/src/webrtc/stats/media/mediaTrackHandler.ts +0 -76
  628. package/src/webrtc/stats/media/mediaTrackStats.ts +0 -176
  629. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +0 -90
  630. package/src/webrtc/stats/statsReport.ts +0 -133
  631. package/src/webrtc/stats/statsReportEmitter.ts +0 -49
  632. package/src/webrtc/stats/summaryStatsReportGatherer.ts +0 -148
  633. package/src/webrtc/stats/trackStatsBuilder.ts +0 -207
  634. package/src/webrtc/stats/transportStats.ts +0 -26
  635. package/src/webrtc/stats/transportStatsBuilder.ts +0 -48
  636. package/src/webrtc/stats/valueFormatter.ts +0 -27
@@ -1,1319 +0,0 @@
1
- /*
2
- Copyright 2023 - 2024 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
- import { logger as rootLogger } from "../logger.ts";
18
- import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
19
- import { EventTimeline } from "../models/event-timeline.ts";
20
- import { Room } from "../models/room.ts";
21
- import { MatrixClient } from "../client.ts";
22
- import { EventType } from "../@types/event.ts";
23
- import { UpdateDelayedEventAction } from "../@types/requests.ts";
24
- import {
25
- CallMembership,
26
- CallMembershipData,
27
- CallMembershipDataLegacy,
28
- SessionMembershipData,
29
- isLegacyCallMembershipData,
30
- } from "./CallMembership.ts";
31
- import { RoomStateEvent } from "../models/room-state.ts";
32
- import { Focus } from "./focus.ts";
33
- import { randomString, secureRandomBase64Url } from "../randomstring.ts";
34
- import { EncryptionKeysEventContent } from "./types.ts";
35
- import { decodeBase64, encodeUnpaddedBase64 } from "../base64.ts";
36
- import { KnownMembership } from "../@types/membership.ts";
37
- import { HTTPError, MatrixError, safeGetRetryAfterMs } from "../http-api/errors.ts";
38
- import { MatrixEvent } from "../models/event.ts";
39
- import { isLivekitFocusActive } from "./LivekitFocus.ts";
40
- import { ExperimentalGroupCallRoomMemberState } from "../webrtc/groupCall.ts";
41
- import { sleep } from "../utils.ts";
42
-
43
- const logger = rootLogger.getChild("MatrixRTCSession");
44
-
45
- const getParticipantId = (userId: string, deviceId: string): string => `${userId}:${deviceId}`;
46
- const getParticipantIdFromMembership = (m: CallMembership): string => getParticipantId(m.sender!, m.deviceId);
47
-
48
- function keysEqual(a: Uint8Array | undefined, b: Uint8Array | undefined): boolean {
49
- if (a === b) return true;
50
- return !!a && !!b && a.length === b.length && a.every((x, i) => x === b[i]);
51
- }
52
-
53
- export enum MatrixRTCSessionEvent {
54
- // A member joined, left, or updated a property of their membership.
55
- MembershipsChanged = "memberships_changed",
56
- // We joined or left the session: our own local idea of whether we are joined,
57
- // separate from MembershipsChanged, ie. independent of whether our member event
58
- // has successfully gone through.
59
- JoinStateChanged = "join_state_changed",
60
- // The key used to encrypt media has changed
61
- EncryptionKeyChanged = "encryption_key_changed",
62
- }
63
-
64
- export type MatrixRTCSessionEventHandlerMap = {
65
- [MatrixRTCSessionEvent.MembershipsChanged]: (
66
- oldMemberships: CallMembership[],
67
- newMemberships: CallMembership[],
68
- ) => void;
69
- [MatrixRTCSessionEvent.JoinStateChanged]: (isJoined: boolean) => void;
70
- [MatrixRTCSessionEvent.EncryptionKeyChanged]: (
71
- key: Uint8Array,
72
- encryptionKeyIndex: number,
73
- participantId: string,
74
- ) => void;
75
- };
76
-
77
- export interface JoinSessionConfig {
78
- /**
79
- * If true, generate and share a media key for this participant,
80
- * and emit MatrixRTCSessionEvent.EncryptionKeyChanged when
81
- * media keys for other participants become available.
82
- */
83
- manageMediaKeys?: boolean;
84
-
85
- /** Lets you configure how the events for the session are formatted.
86
- * - legacy: use one event with a membership array.
87
- * - MSC4143: use one event per membership (with only one membership per event)
88
- * More details can be found in MSC4143 and by checking the types:
89
- * `CallMembershipDataLegacy` and `SessionMembershipData`
90
- */
91
- useLegacyMemberEvents?: boolean;
92
-
93
- /**
94
- * The timeout (in milliseconds) after we joined the call, that our membership should expire
95
- * unless we have explicitly updated it.
96
- */
97
- membershipExpiryTimeout?: number;
98
-
99
- /**
100
- * The period (in milliseconds) with which we check that our membership event still exists on the
101
- * server. If it is not found we create it again.
102
- */
103
- memberEventCheckPeriod?: number;
104
-
105
- /**
106
- * The minimum delay (in milliseconds) after which we will retry sending the membership event if it
107
- * failed to send.
108
- */
109
- callMemberEventRetryDelayMinimum?: number;
110
-
111
- /**
112
- * The jitter (in milliseconds) which is added to callMemberEventRetryDelayMinimum before retrying
113
- * sending the membership event. e.g. if this is set to 1000, then a random delay of between 0 and 1000
114
- * milliseconds will be added.
115
- */
116
- callMemberEventRetryJitter?: number;
117
-
118
- /**
119
- * The minimum time (in milliseconds) between each attempt to send encryption key(s).
120
- * e.g. if this is set to 1000, then we will send at most one key event every second.
121
- */
122
- updateEncryptionKeyThrottle?: number;
123
-
124
- /**
125
- * The delay (in milliseconds) after a member leaves before we create and publish a new key, because people
126
- * tend to leave calls at the same time.
127
- */
128
- makeKeyDelay?: number;
129
-
130
- /**
131
- * The delay (in milliseconds) between creating and sending a new key and starting to encrypt with it. This
132
- * gives other a chance to receive the new key to minimise the chance they don't get media they can't decrypt.
133
- * The total time between a member leaving and the call switching to new keys is therefore:
134
- * makeKeyDelay + useKeyDelay
135
- */
136
- useKeyDelay?: number;
137
-
138
- /**
139
- * The timeout (in milliseconds) after which the server will consider the membership to have expired if it
140
- * has not received a keep-alive from the client.
141
- */
142
- membershipServerSideExpiryTimeout?: number;
143
-
144
- /**
145
- * The period (in milliseconds) that the client will send membership keep-alives to the server.
146
- */
147
- membershipKeepAlivePeriod?: number;
148
- }
149
-
150
- /**
151
- * A MatrixRTCSession manages the membership & properties of a MatrixRTC session.
152
- * This class doesn't deal with media at all, just membership & properties of a session.
153
- */
154
- export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, MatrixRTCSessionEventHandlerMap> {
155
- // The session Id of the call, this is the call_id of the call Member event.
156
- private _callId: string | undefined;
157
-
158
- private relativeExpiry: number | undefined;
159
-
160
- // undefined means not yet joined
161
- private joinConfig?: JoinSessionConfig;
162
-
163
- private get membershipExpiryTimeout(): number {
164
- return this.joinConfig?.membershipExpiryTimeout ?? 60 * 60 * 1000;
165
- }
166
-
167
- private get memberEventCheckPeriod(): number {
168
- return this.joinConfig?.memberEventCheckPeriod ?? 2 * 60 * 1000;
169
- }
170
-
171
- private get callMemberEventRetryDelayMinimum(): number {
172
- return this.joinConfig?.callMemberEventRetryDelayMinimum ?? 3_000;
173
- }
174
-
175
- private get updateEncryptionKeyThrottle(): number {
176
- return this.joinConfig?.updateEncryptionKeyThrottle ?? 3_000;
177
- }
178
-
179
- private get makeKeyDelay(): number {
180
- return this.joinConfig?.makeKeyDelay ?? 3_000;
181
- }
182
-
183
- private get useKeyDelay(): number {
184
- return this.joinConfig?.useKeyDelay ?? 5_000;
185
- }
186
-
187
- /**
188
- * If the server disallows the configured {@link membershipServerSideExpiryTimeout},
189
- * this stores a delay that the server does allow.
190
- */
191
- private membershipServerSideExpiryTimeoutOverride?: number;
192
-
193
- private get membershipServerSideExpiryTimeout(): number {
194
- return (
195
- this.membershipServerSideExpiryTimeoutOverride ??
196
- this.joinConfig?.membershipServerSideExpiryTimeout ??
197
- 8_000
198
- );
199
- }
200
-
201
- private get membershipKeepAlivePeriod(): number {
202
- return this.joinConfig?.membershipKeepAlivePeriod ?? 5_000;
203
- }
204
-
205
- private get callMemberEventRetryJitter(): number {
206
- return this.joinConfig?.callMemberEventRetryJitter ?? 2_000;
207
- }
208
-
209
- // An identifier for our membership of the call. This will allow us to easily recognise
210
- // whether a membership was sent by this session or is stale from some other time.
211
- // It also forces our membership events to be unique, because otherwise we could try
212
- // to overwrite a membership from a previous session but it would do nothing because the
213
- // event content would be identical. We need the origin_server_ts to update though, so
214
- // forcing unique content fixes this.
215
- private membershipId: string | undefined;
216
-
217
- private memberEventTimeout?: ReturnType<typeof setTimeout>;
218
- private expiryTimeout?: ReturnType<typeof setTimeout>;
219
- private keysEventUpdateTimeout?: ReturnType<typeof setTimeout>;
220
- private makeNewKeyTimeout?: ReturnType<typeof setTimeout>;
221
- private setNewKeyTimeouts = new Set<ReturnType<typeof setTimeout>>();
222
-
223
- // This is a Focus with the specified fields for an ActiveFocus (e.g. LivekitFocusActive for type="livekit")
224
- private ownFocusActive?: Focus;
225
- // This is a Foci array that contains the Focus objects this user is aware of and proposes to use.
226
- private ownFociPreferred?: Focus[];
227
-
228
- private updateCallMembershipRunning = false;
229
- private needCallMembershipUpdate = false;
230
-
231
- private manageMediaKeys = false;
232
- private useLegacyMemberEvents = true;
233
- // userId:deviceId => array of (key, timestamp)
234
- private encryptionKeys = new Map<string, Array<{ key: Uint8Array; timestamp: number }>>();
235
- private lastEncryptionKeyUpdateRequest?: number;
236
-
237
- private disconnectDelayId: string | undefined;
238
-
239
- // We use this to store the last membership fingerprints we saw, so we can proactively re-send encryption keys
240
- // if it looks like a membership has been updated.
241
- private lastMembershipFingerprints: Set<string> | undefined;
242
-
243
- private currentEncryptionKeyIndex = -1;
244
-
245
- /**
246
- * The statistics for this session.
247
- */
248
- public statistics = {
249
- counters: {
250
- /**
251
- * The number of times we have sent a room event containing encryption keys.
252
- */
253
- roomEventEncryptionKeysSent: 0,
254
- /**
255
- * The number of times we have received a room event containing encryption keys.
256
- */
257
- roomEventEncryptionKeysReceived: 0,
258
- },
259
- totals: {
260
- /**
261
- * The total age (in milliseconds) of all room events containing encryption keys that we have received.
262
- * We track the total age so that we can later calculate the average age of all keys received.
263
- */
264
- roomEventEncryptionKeysReceivedTotalAge: 0,
265
- },
266
- };
267
-
268
- /**
269
- * The callId (sessionId) of the call.
270
- *
271
- * It can be undefined since the callId is only known once the first membership joins.
272
- * The callId is the property that, per definition, groups memberships into one call.
273
- */
274
- public get callId(): string | undefined {
275
- return this._callId;
276
- }
277
- /**
278
- * Returns all the call memberships for a room, oldest first
279
- */
280
- public static callMembershipsForRoom(room: Room): CallMembership[] {
281
- const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS);
282
- if (!roomState) {
283
- logger.warn("Couldn't get state for room " + room.roomId);
284
- throw new Error("Could't get state for room " + room.roomId);
285
- }
286
- const callMemberEvents = roomState.getStateEvents(EventType.GroupCallMemberPrefix);
287
-
288
- const callMemberships: CallMembership[] = [];
289
- for (const memberEvent of callMemberEvents) {
290
- const content = memberEvent.getContent();
291
- const eventKeysCount = Object.keys(content).length;
292
- // Dont even bother about empty events (saves us from costly type/"key in" checks in bigger rooms)
293
- if (eventKeysCount === 0) continue;
294
-
295
- let membershipContents: any[] = [];
296
-
297
- // We first decide if its a MSC4143 event (per device state key)
298
- if (eventKeysCount > 1 && "focus_active" in content) {
299
- // We have a MSC4143 event membership event
300
- membershipContents.push(content);
301
- } else if (eventKeysCount === 1 && "memberships" in content) {
302
- // we have a legacy (one event for all devices) event
303
- if (!Array.isArray(content["memberships"])) {
304
- logger.warn(`Malformed member event from ${memberEvent.getSender()}: memberships is not an array`);
305
- continue;
306
- }
307
- membershipContents = content["memberships"];
308
- }
309
-
310
- if (membershipContents.length === 0) continue;
311
-
312
- for (const membershipData of membershipContents) {
313
- try {
314
- const membership = new CallMembership(memberEvent, membershipData);
315
-
316
- if (membership.callId !== "" || membership.scope !== "m.room") {
317
- // for now, just ignore anything that isn't a room scope call
318
- logger.info(`Ignoring user-scoped call`);
319
- continue;
320
- }
321
-
322
- if (membership.isExpired()) {
323
- logger.info(`Ignoring expired device membership ${membership.sender}/${membership.deviceId}`);
324
- continue;
325
- }
326
- if (!room.hasMembershipState(membership.sender ?? "", KnownMembership.Join)) {
327
- logger.info(`Ignoring membership of user ${membership.sender} who is not in the room.`);
328
- continue;
329
- }
330
- callMemberships.push(membership);
331
- } catch (e) {
332
- logger.warn("Couldn't construct call membership: ", e);
333
- }
334
- }
335
- }
336
-
337
- callMemberships.sort((a, b) => a.createdTs() - b.createdTs());
338
- if (callMemberships.length > 1) {
339
- logger.debug(
340
- `Call memberships in room ${room.roomId}, in order: `,
341
- callMemberships.map((m) => [m.createdTs(), m.sender]),
342
- );
343
- }
344
-
345
- return callMemberships;
346
- }
347
-
348
- /**
349
- * Return the MatrixRTC session for the room, whether there are currently active members or not
350
- */
351
- public static roomSessionForRoom(client: MatrixClient, room: Room): MatrixRTCSession {
352
- const callMemberships = MatrixRTCSession.callMembershipsForRoom(room);
353
-
354
- return new MatrixRTCSession(client, room, callMemberships);
355
- }
356
-
357
- private constructor(
358
- private readonly client: MatrixClient,
359
- public readonly room: Room,
360
- public memberships: CallMembership[],
361
- ) {
362
- super();
363
- this._callId = memberships[0]?.callId;
364
- const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
365
- roomState?.on(RoomStateEvent.Members, this.onMembershipUpdate);
366
- this.setExpiryTimer();
367
- }
368
-
369
- /*
370
- * Returns true if we intend to be participating in the MatrixRTC session.
371
- * This is determined by checking if the relativeExpiry has been set.
372
- */
373
- public isJoined(): boolean {
374
- return this.relativeExpiry !== undefined;
375
- }
376
-
377
- /**
378
- * Performs cleanup & removes timers for client shutdown
379
- */
380
- public async stop(): Promise<void> {
381
- await this.leaveRoomSession(1000);
382
- if (this.expiryTimeout) {
383
- clearTimeout(this.expiryTimeout);
384
- this.expiryTimeout = undefined;
385
- }
386
- if (this.memberEventTimeout) {
387
- clearTimeout(this.memberEventTimeout);
388
- this.memberEventTimeout = undefined;
389
- }
390
- const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
391
- roomState?.off(RoomStateEvent.Members, this.onMembershipUpdate);
392
- }
393
-
394
- /**
395
- * Announces this user and device as joined to the MatrixRTC session,
396
- * and continues to update the membership event to keep it valid until
397
- * leaveRoomSession() is called
398
- * This will not subscribe to updates: remember to call subscribe() separately if
399
- * desired.
400
- * This method will return immediately and the session will be joined in the background.
401
- *
402
- * @param fociActive - The object representing the active focus. (This depends on the focus type.)
403
- * @param fociPreferred - The list of preferred foci this member proposes to use/knows/has access to.
404
- * For the livekit case this is a list of foci generated from the homeserver well-known, the current rtc session,
405
- * or optionally other room members homeserver well known.
406
- * @param joinConfig - Additional configuration for the joined session.
407
- */
408
- public joinRoomSession(fociPreferred: Focus[], fociActive?: Focus, joinConfig?: JoinSessionConfig): void {
409
- if (this.isJoined()) {
410
- logger.info(`Already joined to session in room ${this.room.roomId}: ignoring join call`);
411
- return;
412
- }
413
-
414
- this.ownFocusActive = fociActive;
415
- this.ownFociPreferred = fociPreferred;
416
- this.joinConfig = joinConfig;
417
- this.relativeExpiry = this.membershipExpiryTimeout;
418
- this.manageMediaKeys = joinConfig?.manageMediaKeys ?? this.manageMediaKeys;
419
- this.useLegacyMemberEvents = joinConfig?.useLegacyMemberEvents ?? this.useLegacyMemberEvents;
420
- this.membershipId = randomString(5);
421
-
422
- logger.info(`Joining call session in room ${this.room.roomId} with manageMediaKeys=${this.manageMediaKeys}`);
423
- if (joinConfig?.manageMediaKeys) {
424
- this.makeNewSenderKey();
425
- this.requestSendCurrentKey();
426
- }
427
- // We don't wait for this, mostly because it may fail and schedule a retry, so this
428
- // function returning doesn't really mean anything at all.
429
- this.triggerCallMembershipEventUpdate();
430
- this.emit(MatrixRTCSessionEvent.JoinStateChanged, true);
431
- }
432
-
433
- /**
434
- * Announces this user and device as having left the MatrixRTC session
435
- * and stops scheduled updates.
436
- * This will not unsubscribe from updates: remember to call unsubscribe() separately if
437
- * desired.
438
- * The membership update required to leave the session will retry if it fails.
439
- * Without network connection the promise will never resolve.
440
- * A timeout can be provided so that there is a guarantee for the promise to resolve.
441
- * @returns Whether the membership update was attempted and did not time out.
442
- */
443
- public async leaveRoomSession(timeout: number | undefined = undefined): Promise<boolean> {
444
- if (!this.isJoined()) {
445
- logger.info(`Not joined to session in room ${this.room.roomId}: ignoring leave call`);
446
- return false;
447
- }
448
-
449
- const userId = this.client.getUserId();
450
- const deviceId = this.client.getDeviceId();
451
-
452
- if (!userId) throw new Error("No userId");
453
- if (!deviceId) throw new Error("No deviceId");
454
-
455
- // clear our encryption keys as we're done with them now (we'll
456
- // make new keys if we rejoin). We leave keys for other participants
457
- // as they may still be using the same ones.
458
- this.encryptionKeys.set(getParticipantId(userId, deviceId), []);
459
-
460
- if (this.makeNewKeyTimeout !== undefined) {
461
- clearTimeout(this.makeNewKeyTimeout);
462
- this.makeNewKeyTimeout = undefined;
463
- }
464
- for (const t of this.setNewKeyTimeouts) {
465
- clearTimeout(t);
466
- }
467
- this.setNewKeyTimeouts.clear();
468
-
469
- logger.info(`Leaving call session in room ${this.room.roomId}`);
470
- this.joinConfig = undefined;
471
- this.relativeExpiry = undefined;
472
- this.ownFocusActive = undefined;
473
- this.manageMediaKeys = false;
474
- this.membershipId = undefined;
475
- this.emit(MatrixRTCSessionEvent.JoinStateChanged, false);
476
-
477
- if (timeout) {
478
- // The sleep promise returns the string 'timeout' and the membership update void
479
- // A success implies that the membership update was quicker then the timeout.
480
- const raceResult = await Promise.race([this.triggerCallMembershipEventUpdate(), sleep(timeout, "timeout")]);
481
- return raceResult !== "timeout";
482
- } else {
483
- await this.triggerCallMembershipEventUpdate();
484
- return true;
485
- }
486
- }
487
-
488
- public getActiveFocus(): Focus | undefined {
489
- if (this.ownFocusActive && isLivekitFocusActive(this.ownFocusActive)) {
490
- // A livekit active focus
491
- if (this.ownFocusActive.focus_selection === "oldest_membership") {
492
- const oldestMembership = this.getOldestMembership();
493
- return oldestMembership?.getPreferredFoci()[0];
494
- }
495
- }
496
- if (!this.ownFocusActive) {
497
- // we use the legacy call.member events so default to oldest member
498
- const oldestMembership = this.getOldestMembership();
499
- return oldestMembership?.getPreferredFoci()[0];
500
- }
501
- }
502
-
503
- /**
504
- * Re-emit an EncryptionKeyChanged event for each tracked encryption key. This can be used to export
505
- * the keys.
506
- */
507
- public reemitEncryptionKeys(): void {
508
- this.encryptionKeys.forEach((keys, participantId) => {
509
- keys.forEach((key, index) => {
510
- this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, key.key, index, participantId);
511
- });
512
- });
513
- }
514
-
515
- /**
516
- * Get the known encryption keys for a given participant device.
517
- *
518
- * @param userId the user ID of the participant
519
- * @param deviceId the device ID of the participant
520
- * @returns The encryption keys for the given participant, or undefined if they are not known.
521
- *
522
- * @deprecated This will be made private in a future release.
523
- */
524
- public getKeysForParticipant(userId: string, deviceId: string): Array<Uint8Array> | undefined {
525
- return this.getKeysForParticipantInternal(userId, deviceId);
526
- }
527
-
528
- private getKeysForParticipantInternal(userId: string, deviceId: string): Array<Uint8Array> | undefined {
529
- return this.encryptionKeys.get(getParticipantId(userId, deviceId))?.map((entry) => entry.key);
530
- }
531
-
532
- /**
533
- * A map of keys used to encrypt and decrypt (we are using a symmetric
534
- * cipher) given participant's media. This also includes our own key
535
- *
536
- * @deprecated This will be made private in a future release.
537
- */
538
- public getEncryptionKeys(): IterableIterator<[string, Array<Uint8Array>]> {
539
- // the returned array doesn't contain the timestamps
540
- return Array.from(this.encryptionKeys.entries())
541
- .map(([participantId, keys]): [string, Uint8Array[]] => [participantId, keys.map((k) => k.key)])
542
- .values();
543
- }
544
-
545
- private getNewEncryptionKeyIndex(): number {
546
- if (this.currentEncryptionKeyIndex === -1) {
547
- return 0;
548
- }
549
-
550
- // maximum key index is 255
551
- return (this.currentEncryptionKeyIndex + 1) % 256;
552
- }
553
-
554
- /**
555
- * Sets an encryption key at a specified index for a participant.
556
- * The encryption keys for the local participant are also stored here under the
557
- * user and device ID of the local participant.
558
- * If the key is older than the existing key at the index, it will be ignored.
559
- * @param userId - The user ID of the participant
560
- * @param deviceId - Device ID of the participant
561
- * @param encryptionKeyIndex - The index of the key to set
562
- * @param encryptionKeyString - The string representation of the key to set in base64
563
- * @param timestamp - The timestamp of the key. We assume that these are monotonic for each participant device.
564
- * @param delayBeforeUse - If true, delay before emitting a key changed event. Useful when setting
565
- * encryption keys for the local participant to allow time for the key to
566
- * be distributed.
567
- */
568
- private setEncryptionKey(
569
- userId: string,
570
- deviceId: string,
571
- encryptionKeyIndex: number,
572
- encryptionKeyString: string,
573
- timestamp: number,
574
- delayBeforeUse = false,
575
- ): void {
576
- const keyBin = decodeBase64(encryptionKeyString);
577
-
578
- const participantId = getParticipantId(userId, deviceId);
579
- if (!this.encryptionKeys.has(participantId)) {
580
- this.encryptionKeys.set(participantId, []);
581
- }
582
- const participantKeys = this.encryptionKeys.get(participantId)!;
583
-
584
- const existingKeyAtIndex = participantKeys[encryptionKeyIndex];
585
-
586
- if (existingKeyAtIndex) {
587
- if (existingKeyAtIndex.timestamp > timestamp) {
588
- logger.info(
589
- `Ignoring new key at index ${encryptionKeyIndex} for ${participantId} as it is older than existing known key`,
590
- );
591
- return;
592
- }
593
-
594
- if (keysEqual(existingKeyAtIndex.key, keyBin)) {
595
- existingKeyAtIndex.timestamp = timestamp;
596
- return;
597
- }
598
- }
599
-
600
- participantKeys[encryptionKeyIndex] = {
601
- key: keyBin,
602
- timestamp,
603
- };
604
-
605
- if (delayBeforeUse) {
606
- const useKeyTimeout = setTimeout(() => {
607
- this.setNewKeyTimeouts.delete(useKeyTimeout);
608
- logger.info(`Delayed-emitting key changed event for ${participantId} idx ${encryptionKeyIndex}`);
609
- if (userId === this.client.getUserId() && deviceId === this.client.getDeviceId()) {
610
- this.currentEncryptionKeyIndex = encryptionKeyIndex;
611
- }
612
- this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, keyBin, encryptionKeyIndex, participantId);
613
- }, this.useKeyDelay);
614
- this.setNewKeyTimeouts.add(useKeyTimeout);
615
- } else {
616
- if (userId === this.client.getUserId() && deviceId === this.client.getDeviceId()) {
617
- this.currentEncryptionKeyIndex = encryptionKeyIndex;
618
- }
619
- this.emit(MatrixRTCSessionEvent.EncryptionKeyChanged, keyBin, encryptionKeyIndex, participantId);
620
- }
621
- }
622
-
623
- /**
624
- * Generate a new sender key and add it at the next available index
625
- * @param delayBeforeUse - If true, wait for a short period before setting the key for the
626
- * media encryptor to use. If false, set the key immediately.
627
- * @returns The index of the new key
628
- */
629
- private makeNewSenderKey(delayBeforeUse = false): number {
630
- const userId = this.client.getUserId();
631
- const deviceId = this.client.getDeviceId();
632
-
633
- if (!userId) throw new Error("No userId");
634
- if (!deviceId) throw new Error("No deviceId");
635
-
636
- const encryptionKey = secureRandomBase64Url(16);
637
- const encryptionKeyIndex = this.getNewEncryptionKeyIndex();
638
- logger.info("Generated new key at index " + encryptionKeyIndex);
639
- this.setEncryptionKey(userId, deviceId, encryptionKeyIndex, encryptionKey, Date.now(), delayBeforeUse);
640
- return encryptionKeyIndex;
641
- }
642
-
643
- /**
644
- * Requests that we resend our current keys to the room. May send a keys event immediately
645
- * or queue for alter if one has already been sent recently.
646
- */
647
- private requestSendCurrentKey(): void {
648
- if (!this.manageMediaKeys) return;
649
-
650
- if (
651
- this.lastEncryptionKeyUpdateRequest &&
652
- this.lastEncryptionKeyUpdateRequest + this.updateEncryptionKeyThrottle > Date.now()
653
- ) {
654
- logger.info("Last encryption key event sent too recently: postponing");
655
- if (this.keysEventUpdateTimeout === undefined) {
656
- this.keysEventUpdateTimeout = setTimeout(
657
- this.sendEncryptionKeysEvent,
658
- this.updateEncryptionKeyThrottle,
659
- );
660
- }
661
- return;
662
- }
663
-
664
- this.sendEncryptionKeysEvent();
665
- }
666
-
667
- /**
668
- * Re-sends the encryption keys room event
669
- */
670
- private sendEncryptionKeysEvent = async (indexToSend?: number): Promise<void> => {
671
- if (this.keysEventUpdateTimeout !== undefined) {
672
- clearTimeout(this.keysEventUpdateTimeout);
673
- this.keysEventUpdateTimeout = undefined;
674
- }
675
- this.lastEncryptionKeyUpdateRequest = Date.now();
676
-
677
- if (!this.isJoined()) return;
678
-
679
- logger.info(`Sending encryption keys event. indexToSend=${indexToSend}`);
680
-
681
- const userId = this.client.getUserId();
682
- const deviceId = this.client.getDeviceId();
683
-
684
- if (!userId) throw new Error("No userId");
685
- if (!deviceId) throw new Error("No deviceId");
686
-
687
- const myKeys = this.getKeysForParticipant(userId, deviceId);
688
-
689
- if (!myKeys) {
690
- logger.warn("Tried to send encryption keys event but no keys found!");
691
- return;
692
- }
693
-
694
- if (typeof indexToSend !== "number" && this.currentEncryptionKeyIndex === -1) {
695
- logger.warn("Tried to send encryption keys event but no current key index found!");
696
- return;
697
- }
698
-
699
- const keyIndexToSend = indexToSend ?? this.currentEncryptionKeyIndex;
700
- const keyToSend = myKeys[keyIndexToSend];
701
-
702
- try {
703
- const content: EncryptionKeysEventContent = {
704
- keys: [
705
- {
706
- index: keyIndexToSend,
707
- key: encodeUnpaddedBase64(keyToSend),
708
- },
709
- ],
710
- device_id: deviceId,
711
- call_id: "",
712
- sent_ts: Date.now(),
713
- };
714
-
715
- this.statistics.counters.roomEventEncryptionKeysSent += 1;
716
-
717
- await this.client.sendEvent(this.room.roomId, EventType.CallEncryptionKeysPrefix, content);
718
-
719
- logger.debug(
720
- `Embedded-E2EE-LOG updateEncryptionKeyEvent participantId=${userId}:${deviceId} numKeys=${myKeys.length} currentKeyIndex=${this.currentEncryptionKeyIndex} keyIndexToSend=${keyIndexToSend}`,
721
- this.encryptionKeys,
722
- );
723
- } catch (error) {
724
- const matrixError = error as MatrixError;
725
- if (matrixError.event) {
726
- // cancel the pending event: we'll just generate a new one with our latest
727
- // keys when we resend
728
- this.client.cancelPendingEvent(matrixError.event);
729
- }
730
- if (this.keysEventUpdateTimeout === undefined) {
731
- const resendDelay = safeGetRetryAfterMs(matrixError, 5000);
732
- logger.warn(`Failed to send m.call.encryption_key, retrying in ${resendDelay}`, error);
733
- this.keysEventUpdateTimeout = setTimeout(this.sendEncryptionKeysEvent, resendDelay);
734
- } else {
735
- logger.info("Not scheduling key resend as another re-send is already pending");
736
- }
737
- }
738
- };
739
-
740
- /**
741
- * Sets a timer for the soonest membership expiry
742
- */
743
- private setExpiryTimer(): void {
744
- if (this.expiryTimeout) {
745
- clearTimeout(this.expiryTimeout);
746
- this.expiryTimeout = undefined;
747
- }
748
-
749
- let soonestExpiry;
750
- for (const membership of this.memberships) {
751
- const thisExpiry = membership.getMsUntilExpiry();
752
- // If getMsUntilExpiry is undefined we have a MSC4143 (MatrixRTC) compliant event - it never expires
753
- // but will be reliably resent on disconnect.
754
- if (thisExpiry !== undefined && (soonestExpiry === undefined || thisExpiry < soonestExpiry)) {
755
- soonestExpiry = thisExpiry;
756
- }
757
- }
758
-
759
- if (soonestExpiry != undefined) {
760
- this.expiryTimeout = setTimeout(this.onMembershipUpdate, soonestExpiry);
761
- }
762
- }
763
-
764
- public getOldestMembership(): CallMembership | undefined {
765
- return this.memberships[0];
766
- }
767
-
768
- public getFocusInUse(): Focus | undefined {
769
- const oldestMembership = this.getOldestMembership();
770
- if (oldestMembership?.getFocusSelection() === "oldest_membership") {
771
- return oldestMembership.getPreferredFoci()[0];
772
- }
773
- }
774
-
775
- /**
776
- * Process `m.call.encryption_keys` events to track the encryption keys for call participants.
777
- * This should be called each time the relevant event is received from a room timeline.
778
- * If the event is malformed then it will be logged and ignored.
779
- *
780
- * @param event the event to process
781
- */
782
- public onCallEncryption = (event: MatrixEvent): void => {
783
- const userId = event.getSender();
784
- const content = event.getContent<EncryptionKeysEventContent>();
785
-
786
- const deviceId = content["device_id"];
787
- const callId = content["call_id"];
788
-
789
- if (!userId) {
790
- logger.warn(`Received m.call.encryption_keys with no userId: callId=${callId}`);
791
- return;
792
- }
793
-
794
- // We currently only handle callId = "" (which is the default for room scoped calls)
795
- if (callId !== "") {
796
- logger.warn(
797
- `Received m.call.encryption_keys with unsupported callId: userId=${userId}, deviceId=${deviceId}, callId=${callId}`,
798
- );
799
- return;
800
- }
801
-
802
- if (!Array.isArray(content.keys)) {
803
- logger.warn(`Received m.call.encryption_keys where keys wasn't an array: callId=${callId}`);
804
- return;
805
- }
806
-
807
- if (userId === this.client.getUserId() && deviceId === this.client.getDeviceId()) {
808
- // We store our own sender key in the same set along with keys from others, so it's
809
- // important we don't allow our own keys to be set by one of these events (apart from
810
- // the fact that we don't need it anyway because we already know our own keys).
811
- logger.info("Ignoring our own keys event");
812
- return;
813
- }
814
-
815
- this.statistics.counters.roomEventEncryptionKeysReceived += 1;
816
- const age = Date.now() - (typeof content.sent_ts === "number" ? content.sent_ts : event.getTs());
817
- this.statistics.totals.roomEventEncryptionKeysReceivedTotalAge += age;
818
-
819
- for (const key of content.keys) {
820
- if (!key) {
821
- logger.info("Ignoring false-y key in keys event");
822
- continue;
823
- }
824
-
825
- const encryptionKey = key.key;
826
- const encryptionKeyIndex = key.index;
827
-
828
- if (
829
- !encryptionKey ||
830
- encryptionKeyIndex === undefined ||
831
- encryptionKeyIndex === null ||
832
- callId === undefined ||
833
- callId === null ||
834
- typeof deviceId !== "string" ||
835
- typeof callId !== "string" ||
836
- typeof encryptionKey !== "string" ||
837
- typeof encryptionKeyIndex !== "number"
838
- ) {
839
- logger.warn(
840
- `Malformed call encryption_key: userId=${userId}, deviceId=${deviceId}, encryptionKeyIndex=${encryptionKeyIndex} callId=${callId}`,
841
- );
842
- } else {
843
- logger.debug(
844
- `Embedded-E2EE-LOG onCallEncryption userId=${userId}:${deviceId} encryptionKeyIndex=${encryptionKeyIndex} age=${age}ms`,
845
- this.encryptionKeys,
846
- );
847
- this.setEncryptionKey(userId, deviceId, encryptionKeyIndex, encryptionKey, event.getTs());
848
- }
849
- }
850
- };
851
-
852
- private isMyMembership = (m: CallMembership): boolean =>
853
- m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();
854
-
855
- /**
856
- * Examines the latest call memberships and handles any encryption key sending or rotation that is needed.
857
- *
858
- * This function should be called when the room members or call memberships might have changed.
859
- */
860
- public onMembershipUpdate = (): void => {
861
- const oldMemberships = this.memberships;
862
- this.memberships = MatrixRTCSession.callMembershipsForRoom(this.room);
863
-
864
- this._callId = this._callId ?? this.memberships[0]?.callId;
865
-
866
- const changed =
867
- oldMemberships.length != this.memberships.length ||
868
- oldMemberships.some((m, i) => !CallMembership.equal(m, this.memberships[i]));
869
-
870
- if (changed) {
871
- logger.info(`Memberships for call in room ${this.room.roomId} have changed: emitting`);
872
- this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);
873
-
874
- if (this.isJoined() && !this.memberships.some(this.isMyMembership)) {
875
- logger.warn("Missing own membership: force re-join");
876
- // TODO: Should this be awaited? And is there anything to tell the focus?
877
- this.triggerCallMembershipEventUpdate();
878
- }
879
- }
880
-
881
- if (this.manageMediaKeys && this.isJoined() && this.makeNewKeyTimeout === undefined) {
882
- const oldMembershipIds = new Set(
883
- oldMemberships.filter((m) => !this.isMyMembership(m)).map(getParticipantIdFromMembership),
884
- );
885
- const newMembershipIds = new Set(
886
- this.memberships.filter((m) => !this.isMyMembership(m)).map(getParticipantIdFromMembership),
887
- );
888
-
889
- // We can use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/symmetricDifference
890
- // for this once available
891
- const anyLeft = Array.from(oldMembershipIds).some((x) => !newMembershipIds.has(x));
892
- const anyJoined = Array.from(newMembershipIds).some((x) => !oldMembershipIds.has(x));
893
-
894
- const oldFingerprints = this.lastMembershipFingerprints;
895
- // always store the fingerprints of these latest memberships
896
- this.storeLastMembershipFingerprints();
897
-
898
- if (anyLeft) {
899
- logger.debug(`Member(s) have left: queueing sender key rotation`);
900
- this.makeNewKeyTimeout = setTimeout(this.onRotateKeyTimeout, this.makeKeyDelay);
901
- } else if (anyJoined) {
902
- logger.debug(`New member(s) have joined: re-sending keys`);
903
- this.requestSendCurrentKey();
904
- } else if (oldFingerprints) {
905
- // does it look like any of the members have updated their memberships?
906
- const newFingerprints = this.lastMembershipFingerprints!;
907
-
908
- // We can use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/symmetricDifference
909
- // for this once available
910
- const candidateUpdates =
911
- Array.from(oldFingerprints).some((x) => !newFingerprints.has(x)) ||
912
- Array.from(newFingerprints).some((x) => !oldFingerprints.has(x));
913
- if (candidateUpdates) {
914
- logger.debug(`Member(s) have updated/reconnected: re-sending keys to everyone`);
915
- this.requestSendCurrentKey();
916
- }
917
- }
918
- }
919
-
920
- this.setExpiryTimer();
921
- };
922
-
923
- private storeLastMembershipFingerprints(): void {
924
- this.lastMembershipFingerprints = new Set(
925
- this.memberships
926
- .filter((m) => !this.isMyMembership(m))
927
- .map((m) => `${getParticipantIdFromMembership(m)}:${m.membershipID}:${m.createdTs()}`),
928
- );
929
- }
930
-
931
- /**
932
- * Constructs our own membership
933
- * @param prevMembership - The previous value of our call membership, if any
934
- */
935
- private makeMyMembershipLegacy(deviceId: string, prevMembership?: CallMembership): CallMembershipDataLegacy {
936
- if (this.relativeExpiry === undefined) {
937
- throw new Error("Tried to create our own membership event when we're not joined!");
938
- }
939
- if (this.membershipId === undefined) {
940
- throw new Error("Tried to create our own membership event when we have no membership ID!");
941
- }
942
- const createdTs = prevMembership?.createdTs();
943
- return {
944
- call_id: "",
945
- scope: "m.room",
946
- application: "m.call",
947
- device_id: deviceId,
948
- expires: this.relativeExpiry,
949
- // TODO: Date.now() should be the origin_server_ts (now).
950
- expires_ts: this.relativeExpiry + (createdTs ?? Date.now()),
951
- // we use the fociPreferred since this is the list of foci.
952
- // it is named wrong in the Legacy events.
953
- foci_active: this.ownFociPreferred,
954
- membershipID: this.membershipId,
955
- ...(createdTs ? { created_ts: createdTs } : {}),
956
- };
957
- }
958
- /**
959
- * Constructs our own membership
960
- */
961
- private makeMyMembership(deviceId: string): SessionMembershipData {
962
- return {
963
- call_id: "",
964
- scope: "m.room",
965
- application: "m.call",
966
- device_id: deviceId,
967
- focus_active: { type: "livekit", focus_selection: "oldest_membership" },
968
- foci_preferred: this.ownFociPreferred ?? [],
969
- };
970
- }
971
-
972
- /**
973
- * Returns true if our membership event needs to be updated
974
- */
975
- private membershipEventNeedsUpdate(
976
- myPrevMembershipData?: CallMembershipData,
977
- myPrevMembership?: CallMembership,
978
- ): boolean {
979
- if (myPrevMembership && myPrevMembership.getMsUntilExpiry() === undefined) return false;
980
-
981
- // Need to update if there's a membership for us but we're not joined (valid or otherwise)
982
- if (!this.isJoined()) return !!myPrevMembershipData;
983
-
984
- // ...or if we are joined, but there's no valid membership event
985
- if (!myPrevMembership) return true;
986
-
987
- const expiryTime = myPrevMembership.getMsUntilExpiry();
988
- if (expiryTime !== undefined && expiryTime < this.membershipExpiryTimeout / 2) {
989
- // ...or if the expiry time needs bumping
990
- this.relativeExpiry! += this.membershipExpiryTimeout;
991
- return true;
992
- }
993
-
994
- return false;
995
- }
996
-
997
- private makeNewMembership(deviceId: string): SessionMembershipData | {} {
998
- // If we're joined, add our own
999
- if (this.isJoined()) {
1000
- return this.makeMyMembership(deviceId);
1001
- }
1002
- return {};
1003
- }
1004
- /**
1005
- * Makes a new membership list given the old list along with this user's previous membership event
1006
- * (if any) and this device's previous membership (if any)
1007
- */
1008
- private makeNewLegacyMemberships(
1009
- oldMemberships: CallMembershipData[],
1010
- localDeviceId: string,
1011
- myCallMemberEvent?: MatrixEvent,
1012
- myPrevMembership?: CallMembership,
1013
- ): ExperimentalGroupCallRoomMemberState {
1014
- const filterExpired = (m: CallMembershipData): boolean => {
1015
- let membershipObj;
1016
- try {
1017
- membershipObj = new CallMembership(myCallMemberEvent!, m);
1018
- } catch {
1019
- return false;
1020
- }
1021
-
1022
- return !membershipObj.isExpired();
1023
- };
1024
-
1025
- const transformMemberships = (m: CallMembershipData): CallMembershipData => {
1026
- if (m.created_ts === undefined) {
1027
- // we need to fill this in with the origin_server_ts from its original event
1028
- m.created_ts = myCallMemberEvent!.getTs();
1029
- }
1030
-
1031
- return m;
1032
- };
1033
-
1034
- // Filter our any invalid or expired memberships, and also our own - we'll add that back in next
1035
- let newMemberships = oldMemberships.filter(filterExpired).filter((m) => m.device_id !== localDeviceId);
1036
-
1037
- // Fix up any memberships that need their created_ts adding
1038
- newMemberships = newMemberships.map(transformMemberships);
1039
-
1040
- // If we're joined, add our own
1041
- if (this.isJoined()) {
1042
- newMemberships.push(this.makeMyMembershipLegacy(localDeviceId, myPrevMembership));
1043
- }
1044
-
1045
- return { memberships: newMemberships };
1046
- }
1047
-
1048
- private triggerCallMembershipEventUpdate = async (): Promise<void> => {
1049
- // TODO: Should this await on a shared promise?
1050
- if (this.updateCallMembershipRunning) {
1051
- this.needCallMembershipUpdate = true;
1052
- return;
1053
- }
1054
-
1055
- this.updateCallMembershipRunning = true;
1056
- try {
1057
- // if anything triggers an update while the update is running, do another update afterwards
1058
- do {
1059
- this.needCallMembershipUpdate = false;
1060
- await this.updateCallMembershipEvent();
1061
- } while (this.needCallMembershipUpdate);
1062
- } finally {
1063
- this.updateCallMembershipRunning = false;
1064
- }
1065
- };
1066
-
1067
- private async updateCallMembershipEvent(): Promise<void> {
1068
- if (this.memberEventTimeout) {
1069
- clearTimeout(this.memberEventTimeout);
1070
- this.memberEventTimeout = undefined;
1071
- }
1072
-
1073
- const roomState = this.room.getLiveTimeline().getState(EventTimeline.FORWARDS);
1074
- if (!roomState) throw new Error("Couldn't get room state for room " + this.room.roomId);
1075
-
1076
- const localUserId = this.client.getUserId();
1077
- const localDeviceId = this.client.getDeviceId();
1078
- if (!localUserId || !localDeviceId) throw new Error("User ID or device ID was null!");
1079
-
1080
- const callMemberEvents = roomState.events.get(EventType.GroupCallMemberPrefix);
1081
- const legacy = this.stateEventsContainOngoingLegacySession(callMemberEvents);
1082
- let newContent: {} | ExperimentalGroupCallRoomMemberState | SessionMembershipData = {};
1083
- if (legacy) {
1084
- const myCallMemberEvent = callMemberEvents?.get(localUserId);
1085
- const content = myCallMemberEvent?.getContent() ?? {};
1086
- let myPrevMembership: CallMembership | undefined;
1087
- // We know its CallMembershipDataLegacy
1088
- const memberships: CallMembershipDataLegacy[] = Array.isArray(content["memberships"])
1089
- ? content["memberships"]
1090
- : [];
1091
- const myPrevMembershipData = memberships.find((m) => m.device_id === localDeviceId);
1092
- try {
1093
- if (
1094
- myCallMemberEvent &&
1095
- myPrevMembershipData &&
1096
- isLegacyCallMembershipData(myPrevMembershipData) &&
1097
- myPrevMembershipData.membershipID === this.membershipId
1098
- ) {
1099
- myPrevMembership = new CallMembership(myCallMemberEvent, myPrevMembershipData);
1100
- }
1101
- } catch (e) {
1102
- // This would indicate a bug or something weird if our own call membership
1103
- // wasn't valid
1104
- logger.warn("Our previous call membership was invalid - this shouldn't happen.", e);
1105
- }
1106
- if (myPrevMembership) {
1107
- logger.debug(`${myPrevMembership.getMsUntilExpiry()} until our membership expires`);
1108
- }
1109
- if (!this.membershipEventNeedsUpdate(myPrevMembershipData, myPrevMembership)) {
1110
- // nothing to do - reschedule the check again
1111
- this.memberEventTimeout = setTimeout(
1112
- this.triggerCallMembershipEventUpdate,
1113
- this.memberEventCheckPeriod,
1114
- );
1115
- return;
1116
- }
1117
- newContent = this.makeNewLegacyMemberships(memberships, localDeviceId, myCallMemberEvent, myPrevMembership);
1118
- } else {
1119
- newContent = this.makeNewMembership(localDeviceId);
1120
- }
1121
-
1122
- try {
1123
- if (legacy) {
1124
- await this.client.sendStateEvent(
1125
- this.room.roomId,
1126
- EventType.GroupCallMemberPrefix,
1127
- newContent,
1128
- localUserId,
1129
- );
1130
- if (this.isJoined()) {
1131
- // check periodically to see if we need to refresh our member event
1132
- this.memberEventTimeout = setTimeout(
1133
- this.triggerCallMembershipEventUpdate,
1134
- this.memberEventCheckPeriod,
1135
- );
1136
- }
1137
- } else if (this.isJoined()) {
1138
- const stateKey = this.makeMembershipStateKey(localUserId, localDeviceId);
1139
- const prepareDelayedDisconnection = async (): Promise<void> => {
1140
- try {
1141
- const res = await resendIfRateLimited(() =>
1142
- this.client._unstable_sendDelayedStateEvent(
1143
- this.room.roomId,
1144
- {
1145
- delay: this.membershipServerSideExpiryTimeout,
1146
- },
1147
- EventType.GroupCallMemberPrefix,
1148
- {}, // leave event
1149
- stateKey,
1150
- ),
1151
- );
1152
- this.disconnectDelayId = res.delay_id;
1153
- } catch (e) {
1154
- if (
1155
- e instanceof MatrixError &&
1156
- e.errcode === "M_UNKNOWN" &&
1157
- e.data["org.matrix.msc4140.errcode"] === "M_MAX_DELAY_EXCEEDED"
1158
- ) {
1159
- const maxDelayAllowed = e.data["org.matrix.msc4140.max_delay"];
1160
- if (
1161
- typeof maxDelayAllowed === "number" &&
1162
- this.membershipServerSideExpiryTimeout > maxDelayAllowed
1163
- ) {
1164
- this.membershipServerSideExpiryTimeoutOverride = maxDelayAllowed;
1165
- return prepareDelayedDisconnection();
1166
- }
1167
- }
1168
- logger.error("Failed to prepare delayed disconnection event:", e);
1169
- }
1170
- };
1171
- await prepareDelayedDisconnection();
1172
- // Send join event _after_ preparing the delayed disconnection event
1173
- await resendIfRateLimited(() =>
1174
- this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, newContent, stateKey),
1175
- );
1176
- // If sending state cancels your own delayed state, prepare another delayed state
1177
- // TODO: Remove this once MSC4140 is stable & doesn't cancel own delayed state
1178
- if (this.disconnectDelayId !== undefined) {
1179
- try {
1180
- const knownDisconnectDelayId = this.disconnectDelayId;
1181
- await resendIfRateLimited(() =>
1182
- this.client._unstable_updateDelayedEvent(
1183
- knownDisconnectDelayId,
1184
- UpdateDelayedEventAction.Restart,
1185
- ),
1186
- );
1187
- } catch (e) {
1188
- logger.warn("Failed to update delayed disconnection event, prepare it again:", e);
1189
- this.disconnectDelayId = undefined;
1190
- await prepareDelayedDisconnection();
1191
- }
1192
- }
1193
- if (this.disconnectDelayId !== undefined) {
1194
- this.scheduleDelayDisconnection();
1195
- }
1196
- } else {
1197
- let sentDelayedDisconnect = false;
1198
- if (this.disconnectDelayId !== undefined) {
1199
- try {
1200
- const knownDisconnectDelayId = this.disconnectDelayId;
1201
- await resendIfRateLimited(() =>
1202
- this.client._unstable_updateDelayedEvent(
1203
- knownDisconnectDelayId,
1204
- UpdateDelayedEventAction.Send,
1205
- ),
1206
- );
1207
- sentDelayedDisconnect = true;
1208
- } catch (e) {
1209
- logger.error("Failed to send our delayed disconnection event:", e);
1210
- }
1211
- this.disconnectDelayId = undefined;
1212
- }
1213
- if (!sentDelayedDisconnect) {
1214
- await resendIfRateLimited(() =>
1215
- this.client.sendStateEvent(
1216
- this.room.roomId,
1217
- EventType.GroupCallMemberPrefix,
1218
- {},
1219
- this.makeMembershipStateKey(localUserId, localDeviceId),
1220
- ),
1221
- );
1222
- }
1223
- }
1224
- logger.info("Sent updated call member event.");
1225
- } catch (e) {
1226
- const resendDelay = this.callMemberEventRetryDelayMinimum + Math.random() * this.callMemberEventRetryJitter;
1227
- logger.warn(`Failed to send call member event (retrying in ${resendDelay}): ${e}`);
1228
- await sleep(resendDelay);
1229
- await this.triggerCallMembershipEventUpdate();
1230
- }
1231
- }
1232
-
1233
- private scheduleDelayDisconnection(): void {
1234
- this.memberEventTimeout = setTimeout(this.delayDisconnection, this.membershipKeepAlivePeriod);
1235
- }
1236
-
1237
- private readonly delayDisconnection = async (): Promise<void> => {
1238
- try {
1239
- const knownDisconnectDelayId = this.disconnectDelayId!;
1240
- await resendIfRateLimited(() =>
1241
- this.client._unstable_updateDelayedEvent(knownDisconnectDelayId, UpdateDelayedEventAction.Restart),
1242
- );
1243
- this.scheduleDelayDisconnection();
1244
- } catch (e) {
1245
- logger.error("Failed to delay our disconnection event:", e);
1246
- }
1247
- };
1248
-
1249
- private stateEventsContainOngoingLegacySession(callMemberEvents: Map<string, MatrixEvent> | undefined): boolean {
1250
- if (!callMemberEvents?.size) {
1251
- return this.useLegacyMemberEvents;
1252
- }
1253
-
1254
- let containsAnyOngoingSession = false;
1255
- let containsUnknownOngoingSession = false;
1256
- for (const callMemberEvent of callMemberEvents.values()) {
1257
- const content = callMemberEvent.getContent();
1258
- if (Array.isArray(content["memberships"])) {
1259
- for (const membership of content.memberships) {
1260
- if (!new CallMembership(callMemberEvent, membership).isExpired()) {
1261
- return true;
1262
- }
1263
- }
1264
- } else if (Object.keys(content).length > 0) {
1265
- containsAnyOngoingSession ||= true;
1266
- containsUnknownOngoingSession ||= !("focus_active" in content);
1267
- }
1268
- }
1269
- return containsAnyOngoingSession && !containsUnknownOngoingSession ? false : this.useLegacyMemberEvents;
1270
- }
1271
-
1272
- private makeMembershipStateKey(localUserId: string, localDeviceId: string): string {
1273
- const stateKey = `${localUserId}_${localDeviceId}`;
1274
- if (/^org\.matrix\.msc(3757|3779)\b/.exec(this.room.getVersion())) {
1275
- return stateKey;
1276
- } else {
1277
- return `_${stateKey}`;
1278
- }
1279
- }
1280
-
1281
- private onRotateKeyTimeout = (): void => {
1282
- if (!this.manageMediaKeys) return;
1283
-
1284
- this.makeNewKeyTimeout = undefined;
1285
- logger.info("Making new sender key for key rotation");
1286
- const newKeyIndex = this.makeNewSenderKey(true);
1287
- // send immediately: if we're about to start sending with a new key, it's
1288
- // important we get it out to others as soon as we can.
1289
- this.sendEncryptionKeysEvent(newKeyIndex);
1290
- };
1291
- }
1292
-
1293
- async function resendIfRateLimited<T>(func: () => Promise<T>, numRetriesAllowed: number = 1): Promise<T> {
1294
- // eslint-disable-next-line no-constant-condition
1295
- while (true) {
1296
- try {
1297
- return await func();
1298
- } catch (e) {
1299
- if (numRetriesAllowed > 0 && e instanceof HTTPError && e.isRateLimitError()) {
1300
- numRetriesAllowed--;
1301
- let resendDelay: number;
1302
- const defaultMs = 5000;
1303
- try {
1304
- resendDelay = e.getRetryAfterMs() ?? defaultMs;
1305
- logger.info(`Rate limited by server, retrying in ${resendDelay}ms`);
1306
- } catch (e) {
1307
- logger.warn(
1308
- `Error while retrieving a rate-limit retry delay, retrying after default delay of ${defaultMs}`,
1309
- e,
1310
- );
1311
- resendDelay = defaultMs;
1312
- }
1313
- await sleep(resendDelay);
1314
- } else {
1315
- throw e;
1316
- }
1317
- }
1318
- }
1319
- }