@unwanted/matrix-sdk-mini 34.12.0 → 36.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (759) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/@types/event.d.ts +25 -19
  3. package/lib/@types/event.d.ts.map +1 -1
  4. package/lib/@types/event.js +5 -0
  5. package/lib/@types/event.js.map +1 -1
  6. package/lib/@types/global.d.js +0 -2
  7. package/lib/@types/global.d.js.map +1 -1
  8. package/lib/autodiscovery.d.ts +1 -1
  9. package/lib/autodiscovery.d.ts.map +1 -1
  10. package/lib/autodiscovery.js.map +1 -1
  11. package/lib/base64.d.ts +3 -6
  12. package/lib/base64.d.ts.map +1 -1
  13. package/lib/base64.js +43 -36
  14. package/lib/base64.js.map +1 -1
  15. package/lib/browser-index.d.ts.map +1 -1
  16. package/lib/browser-index.js +0 -11
  17. package/lib/browser-index.js.map +1 -1
  18. package/lib/client.d.ts +45 -1306
  19. package/lib/client.d.ts.map +1 -1
  20. package/lib/client.js +406 -2963
  21. package/lib/client.js.map +1 -1
  22. package/lib/digest.d.ts +2 -2
  23. package/lib/digest.d.ts.map +1 -1
  24. package/lib/digest.js +2 -2
  25. package/lib/digest.js.map +1 -1
  26. package/lib/embedded.d.ts +2 -23
  27. package/lib/embedded.d.ts.map +1 -1
  28. package/lib/embedded.js +82 -209
  29. package/lib/embedded.js.map +1 -1
  30. package/lib/event-mapper.d.ts.map +1 -1
  31. package/lib/event-mapper.js +0 -4
  32. package/lib/event-mapper.js.map +1 -1
  33. package/lib/feature.d.ts.map +1 -1
  34. package/lib/feature.js +2 -1
  35. package/lib/feature.js.map +1 -1
  36. package/lib/http-api/errors.d.ts +3 -3
  37. package/lib/http-api/errors.js +3 -3
  38. package/lib/http-api/errors.js.map +1 -1
  39. package/lib/http-api/utils.js +2 -2
  40. package/lib/http-api/utils.js.map +1 -1
  41. package/lib/matrix.d.ts +0 -25
  42. package/lib/matrix.d.ts.map +1 -1
  43. package/lib/matrix.js +1 -30
  44. package/lib/matrix.js.map +1 -1
  45. package/lib/models/MSC3089Branch.d.ts.map +1 -1
  46. package/lib/models/MSC3089Branch.js +0 -3
  47. package/lib/models/MSC3089Branch.js.map +1 -1
  48. package/lib/models/event-timeline-set.d.ts +6 -10
  49. package/lib/models/event-timeline-set.d.ts.map +1 -1
  50. package/lib/models/event-timeline-set.js +28 -36
  51. package/lib/models/event-timeline-set.js.map +1 -1
  52. package/lib/models/event-timeline.d.ts +7 -2
  53. package/lib/models/event-timeline.d.ts.map +1 -1
  54. package/lib/models/event-timeline.js +9 -30
  55. package/lib/models/event-timeline.js.map +1 -1
  56. package/lib/models/event.d.ts +12 -96
  57. package/lib/models/event.d.ts.map +1 -1
  58. package/lib/models/event.js +59 -286
  59. package/lib/models/event.js.map +1 -1
  60. package/lib/models/invites-ignorer-types.d.ts +27 -0
  61. package/lib/models/invites-ignorer-types.d.ts.map +1 -0
  62. package/lib/models/invites-ignorer-types.js +36 -0
  63. package/lib/models/invites-ignorer-types.js.map +1 -0
  64. package/lib/models/invites-ignorer.d.ts +2 -26
  65. package/lib/models/invites-ignorer.d.ts.map +1 -1
  66. package/lib/models/invites-ignorer.js +2 -27
  67. package/lib/models/invites-ignorer.js.map +1 -1
  68. package/lib/models/poll.d.ts.map +1 -1
  69. package/lib/models/poll.js +1 -5
  70. package/lib/models/poll.js.map +1 -1
  71. package/lib/models/relations-container.d.ts.map +1 -1
  72. package/lib/models/relations-container.js +1 -7
  73. package/lib/models/relations-container.js.map +1 -1
  74. package/lib/models/relations.d.ts +0 -1
  75. package/lib/models/relations.d.ts.map +1 -1
  76. package/lib/models/relations.js +0 -8
  77. package/lib/models/relations.js.map +1 -1
  78. package/lib/models/room-member.d.ts +6 -1
  79. package/lib/models/room-member.d.ts.map +1 -1
  80. package/lib/models/room-member.js +7 -1
  81. package/lib/models/room-member.js.map +1 -1
  82. package/lib/models/room-state.d.ts +2 -13
  83. package/lib/models/room-state.d.ts.map +1 -1
  84. package/lib/models/room-state.js +12 -56
  85. package/lib/models/room-state.js.map +1 -1
  86. package/lib/models/room.d.ts +8 -21
  87. package/lib/models/room.d.ts.map +1 -1
  88. package/lib/models/room.js +128 -163
  89. package/lib/models/room.js.map +1 -1
  90. package/lib/models/thread.d.ts.map +1 -1
  91. package/lib/models/thread.js +5 -4
  92. package/lib/models/thread.js.map +1 -1
  93. package/lib/oidc/authorize.d.ts +2 -2
  94. package/lib/oidc/authorize.d.ts.map +1 -1
  95. package/lib/oidc/authorize.js +5 -5
  96. package/lib/oidc/authorize.js.map +1 -1
  97. package/lib/oidc/discovery.d.ts +8 -0
  98. package/lib/oidc/discovery.d.ts.map +1 -1
  99. package/lib/oidc/discovery.js +22 -11
  100. package/lib/oidc/discovery.js.map +1 -1
  101. package/lib/oidc/index.d.ts +3 -4
  102. package/lib/oidc/index.d.ts.map +1 -1
  103. package/lib/oidc/index.js.map +1 -1
  104. package/lib/oidc/register.js +3 -3
  105. package/lib/oidc/register.js.map +1 -1
  106. package/lib/oidc/tokenRefresher.d.ts.map +1 -1
  107. package/lib/oidc/tokenRefresher.js +6 -5
  108. package/lib/oidc/tokenRefresher.js.map +1 -1
  109. package/lib/oidc/validate.d.ts +9 -23
  110. package/lib/oidc/validate.d.ts.map +1 -1
  111. package/lib/oidc/validate.js +13 -28
  112. package/lib/oidc/validate.js.map +1 -1
  113. package/lib/randomstring.d.ts +30 -3
  114. package/lib/randomstring.d.ts.map +1 -1
  115. package/lib/randomstring.js +68 -16
  116. package/lib/randomstring.js.map +1 -1
  117. package/lib/sliding-sync-sdk.d.ts +3 -4
  118. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  119. package/lib/sliding-sync-sdk.js +55 -102
  120. package/lib/sliding-sync-sdk.js.map +1 -1
  121. package/lib/sliding-sync.js +9 -6
  122. package/lib/sliding-sync.js.map +1 -1
  123. package/lib/store/indexeddb-local-backend.js +4 -2
  124. package/lib/store/indexeddb-local-backend.js.map +1 -1
  125. package/lib/store/indexeddb.d.ts +1 -1
  126. package/lib/store/indexeddb.d.ts.map +1 -1
  127. package/lib/store/indexeddb.js.map +1 -1
  128. package/lib/sync-accumulator.d.ts +6 -4
  129. package/lib/sync-accumulator.d.ts.map +1 -1
  130. package/lib/sync-accumulator.js +23 -12
  131. package/lib/sync-accumulator.js.map +1 -1
  132. package/lib/sync.d.ts +10 -13
  133. package/lib/sync.d.ts.map +1 -1
  134. package/lib/sync.js +94 -115
  135. package/lib/sync.js.map +1 -1
  136. package/lib/testing.d.ts +13 -44
  137. package/lib/testing.d.ts.map +1 -1
  138. package/lib/testing.js +36 -99
  139. package/lib/testing.js.map +1 -1
  140. package/lib/types.d.ts +0 -1
  141. package/lib/types.d.ts.map +1 -1
  142. package/lib/types.js.map +1 -1
  143. package/package.json +14 -15
  144. package/src/@types/event.ts +19 -36
  145. package/src/@types/global.d.ts +21 -4
  146. package/src/autodiscovery.ts +1 -1
  147. package/src/base64.ts +38 -40
  148. package/src/browser-index.ts +0 -11
  149. package/src/client.ts +175 -3136
  150. package/src/digest.ts +3 -3
  151. package/src/embedded.ts +43 -149
  152. package/src/event-mapper.ts +0 -4
  153. package/src/feature.ts +1 -0
  154. package/src/http-api/errors.ts +3 -3
  155. package/src/http-api/utils.ts +2 -2
  156. package/src/matrix.ts +0 -41
  157. package/src/models/MSC3089Branch.ts +0 -3
  158. package/src/models/event-timeline-set.ts +17 -38
  159. package/src/models/event-timeline.ts +11 -26
  160. package/src/models/event.ts +54 -295
  161. package/src/models/invites-ignorer-types.ts +48 -0
  162. package/src/models/invites-ignorer.ts +7 -42
  163. package/src/models/poll.ts +0 -6
  164. package/src/models/relations-container.ts +1 -8
  165. package/src/models/relations.ts +0 -8
  166. package/src/models/room-member.ts +16 -1
  167. package/src/models/room-state.ts +4 -37
  168. package/src/models/room.ts +34 -69
  169. package/src/models/thread.ts +4 -3
  170. package/src/oidc/authorize.ts +7 -7
  171. package/src/oidc/discovery.ts +16 -10
  172. package/src/oidc/index.ts +3 -4
  173. package/src/oidc/register.ts +3 -3
  174. package/src/oidc/tokenRefresher.ts +3 -2
  175. package/src/oidc/validate.ts +40 -63
  176. package/src/randomstring.ts +65 -19
  177. package/src/sliding-sync-sdk.ts +10 -83
  178. package/src/sliding-sync.ts +6 -6
  179. package/src/store/indexeddb-local-backend.ts +2 -2
  180. package/src/store/indexeddb.ts +1 -1
  181. package/src/sync-accumulator.ts +33 -16
  182. package/src/sync.ts +112 -143
  183. package/src/testing.ts +36 -103
  184. package/src/types.ts +0 -1
  185. package/CHANGELOG.md +0 -5910
  186. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts +0 -14
  187. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts.map +0 -1
  188. package/lib/@types/AESEncryptedSecretStoragePayload.js +0 -1
  189. package/lib/@types/AESEncryptedSecretStoragePayload.js.map +0 -1
  190. package/lib/@types/crypto.d.ts +0 -47
  191. package/lib/@types/crypto.d.ts.map +0 -1
  192. package/lib/@types/crypto.js +0 -1
  193. package/lib/@types/crypto.js.map +0 -1
  194. package/lib/@types/matrix-sdk-crypto-wasm.d.js +0 -1
  195. package/lib/@types/matrix-sdk-crypto-wasm.d.js.map +0 -1
  196. package/lib/common-crypto/CryptoBackend.d.ts +0 -240
  197. package/lib/common-crypto/CryptoBackend.d.ts.map +0 -1
  198. package/lib/common-crypto/CryptoBackend.js +0 -73
  199. package/lib/common-crypto/CryptoBackend.js.map +0 -1
  200. package/lib/common-crypto/key-passphrase.d.ts +0 -14
  201. package/lib/common-crypto/key-passphrase.d.ts.map +0 -1
  202. package/lib/common-crypto/key-passphrase.js +0 -33
  203. package/lib/common-crypto/key-passphrase.js.map +0 -1
  204. package/lib/crypto/CrossSigning.d.ts +0 -184
  205. package/lib/crypto/CrossSigning.d.ts.map +0 -1
  206. package/lib/crypto/CrossSigning.js +0 -718
  207. package/lib/crypto/CrossSigning.js.map +0 -1
  208. package/lib/crypto/DeviceList.d.ts +0 -216
  209. package/lib/crypto/DeviceList.d.ts.map +0 -1
  210. package/lib/crypto/DeviceList.js +0 -892
  211. package/lib/crypto/DeviceList.js.map +0 -1
  212. package/lib/crypto/EncryptionSetup.d.ts +0 -152
  213. package/lib/crypto/EncryptionSetup.d.ts.map +0 -1
  214. package/lib/crypto/EncryptionSetup.js +0 -356
  215. package/lib/crypto/EncryptionSetup.js.map +0 -1
  216. package/lib/crypto/OlmDevice.d.ts +0 -457
  217. package/lib/crypto/OlmDevice.d.ts.map +0 -1
  218. package/lib/crypto/OlmDevice.js +0 -1241
  219. package/lib/crypto/OlmDevice.js.map +0 -1
  220. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts +0 -109
  221. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts.map +0 -1
  222. package/lib/crypto/OutgoingRoomKeyRequestManager.js +0 -415
  223. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +0 -1
  224. package/lib/crypto/RoomList.d.ts +0 -26
  225. package/lib/crypto/RoomList.d.ts.map +0 -1
  226. package/lib/crypto/RoomList.js +0 -71
  227. package/lib/crypto/RoomList.js.map +0 -1
  228. package/lib/crypto/SecretSharing.d.ts +0 -24
  229. package/lib/crypto/SecretSharing.d.ts.map +0 -1
  230. package/lib/crypto/SecretSharing.js +0 -194
  231. package/lib/crypto/SecretSharing.js.map +0 -1
  232. package/lib/crypto/SecretStorage.d.ts +0 -55
  233. package/lib/crypto/SecretStorage.d.ts.map +0 -1
  234. package/lib/crypto/SecretStorage.js +0 -118
  235. package/lib/crypto/SecretStorage.js.map +0 -1
  236. package/lib/crypto/aes.d.ts +0 -6
  237. package/lib/crypto/aes.d.ts.map +0 -1
  238. package/lib/crypto/aes.js +0 -24
  239. package/lib/crypto/aes.js.map +0 -1
  240. package/lib/crypto/algorithms/base.d.ts +0 -156
  241. package/lib/crypto/algorithms/base.d.ts.map +0 -1
  242. package/lib/crypto/algorithms/base.js +0 -187
  243. package/lib/crypto/algorithms/base.js.map +0 -1
  244. package/lib/crypto/algorithms/index.d.ts +0 -4
  245. package/lib/crypto/algorithms/index.d.ts.map +0 -1
  246. package/lib/crypto/algorithms/index.js +0 -20
  247. package/lib/crypto/algorithms/index.js.map +0 -1
  248. package/lib/crypto/algorithms/megolm.d.ts +0 -385
  249. package/lib/crypto/algorithms/megolm.d.ts.map +0 -1
  250. package/lib/crypto/algorithms/megolm.js +0 -1822
  251. package/lib/crypto/algorithms/megolm.js.map +0 -1
  252. package/lib/crypto/algorithms/olm.d.ts +0 -5
  253. package/lib/crypto/algorithms/olm.d.ts.map +0 -1
  254. package/lib/crypto/algorithms/olm.js +0 -299
  255. package/lib/crypto/algorithms/olm.js.map +0 -1
  256. package/lib/crypto/api.d.ts +0 -32
  257. package/lib/crypto/api.d.ts.map +0 -1
  258. package/lib/crypto/api.js +0 -22
  259. package/lib/crypto/api.js.map +0 -1
  260. package/lib/crypto/backup.d.ts +0 -227
  261. package/lib/crypto/backup.d.ts.map +0 -1
  262. package/lib/crypto/backup.js +0 -824
  263. package/lib/crypto/backup.js.map +0 -1
  264. package/lib/crypto/crypto.d.ts +0 -3
  265. package/lib/crypto/crypto.d.ts.map +0 -1
  266. package/lib/crypto/crypto.js +0 -19
  267. package/lib/crypto/crypto.js.map +0 -1
  268. package/lib/crypto/dehydration.d.ts +0 -34
  269. package/lib/crypto/dehydration.d.ts.map +0 -1
  270. package/lib/crypto/dehydration.js +0 -252
  271. package/lib/crypto/dehydration.js.map +0 -1
  272. package/lib/crypto/device-converter.d.ts +0 -9
  273. package/lib/crypto/device-converter.d.ts.map +0 -1
  274. package/lib/crypto/device-converter.js +0 -42
  275. package/lib/crypto/device-converter.js.map +0 -1
  276. package/lib/crypto/deviceinfo.d.ts +0 -99
  277. package/lib/crypto/deviceinfo.d.ts.map +0 -1
  278. package/lib/crypto/deviceinfo.js +0 -148
  279. package/lib/crypto/deviceinfo.js.map +0 -1
  280. package/lib/crypto/index.d.ts +0 -1210
  281. package/lib/crypto/index.d.ts.map +0 -1
  282. package/lib/crypto/index.js +0 -4101
  283. package/lib/crypto/index.js.map +0 -1
  284. package/lib/crypto/key_passphrase.d.ts +0 -14
  285. package/lib/crypto/key_passphrase.d.ts.map +0 -1
  286. package/lib/crypto/key_passphrase.js +0 -44
  287. package/lib/crypto/key_passphrase.js.map +0 -1
  288. package/lib/crypto/keybackup.d.ts +0 -18
  289. package/lib/crypto/keybackup.d.ts.map +0 -1
  290. package/lib/crypto/keybackup.js +0 -1
  291. package/lib/crypto/keybackup.js.map +0 -1
  292. package/lib/crypto/olmlib.d.ts +0 -129
  293. package/lib/crypto/olmlib.d.ts.map +0 -1
  294. package/lib/crypto/olmlib.js +0 -492
  295. package/lib/crypto/olmlib.js.map +0 -1
  296. package/lib/crypto/recoverykey.d.ts +0 -2
  297. package/lib/crypto/recoverykey.d.ts.map +0 -1
  298. package/lib/crypto/recoverykey.js +0 -19
  299. package/lib/crypto/recoverykey.js.map +0 -1
  300. package/lib/crypto/store/base.d.ts +0 -252
  301. package/lib/crypto/store/base.d.ts.map +0 -1
  302. package/lib/crypto/store/base.js +0 -64
  303. package/lib/crypto/store/base.js.map +0 -1
  304. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts +0 -187
  305. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts.map +0 -1
  306. package/lib/crypto/store/indexeddb-crypto-store-backend.js +0 -1145
  307. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +0 -1
  308. package/lib/crypto/store/indexeddb-crypto-store.d.ts +0 -432
  309. package/lib/crypto/store/indexeddb-crypto-store.d.ts.map +0 -1
  310. package/lib/crypto/store/indexeddb-crypto-store.js +0 -728
  311. package/lib/crypto/store/indexeddb-crypto-store.js.map +0 -1
  312. package/lib/crypto/store/localStorage-crypto-store.d.ts +0 -119
  313. package/lib/crypto/store/localStorage-crypto-store.d.ts.map +0 -1
  314. package/lib/crypto/store/localStorage-crypto-store.js +0 -531
  315. package/lib/crypto/store/localStorage-crypto-store.js.map +0 -1
  316. package/lib/crypto/store/memory-crypto-store.d.ts +0 -215
  317. package/lib/crypto/store/memory-crypto-store.d.ts.map +0 -1
  318. package/lib/crypto/store/memory-crypto-store.js +0 -622
  319. package/lib/crypto/store/memory-crypto-store.js.map +0 -1
  320. package/lib/crypto/verification/Base.d.ts +0 -105
  321. package/lib/crypto/verification/Base.d.ts.map +0 -1
  322. package/lib/crypto/verification/Base.js +0 -372
  323. package/lib/crypto/verification/Base.js.map +0 -1
  324. package/lib/crypto/verification/Error.d.ts +0 -35
  325. package/lib/crypto/verification/Error.d.ts.map +0 -1
  326. package/lib/crypto/verification/Error.js +0 -86
  327. package/lib/crypto/verification/Error.js.map +0 -1
  328. package/lib/crypto/verification/IllegalMethod.d.ts +0 -15
  329. package/lib/crypto/verification/IllegalMethod.d.ts.map +0 -1
  330. package/lib/crypto/verification/IllegalMethod.js +0 -43
  331. package/lib/crypto/verification/IllegalMethod.js.map +0 -1
  332. package/lib/crypto/verification/QRCode.d.ts +0 -51
  333. package/lib/crypto/verification/QRCode.d.ts.map +0 -1
  334. package/lib/crypto/verification/QRCode.js +0 -277
  335. package/lib/crypto/verification/QRCode.js.map +0 -1
  336. package/lib/crypto/verification/SAS.d.ts +0 -27
  337. package/lib/crypto/verification/SAS.d.ts.map +0 -1
  338. package/lib/crypto/verification/SAS.js +0 -485
  339. package/lib/crypto/verification/SAS.js.map +0 -1
  340. package/lib/crypto/verification/SASDecimal.d.ts +0 -8
  341. package/lib/crypto/verification/SASDecimal.d.ts.map +0 -1
  342. package/lib/crypto/verification/SASDecimal.js +0 -34
  343. package/lib/crypto/verification/SASDecimal.js.map +0 -1
  344. package/lib/crypto/verification/request/Channel.d.ts +0 -18
  345. package/lib/crypto/verification/request/Channel.d.ts.map +0 -1
  346. package/lib/crypto/verification/request/Channel.js +0 -1
  347. package/lib/crypto/verification/request/Channel.js.map +0 -1
  348. package/lib/crypto/verification/request/InRoomChannel.d.ts +0 -113
  349. package/lib/crypto/verification/request/InRoomChannel.d.ts.map +0 -1
  350. package/lib/crypto/verification/request/InRoomChannel.js +0 -351
  351. package/lib/crypto/verification/request/InRoomChannel.js.map +0 -1
  352. package/lib/crypto/verification/request/ToDeviceChannel.d.ts +0 -105
  353. package/lib/crypto/verification/request/ToDeviceChannel.d.ts.map +0 -1
  354. package/lib/crypto/verification/request/ToDeviceChannel.js +0 -328
  355. package/lib/crypto/verification/request/ToDeviceChannel.js.map +0 -1
  356. package/lib/crypto/verification/request/VerificationRequest.d.ts +0 -227
  357. package/lib/crypto/verification/request/VerificationRequest.d.ts.map +0 -1
  358. package/lib/crypto/verification/request/VerificationRequest.js +0 -937
  359. package/lib/crypto/verification/request/VerificationRequest.js.map +0 -1
  360. package/lib/crypto-api/CryptoEvent.d.ts +0 -69
  361. package/lib/crypto-api/CryptoEvent.d.ts.map +0 -1
  362. package/lib/crypto-api/CryptoEvent.js +0 -33
  363. package/lib/crypto-api/CryptoEvent.js.map +0 -1
  364. package/lib/crypto-api/CryptoEventHandlerMap.d.ts +0 -16
  365. package/lib/crypto-api/CryptoEventHandlerMap.d.ts.map +0 -1
  366. package/lib/crypto-api/CryptoEventHandlerMap.js +0 -22
  367. package/lib/crypto-api/CryptoEventHandlerMap.js.map +0 -1
  368. package/lib/crypto-api/index.d.ts +0 -978
  369. package/lib/crypto-api/index.d.ts.map +0 -1
  370. package/lib/crypto-api/index.js +0 -304
  371. package/lib/crypto-api/index.js.map +0 -1
  372. package/lib/crypto-api/key-passphrase.d.ts +0 -11
  373. package/lib/crypto-api/key-passphrase.d.ts.map +0 -1
  374. package/lib/crypto-api/key-passphrase.js +0 -51
  375. package/lib/crypto-api/key-passphrase.js.map +0 -1
  376. package/lib/crypto-api/keybackup.d.ts +0 -88
  377. package/lib/crypto-api/keybackup.d.ts.map +0 -1
  378. package/lib/crypto-api/keybackup.js +0 -1
  379. package/lib/crypto-api/keybackup.js.map +0 -1
  380. package/lib/crypto-api/recovery-key.d.ts +0 -11
  381. package/lib/crypto-api/recovery-key.d.ts.map +0 -1
  382. package/lib/crypto-api/recovery-key.js +0 -65
  383. package/lib/crypto-api/recovery-key.js.map +0 -1
  384. package/lib/crypto-api/verification.d.ts +0 -344
  385. package/lib/crypto-api/verification.d.ts.map +0 -1
  386. package/lib/crypto-api/verification.js +0 -91
  387. package/lib/crypto-api/verification.js.map +0 -1
  388. package/lib/matrixrtc/CallMembership.d.ts +0 -66
  389. package/lib/matrixrtc/CallMembership.d.ts.map +0 -1
  390. package/lib/matrixrtc/CallMembership.js +0 -197
  391. package/lib/matrixrtc/CallMembership.js.map +0 -1
  392. package/lib/matrixrtc/LivekitFocus.d.ts +0 -16
  393. package/lib/matrixrtc/LivekitFocus.d.ts.map +0 -1
  394. package/lib/matrixrtc/LivekitFocus.js +0 -20
  395. package/lib/matrixrtc/LivekitFocus.js.map +0 -1
  396. package/lib/matrixrtc/MatrixRTCSession.d.ts +0 -295
  397. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +0 -1
  398. package/lib/matrixrtc/MatrixRTCSession.js +0 -1043
  399. package/lib/matrixrtc/MatrixRTCSession.js.map +0 -1
  400. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +0 -40
  401. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +0 -1
  402. package/lib/matrixrtc/MatrixRTCSessionManager.js +0 -146
  403. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +0 -1
  404. package/lib/matrixrtc/focus.d.ts +0 -10
  405. package/lib/matrixrtc/focus.d.ts.map +0 -1
  406. package/lib/matrixrtc/focus.js +0 -1
  407. package/lib/matrixrtc/focus.js.map +0 -1
  408. package/lib/matrixrtc/index.d.ts +0 -7
  409. package/lib/matrixrtc/index.d.ts.map +0 -1
  410. package/lib/matrixrtc/index.js +0 -21
  411. package/lib/matrixrtc/index.js.map +0 -1
  412. package/lib/matrixrtc/types.d.ts +0 -19
  413. package/lib/matrixrtc/types.d.ts.map +0 -1
  414. package/lib/matrixrtc/types.js +0 -1
  415. package/lib/matrixrtc/types.js.map +0 -1
  416. package/lib/rendezvous/MSC4108SignInWithQR.d.ts +0 -112
  417. package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +0 -1
  418. package/lib/rendezvous/MSC4108SignInWithQR.js +0 -392
  419. package/lib/rendezvous/MSC4108SignInWithQR.js.map +0 -1
  420. package/lib/rendezvous/RendezvousChannel.d.ts +0 -27
  421. package/lib/rendezvous/RendezvousChannel.d.ts.map +0 -1
  422. package/lib/rendezvous/RendezvousChannel.js +0 -1
  423. package/lib/rendezvous/RendezvousChannel.js.map +0 -1
  424. package/lib/rendezvous/RendezvousCode.d.ts +0 -9
  425. package/lib/rendezvous/RendezvousCode.d.ts.map +0 -1
  426. package/lib/rendezvous/RendezvousCode.js +0 -1
  427. package/lib/rendezvous/RendezvousCode.js.map +0 -1
  428. package/lib/rendezvous/RendezvousError.d.ts +0 -6
  429. package/lib/rendezvous/RendezvousError.d.ts.map +0 -1
  430. package/lib/rendezvous/RendezvousError.js +0 -23
  431. package/lib/rendezvous/RendezvousError.js.map +0 -1
  432. package/lib/rendezvous/RendezvousFailureReason.d.ts +0 -31
  433. package/lib/rendezvous/RendezvousFailureReason.d.ts.map +0 -1
  434. package/lib/rendezvous/RendezvousFailureReason.js +0 -38
  435. package/lib/rendezvous/RendezvousFailureReason.js.map +0 -1
  436. package/lib/rendezvous/RendezvousIntent.d.ts +0 -5
  437. package/lib/rendezvous/RendezvousIntent.d.ts.map +0 -1
  438. package/lib/rendezvous/RendezvousIntent.js +0 -22
  439. package/lib/rendezvous/RendezvousIntent.js.map +0 -1
  440. package/lib/rendezvous/RendezvousTransport.d.ts +0 -36
  441. package/lib/rendezvous/RendezvousTransport.d.ts.map +0 -1
  442. package/lib/rendezvous/RendezvousTransport.js +0 -1
  443. package/lib/rendezvous/RendezvousTransport.js.map +0 -1
  444. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts +0 -58
  445. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts.map +0 -1
  446. package/lib/rendezvous/channels/MSC4108SecureChannel.js +0 -246
  447. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +0 -1
  448. package/lib/rendezvous/channels/index.d.ts +0 -2
  449. package/lib/rendezvous/channels/index.d.ts.map +0 -1
  450. package/lib/rendezvous/channels/index.js +0 -18
  451. package/lib/rendezvous/channels/index.js.map +0 -1
  452. package/lib/rendezvous/index.d.ts +0 -10
  453. package/lib/rendezvous/index.d.ts.map +0 -1
  454. package/lib/rendezvous/index.js +0 -23
  455. package/lib/rendezvous/index.js.map +0 -1
  456. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +0 -61
  457. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts.map +0 -1
  458. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +0 -253
  459. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +0 -1
  460. package/lib/rendezvous/transports/index.d.ts +0 -2
  461. package/lib/rendezvous/transports/index.d.ts.map +0 -1
  462. package/lib/rendezvous/transports/index.js +0 -18
  463. package/lib/rendezvous/transports/index.js.map +0 -1
  464. package/lib/rust-crypto/CrossSigningIdentity.d.ts +0 -33
  465. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +0 -1
  466. package/lib/rust-crypto/CrossSigningIdentity.js +0 -157
  467. package/lib/rust-crypto/CrossSigningIdentity.js.map +0 -1
  468. package/lib/rust-crypto/DehydratedDeviceManager.d.ts +0 -98
  469. package/lib/rust-crypto/DehydratedDeviceManager.d.ts.map +0 -1
  470. package/lib/rust-crypto/DehydratedDeviceManager.js +0 -285
  471. package/lib/rust-crypto/DehydratedDeviceManager.js.map +0 -1
  472. package/lib/rust-crypto/KeyClaimManager.d.ts +0 -33
  473. package/lib/rust-crypto/KeyClaimManager.d.ts.map +0 -1
  474. package/lib/rust-crypto/KeyClaimManager.js +0 -82
  475. package/lib/rust-crypto/KeyClaimManager.js.map +0 -1
  476. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts +0 -43
  477. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +0 -1
  478. package/lib/rust-crypto/OutgoingRequestProcessor.js +0 -195
  479. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +0 -1
  480. package/lib/rust-crypto/OutgoingRequestsManager.d.ts +0 -47
  481. package/lib/rust-crypto/OutgoingRequestsManager.d.ts.map +0 -1
  482. package/lib/rust-crypto/OutgoingRequestsManager.js +0 -148
  483. package/lib/rust-crypto/OutgoingRequestsManager.js.map +0 -1
  484. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +0 -120
  485. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts.map +0 -1
  486. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +0 -467
  487. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +0 -1
  488. package/lib/rust-crypto/RoomEncryptor.d.ts +0 -98
  489. package/lib/rust-crypto/RoomEncryptor.d.ts.map +0 -1
  490. package/lib/rust-crypto/RoomEncryptor.js +0 -299
  491. package/lib/rust-crypto/RoomEncryptor.js.map +0 -1
  492. package/lib/rust-crypto/backup.d.ts +0 -254
  493. package/lib/rust-crypto/backup.d.ts.map +0 -1
  494. package/lib/rust-crypto/backup.js +0 -837
  495. package/lib/rust-crypto/backup.js.map +0 -1
  496. package/lib/rust-crypto/constants.d.ts +0 -3
  497. package/lib/rust-crypto/constants.d.ts.map +0 -1
  498. package/lib/rust-crypto/constants.js +0 -19
  499. package/lib/rust-crypto/constants.js.map +0 -1
  500. package/lib/rust-crypto/device-converter.d.ts +0 -28
  501. package/lib/rust-crypto/device-converter.d.ts.map +0 -1
  502. package/lib/rust-crypto/device-converter.js +0 -123
  503. package/lib/rust-crypto/device-converter.js.map +0 -1
  504. package/lib/rust-crypto/index.d.ts +0 -61
  505. package/lib/rust-crypto/index.d.ts.map +0 -1
  506. package/lib/rust-crypto/index.js +0 -152
  507. package/lib/rust-crypto/index.js.map +0 -1
  508. package/lib/rust-crypto/libolm_migration.d.ts +0 -81
  509. package/lib/rust-crypto/libolm_migration.d.ts.map +0 -1
  510. package/lib/rust-crypto/libolm_migration.js +0 -459
  511. package/lib/rust-crypto/libolm_migration.js.map +0 -1
  512. package/lib/rust-crypto/rust-crypto.d.ts +0 -556
  513. package/lib/rust-crypto/rust-crypto.d.ts.map +0 -1
  514. package/lib/rust-crypto/rust-crypto.js +0 -2016
  515. package/lib/rust-crypto/rust-crypto.js.map +0 -1
  516. package/lib/rust-crypto/secret-storage.d.ts +0 -22
  517. package/lib/rust-crypto/secret-storage.d.ts.map +0 -1
  518. package/lib/rust-crypto/secret-storage.js +0 -63
  519. package/lib/rust-crypto/secret-storage.js.map +0 -1
  520. package/lib/rust-crypto/verification.d.ts +0 -319
  521. package/lib/rust-crypto/verification.d.ts.map +0 -1
  522. package/lib/rust-crypto/verification.js +0 -816
  523. package/lib/rust-crypto/verification.js.map +0 -1
  524. package/lib/secret-storage.d.ts +0 -370
  525. package/lib/secret-storage.d.ts.map +0 -1
  526. package/lib/secret-storage.js +0 -466
  527. package/lib/secret-storage.js.map +0 -1
  528. package/lib/utils/decryptAESSecretStorageItem.d.ts +0 -12
  529. package/lib/utils/decryptAESSecretStorageItem.d.ts.map +0 -1
  530. package/lib/utils/decryptAESSecretStorageItem.js +0 -50
  531. package/lib/utils/decryptAESSecretStorageItem.js.map +0 -1
  532. package/lib/utils/encryptAESSecretStorageItem.d.ts +0 -16
  533. package/lib/utils/encryptAESSecretStorageItem.d.ts.map +0 -1
  534. package/lib/utils/encryptAESSecretStorageItem.js +0 -68
  535. package/lib/utils/encryptAESSecretStorageItem.js.map +0 -1
  536. package/lib/utils/internal/deriveKeys.d.ts +0 -10
  537. package/lib/utils/internal/deriveKeys.d.ts.map +0 -1
  538. package/lib/utils/internal/deriveKeys.js +0 -60
  539. package/lib/utils/internal/deriveKeys.js.map +0 -1
  540. package/lib/webrtc/audioContext.d.ts +0 -15
  541. package/lib/webrtc/audioContext.d.ts.map +0 -1
  542. package/lib/webrtc/audioContext.js +0 -46
  543. package/lib/webrtc/audioContext.js.map +0 -1
  544. package/lib/webrtc/call.d.ts +0 -560
  545. package/lib/webrtc/call.d.ts.map +0 -1
  546. package/lib/webrtc/call.js +0 -2541
  547. package/lib/webrtc/call.js.map +0 -1
  548. package/lib/webrtc/callEventHandler.d.ts +0 -37
  549. package/lib/webrtc/callEventHandler.d.ts.map +0 -1
  550. package/lib/webrtc/callEventHandler.js +0 -344
  551. package/lib/webrtc/callEventHandler.js.map +0 -1
  552. package/lib/webrtc/callEventTypes.d.ts +0 -73
  553. package/lib/webrtc/callEventTypes.d.ts.map +0 -1
  554. package/lib/webrtc/callEventTypes.js +0 -13
  555. package/lib/webrtc/callEventTypes.js.map +0 -1
  556. package/lib/webrtc/callFeed.d.ts +0 -128
  557. package/lib/webrtc/callFeed.d.ts.map +0 -1
  558. package/lib/webrtc/callFeed.js +0 -289
  559. package/lib/webrtc/callFeed.js.map +0 -1
  560. package/lib/webrtc/groupCall.d.ts +0 -323
  561. package/lib/webrtc/groupCall.d.ts.map +0 -1
  562. package/lib/webrtc/groupCall.js +0 -1337
  563. package/lib/webrtc/groupCall.js.map +0 -1
  564. package/lib/webrtc/groupCallEventHandler.d.ts +0 -31
  565. package/lib/webrtc/groupCallEventHandler.d.ts.map +0 -1
  566. package/lib/webrtc/groupCallEventHandler.js +0 -178
  567. package/lib/webrtc/groupCallEventHandler.js.map +0 -1
  568. package/lib/webrtc/mediaHandler.d.ts +0 -89
  569. package/lib/webrtc/mediaHandler.d.ts.map +0 -1
  570. package/lib/webrtc/mediaHandler.js +0 -437
  571. package/lib/webrtc/mediaHandler.js.map +0 -1
  572. package/lib/webrtc/stats/callFeedStatsReporter.d.ts +0 -8
  573. package/lib/webrtc/stats/callFeedStatsReporter.d.ts.map +0 -1
  574. package/lib/webrtc/stats/callFeedStatsReporter.js +0 -82
  575. package/lib/webrtc/stats/callFeedStatsReporter.js.map +0 -1
  576. package/lib/webrtc/stats/callStatsReportGatherer.d.ts +0 -25
  577. package/lib/webrtc/stats/callStatsReportGatherer.d.ts.map +0 -1
  578. package/lib/webrtc/stats/callStatsReportGatherer.js +0 -199
  579. package/lib/webrtc/stats/callStatsReportGatherer.js.map +0 -1
  580. package/lib/webrtc/stats/callStatsReportSummary.d.ts +0 -17
  581. package/lib/webrtc/stats/callStatsReportSummary.d.ts.map +0 -1
  582. package/lib/webrtc/stats/callStatsReportSummary.js +0 -1
  583. package/lib/webrtc/stats/callStatsReportSummary.js.map +0 -1
  584. package/lib/webrtc/stats/connectionStats.d.ts +0 -28
  585. package/lib/webrtc/stats/connectionStats.d.ts.map +0 -1
  586. package/lib/webrtc/stats/connectionStats.js +0 -26
  587. package/lib/webrtc/stats/connectionStats.js.map +0 -1
  588. package/lib/webrtc/stats/connectionStatsBuilder.d.ts +0 -5
  589. package/lib/webrtc/stats/connectionStatsBuilder.d.ts.map +0 -1
  590. package/lib/webrtc/stats/connectionStatsBuilder.js +0 -27
  591. package/lib/webrtc/stats/connectionStatsBuilder.js.map +0 -1
  592. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts +0 -7
  593. package/lib/webrtc/stats/connectionStatsReportBuilder.d.ts.map +0 -1
  594. package/lib/webrtc/stats/connectionStatsReportBuilder.js +0 -121
  595. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +0 -1
  596. package/lib/webrtc/stats/groupCallStats.d.ts +0 -22
  597. package/lib/webrtc/stats/groupCallStats.d.ts.map +0 -1
  598. package/lib/webrtc/stats/groupCallStats.js +0 -78
  599. package/lib/webrtc/stats/groupCallStats.js.map +0 -1
  600. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts +0 -10
  601. package/lib/webrtc/stats/media/mediaSsrcHandler.d.ts.map +0 -1
  602. package/lib/webrtc/stats/media/mediaSsrcHandler.js +0 -57
  603. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +0 -1
  604. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts +0 -12
  605. package/lib/webrtc/stats/media/mediaTrackHandler.d.ts.map +0 -1
  606. package/lib/webrtc/stats/media/mediaTrackHandler.js +0 -62
  607. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +0 -1
  608. package/lib/webrtc/stats/media/mediaTrackStats.d.ts +0 -86
  609. package/lib/webrtc/stats/media/mediaTrackStats.d.ts.map +0 -1
  610. package/lib/webrtc/stats/media/mediaTrackStats.js +0 -142
  611. package/lib/webrtc/stats/media/mediaTrackStats.js.map +0 -1
  612. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts +0 -22
  613. package/lib/webrtc/stats/media/mediaTrackStatsHandler.d.ts.map +0 -1
  614. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +0 -76
  615. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +0 -1
  616. package/lib/webrtc/stats/statsReport.d.ts +0 -99
  617. package/lib/webrtc/stats/statsReport.d.ts.map +0 -1
  618. package/lib/webrtc/stats/statsReport.js +0 -32
  619. package/lib/webrtc/stats/statsReport.js.map +0 -1
  620. package/lib/webrtc/stats/statsReportEmitter.d.ts +0 -15
  621. package/lib/webrtc/stats/statsReportEmitter.d.ts.map +0 -1
  622. package/lib/webrtc/stats/statsReportEmitter.js +0 -33
  623. package/lib/webrtc/stats/statsReportEmitter.js.map +0 -1
  624. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts +0 -16
  625. package/lib/webrtc/stats/summaryStatsReportGatherer.d.ts.map +0 -1
  626. package/lib/webrtc/stats/summaryStatsReportGatherer.js +0 -116
  627. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +0 -1
  628. package/lib/webrtc/stats/trackStatsBuilder.d.ts +0 -19
  629. package/lib/webrtc/stats/trackStatsBuilder.d.ts.map +0 -1
  630. package/lib/webrtc/stats/trackStatsBuilder.js +0 -168
  631. package/lib/webrtc/stats/trackStatsBuilder.js.map +0 -1
  632. package/lib/webrtc/stats/transportStats.d.ts +0 -11
  633. package/lib/webrtc/stats/transportStats.d.ts.map +0 -1
  634. package/lib/webrtc/stats/transportStats.js +0 -1
  635. package/lib/webrtc/stats/transportStats.js.map +0 -1
  636. package/lib/webrtc/stats/transportStatsBuilder.d.ts +0 -5
  637. package/lib/webrtc/stats/transportStatsBuilder.d.ts.map +0 -1
  638. package/lib/webrtc/stats/transportStatsBuilder.js +0 -34
  639. package/lib/webrtc/stats/transportStatsBuilder.js.map +0 -1
  640. package/lib/webrtc/stats/valueFormatter.d.ts +0 -4
  641. package/lib/webrtc/stats/valueFormatter.d.ts.map +0 -1
  642. package/lib/webrtc/stats/valueFormatter.js +0 -25
  643. package/lib/webrtc/stats/valueFormatter.js.map +0 -1
  644. package/src/@types/AESEncryptedSecretStoragePayload.ts +0 -29
  645. package/src/@types/crypto.ts +0 -73
  646. package/src/@types/matrix-sdk-crypto-wasm.d.ts +0 -44
  647. package/src/common-crypto/CryptoBackend.ts +0 -302
  648. package/src/common-crypto/README.md +0 -4
  649. package/src/common-crypto/key-passphrase.ts +0 -43
  650. package/src/crypto/CrossSigning.ts +0 -773
  651. package/src/crypto/DeviceList.ts +0 -989
  652. package/src/crypto/EncryptionSetup.ts +0 -351
  653. package/src/crypto/OlmDevice.ts +0 -1500
  654. package/src/crypto/OutgoingRoomKeyRequestManager.ts +0 -485
  655. package/src/crypto/RoomList.ts +0 -70
  656. package/src/crypto/SecretSharing.ts +0 -240
  657. package/src/crypto/SecretStorage.ts +0 -136
  658. package/src/crypto/aes.ts +0 -23
  659. package/src/crypto/algorithms/base.ts +0 -236
  660. package/src/crypto/algorithms/index.ts +0 -20
  661. package/src/crypto/algorithms/megolm.ts +0 -2216
  662. package/src/crypto/algorithms/olm.ts +0 -381
  663. package/src/crypto/api.ts +0 -70
  664. package/src/crypto/backup.ts +0 -922
  665. package/src/crypto/crypto.ts +0 -18
  666. package/src/crypto/dehydration.ts +0 -272
  667. package/src/crypto/device-converter.ts +0 -45
  668. package/src/crypto/deviceinfo.ts +0 -158
  669. package/src/crypto/index.ts +0 -4418
  670. package/src/crypto/key_passphrase.ts +0 -42
  671. package/src/crypto/keybackup.ts +0 -47
  672. package/src/crypto/olmlib.ts +0 -539
  673. package/src/crypto/recoverykey.ts +0 -18
  674. package/src/crypto/store/base.ts +0 -348
  675. package/src/crypto/store/indexeddb-crypto-store-backend.ts +0 -1250
  676. package/src/crypto/store/indexeddb-crypto-store.ts +0 -845
  677. package/src/crypto/store/localStorage-crypto-store.ts +0 -579
  678. package/src/crypto/store/memory-crypto-store.ts +0 -680
  679. package/src/crypto/verification/Base.ts +0 -409
  680. package/src/crypto/verification/Error.ts +0 -76
  681. package/src/crypto/verification/IllegalMethod.ts +0 -50
  682. package/src/crypto/verification/QRCode.ts +0 -310
  683. package/src/crypto/verification/SAS.ts +0 -494
  684. package/src/crypto/verification/SASDecimal.ts +0 -37
  685. package/src/crypto/verification/request/Channel.ts +0 -34
  686. package/src/crypto/verification/request/InRoomChannel.ts +0 -371
  687. package/src/crypto/verification/request/ToDeviceChannel.ts +0 -354
  688. package/src/crypto/verification/request/VerificationRequest.ts +0 -976
  689. package/src/crypto-api/CryptoEvent.ts +0 -93
  690. package/src/crypto-api/CryptoEventHandlerMap.ts +0 -32
  691. package/src/crypto-api/index.ts +0 -1175
  692. package/src/crypto-api/key-passphrase.ts +0 -58
  693. package/src/crypto-api/keybackup.ts +0 -115
  694. package/src/crypto-api/recovery-key.ts +0 -69
  695. package/src/crypto-api/verification.ts +0 -408
  696. package/src/matrixrtc/CallMembership.ts +0 -247
  697. package/src/matrixrtc/LivekitFocus.ts +0 -39
  698. package/src/matrixrtc/MatrixRTCSession.ts +0 -1319
  699. package/src/matrixrtc/MatrixRTCSessionManager.ts +0 -166
  700. package/src/matrixrtc/focus.ts +0 -25
  701. package/src/matrixrtc/index.ts +0 -22
  702. package/src/matrixrtc/types.ts +0 -36
  703. package/src/rendezvous/MSC4108SignInWithQR.ts +0 -444
  704. package/src/rendezvous/RendezvousChannel.ts +0 -48
  705. package/src/rendezvous/RendezvousCode.ts +0 -25
  706. package/src/rendezvous/RendezvousError.ts +0 -26
  707. package/src/rendezvous/RendezvousFailureReason.ts +0 -49
  708. package/src/rendezvous/RendezvousIntent.ts +0 -20
  709. package/src/rendezvous/RendezvousTransport.ts +0 -58
  710. package/src/rendezvous/channels/MSC4108SecureChannel.ts +0 -270
  711. package/src/rendezvous/channels/index.ts +0 -17
  712. package/src/rendezvous/index.ts +0 -25
  713. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +0 -270
  714. package/src/rendezvous/transports/index.ts +0 -17
  715. package/src/rust-crypto/CrossSigningIdentity.ts +0 -183
  716. package/src/rust-crypto/DehydratedDeviceManager.ts +0 -306
  717. package/src/rust-crypto/KeyClaimManager.ts +0 -86
  718. package/src/rust-crypto/OutgoingRequestProcessor.ts +0 -236
  719. package/src/rust-crypto/OutgoingRequestsManager.ts +0 -143
  720. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +0 -501
  721. package/src/rust-crypto/RoomEncryptor.ts +0 -352
  722. package/src/rust-crypto/backup.ts +0 -881
  723. package/src/rust-crypto/constants.ts +0 -18
  724. package/src/rust-crypto/device-converter.ts +0 -128
  725. package/src/rust-crypto/index.ts +0 -237
  726. package/src/rust-crypto/libolm_migration.ts +0 -530
  727. package/src/rust-crypto/rust-crypto.ts +0 -2205
  728. package/src/rust-crypto/secret-storage.ts +0 -60
  729. package/src/rust-crypto/verification.ts +0 -830
  730. package/src/secret-storage.ts +0 -693
  731. package/src/utils/decryptAESSecretStorageItem.ts +0 -54
  732. package/src/utils/encryptAESSecretStorageItem.ts +0 -73
  733. package/src/utils/internal/deriveKeys.ts +0 -63
  734. package/src/webrtc/audioContext.ts +0 -44
  735. package/src/webrtc/call.ts +0 -3074
  736. package/src/webrtc/callEventHandler.ts +0 -425
  737. package/src/webrtc/callEventTypes.ts +0 -93
  738. package/src/webrtc/callFeed.ts +0 -364
  739. package/src/webrtc/groupCall.ts +0 -1735
  740. package/src/webrtc/groupCallEventHandler.ts +0 -234
  741. package/src/webrtc/mediaHandler.ts +0 -484
  742. package/src/webrtc/stats/callFeedStatsReporter.ts +0 -94
  743. package/src/webrtc/stats/callStatsReportGatherer.ts +0 -219
  744. package/src/webrtc/stats/callStatsReportSummary.ts +0 -30
  745. package/src/webrtc/stats/connectionStats.ts +0 -47
  746. package/src/webrtc/stats/connectionStatsBuilder.ts +0 -28
  747. package/src/webrtc/stats/connectionStatsReportBuilder.ts +0 -140
  748. package/src/webrtc/stats/groupCallStats.ts +0 -93
  749. package/src/webrtc/stats/media/mediaSsrcHandler.ts +0 -57
  750. package/src/webrtc/stats/media/mediaTrackHandler.ts +0 -76
  751. package/src/webrtc/stats/media/mediaTrackStats.ts +0 -176
  752. package/src/webrtc/stats/media/mediaTrackStatsHandler.ts +0 -90
  753. package/src/webrtc/stats/statsReport.ts +0 -133
  754. package/src/webrtc/stats/statsReportEmitter.ts +0 -49
  755. package/src/webrtc/stats/summaryStatsReportGatherer.ts +0 -148
  756. package/src/webrtc/stats/trackStatsBuilder.ts +0 -207
  757. package/src/webrtc/stats/transportStats.ts +0 -26
  758. package/src/webrtc/stats/transportStatsBuilder.ts +0 -48
  759. package/src/webrtc/stats/valueFormatter.ts +0 -27
@@ -1 +0,0 @@
1
- {"version":3,"file":"groupCall.js","names":["TypedEventEmitter","CallFeed","SPEAKING_THRESHOLD","CallErrorCode","CallEvent","CallState","genCallID","setTracksEnabled","createNewMatrixCall","CallError","RoomStateEvent","logger","ReEmitter","SDPStreamMetadataPurpose","EventType","CallEventHandlerEvent","GroupCallEventHandlerEvent","mapsEqual","GroupCallStats","StatsReport","SummaryStatsReportGatherer","CallFeedStatsReporter","KnownMembership","GroupCallIntent","GroupCallType","GroupCallTerminationReason","GroupCallEvent","GroupCallStatsReportEvent","GroupCallErrorCode","GroupCallError","Error","constructor","code","msg","err","_defineProperty","GroupCallUnknownDeviceError","userId","UnknownDevice","OtherUserSpeakingError","GroupCallState","DEVICE_TIMEOUT","getCallUserId","call","_call$getOpponentMemb","getOpponentMember","invitee","GroupCall","client","room","type","isPtt","intent","groupCallId","dataChannelsEnabled","dataChannelOptions","isCallWithoutVideoAndAudio","_room$currentState$ge","_room$currentState$ge2","useLivekit","arguments","length","undefined","livekitServiceURL","Map","report","emit","ConnectionStats","ByteSentStats","extendSummaryReport","participants","SummaryStats","localCallFeed","expandCallFeedReport","callFeeds","forEachCall","callId","getFeeds","forEach","f","push","CallFeedStats","LocalCallFeedUninitialized","newCall","_newCall$getOpponentM","_this$calls$get","roomId","state","Ringing","warn","concat","log","reject","opponentUserId","info","deviceMap","calls","get","prevCall","getOpponentDeviceId","hangup","Replaced","set","initCall","feeds","getLocalFeeds","map","feed","clone","callExpected","stream","getAudioTracks","getVideoTracks","answerWithCallFeeds","CallsChanged","needsRetry","participantMap","callMap","retriesMap","retryCallCounts","deviceId","participant","_retriesMap$get","_retriesMap","retries","getOpponentSessionId","sessionId","wantsOutgoingCall","placeOutgoingCalls","opponentMemberId","opponentDeviceId","currentUserMediaFeed","getUserMediaFeed","remoteUsermediaFeed","remoteFeedChanged","currentCallForUserDevice","addUserMediaFeed","replaceUserMediaFeed","removeUserMediaFeed","currentScreenshareFeed","getScreenshareFeed","remoteScreensharingFeed","remoteScreenshareFeedChanged","addScreenshareFeed","replaceScreenshareFeed","removeScreenshareFeed","_oldState","_call$getOpponentMemb2","Ended","audioMuted","isAudioMuted","localUsermediaStream","isMicrophoneMuted","setMicrophoneMuted","videoMuted","isVideoMuted","isLocalVideoMuted","setLocalVideoMuted","Connected","delete","size","_call$getOpponentMemb3","_call$getOpponentMemb4","hangupReason","getMember","disposeCall","topAvg","nextActiveSpeaker","callFeed","userMediaFeeds","isLocal","total","speakingVolumeSamples","reduce","acc","volume","Math","max","avg","activeSpeaker","ActiveSpeakerChanged","updateParticipants","expected","Entered","newState","oldState","updateMemberState","catch","e","error","reEmitter","_livekitServiceURL","creationTs","currentState","getStateEvents","GroupCallPrefix","getTs","on","Update","onRoomState","ParticipantsChanged","onParticipantsChanged","GroupCallStateChanged","onStateChanged","LocalScreenshareStateChanged","onLocalFeedsChanged","allowCallWithoutVideoAndAudio","create","_this","_asyncToGenerator","Date","now","groupCallEventHandler","groupCalls","Outgoing","sendCallStateEvent","_this2","groupCallState","sendStateEvent","updateLivekitServiceURL","newURL","_state","value","prevValue","_participants","participantStateEqual","x","y","screensharing","deviceMapsEqual","_creationTs","enteredViaAnotherSession","_enteredViaAnotherSession","values","localScreenshareFeed","hasLocalParticipant","_this$participants$ge","_this$participants$ge2","getUserId","has","getDeviceId","_this$participants$ge3","member","initLocalCallFeed","_this3","InitializingLocalCallFeed","initCallFeedPromise","initLocalCallFeedInternal","_this4","getMediaHandler","getUserMediaStream","Video","MediaStream","stopUserMediaStream","purpose","Usermedia","initWithAudioMuted","initWithVideoMuted","LocalCallFeedInitialized","updateLocalUsermediaStream","_this5","oldStream","setNewStream","micShouldBeMuted","vidShouldBeMuted","id","enter","_this6","Incoming","onIncomingCall","callEventHandler","retryCallLoopInterval","setInterval","onRetryCallLoop","retryCallInterval","onActiveSpeakerLoop","activeSpeakerLoopInterval","activeSpeakerInterval","dispose","_this$stats","stopScreensharingStream","localDesktopCapturerSourceId","stopAllStreams","transmitTimer","clearTimeout","clearInterval","participantsExpirationTimer","UserHangup","clear","removeListener","stats","stop","leave","terminate","_arguments","_this7","emitStateEvent","off","existingStateEvent","_objectSpread","getContent","CallEnded","muted","_this8","hasAudioDevice","sendUpdatesBefore","setTimeout","pttMaxTransmitTime","_call$localUsermediaF","localUsermediaFeed","setAudioVideoMuted","sendUpdates","_ref","updates","sendMetadataUpdate","Promise","all","apply","hasPermission","checkAudioPermissionIfNecessary","LocalMuteStateChanged","_this9","hasAudioTrack","getTracks","_unused","_this10","hasVideoDevice","_unused2","setScreensharingEnabled","enabled","_arguments2","_this11","opts","isScreensharing","getScreensharingStream","_loop","track","onTrackEnded","removeEventListener","addEventListener","desktopCapturerSourceId","Screenshare","pushLocalFeed","throwOnFail","NoUserMedia","localScreensharingFeed","removeLocalFeed","localUserId","localDeviceId","_this12","callsChanged","_loop2","_userId2","_this12$calls$get","_loop3","debug","NewSession","opponentSessionId","placeCallWithCallFeeds","then","createDataChannel","PlaceCallFailed","SignallingFailed","getMemberStateEvents","GroupCallMemberPrefix","onCallFeedsChanged","onCallStateChanged","onCallHangup","onCallReplaced","callHandlers","FeedsChanged","State","Hangup","reEmit","Object","initStats","getGroupCallStats","usermediaFeed","screenshareFeed","find","measureVolumeActivity","UserMediaFeedsChanged","existingFeed","replacementFeed","feedIndex","findIndex","splice","screenshareFeeds","ScreenshareFeedsChanged","localMember","entered","nextExpiration","Infinity","getStateKey","content","Array","isArray","devices","validDevices","filter","d","device_id","session_id","expires_ts","membership","Join","some","getSessionId","updateDevices","fn","_arguments3","_this13","_event$getContent","keepAlive","event","otherCalls","c","newDevices","newCalls","newContent","addDeviceToMemberState","_this14","_this15","resendMemberStateTimer","cleanMemberState","_this16","myDevices","getDevices","device","last_seen_ts","userID","statsCollectIntervalTime","reports","CONNECTION_STATS","onConnectionStats","BYTE_SENT_STATS","onByteSentStats","SUMMARY_STATS","onSummaryStats","CALL_FEED_REPORT","onCallFeedReport","setGroupCallStatsInterval","interval","start"],"sources":["../../src/webrtc/groupCall.ts"],"sourcesContent":["import { TypedEventEmitter } from \"../models/typed-event-emitter.ts\";\nimport { CallFeed, SPEAKING_THRESHOLD } from \"./callFeed.ts\";\nimport { MatrixClient, IMyDevice } from \"../client.ts\";\nimport {\n CallErrorCode,\n CallEvent,\n CallEventHandlerMap,\n CallState,\n genCallID,\n MatrixCall,\n setTracksEnabled,\n createNewMatrixCall,\n CallError,\n} from \"./call.ts\";\nimport { RoomMember } from \"../models/room-member.ts\";\nimport { Room } from \"../models/room.ts\";\nimport { RoomStateEvent } from \"../models/room-state.ts\";\nimport { logger } from \"../logger.ts\";\nimport { ReEmitter } from \"../ReEmitter.ts\";\nimport { SDPStreamMetadataPurpose } from \"./callEventTypes.ts\";\nimport { MatrixEvent } from \"../models/event.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport { CallEventHandlerEvent } from \"./callEventHandler.ts\";\nimport { GroupCallEventHandlerEvent } from \"./groupCallEventHandler.ts\";\nimport { IScreensharingOpts } from \"./mediaHandler.ts\";\nimport { mapsEqual } from \"../utils.ts\";\nimport { GroupCallStats } from \"./stats/groupCallStats.ts\";\nimport {\n ByteSentStatsReport,\n CallFeedReport,\n ConnectionStatsReport,\n StatsReport,\n SummaryStatsReport,\n} from \"./stats/statsReport.ts\";\nimport { SummaryStatsReportGatherer } from \"./stats/summaryStatsReportGatherer.ts\";\nimport { CallFeedStatsReporter } from \"./stats/callFeedStatsReporter.ts\";\nimport { KnownMembership } from \"../@types/membership.ts\";\nimport { CallMembershipData } from \"../matrixrtc/CallMembership.ts\";\n\nexport enum GroupCallIntent {\n Ring = \"m.ring\",\n Prompt = \"m.prompt\",\n Room = \"m.room\",\n}\n\nexport enum GroupCallType {\n Video = \"m.video\",\n Voice = \"m.voice\",\n}\n\nexport enum GroupCallTerminationReason {\n CallEnded = \"call_ended\",\n}\n\nexport type CallsByUserAndDevice = Map<string, Map<string, MatrixCall>>;\n\n/**\n * Because event names are just strings, they do need\n * to be unique over all event types of event emitter.\n * Some objects could emit more then one set of events.\n */\nexport enum GroupCallEvent {\n GroupCallStateChanged = \"group_call_state_changed\",\n ActiveSpeakerChanged = \"active_speaker_changed\",\n CallsChanged = \"calls_changed\",\n UserMediaFeedsChanged = \"user_media_feeds_changed\",\n ScreenshareFeedsChanged = \"screenshare_feeds_changed\",\n LocalScreenshareStateChanged = \"local_screenshare_state_changed\",\n LocalMuteStateChanged = \"local_mute_state_changed\",\n ParticipantsChanged = \"participants_changed\",\n Error = \"group_call_error\",\n}\n\nexport type GroupCallEventHandlerMap = {\n [GroupCallEvent.GroupCallStateChanged]: (newState: GroupCallState, oldState: GroupCallState) => void;\n [GroupCallEvent.ActiveSpeakerChanged]: (activeSpeaker: CallFeed | undefined) => void;\n [GroupCallEvent.CallsChanged]: (calls: CallsByUserAndDevice) => void;\n [GroupCallEvent.UserMediaFeedsChanged]: (feeds: CallFeed[]) => void;\n [GroupCallEvent.ScreenshareFeedsChanged]: (feeds: CallFeed[]) => void;\n [GroupCallEvent.LocalScreenshareStateChanged]: (\n isScreensharing: boolean,\n feed?: CallFeed,\n sourceId?: string,\n ) => void;\n [GroupCallEvent.LocalMuteStateChanged]: (audioMuted: boolean, videoMuted: boolean) => void;\n [GroupCallEvent.ParticipantsChanged]: (participants: Map<RoomMember, Map<string, ParticipantState>>) => void;\n /**\n * Fires whenever an error occurs when call.js encounters an issue with setting up the call.\n * <p>\n * The error given will have a code equal to either `MatrixCall.ERR_LOCAL_OFFER_FAILED` or\n * `MatrixCall.ERR_NO_USER_MEDIA`. `ERR_LOCAL_OFFER_FAILED` is emitted when the local client\n * fails to create an offer. `ERR_NO_USER_MEDIA` is emitted when the user has denied access\n * to their audio/video hardware.\n * @param error - The error raised by MatrixCall.\n * @example\n * ```\n * matrixCall.on(\"error\", function(err){\n * console.error(err.code, err);\n * });\n * ```\n */\n [GroupCallEvent.Error]: (error: GroupCallError) => void;\n};\n\nexport enum GroupCallStatsReportEvent {\n ConnectionStats = \"GroupCall.connection_stats\",\n ByteSentStats = \"GroupCall.byte_sent_stats\",\n SummaryStats = \"GroupCall.summary_stats\",\n CallFeedStats = \"GroupCall.call_feed_stats\",\n}\n\n/**\n * The final report-events that get consumed by client.\n */\nexport type GroupCallStatsReportEventHandlerMap = {\n [GroupCallStatsReportEvent.ConnectionStats]: (report: GroupCallStatsReport<ConnectionStatsReport>) => void;\n [GroupCallStatsReportEvent.ByteSentStats]: (report: GroupCallStatsReport<ByteSentStatsReport>) => void;\n [GroupCallStatsReportEvent.SummaryStats]: (report: GroupCallStatsReport<SummaryStatsReport>) => void;\n [GroupCallStatsReportEvent.CallFeedStats]: (report: GroupCallStatsReport<CallFeedReport>) => void;\n};\n\nexport enum GroupCallErrorCode {\n NoUserMedia = \"no_user_media\",\n UnknownDevice = \"unknown_device\",\n PlaceCallFailed = \"place_call_failed\",\n}\n\nexport interface GroupCallStatsReport<\n T extends ConnectionStatsReport | ByteSentStatsReport | SummaryStatsReport | CallFeedReport,\n> {\n report: T;\n}\n\nexport class GroupCallError extends Error {\n public code: string;\n\n public constructor(code: GroupCallErrorCode, msg: string, err?: Error) {\n // Still don't think there's any way to have proper nested errors\n if (err) {\n super(msg + \": \" + err);\n } else {\n super(msg);\n }\n\n this.code = code;\n }\n}\n\nexport class GroupCallUnknownDeviceError extends GroupCallError {\n public constructor(public userId: string) {\n super(GroupCallErrorCode.UnknownDevice, \"No device found for \" + userId);\n }\n}\n\nexport class OtherUserSpeakingError extends Error {\n public constructor() {\n super(\"Cannot unmute: another user is speaking\");\n }\n}\n\nexport interface IGroupCallDataChannelOptions {\n ordered: boolean;\n maxPacketLifeTime: number;\n maxRetransmits: number;\n protocol: string;\n}\n\nexport interface IGroupCallRoomState {\n \"m.intent\": GroupCallIntent;\n \"m.type\": GroupCallType;\n \"m.terminated\"?: GroupCallTerminationReason;\n \"io.element.ptt\"?: boolean;\n // TODO: Specify data-channels\n \"dataChannelsEnabled\"?: boolean;\n \"dataChannelOptions\"?: IGroupCallDataChannelOptions;\n\n \"io.element.livekit_service_url\"?: string;\n}\n\nexport interface IGroupCallRoomMemberFeed {\n purpose: SDPStreamMetadataPurpose;\n}\n\nexport interface IGroupCallRoomMemberDevice {\n device_id: string;\n session_id: string;\n expires_ts: number;\n feeds: IGroupCallRoomMemberFeed[];\n}\n\nexport interface IGroupCallRoomMemberCallState {\n \"m.call_id\": string;\n \"m.foci\"?: string[];\n \"m.devices\": IGroupCallRoomMemberDevice[];\n}\n\nexport interface IGroupCallRoomMemberState {\n \"m.calls\": IGroupCallRoomMemberCallState[];\n}\n\n// XXX: this hasn't made it into the MSC yet\nexport interface ExperimentalGroupCallRoomMemberState {\n memberships: CallMembershipData[];\n}\n\nexport enum GroupCallState {\n LocalCallFeedUninitialized = \"local_call_feed_uninitialized\",\n InitializingLocalCallFeed = \"initializing_local_call_feed\",\n LocalCallFeedInitialized = \"local_call_feed_initialized\",\n Entered = \"entered\",\n Ended = \"ended\",\n}\n\nexport interface ParticipantState {\n sessionId: string;\n screensharing: boolean;\n}\n\ninterface ICallHandlers {\n onCallFeedsChanged: (feeds: CallFeed[]) => void;\n onCallStateChanged: (state: CallState, oldState: CallState | undefined) => void;\n onCallHangup: (call: MatrixCall) => void;\n onCallReplaced: (newCall: MatrixCall) => void;\n}\n\nconst DEVICE_TIMEOUT = 1000 * 60 * 60; // 1 hour\n\nfunction getCallUserId(call: MatrixCall): string | null {\n return call.getOpponentMember()?.userId || call.invitee || null;\n}\n\nexport class GroupCall extends TypedEventEmitter<\n GroupCallEvent | CallEvent | GroupCallStatsReportEvent,\n GroupCallEventHandlerMap & CallEventHandlerMap & GroupCallStatsReportEventHandlerMap\n> {\n // Config\n public activeSpeakerInterval = 1000;\n public retryCallInterval = 5000;\n public participantTimeout = 1000 * 15;\n public pttMaxTransmitTime = 1000 * 20;\n\n public activeSpeaker?: CallFeed;\n public localCallFeed?: CallFeed;\n public localScreenshareFeed?: CallFeed;\n public localDesktopCapturerSourceId?: string;\n public readonly userMediaFeeds: CallFeed[] = [];\n public readonly screenshareFeeds: CallFeed[] = [];\n public groupCallId: string;\n public readonly allowCallWithoutVideoAndAudio: boolean;\n\n private readonly calls = new Map<string, Map<string, MatrixCall>>(); // user_id -> device_id -> MatrixCall\n private callHandlers = new Map<string, Map<string, ICallHandlers>>(); // user_id -> device_id -> ICallHandlers\n private activeSpeakerLoopInterval?: ReturnType<typeof setTimeout>;\n private retryCallLoopInterval?: ReturnType<typeof setTimeout>;\n private retryCallCounts: Map<string, Map<string, number>> = new Map(); // user_id -> device_id -> count\n private reEmitter: ReEmitter;\n private transmitTimer: ReturnType<typeof setTimeout> | null = null;\n private participantsExpirationTimer: ReturnType<typeof setTimeout> | null = null;\n private resendMemberStateTimer: ReturnType<typeof setInterval> | null = null;\n private initWithAudioMuted = false;\n private initWithVideoMuted = false;\n private initCallFeedPromise?: Promise<void>;\n private _livekitServiceURL?: string;\n\n private stats: GroupCallStats | undefined;\n /**\n * Configure default webrtc stats collection interval in ms\n * Disable collecting webrtc stats by setting interval to 0\n */\n private statsCollectIntervalTime = 0;\n\n public constructor(\n private client: MatrixClient,\n public room: Room,\n public type: GroupCallType,\n public isPtt: boolean,\n public intent: GroupCallIntent,\n groupCallId?: string,\n private dataChannelsEnabled?: boolean,\n private dataChannelOptions?: IGroupCallDataChannelOptions,\n isCallWithoutVideoAndAudio?: boolean,\n // this tells the js-sdk not to actually establish any calls to exchange media and just to\n // create the group call signaling events, with the intention that the actual media will be\n // handled using livekit. The js-sdk doesn't contain any code to do the actual livekit call though.\n private useLivekit = false,\n livekitServiceURL?: string,\n ) {\n super();\n this.reEmitter = new ReEmitter(this);\n this.groupCallId = groupCallId ?? genCallID();\n this._livekitServiceURL = livekitServiceURL;\n this.creationTs =\n room.currentState.getStateEvents(EventType.GroupCallPrefix, this.groupCallId)?.getTs() ?? null;\n this.updateParticipants();\n\n room.on(RoomStateEvent.Update, this.onRoomState);\n this.on(GroupCallEvent.ParticipantsChanged, this.onParticipantsChanged);\n this.on(GroupCallEvent.GroupCallStateChanged, this.onStateChanged);\n this.on(GroupCallEvent.LocalScreenshareStateChanged, this.onLocalFeedsChanged);\n this.allowCallWithoutVideoAndAudio = !!isCallWithoutVideoAndAudio;\n }\n\n private onConnectionStats = (report: ConnectionStatsReport): void => {\n // Final emit of the summary event, to be consumed by the client\n this.emit(GroupCallStatsReportEvent.ConnectionStats, { report });\n };\n\n private onByteSentStats = (report: ByteSentStatsReport): void => {\n // Final emit of the summary event, to be consumed by the client\n this.emit(GroupCallStatsReportEvent.ByteSentStats, { report });\n };\n\n private onSummaryStats = (report: SummaryStatsReport): void => {\n SummaryStatsReportGatherer.extendSummaryReport(report, this.participants);\n // Final emit of the summary event, to be consumed by the client\n this.emit(GroupCallStatsReportEvent.SummaryStats, { report });\n };\n\n private onCallFeedReport = (report: CallFeedReport): void => {\n if (this.localCallFeed) {\n report = CallFeedStatsReporter.expandCallFeedReport(report, [this.localCallFeed], \"from-local-feed\");\n }\n\n const callFeeds: CallFeed[] = [];\n this.forEachCall((call) => {\n if (call.callId === report.callId) {\n call.getFeeds().forEach((f) => callFeeds.push(f));\n }\n });\n\n report = CallFeedStatsReporter.expandCallFeedReport(report, callFeeds, \"from-call-feed\");\n this.emit(GroupCallStatsReportEvent.CallFeedStats, { report });\n };\n\n public async create(): Promise<GroupCall> {\n this.creationTs = Date.now();\n this.client.groupCallEventHandler!.groupCalls.set(this.room.roomId, this);\n this.client.emit(GroupCallEventHandlerEvent.Outgoing, this);\n\n await this.sendCallStateEvent();\n\n return this;\n }\n\n private async sendCallStateEvent(): Promise<void> {\n const groupCallState: IGroupCallRoomState = {\n \"m.intent\": this.intent,\n \"m.type\": this.type,\n \"io.element.ptt\": this.isPtt,\n // TODO: Specify data-channels better\n \"dataChannelsEnabled\": this.dataChannelsEnabled,\n \"dataChannelOptions\": this.dataChannelsEnabled ? this.dataChannelOptions : undefined,\n };\n if (this.livekitServiceURL) {\n groupCallState[\"io.element.livekit_service_url\"] = this.livekitServiceURL;\n }\n\n await this.client.sendStateEvent(this.room.roomId, EventType.GroupCallPrefix, groupCallState, this.groupCallId);\n }\n\n public get livekitServiceURL(): string | undefined {\n return this._livekitServiceURL;\n }\n\n public updateLivekitServiceURL(newURL: string): Promise<void> {\n this._livekitServiceURL = newURL;\n return this.sendCallStateEvent();\n }\n\n private _state = GroupCallState.LocalCallFeedUninitialized;\n\n /**\n * The group call's state.\n */\n public get state(): GroupCallState {\n return this._state;\n }\n\n private set state(value: GroupCallState) {\n const prevValue = this._state;\n if (value !== prevValue) {\n this._state = value;\n this.emit(GroupCallEvent.GroupCallStateChanged, value, prevValue);\n }\n }\n\n private _participants = new Map<RoomMember, Map<string, ParticipantState>>();\n\n /**\n * The current participants in the call, as a map from members to device IDs\n * to participant info.\n */\n public get participants(): Map<RoomMember, Map<string, ParticipantState>> {\n return this._participants;\n }\n\n private set participants(value: Map<RoomMember, Map<string, ParticipantState>>) {\n const prevValue = this._participants;\n const participantStateEqual = (x: ParticipantState, y: ParticipantState): boolean =>\n x.sessionId === y.sessionId && x.screensharing === y.screensharing;\n const deviceMapsEqual = (x: Map<string, ParticipantState>, y: Map<string, ParticipantState>): boolean =>\n mapsEqual(x, y, participantStateEqual);\n\n // Only update if the map actually changed\n if (!mapsEqual(value, prevValue, deviceMapsEqual)) {\n this._participants = value;\n this.emit(GroupCallEvent.ParticipantsChanged, value);\n }\n }\n\n private _creationTs: number | null = null;\n\n /**\n * The timestamp at which the call was created, or null if it has not yet\n * been created.\n */\n public get creationTs(): number | null {\n return this._creationTs;\n }\n\n private set creationTs(value: number | null) {\n this._creationTs = value;\n }\n\n private _enteredViaAnotherSession = false;\n\n /**\n * Whether the local device has entered this call via another session, such\n * as a widget.\n */\n public get enteredViaAnotherSession(): boolean {\n return this._enteredViaAnotherSession;\n }\n\n public set enteredViaAnotherSession(value: boolean) {\n this._enteredViaAnotherSession = value;\n this.updateParticipants();\n }\n\n /**\n * Executes the given callback on all calls in this group call.\n * @param f - The callback.\n */\n public forEachCall(f: (call: MatrixCall) => void): void {\n for (const deviceMap of this.calls.values()) {\n for (const call of deviceMap.values()) f(call);\n }\n }\n\n public getLocalFeeds(): CallFeed[] {\n const feeds: CallFeed[] = [];\n\n if (this.localCallFeed) feeds.push(this.localCallFeed);\n if (this.localScreenshareFeed) feeds.push(this.localScreenshareFeed);\n\n return feeds;\n }\n\n public hasLocalParticipant(): boolean {\n return (\n this.participants.get(this.room.getMember(this.client.getUserId()!)!)?.has(this.client.getDeviceId()!) ??\n false\n );\n }\n\n /**\n * Determines whether the given call is one that we were expecting to exist\n * given our knowledge of who is participating in the group call.\n */\n private callExpected(call: MatrixCall): boolean {\n const userId = getCallUserId(call);\n const member = userId === null ? null : this.room.getMember(userId);\n const deviceId = call.getOpponentDeviceId();\n return member !== null && deviceId !== undefined && this.participants.get(member)?.get(deviceId) !== undefined;\n }\n\n public async initLocalCallFeed(): Promise<void> {\n if (this.useLivekit) {\n logger.info(\"Livekit group call: not starting local call feed.\");\n return;\n }\n\n if (this.state !== GroupCallState.LocalCallFeedUninitialized) {\n throw new Error(`Cannot initialize local call feed in the \"${this.state}\" state.`);\n }\n this.state = GroupCallState.InitializingLocalCallFeed;\n\n // wraps the real method to serialise calls, because we don't want to try starting\n // multiple call feeds at once\n if (this.initCallFeedPromise) return this.initCallFeedPromise;\n\n try {\n this.initCallFeedPromise = this.initLocalCallFeedInternal();\n await this.initCallFeedPromise;\n } finally {\n this.initCallFeedPromise = undefined;\n }\n }\n\n private async initLocalCallFeedInternal(): Promise<void> {\n logger.log(`GroupCall ${this.groupCallId} initLocalCallFeedInternal() running`);\n\n let stream: MediaStream;\n\n try {\n stream = await this.client.getMediaHandler().getUserMediaStream(true, this.type === GroupCallType.Video);\n } catch (error) {\n // If is allowed to join a call without a media stream, then we\n // don't throw an error here. But we need an empty Local Feed to establish\n // a connection later.\n if (this.allowCallWithoutVideoAndAudio) {\n stream = new MediaStream();\n } else {\n this.state = GroupCallState.LocalCallFeedUninitialized;\n throw error;\n }\n }\n\n // The call could've been disposed while we were waiting, and could\n // also have been started back up again (hello, React 18) so if we're\n // still in this 'initializing' state, carry on, otherwise bail.\n if (this._state !== GroupCallState.InitializingLocalCallFeed) {\n this.client.getMediaHandler().stopUserMediaStream(stream);\n throw new Error(\"Group call disposed while gathering media stream\");\n }\n\n const callFeed = new CallFeed({\n client: this.client,\n roomId: this.room.roomId,\n userId: this.client.getUserId()!,\n deviceId: this.client.getDeviceId()!,\n stream,\n purpose: SDPStreamMetadataPurpose.Usermedia,\n audioMuted: this.initWithAudioMuted || stream.getAudioTracks().length === 0 || this.isPtt,\n videoMuted: this.initWithVideoMuted || stream.getVideoTracks().length === 0,\n });\n\n setTracksEnabled(stream.getAudioTracks(), !callFeed.isAudioMuted());\n setTracksEnabled(stream.getVideoTracks(), !callFeed.isVideoMuted());\n\n this.localCallFeed = callFeed;\n this.addUserMediaFeed(callFeed);\n\n this.state = GroupCallState.LocalCallFeedInitialized;\n }\n\n public async updateLocalUsermediaStream(stream: MediaStream): Promise<void> {\n if (this.localCallFeed) {\n const oldStream = this.localCallFeed.stream;\n this.localCallFeed.setNewStream(stream);\n const micShouldBeMuted = this.localCallFeed.isAudioMuted();\n const vidShouldBeMuted = this.localCallFeed.isVideoMuted();\n logger.log(\n `GroupCall ${this.groupCallId} updateLocalUsermediaStream() (oldStreamId=${oldStream.id}, newStreamId=${stream.id}, micShouldBeMuted=${micShouldBeMuted}, vidShouldBeMuted=${vidShouldBeMuted})`,\n );\n setTracksEnabled(stream.getAudioTracks(), !micShouldBeMuted);\n setTracksEnabled(stream.getVideoTracks(), !vidShouldBeMuted);\n this.client.getMediaHandler().stopUserMediaStream(oldStream);\n }\n }\n\n public async enter(): Promise<void> {\n if (this.state === GroupCallState.LocalCallFeedUninitialized) {\n await this.initLocalCallFeed();\n } else if (this.state !== GroupCallState.LocalCallFeedInitialized) {\n throw new Error(`Cannot enter call in the \"${this.state}\" state`);\n }\n\n logger.log(`GroupCall ${this.groupCallId} enter() running`);\n this.state = GroupCallState.Entered;\n\n this.client.on(CallEventHandlerEvent.Incoming, this.onIncomingCall);\n\n for (const call of this.client.callEventHandler!.calls.values()) {\n this.onIncomingCall(call);\n }\n\n if (!this.useLivekit) {\n this.retryCallLoopInterval = setInterval(this.onRetryCallLoop, this.retryCallInterval);\n\n this.activeSpeaker = undefined;\n this.onActiveSpeakerLoop();\n this.activeSpeakerLoopInterval = setInterval(this.onActiveSpeakerLoop, this.activeSpeakerInterval);\n }\n }\n\n private dispose(): void {\n if (this.localCallFeed) {\n this.removeUserMediaFeed(this.localCallFeed);\n this.localCallFeed = undefined;\n }\n\n if (this.localScreenshareFeed) {\n this.client.getMediaHandler().stopScreensharingStream(this.localScreenshareFeed.stream);\n this.removeScreenshareFeed(this.localScreenshareFeed);\n this.localScreenshareFeed = undefined;\n this.localDesktopCapturerSourceId = undefined;\n }\n\n this.client.getMediaHandler().stopAllStreams();\n\n if (this.transmitTimer !== null) {\n clearTimeout(this.transmitTimer);\n this.transmitTimer = null;\n }\n\n if (this.retryCallLoopInterval !== undefined) {\n clearInterval(this.retryCallLoopInterval);\n this.retryCallLoopInterval = undefined;\n }\n\n if (this.participantsExpirationTimer !== null) {\n clearTimeout(this.participantsExpirationTimer);\n this.participantsExpirationTimer = null;\n }\n\n if (this.state !== GroupCallState.Entered) {\n return;\n }\n\n this.forEachCall((call) => call.hangup(CallErrorCode.UserHangup, false));\n\n this.activeSpeaker = undefined;\n clearInterval(this.activeSpeakerLoopInterval);\n\n this.retryCallCounts.clear();\n clearInterval(this.retryCallLoopInterval);\n\n this.client.removeListener(CallEventHandlerEvent.Incoming, this.onIncomingCall);\n this.stats?.stop();\n }\n\n public leave(): void {\n this.dispose();\n this.state = GroupCallState.LocalCallFeedUninitialized;\n }\n\n public async terminate(emitStateEvent = true): Promise<void> {\n this.dispose();\n\n this.room.off(RoomStateEvent.Update, this.onRoomState);\n this.client.groupCallEventHandler!.groupCalls.delete(this.room.roomId);\n this.client.emit(GroupCallEventHandlerEvent.Ended, this);\n this.state = GroupCallState.Ended;\n\n if (emitStateEvent) {\n const existingStateEvent = this.room.currentState.getStateEvents(\n EventType.GroupCallPrefix,\n this.groupCallId,\n )!;\n\n await this.client.sendStateEvent(\n this.room.roomId,\n EventType.GroupCallPrefix,\n {\n ...existingStateEvent.getContent(),\n \"m.terminated\": GroupCallTerminationReason.CallEnded,\n },\n this.groupCallId,\n );\n }\n }\n\n /*\n * Local Usermedia\n */\n\n public isLocalVideoMuted(): boolean {\n if (this.localCallFeed) {\n return this.localCallFeed.isVideoMuted();\n }\n\n return true;\n }\n\n public isMicrophoneMuted(): boolean {\n if (this.localCallFeed) {\n return this.localCallFeed.isAudioMuted();\n }\n\n return true;\n }\n\n /**\n * Sets the mute state of the local participants's microphone.\n * @param muted - Whether to mute the microphone\n * @returns Whether muting/unmuting was successful\n */\n public async setMicrophoneMuted(muted: boolean): Promise<boolean> {\n // hasAudioDevice can block indefinitely if the window has lost focus,\n // and it doesn't make much sense to keep a device from being muted, so\n // we always allow muted = true changes to go through\n if (!muted && !(await this.client.getMediaHandler().hasAudioDevice())) {\n return false;\n }\n\n const sendUpdatesBefore = !muted && this.isPtt;\n\n // set a timer for the maximum transmit time on PTT calls\n if (this.isPtt) {\n // Set or clear the max transmit timer\n if (!muted && this.isMicrophoneMuted()) {\n this.transmitTimer = setTimeout(() => {\n this.setMicrophoneMuted(true);\n }, this.pttMaxTransmitTime);\n } else if (muted && !this.isMicrophoneMuted()) {\n if (this.transmitTimer !== null) clearTimeout(this.transmitTimer);\n this.transmitTimer = null;\n }\n }\n\n this.forEachCall((call) => call.localUsermediaFeed?.setAudioVideoMuted(muted, null));\n\n const sendUpdates = async (): Promise<void> => {\n const updates: Promise<void>[] = [];\n this.forEachCall((call) => updates.push(call.sendMetadataUpdate()));\n\n await Promise.all(updates).catch((e) =>\n logger.info(\n `GroupCall ${this.groupCallId} setMicrophoneMuted() failed to send some metadata updates`,\n e,\n ),\n );\n };\n\n if (sendUpdatesBefore) await sendUpdates();\n\n if (this.localCallFeed) {\n logger.log(\n `GroupCall ${this.groupCallId} setMicrophoneMuted() (streamId=${this.localCallFeed.stream.id}, muted=${muted})`,\n );\n\n const hasPermission = await this.checkAudioPermissionIfNecessary(muted);\n\n if (!hasPermission) {\n return false;\n }\n\n this.localCallFeed.setAudioVideoMuted(muted, null);\n // I don't believe its actually necessary to enable these tracks: they\n // are the one on the GroupCall's own CallFeed and are cloned before being\n // given to any of the actual calls, so these tracks don't actually go\n // anywhere. Let's do it anyway to avoid confusion.\n setTracksEnabled(this.localCallFeed.stream.getAudioTracks(), !muted);\n } else {\n logger.log(`GroupCall ${this.groupCallId} setMicrophoneMuted() no stream muted (muted=${muted})`);\n this.initWithAudioMuted = muted;\n }\n\n this.forEachCall((call) =>\n setTracksEnabled(call.localUsermediaFeed!.stream.getAudioTracks(), !muted && this.callExpected(call)),\n );\n this.emit(GroupCallEvent.LocalMuteStateChanged, muted, this.isLocalVideoMuted());\n\n if (!sendUpdatesBefore) await sendUpdates();\n\n return true;\n }\n\n /**\n * If we allow entering a call without a camera and without video, it can happen that the access rights to the\n * devices have not yet been queried. If a stream does not yet have an audio track, we assume that the rights have\n * not yet been checked.\n *\n * `this.client.getMediaHandler().getUserMediaStream` clones the current stream, so it only wanted to be called when\n * not Audio Track exists.\n * As such, this is a compromise, because, the access rights should always be queried before the call.\n */\n private async checkAudioPermissionIfNecessary(muted: boolean): Promise<boolean> {\n // We needed this here to avoid an error in case user join a call without a device.\n try {\n if (!muted && this.localCallFeed && !this.localCallFeed.hasAudioTrack) {\n const stream = await this.client\n .getMediaHandler()\n .getUserMediaStream(true, !this.localCallFeed.isVideoMuted());\n if (stream?.getTracks().length === 0) {\n // if case permission denied to get a stream stop this here\n /* istanbul ignore next */\n logger.log(\n `GroupCall ${this.groupCallId} setMicrophoneMuted() no device to receive local stream, muted=${muted}`,\n );\n return false;\n }\n }\n } catch {\n /* istanbul ignore next */\n logger.log(\n `GroupCall ${this.groupCallId} setMicrophoneMuted() no device or permission to receive local stream, muted=${muted}`,\n );\n return false;\n }\n\n return true;\n }\n\n /**\n * Sets the mute state of the local participants's video.\n * @param muted - Whether to mute the video\n * @returns Whether muting/unmuting was successful\n */\n public async setLocalVideoMuted(muted: boolean): Promise<boolean> {\n // hasAudioDevice can block indefinitely if the window has lost focus,\n // and it doesn't make much sense to keep a device from being muted, so\n // we always allow muted = true changes to go through\n if (!muted && !(await this.client.getMediaHandler().hasVideoDevice())) {\n return false;\n }\n\n if (this.localCallFeed) {\n /* istanbul ignore next */\n logger.log(\n `GroupCall ${this.groupCallId} setLocalVideoMuted() (stream=${this.localCallFeed.stream.id}, muted=${muted})`,\n );\n\n try {\n const stream = await this.client.getMediaHandler().getUserMediaStream(true, !muted);\n await this.updateLocalUsermediaStream(stream);\n this.localCallFeed.setAudioVideoMuted(null, muted);\n setTracksEnabled(this.localCallFeed.stream.getVideoTracks(), !muted);\n } catch {\n // No permission to video device\n /* istanbul ignore next */\n logger.log(\n `GroupCall ${this.groupCallId} setLocalVideoMuted() no device or permission to receive local stream, muted=${muted}`,\n );\n return false;\n }\n } else {\n logger.log(`GroupCall ${this.groupCallId} setLocalVideoMuted() no stream muted (muted=${muted})`);\n this.initWithVideoMuted = muted;\n }\n\n const updates: Promise<unknown>[] = [];\n this.forEachCall((call) => updates.push(call.setLocalVideoMuted(muted)));\n await Promise.all(updates);\n\n // We setTracksEnabled again, independently from the call doing it\n // internally, since we might not be expecting the call\n this.forEachCall((call) =>\n setTracksEnabled(call.localUsermediaFeed!.stream.getVideoTracks(), !muted && this.callExpected(call)),\n );\n\n this.emit(GroupCallEvent.LocalMuteStateChanged, this.isMicrophoneMuted(), muted);\n\n return true;\n }\n\n public async setScreensharingEnabled(enabled: boolean, opts: IScreensharingOpts = {}): Promise<boolean> {\n if (enabled === this.isScreensharing()) {\n return enabled;\n }\n\n if (enabled) {\n try {\n logger.log(\n `GroupCall ${this.groupCallId} setScreensharingEnabled() is asking for screensharing permissions`,\n );\n const stream = await this.client.getMediaHandler().getScreensharingStream(opts);\n\n for (const track of stream.getTracks()) {\n const onTrackEnded = (): void => {\n this.setScreensharingEnabled(false);\n track.removeEventListener(\"ended\", onTrackEnded);\n };\n\n track.addEventListener(\"ended\", onTrackEnded);\n }\n\n logger.log(\n `GroupCall ${this.groupCallId} setScreensharingEnabled() granted screensharing permissions. Setting screensharing enabled on all calls`,\n );\n\n this.localDesktopCapturerSourceId = opts.desktopCapturerSourceId;\n this.localScreenshareFeed = new CallFeed({\n client: this.client,\n roomId: this.room.roomId,\n userId: this.client.getUserId()!,\n deviceId: this.client.getDeviceId()!,\n stream,\n purpose: SDPStreamMetadataPurpose.Screenshare,\n audioMuted: false,\n videoMuted: false,\n });\n this.addScreenshareFeed(this.localScreenshareFeed);\n\n this.emit(\n GroupCallEvent.LocalScreenshareStateChanged,\n true,\n this.localScreenshareFeed,\n this.localDesktopCapturerSourceId,\n );\n\n // TODO: handle errors\n this.forEachCall((call) => call.pushLocalFeed(this.localScreenshareFeed!.clone()));\n\n return true;\n } catch (error) {\n if (opts.throwOnFail) throw error;\n logger.error(\n `GroupCall ${this.groupCallId} setScreensharingEnabled() enabling screensharing error`,\n error,\n );\n this.emit(\n GroupCallEvent.Error,\n new GroupCallError(\n GroupCallErrorCode.NoUserMedia,\n \"Failed to get screen-sharing stream: \",\n error as Error,\n ),\n );\n return false;\n }\n } else {\n this.forEachCall((call) => {\n if (call.localScreensharingFeed) call.removeLocalFeed(call.localScreensharingFeed);\n });\n this.client.getMediaHandler().stopScreensharingStream(this.localScreenshareFeed!.stream);\n this.removeScreenshareFeed(this.localScreenshareFeed!);\n this.localScreenshareFeed = undefined;\n this.localDesktopCapturerSourceId = undefined;\n this.emit(GroupCallEvent.LocalScreenshareStateChanged, false, undefined, undefined);\n return false;\n }\n }\n\n public isScreensharing(): boolean {\n return !!this.localScreenshareFeed;\n }\n\n /*\n * Call Setup\n *\n * There are two different paths for calls to be created:\n * 1. Incoming calls triggered by the Call.incoming event.\n * 2. Outgoing calls to the initial members of a room or new members\n * as they are observed by the RoomState.members event.\n */\n\n private onIncomingCall = (newCall: MatrixCall): void => {\n // The incoming calls may be for another room, which we will ignore.\n if (newCall.roomId !== this.room.roomId) {\n return;\n }\n\n if (newCall.state !== CallState.Ringing) {\n logger.warn(\n `GroupCall ${this.groupCallId} onIncomingCall() incoming call no longer in ringing state - ignoring`,\n );\n return;\n }\n\n if (!newCall.groupCallId || newCall.groupCallId !== this.groupCallId) {\n logger.log(\n `GroupCall ${this.groupCallId} onIncomingCall() ignored because it doesn't match the current group call`,\n );\n newCall.reject();\n return;\n }\n\n const opponentUserId = newCall.getOpponentMember()?.userId;\n if (opponentUserId === undefined) {\n logger.warn(`GroupCall ${this.groupCallId} onIncomingCall() incoming call with no member - ignoring`);\n return;\n }\n\n if (this.useLivekit) {\n logger.info(\"Received incoming call whilst in signaling-only mode! Ignoring.\");\n return;\n }\n\n const deviceMap = this.calls.get(opponentUserId) ?? new Map<string, MatrixCall>();\n const prevCall = deviceMap.get(newCall.getOpponentDeviceId()!);\n\n if (prevCall?.callId === newCall.callId) return;\n\n logger.log(\n `GroupCall ${this.groupCallId} onIncomingCall() incoming call (userId=${opponentUserId}, callId=${newCall.callId})`,\n );\n\n if (prevCall) prevCall.hangup(CallErrorCode.Replaced, false);\n // We must do this before we start initialising / answering the call as we\n // need to know it is the active call for this user+deviceId and to not ignore\n // events from it.\n deviceMap.set(newCall.getOpponentDeviceId()!, newCall);\n this.calls.set(opponentUserId, deviceMap);\n\n this.initCall(newCall);\n\n const feeds = this.getLocalFeeds().map((feed) => feed.clone());\n if (!this.callExpected(newCall)) {\n // Disable our tracks for users not explicitly participating in the\n // call but trying to receive the feeds\n for (const feed of feeds) {\n setTracksEnabled(feed.stream.getAudioTracks(), false);\n setTracksEnabled(feed.stream.getVideoTracks(), false);\n }\n }\n newCall.answerWithCallFeeds(feeds);\n\n this.emit(GroupCallEvent.CallsChanged, this.calls);\n };\n\n /**\n * Determines whether a given participant expects us to call them (versus\n * them calling us).\n * @param userId - The participant's user ID.\n * @param deviceId - The participant's device ID.\n * @returns Whether we need to place an outgoing call to the participant.\n */\n private wantsOutgoingCall(userId: string, deviceId: string): boolean {\n const localUserId = this.client.getUserId()!;\n const localDeviceId = this.client.getDeviceId()!;\n return (\n // If a user's ID is less than our own, they'll call us\n userId >= localUserId &&\n // If this is another one of our devices, compare device IDs to tell whether it'll call us\n (userId !== localUserId || deviceId > localDeviceId)\n );\n }\n\n /**\n * Places calls to all participants that we're responsible for calling.\n */\n private placeOutgoingCalls(): void {\n let callsChanged = false;\n\n for (const [{ userId }, participantMap] of this.participants) {\n const callMap = this.calls.get(userId) ?? new Map<string, MatrixCall>();\n\n for (const [deviceId, participant] of participantMap) {\n const prevCall = callMap.get(deviceId);\n\n if (\n prevCall?.getOpponentSessionId() !== participant.sessionId &&\n this.wantsOutgoingCall(userId, deviceId)\n ) {\n callsChanged = true;\n\n if (prevCall !== undefined) {\n logger.debug(\n `GroupCall ${this.groupCallId} placeOutgoingCalls() replacing call (userId=${userId}, deviceId=${deviceId}, callId=${prevCall.callId})`,\n );\n prevCall.hangup(CallErrorCode.NewSession, false);\n }\n\n const newCall = createNewMatrixCall(this.client, this.room.roomId, {\n invitee: userId,\n opponentDeviceId: deviceId,\n opponentSessionId: participant.sessionId,\n groupCallId: this.groupCallId,\n });\n\n if (newCall === null) {\n logger.error(\n `GroupCall ${this.groupCallId} placeOutgoingCalls() failed to create call (userId=${userId}, device=${deviceId})`,\n );\n callMap.delete(deviceId);\n } else {\n this.initCall(newCall);\n callMap.set(deviceId, newCall);\n\n logger.debug(\n `GroupCall ${this.groupCallId} placeOutgoingCalls() placing call (userId=${userId}, deviceId=${deviceId}, sessionId=${participant.sessionId})`,\n );\n\n newCall\n .placeCallWithCallFeeds(\n this.getLocalFeeds().map((feed) => feed.clone()),\n participant.screensharing,\n )\n .then(() => {\n if (this.dataChannelsEnabled) {\n newCall.createDataChannel(\"datachannel\", this.dataChannelOptions);\n }\n })\n .catch((e) => {\n logger.warn(\n `GroupCall ${this.groupCallId} placeOutgoingCalls() failed to place call (userId=${userId})`,\n e,\n );\n\n if (e instanceof CallError && e.code === GroupCallErrorCode.UnknownDevice) {\n this.emit(GroupCallEvent.Error, e);\n } else {\n this.emit(\n GroupCallEvent.Error,\n new GroupCallError(\n GroupCallErrorCode.PlaceCallFailed,\n `Failed to place call to ${userId}`,\n ),\n );\n }\n\n newCall.hangup(CallErrorCode.SignallingFailed, false);\n if (callMap.get(deviceId) === newCall) callMap.delete(deviceId);\n });\n }\n }\n }\n\n if (callMap.size > 0) {\n this.calls.set(userId, callMap);\n } else {\n this.calls.delete(userId);\n }\n }\n\n if (callsChanged) this.emit(GroupCallEvent.CallsChanged, this.calls);\n }\n\n /*\n * Room Member State\n */\n\n private getMemberStateEvents(): MatrixEvent[];\n private getMemberStateEvents(userId: string): MatrixEvent | null;\n private getMemberStateEvents(userId?: string): MatrixEvent[] | MatrixEvent | null {\n return userId === undefined\n ? this.room.currentState.getStateEvents(EventType.GroupCallMemberPrefix)\n : this.room.currentState.getStateEvents(EventType.GroupCallMemberPrefix, userId);\n }\n\n private onRetryCallLoop = (): void => {\n let needsRetry = false;\n\n for (const [{ userId }, participantMap] of this.participants) {\n const callMap = this.calls.get(userId);\n let retriesMap = this.retryCallCounts.get(userId);\n\n for (const [deviceId, participant] of participantMap) {\n const call = callMap?.get(deviceId);\n const retries = retriesMap?.get(deviceId) ?? 0;\n\n if (\n call?.getOpponentSessionId() !== participant.sessionId &&\n this.wantsOutgoingCall(userId, deviceId) &&\n retries < 3\n ) {\n if (retriesMap === undefined) {\n retriesMap = new Map();\n this.retryCallCounts.set(userId, retriesMap);\n }\n retriesMap.set(deviceId, retries + 1);\n needsRetry = true;\n }\n }\n }\n\n if (needsRetry) this.placeOutgoingCalls();\n };\n\n private initCall(call: MatrixCall): void {\n const opponentMemberId = getCallUserId(call);\n\n if (!opponentMemberId) {\n throw new Error(\"Cannot init call without user id\");\n }\n\n const onCallFeedsChanged = (): void => this.onCallFeedsChanged(call);\n const onCallStateChanged = (state: CallState, oldState?: CallState): void =>\n this.onCallStateChanged(call, state, oldState);\n const onCallHangup = this.onCallHangup;\n const onCallReplaced = (newCall: MatrixCall): void => this.onCallReplaced(call, newCall);\n\n let deviceMap = this.callHandlers.get(opponentMemberId);\n if (deviceMap === undefined) {\n deviceMap = new Map();\n this.callHandlers.set(opponentMemberId, deviceMap);\n }\n\n deviceMap.set(call.getOpponentDeviceId()!, {\n onCallFeedsChanged,\n onCallStateChanged,\n onCallHangup,\n onCallReplaced,\n });\n\n call.on(CallEvent.FeedsChanged, onCallFeedsChanged);\n call.on(CallEvent.State, onCallStateChanged);\n call.on(CallEvent.Hangup, onCallHangup);\n call.on(CallEvent.Replaced, onCallReplaced);\n\n call.isPtt = this.isPtt;\n\n this.reEmitter.reEmit(call, Object.values(CallEvent));\n\n call.initStats(this.getGroupCallStats());\n\n onCallFeedsChanged();\n }\n\n private disposeCall(call: MatrixCall, hangupReason: CallErrorCode): void {\n const opponentMemberId = getCallUserId(call);\n const opponentDeviceId = call.getOpponentDeviceId()!;\n\n if (!opponentMemberId) {\n throw new Error(\"Cannot dispose call without user id\");\n }\n\n const deviceMap = this.callHandlers.get(opponentMemberId)!;\n const { onCallFeedsChanged, onCallStateChanged, onCallHangup, onCallReplaced } =\n deviceMap.get(opponentDeviceId)!;\n\n call.removeListener(CallEvent.FeedsChanged, onCallFeedsChanged);\n call.removeListener(CallEvent.State, onCallStateChanged);\n call.removeListener(CallEvent.Hangup, onCallHangup);\n call.removeListener(CallEvent.Replaced, onCallReplaced);\n\n deviceMap.delete(opponentMemberId);\n if (deviceMap.size === 0) this.callHandlers.delete(opponentMemberId);\n\n if (call.hangupReason === CallErrorCode.Replaced) {\n return;\n }\n\n const usermediaFeed = this.getUserMediaFeed(opponentMemberId, opponentDeviceId);\n\n if (usermediaFeed) {\n this.removeUserMediaFeed(usermediaFeed);\n }\n\n const screenshareFeed = this.getScreenshareFeed(opponentMemberId, opponentDeviceId);\n\n if (screenshareFeed) {\n this.removeScreenshareFeed(screenshareFeed);\n }\n }\n\n private onCallFeedsChanged = (call: MatrixCall): void => {\n const opponentMemberId = getCallUserId(call);\n const opponentDeviceId = call.getOpponentDeviceId()!;\n\n if (!opponentMemberId) {\n throw new Error(\"Cannot change call feeds without user id\");\n }\n\n const currentUserMediaFeed = this.getUserMediaFeed(opponentMemberId, opponentDeviceId);\n const remoteUsermediaFeed = call.remoteUsermediaFeed;\n const remoteFeedChanged = remoteUsermediaFeed !== currentUserMediaFeed;\n\n const deviceMap = this.calls.get(opponentMemberId);\n const currentCallForUserDevice = deviceMap?.get(opponentDeviceId);\n if (currentCallForUserDevice?.callId !== call.callId) {\n // the call in question is not the current call for this user/deviceId\n // so ignore feed events from it otherwise we'll remove our real feeds\n return;\n }\n\n if (remoteFeedChanged) {\n if (!currentUserMediaFeed && remoteUsermediaFeed) {\n this.addUserMediaFeed(remoteUsermediaFeed);\n } else if (currentUserMediaFeed && remoteUsermediaFeed) {\n this.replaceUserMediaFeed(currentUserMediaFeed, remoteUsermediaFeed);\n } else if (currentUserMediaFeed && !remoteUsermediaFeed) {\n this.removeUserMediaFeed(currentUserMediaFeed);\n }\n }\n\n const currentScreenshareFeed = this.getScreenshareFeed(opponentMemberId, opponentDeviceId);\n const remoteScreensharingFeed = call.remoteScreensharingFeed;\n const remoteScreenshareFeedChanged = remoteScreensharingFeed !== currentScreenshareFeed;\n\n if (remoteScreenshareFeedChanged) {\n if (!currentScreenshareFeed && remoteScreensharingFeed) {\n this.addScreenshareFeed(remoteScreensharingFeed);\n } else if (currentScreenshareFeed && remoteScreensharingFeed) {\n this.replaceScreenshareFeed(currentScreenshareFeed, remoteScreensharingFeed);\n } else if (currentScreenshareFeed && !remoteScreensharingFeed) {\n this.removeScreenshareFeed(currentScreenshareFeed);\n }\n }\n };\n\n private onCallStateChanged = (call: MatrixCall, state: CallState, _oldState: CallState | undefined): void => {\n if (state === CallState.Ended) return;\n\n const audioMuted = this.localCallFeed!.isAudioMuted();\n\n if (call.localUsermediaStream && call.isMicrophoneMuted() !== audioMuted) {\n call.setMicrophoneMuted(audioMuted);\n }\n\n const videoMuted = this.localCallFeed!.isVideoMuted();\n\n if (call.localUsermediaStream && call.isLocalVideoMuted() !== videoMuted) {\n call.setLocalVideoMuted(videoMuted);\n }\n\n const opponentUserId = call.getOpponentMember()?.userId;\n if (state === CallState.Connected && opponentUserId) {\n const retriesMap = this.retryCallCounts.get(opponentUserId);\n retriesMap?.delete(call.getOpponentDeviceId()!);\n if (retriesMap?.size === 0) this.retryCallCounts.delete(opponentUserId);\n }\n };\n\n private onCallHangup = (call: MatrixCall): void => {\n if (call.hangupReason === CallErrorCode.Replaced) return;\n\n const opponentUserId = call.getOpponentMember()?.userId ?? this.room.getMember(call.invitee!)!.userId;\n const deviceMap = this.calls.get(opponentUserId);\n\n // Sanity check that this call is in fact in the map\n if (deviceMap?.get(call.getOpponentDeviceId()!) === call) {\n this.disposeCall(call, call.hangupReason as CallErrorCode);\n deviceMap.delete(call.getOpponentDeviceId()!);\n if (deviceMap.size === 0) this.calls.delete(opponentUserId);\n this.emit(GroupCallEvent.CallsChanged, this.calls);\n }\n };\n\n private onCallReplaced = (prevCall: MatrixCall, newCall: MatrixCall): void => {\n const opponentUserId = prevCall.getOpponentMember()!.userId;\n\n let deviceMap = this.calls.get(opponentUserId);\n if (deviceMap === undefined) {\n deviceMap = new Map();\n this.calls.set(opponentUserId, deviceMap);\n }\n\n prevCall.hangup(CallErrorCode.Replaced, false);\n this.initCall(newCall);\n deviceMap.set(prevCall.getOpponentDeviceId()!, newCall);\n this.emit(GroupCallEvent.CallsChanged, this.calls);\n };\n\n /*\n * UserMedia CallFeed Event Handlers\n */\n\n public getUserMediaFeed(userId: string, deviceId: string): CallFeed | undefined {\n return this.userMediaFeeds.find((f) => f.userId === userId && f.deviceId! === deviceId);\n }\n\n private addUserMediaFeed(callFeed: CallFeed): void {\n this.userMediaFeeds.push(callFeed);\n callFeed.measureVolumeActivity(true);\n this.emit(GroupCallEvent.UserMediaFeedsChanged, this.userMediaFeeds);\n }\n\n private replaceUserMediaFeed(existingFeed: CallFeed, replacementFeed: CallFeed): void {\n const feedIndex = this.userMediaFeeds.findIndex(\n (f) => f.userId === existingFeed.userId && f.deviceId! === existingFeed.deviceId,\n );\n\n if (feedIndex === -1) {\n throw new Error(\"Couldn't find user media feed to replace\");\n }\n\n this.userMediaFeeds.splice(feedIndex, 1, replacementFeed);\n\n existingFeed.dispose();\n replacementFeed.measureVolumeActivity(true);\n this.emit(GroupCallEvent.UserMediaFeedsChanged, this.userMediaFeeds);\n }\n\n private removeUserMediaFeed(callFeed: CallFeed): void {\n const feedIndex = this.userMediaFeeds.findIndex(\n (f) => f.userId === callFeed.userId && f.deviceId! === callFeed.deviceId,\n );\n\n if (feedIndex === -1) {\n throw new Error(\"Couldn't find user media feed to remove\");\n }\n\n this.userMediaFeeds.splice(feedIndex, 1);\n\n callFeed.dispose();\n this.emit(GroupCallEvent.UserMediaFeedsChanged, this.userMediaFeeds);\n\n if (this.activeSpeaker === callFeed) {\n this.activeSpeaker = this.userMediaFeeds[0];\n this.emit(GroupCallEvent.ActiveSpeakerChanged, this.activeSpeaker);\n }\n }\n\n private onActiveSpeakerLoop = (): void => {\n let topAvg: number | undefined = undefined;\n let nextActiveSpeaker: CallFeed | undefined = undefined;\n\n for (const callFeed of this.userMediaFeeds) {\n if (callFeed.isLocal() && this.userMediaFeeds.length > 1) continue;\n\n const total = callFeed.speakingVolumeSamples.reduce(\n (acc, volume) => acc + Math.max(volume, SPEAKING_THRESHOLD),\n );\n const avg = total / callFeed.speakingVolumeSamples.length;\n\n if (!topAvg || avg > topAvg) {\n topAvg = avg;\n nextActiveSpeaker = callFeed;\n }\n }\n\n if (nextActiveSpeaker && this.activeSpeaker !== nextActiveSpeaker && topAvg && topAvg > SPEAKING_THRESHOLD) {\n this.activeSpeaker = nextActiveSpeaker;\n this.emit(GroupCallEvent.ActiveSpeakerChanged, this.activeSpeaker);\n }\n };\n\n /*\n * Screenshare Call Feed Event Handlers\n */\n\n public getScreenshareFeed(userId: string, deviceId: string): CallFeed | undefined {\n return this.screenshareFeeds.find((f) => f.userId === userId && f.deviceId! === deviceId);\n }\n\n private addScreenshareFeed(callFeed: CallFeed): void {\n this.screenshareFeeds.push(callFeed);\n this.emit(GroupCallEvent.ScreenshareFeedsChanged, this.screenshareFeeds);\n }\n\n private replaceScreenshareFeed(existingFeed: CallFeed, replacementFeed: CallFeed): void {\n const feedIndex = this.screenshareFeeds.findIndex(\n (f) => f.userId === existingFeed.userId && f.deviceId! === existingFeed.deviceId,\n );\n\n if (feedIndex === -1) {\n throw new Error(\"Couldn't find screenshare feed to replace\");\n }\n\n this.screenshareFeeds.splice(feedIndex, 1, replacementFeed);\n\n existingFeed.dispose();\n this.emit(GroupCallEvent.ScreenshareFeedsChanged, this.screenshareFeeds);\n }\n\n private removeScreenshareFeed(callFeed: CallFeed): void {\n const feedIndex = this.screenshareFeeds.findIndex(\n (f) => f.userId === callFeed.userId && f.deviceId! === callFeed.deviceId,\n );\n\n if (feedIndex === -1) {\n throw new Error(\"Couldn't find screenshare feed to remove\");\n }\n\n this.screenshareFeeds.splice(feedIndex, 1);\n\n callFeed.dispose();\n this.emit(GroupCallEvent.ScreenshareFeedsChanged, this.screenshareFeeds);\n }\n\n /**\n * Recalculates and updates the participant map to match the room state.\n */\n private updateParticipants(): void {\n const localMember = this.room.getMember(this.client.getUserId()!)!;\n if (!localMember) {\n // The client hasn't fetched enough of the room state to get our own member\n // event. This probably shouldn't happen, but sanity check & exit for now.\n logger.warn(\n `GroupCall ${this.groupCallId} updateParticipants() tried to update participants before local room member is available`,\n );\n return;\n }\n\n if (this.participantsExpirationTimer !== null) {\n clearTimeout(this.participantsExpirationTimer);\n this.participantsExpirationTimer = null;\n }\n\n if (this.state === GroupCallState.Ended) {\n this.participants = new Map();\n return;\n }\n\n const participants = new Map<RoomMember, Map<string, ParticipantState>>();\n const now = Date.now();\n const entered = this.state === GroupCallState.Entered || this.enteredViaAnotherSession;\n let nextExpiration = Infinity;\n\n for (const e of this.getMemberStateEvents()) {\n const member = this.room.getMember(e.getStateKey()!);\n const content = e.getContent<Record<any, unknown>>();\n const calls: Record<any, unknown>[] = Array.isArray(content[\"m.calls\"]) ? content[\"m.calls\"] : [];\n const call = calls.find((call) => call[\"m.call_id\"] === this.groupCallId);\n const devices: Record<any, unknown>[] = Array.isArray(call?.[\"m.devices\"]) ? call![\"m.devices\"] : [];\n\n // Filter out invalid and expired devices\n let validDevices = devices.filter(\n (d) =>\n typeof d.device_id === \"string\" &&\n typeof d.session_id === \"string\" &&\n typeof d.expires_ts === \"number\" &&\n d.expires_ts > now &&\n Array.isArray(d.feeds),\n ) as unknown as IGroupCallRoomMemberDevice[];\n\n // Apply local echo for the unentered case\n if (!entered && member?.userId === this.client.getUserId()!) {\n validDevices = validDevices.filter((d) => d.device_id !== this.client.getDeviceId()!);\n }\n\n // Must have a connected device and be joined to the room\n if (validDevices.length > 0 && member?.membership === KnownMembership.Join) {\n const deviceMap = new Map<string, ParticipantState>();\n participants.set(member, deviceMap);\n\n for (const d of validDevices) {\n deviceMap.set(d.device_id, {\n sessionId: d.session_id,\n screensharing: d.feeds.some((f) => f.purpose === SDPStreamMetadataPurpose.Screenshare),\n });\n if (d.expires_ts < nextExpiration) nextExpiration = d.expires_ts;\n }\n }\n }\n\n // Apply local echo for the entered case\n if (entered) {\n let deviceMap = participants.get(localMember);\n if (deviceMap === undefined) {\n deviceMap = new Map();\n participants.set(localMember, deviceMap);\n }\n\n if (!deviceMap.has(this.client.getDeviceId()!)) {\n deviceMap.set(this.client.getDeviceId()!, {\n sessionId: this.client.getSessionId(),\n screensharing: this.getLocalFeeds().some((f) => f.purpose === SDPStreamMetadataPurpose.Screenshare),\n });\n }\n }\n\n this.participants = participants;\n if (nextExpiration < Infinity) {\n this.participantsExpirationTimer = setTimeout(() => this.updateParticipants(), nextExpiration - now);\n }\n }\n\n /**\n * Updates the local user's member state with the devices returned by the given function.\n * @param fn - A function from the current devices to the new devices. If it\n * returns null, the update will be skipped.\n * @param keepAlive - Whether the request should outlive the window.\n */\n private async updateDevices(\n fn: (devices: IGroupCallRoomMemberDevice[]) => IGroupCallRoomMemberDevice[] | null,\n keepAlive = false,\n ): Promise<void> {\n const now = Date.now();\n const localUserId = this.client.getUserId()!;\n\n const event = this.getMemberStateEvents(localUserId);\n const content = event?.getContent<Record<any, unknown>>() ?? {};\n const calls: Record<any, unknown>[] = Array.isArray(content[\"m.calls\"]) ? content[\"m.calls\"] : [];\n\n let call: Record<any, unknown> | null = null;\n const otherCalls: Record<any, unknown>[] = [];\n for (const c of calls) {\n if (c[\"m.call_id\"] === this.groupCallId) {\n call = c;\n } else {\n otherCalls.push(c);\n }\n }\n if (call === null) call = {};\n\n const devices: Record<any, unknown>[] = Array.isArray(call[\"m.devices\"]) ? call[\"m.devices\"] : [];\n\n // Filter out invalid and expired devices\n const validDevices = devices.filter(\n (d) =>\n typeof d.device_id === \"string\" &&\n typeof d.session_id === \"string\" &&\n typeof d.expires_ts === \"number\" &&\n d.expires_ts > now &&\n Array.isArray(d.feeds),\n ) as unknown as IGroupCallRoomMemberDevice[];\n\n const newDevices = fn(validDevices);\n if (newDevices === null) return;\n\n const newCalls = [...(otherCalls as unknown as IGroupCallRoomMemberCallState[])];\n if (newDevices.length > 0) {\n newCalls.push({\n ...call,\n \"m.call_id\": this.groupCallId,\n \"m.devices\": newDevices,\n });\n }\n\n const newContent: IGroupCallRoomMemberState = { \"m.calls\": newCalls };\n\n await this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, newContent, localUserId, {\n keepAlive,\n });\n }\n\n private async addDeviceToMemberState(): Promise<void> {\n await this.updateDevices((devices) => [\n ...devices.filter((d) => d.device_id !== this.client.getDeviceId()!),\n {\n device_id: this.client.getDeviceId()!,\n session_id: this.client.getSessionId(),\n expires_ts: Date.now() + DEVICE_TIMEOUT,\n feeds: this.getLocalFeeds().map((feed) => ({ purpose: feed.purpose })),\n // TODO: Add data channels\n },\n ]);\n }\n\n private async updateMemberState(): Promise<void> {\n // Clear the old update interval before proceeding\n if (this.resendMemberStateTimer !== null) {\n clearInterval(this.resendMemberStateTimer);\n this.resendMemberStateTimer = null;\n }\n\n if (this.state === GroupCallState.Entered) {\n // Add the local device\n await this.addDeviceToMemberState();\n\n // Resend the state event every so often so it doesn't become stale\n this.resendMemberStateTimer = setInterval(\n async () => {\n logger.log(`GroupCall ${this.groupCallId} updateMemberState() resending call member state\"`);\n try {\n await this.addDeviceToMemberState();\n } catch (e) {\n logger.error(\n `GroupCall ${this.groupCallId} updateMemberState() failed to resend call member state`,\n e,\n );\n }\n },\n (DEVICE_TIMEOUT * 3) / 4,\n );\n } else {\n // Remove the local device\n await this.updateDevices(\n (devices) => devices.filter((d) => d.device_id !== this.client.getDeviceId()!),\n true,\n );\n }\n }\n\n /**\n * Cleans up our member state by filtering out logged out devices, inactive\n * devices, and our own device (if we know we haven't entered).\n */\n public async cleanMemberState(): Promise<void> {\n const { devices: myDevices } = await this.client.getDevices();\n const deviceMap = new Map<string, IMyDevice>(myDevices.map((d) => [d.device_id, d]));\n\n // updateDevices takes care of filtering out inactive devices for us\n await this.updateDevices((devices) => {\n const newDevices = devices.filter((d) => {\n const device = deviceMap.get(d.device_id);\n return (\n device?.last_seen_ts !== undefined &&\n !(\n d.device_id === this.client.getDeviceId()! &&\n this.state !== GroupCallState.Entered &&\n !this.enteredViaAnotherSession\n )\n );\n });\n\n // Skip the update if the devices are unchanged\n return newDevices.length === devices.length ? null : newDevices;\n });\n }\n\n private onRoomState = (): void => this.updateParticipants();\n\n private onParticipantsChanged = (): void => {\n // Re-run setTracksEnabled on all calls, so that participants that just\n // left get denied access to our media, and participants that just\n // joined get granted access\n this.forEachCall((call) => {\n const expected = this.callExpected(call);\n for (const feed of call.getLocalFeeds()) {\n setTracksEnabled(feed.stream.getAudioTracks(), !feed.isAudioMuted() && expected);\n setTracksEnabled(feed.stream.getVideoTracks(), !feed.isVideoMuted() && expected);\n }\n });\n\n if (this.state === GroupCallState.Entered && !this.useLivekit) this.placeOutgoingCalls();\n\n // Update the participants stored in the stats object\n };\n\n private onStateChanged = (newState: GroupCallState, oldState: GroupCallState): void => {\n if (\n newState === GroupCallState.Entered ||\n oldState === GroupCallState.Entered ||\n newState === GroupCallState.Ended\n ) {\n // We either entered, left, or ended the call\n this.updateParticipants();\n this.updateMemberState().catch((e) =>\n logger.error(\n `GroupCall ${this.groupCallId} onStateChanged() failed to update member state devices\"`,\n e,\n ),\n );\n }\n };\n\n private onLocalFeedsChanged = (): void => {\n if (this.state === GroupCallState.Entered) {\n this.updateMemberState().catch((e) =>\n logger.error(\n `GroupCall ${this.groupCallId} onLocalFeedsChanged() failed to update member state feeds`,\n e,\n ),\n );\n }\n };\n\n public getGroupCallStats(): GroupCallStats {\n if (this.stats === undefined) {\n const userID = this.client.getUserId() || \"unknown\";\n this.stats = new GroupCallStats(this.groupCallId, userID, this.statsCollectIntervalTime);\n this.stats.reports.on(StatsReport.CONNECTION_STATS, this.onConnectionStats);\n this.stats.reports.on(StatsReport.BYTE_SENT_STATS, this.onByteSentStats);\n this.stats.reports.on(StatsReport.SUMMARY_STATS, this.onSummaryStats);\n this.stats.reports.on(StatsReport.CALL_FEED_REPORT, this.onCallFeedReport);\n }\n return this.stats;\n }\n\n public setGroupCallStatsInterval(interval: number): void {\n this.statsCollectIntervalTime = interval;\n if (this.stats !== undefined) {\n this.stats.stop();\n this.stats.setInterval(interval);\n if (interval > 0) {\n this.stats.start();\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,31 +0,0 @@
1
- import { MatrixClient } from "../client.ts";
2
- import { GroupCall } from "./groupCall.ts";
3
- import { RoomMember } from "../models/room-member.ts";
4
- export declare enum GroupCallEventHandlerEvent {
5
- Incoming = "GroupCall.incoming",
6
- Outgoing = "GroupCall.outgoing",
7
- Ended = "GroupCall.ended",
8
- Participants = "GroupCall.participants"
9
- }
10
- export type GroupCallEventHandlerEventHandlerMap = {
11
- [GroupCallEventHandlerEvent.Incoming]: (call: GroupCall) => void;
12
- [GroupCallEventHandlerEvent.Outgoing]: (call: GroupCall) => void;
13
- [GroupCallEventHandlerEvent.Ended]: (call: GroupCall) => void;
14
- [GroupCallEventHandlerEvent.Participants]: (participants: RoomMember[], call: GroupCall) => void;
15
- };
16
- export declare class GroupCallEventHandler {
17
- private client;
18
- groupCalls: Map<string, GroupCall>;
19
- private roomDeferreds;
20
- constructor(client: MatrixClient);
21
- start(): Promise<void>;
22
- stop(): void;
23
- private getRoomDeferred;
24
- waitUntilRoomReadyForGroupCalls(roomId: string): Promise<void>;
25
- getGroupCallById(groupCallId: string): GroupCall | undefined;
26
- private createGroupCallForRoom;
27
- private createGroupCallFromRoomStateEvent;
28
- private onRoomsChanged;
29
- private onRoomStateChanged;
30
- }
31
- //# sourceMappingURL=groupCallEventHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"groupCallEventHandler.d.ts","sourceRoot":"","sources":["../../src/webrtc/groupCallEventHandler.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAe,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,SAAS,EAAgE,MAAM,gBAAgB,CAAC;AAGzG,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAKtD,oBAAY,0BAA0B;IAClC,QAAQ,uBAAuB;IAC/B,QAAQ,uBAAuB;IAC/B,KAAK,oBAAoB;IACzB,YAAY,2BAA2B;CAC1C;AAED,MAAM,MAAM,oCAAoC,GAAG;IAC/C,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACjE,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACjE,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9D,CAAC,0BAA0B,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACpG,CAAC;AAOF,qBAAa,qBAAqB;IASX,OAAO,CAAC,MAAM;IAR1B,UAAU,yBAAgC;IAMjD,OAAO,CAAC,aAAa,CAAmC;gBAE7B,MAAM,EAAE,YAAY;IAElC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B,IAAI,IAAI,IAAI;IAKnB,OAAO,CAAC,eAAe;IAgBhB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAInE,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,iCAAiC;IA+DzC,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,kBAAkB,CA2BxB;CACL"}
@@ -1,178 +0,0 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- /*
4
- Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>
5
-
6
- Licensed under the Apache License, Version 2.0 (the "License");
7
- you may not use this file except in compliance with the License.
8
- You may obtain a copy of the License at
9
-
10
- http://www.apache.org/licenses/LICENSE-2.0
11
-
12
- Unless required by applicable law or agreed to in writing, software
13
- distributed under the License is distributed on an "AS IS" BASIS,
14
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- See the License for the specific language governing permissions and
16
- limitations under the License.
17
- */
18
-
19
- import { ClientEvent } from "../client.js";
20
- import { GroupCall, GroupCallIntent, GroupCallType } from "./groupCall.js";
21
- import { RoomStateEvent } from "../models/room-state.js";
22
- import { logger } from "../logger.js";
23
- import { EventType } from "../@types/event.js";
24
- import { SyncState } from "../sync.js";
25
- export var GroupCallEventHandlerEvent = /*#__PURE__*/function (GroupCallEventHandlerEvent) {
26
- GroupCallEventHandlerEvent["Incoming"] = "GroupCall.incoming";
27
- GroupCallEventHandlerEvent["Outgoing"] = "GroupCall.outgoing";
28
- GroupCallEventHandlerEvent["Ended"] = "GroupCall.ended";
29
- GroupCallEventHandlerEvent["Participants"] = "GroupCall.participants";
30
- return GroupCallEventHandlerEvent;
31
- }({});
32
- export class GroupCallEventHandler {
33
- constructor(client) {
34
- this.client = client;
35
- _defineProperty(this, "groupCalls", new Map());
36
- // roomId -> GroupCall
37
- // All rooms we know about and whether we've seen a 'Room' event
38
- // for them. The promise will be fulfilled once we've processed that
39
- // event which means we're "up to date" on what calls are in a room
40
- // and get
41
- _defineProperty(this, "roomDeferreds", new Map());
42
- _defineProperty(this, "onRoomsChanged", room => {
43
- this.createGroupCallForRoom(room);
44
- });
45
- _defineProperty(this, "onRoomStateChanged", (event, state) => {
46
- var eventType = event.getType();
47
- if (eventType === EventType.GroupCallPrefix) {
48
- var groupCallId = event.getStateKey();
49
- var content = event.getContent();
50
- var currentGroupCall = this.groupCalls.get(state.roomId);
51
- if (!currentGroupCall && !content["m.terminated"] && !event.isRedacted()) {
52
- this.createGroupCallFromRoomStateEvent(event);
53
- } else if (currentGroupCall && currentGroupCall.groupCallId === groupCallId) {
54
- if (content["m.terminated"] || event.isRedacted()) {
55
- currentGroupCall.terminate(false);
56
- } else if (content["m.type"] !== currentGroupCall.type) {
57
- // TODO: Handle the callType changing when the room state changes
58
- logger.warn("GroupCallEventHandler onRoomStateChanged() currently does not support changing type (roomId=".concat(state.roomId, ")"));
59
- }
60
- } else if (currentGroupCall && currentGroupCall.groupCallId !== groupCallId) {
61
- // TODO: Handle new group calls and multiple group calls
62
- logger.warn("GroupCallEventHandler onRoomStateChanged() currently does not support multiple calls (roomId=".concat(state.roomId, ")"));
63
- }
64
- }
65
- });
66
- }
67
- start() {
68
- var _this = this;
69
- return _asyncToGenerator(function* () {
70
- // We wait until the client has started syncing for real.
71
- // This is because we only support one call at a time, and want
72
- // the latest. We therefore want the latest state of the room before
73
- // we create a group call for the room so we can be fairly sure that
74
- // the group call we create is really the latest one.
75
- if (_this.client.getSyncState() !== SyncState.Syncing) {
76
- logger.debug("GroupCallEventHandler start() waiting for client to start syncing");
77
- yield new Promise(resolve => {
78
- var onSync = () => {
79
- if (_this.client.getSyncState() === SyncState.Syncing) {
80
- _this.client.off(ClientEvent.Sync, onSync);
81
- return resolve();
82
- }
83
- };
84
- _this.client.on(ClientEvent.Sync, onSync);
85
- });
86
- }
87
- var rooms = _this.client.getRooms();
88
- for (var room of rooms) {
89
- _this.createGroupCallForRoom(room);
90
- }
91
- _this.client.on(ClientEvent.Room, _this.onRoomsChanged);
92
- _this.client.on(RoomStateEvent.Events, _this.onRoomStateChanged);
93
- })();
94
- }
95
- stop() {
96
- this.client.removeListener(ClientEvent.Room, this.onRoomsChanged);
97
- this.client.removeListener(RoomStateEvent.Events, this.onRoomStateChanged);
98
- }
99
- getRoomDeferred(roomId) {
100
- var deferred = this.roomDeferreds.get(roomId);
101
- if (deferred === undefined) {
102
- var resolveFunc;
103
- deferred = {
104
- prom: new Promise(resolve => {
105
- resolveFunc = resolve;
106
- })
107
- };
108
- deferred.resolve = resolveFunc;
109
- this.roomDeferreds.set(roomId, deferred);
110
- }
111
- return deferred;
112
- }
113
- waitUntilRoomReadyForGroupCalls(roomId) {
114
- return this.getRoomDeferred(roomId).prom;
115
- }
116
- getGroupCallById(groupCallId) {
117
- return [...this.groupCalls.values()].find(groupCall => groupCall.groupCallId === groupCallId);
118
- }
119
- createGroupCallForRoom(room) {
120
- var callEvents = room.currentState.getStateEvents(EventType.GroupCallPrefix);
121
- var sortedCallEvents = callEvents.sort((a, b) => b.getTs() - a.getTs());
122
- for (var callEvent of sortedCallEvents) {
123
- var content = callEvent.getContent();
124
- if (content["m.terminated"] || callEvent.isRedacted()) {
125
- continue;
126
- }
127
- logger.debug("GroupCallEventHandler createGroupCallForRoom() choosing group call from possible calls (stateKey=".concat(callEvent.getStateKey(), ", ts=").concat(callEvent.getTs(), ", roomId=").concat(room.roomId, ", numOfPossibleCalls=").concat(callEvents.length, ")"));
128
- this.createGroupCallFromRoomStateEvent(callEvent);
129
- break;
130
- }
131
- this.getRoomDeferred(room.roomId).resolve();
132
- }
133
- createGroupCallFromRoomStateEvent(event) {
134
- var roomId = event.getRoomId();
135
- var content = event.getContent();
136
- var room = this.client.getRoom(roomId);
137
- if (!room) {
138
- logger.warn("GroupCallEventHandler createGroupCallFromRoomStateEvent() couldn't find room for call (roomId=".concat(roomId, ")"));
139
- return;
140
- }
141
- var groupCallId = event.getStateKey();
142
- var callType = content["m.type"];
143
- if (!Object.values(GroupCallType).includes(callType)) {
144
- logger.warn("GroupCallEventHandler createGroupCallFromRoomStateEvent() received invalid call type (type=".concat(callType, ", roomId=").concat(roomId, ")"));
145
- return;
146
- }
147
- var callIntent = content["m.intent"];
148
- if (!Object.values(GroupCallIntent).includes(callIntent)) {
149
- logger.warn("Received invalid group call intent (type=".concat(callType, ", roomId=").concat(roomId, ")"));
150
- return;
151
- }
152
- var isPtt = Boolean(content["io.element.ptt"]);
153
- var dataChannelOptions;
154
- if (content !== null && content !== void 0 && content.dataChannelsEnabled && content !== null && content !== void 0 && content.dataChannelOptions) {
155
- // Pull out just the dataChannelOptions we want to support.
156
- var {
157
- ordered,
158
- maxPacketLifeTime,
159
- maxRetransmits,
160
- protocol
161
- } = content.dataChannelOptions;
162
- dataChannelOptions = {
163
- ordered,
164
- maxPacketLifeTime,
165
- maxRetransmits,
166
- protocol
167
- };
168
- }
169
- var groupCall = new GroupCall(this.client, room, callType, isPtt, callIntent, groupCallId,
170
- // Because without Media section a WebRTC connection is not possible, so need a RTCDataChannel to set up a
171
- // no media WebRTC connection anyway.
172
- (content === null || content === void 0 ? void 0 : content.dataChannelsEnabled) || this.client.isVoipWithNoMediaAllowed, dataChannelOptions, this.client.isVoipWithNoMediaAllowed, this.client.useLivekitForGroupCalls, content["io.element.livekit_service_url"]);
173
- this.groupCalls.set(room.roomId, groupCall);
174
- this.client.emit(GroupCallEventHandlerEvent.Incoming, groupCall);
175
- return groupCall;
176
- }
177
- }
178
- //# sourceMappingURL=groupCallEventHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"groupCallEventHandler.js","names":["ClientEvent","GroupCall","GroupCallIntent","GroupCallType","RoomStateEvent","logger","EventType","SyncState","GroupCallEventHandlerEvent","GroupCallEventHandler","constructor","client","_defineProperty","Map","room","createGroupCallForRoom","event","state","eventType","getType","GroupCallPrefix","groupCallId","getStateKey","content","getContent","currentGroupCall","groupCalls","get","roomId","isRedacted","createGroupCallFromRoomStateEvent","terminate","type","warn","concat","start","_this","_asyncToGenerator","getSyncState","Syncing","debug","Promise","resolve","onSync","off","Sync","on","rooms","getRooms","Room","onRoomsChanged","Events","onRoomStateChanged","stop","removeListener","getRoomDeferred","deferred","roomDeferreds","undefined","resolveFunc","prom","set","waitUntilRoomReadyForGroupCalls","getGroupCallById","values","find","groupCall","callEvents","currentState","getStateEvents","sortedCallEvents","sort","a","b","getTs","callEvent","length","getRoomId","getRoom","callType","Object","includes","callIntent","isPtt","Boolean","dataChannelOptions","dataChannelsEnabled","ordered","maxPacketLifeTime","maxRetransmits","protocol","isVoipWithNoMediaAllowed","useLivekitForGroupCalls","emit","Incoming"],"sources":["../../src/webrtc/groupCallEventHandler.ts"],"sourcesContent":["/*\nCopyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { MatrixEvent } from \"../models/event.ts\";\nimport { MatrixClient, ClientEvent } from \"../client.ts\";\nimport { GroupCall, GroupCallIntent, GroupCallType, IGroupCallDataChannelOptions } from \"./groupCall.ts\";\nimport { Room } from \"../models/room.ts\";\nimport { RoomState, RoomStateEvent } from \"../models/room-state.ts\";\nimport { RoomMember } from \"../models/room-member.ts\";\nimport { logger } from \"../logger.ts\";\nimport { EventType } from \"../@types/event.ts\";\nimport { SyncState } from \"../sync.ts\";\n\nexport enum GroupCallEventHandlerEvent {\n Incoming = \"GroupCall.incoming\",\n Outgoing = \"GroupCall.outgoing\",\n Ended = \"GroupCall.ended\",\n Participants = \"GroupCall.participants\",\n}\n\nexport type GroupCallEventHandlerEventHandlerMap = {\n [GroupCallEventHandlerEvent.Incoming]: (call: GroupCall) => void;\n [GroupCallEventHandlerEvent.Outgoing]: (call: GroupCall) => void;\n [GroupCallEventHandlerEvent.Ended]: (call: GroupCall) => void;\n [GroupCallEventHandlerEvent.Participants]: (participants: RoomMember[], call: GroupCall) => void;\n};\n\ninterface RoomDeferred {\n prom: Promise<void>;\n resolve?: () => void;\n}\n\nexport class GroupCallEventHandler {\n public groupCalls = new Map<string, GroupCall>(); // roomId -> GroupCall\n\n // All rooms we know about and whether we've seen a 'Room' event\n // for them. The promise will be fulfilled once we've processed that\n // event which means we're \"up to date\" on what calls are in a room\n // and get\n private roomDeferreds = new Map<string, RoomDeferred>();\n\n public constructor(private client: MatrixClient) {}\n\n public async start(): Promise<void> {\n // We wait until the client has started syncing for real.\n // This is because we only support one call at a time, and want\n // the latest. We therefore want the latest state of the room before\n // we create a group call for the room so we can be fairly sure that\n // the group call we create is really the latest one.\n if (this.client.getSyncState() !== SyncState.Syncing) {\n logger.debug(\"GroupCallEventHandler start() waiting for client to start syncing\");\n await new Promise<void>((resolve) => {\n const onSync = (): void => {\n if (this.client.getSyncState() === SyncState.Syncing) {\n this.client.off(ClientEvent.Sync, onSync);\n return resolve();\n }\n };\n this.client.on(ClientEvent.Sync, onSync);\n });\n }\n\n const rooms = this.client.getRooms();\n\n for (const room of rooms) {\n this.createGroupCallForRoom(room);\n }\n\n this.client.on(ClientEvent.Room, this.onRoomsChanged);\n this.client.on(RoomStateEvent.Events, this.onRoomStateChanged);\n }\n\n public stop(): void {\n this.client.removeListener(ClientEvent.Room, this.onRoomsChanged);\n this.client.removeListener(RoomStateEvent.Events, this.onRoomStateChanged);\n }\n\n private getRoomDeferred(roomId: string): RoomDeferred {\n let deferred = this.roomDeferreds.get(roomId);\n if (deferred === undefined) {\n let resolveFunc: () => void;\n deferred = {\n prom: new Promise<void>((resolve) => {\n resolveFunc = resolve;\n }),\n };\n deferred.resolve = resolveFunc!;\n this.roomDeferreds.set(roomId, deferred);\n }\n\n return deferred;\n }\n\n public waitUntilRoomReadyForGroupCalls(roomId: string): Promise<void> {\n return this.getRoomDeferred(roomId).prom;\n }\n\n public getGroupCallById(groupCallId: string): GroupCall | undefined {\n return [...this.groupCalls.values()].find((groupCall) => groupCall.groupCallId === groupCallId);\n }\n\n private createGroupCallForRoom(room: Room): void {\n const callEvents = room.currentState.getStateEvents(EventType.GroupCallPrefix);\n const sortedCallEvents = callEvents.sort((a, b) => b.getTs() - a.getTs());\n\n for (const callEvent of sortedCallEvents) {\n const content = callEvent.getContent();\n\n if (content[\"m.terminated\"] || callEvent.isRedacted()) {\n continue;\n }\n\n logger.debug(\n `GroupCallEventHandler createGroupCallForRoom() choosing group call from possible calls (stateKey=${callEvent.getStateKey()}, ts=${callEvent.getTs()}, roomId=${\n room.roomId\n }, numOfPossibleCalls=${callEvents.length})`,\n );\n\n this.createGroupCallFromRoomStateEvent(callEvent);\n break;\n }\n\n this.getRoomDeferred(room.roomId).resolve!();\n }\n\n private createGroupCallFromRoomStateEvent(event: MatrixEvent): GroupCall | undefined {\n const roomId = event.getRoomId();\n const content = event.getContent();\n\n const room = this.client.getRoom(roomId);\n\n if (!room) {\n logger.warn(\n `GroupCallEventHandler createGroupCallFromRoomStateEvent() couldn't find room for call (roomId=${roomId})`,\n );\n return;\n }\n\n const groupCallId = event.getStateKey();\n\n const callType = content[\"m.type\"];\n\n if (!Object.values(GroupCallType).includes(callType)) {\n logger.warn(\n `GroupCallEventHandler createGroupCallFromRoomStateEvent() received invalid call type (type=${callType}, roomId=${roomId})`,\n );\n return;\n }\n\n const callIntent = content[\"m.intent\"];\n\n if (!Object.values(GroupCallIntent).includes(callIntent)) {\n logger.warn(`Received invalid group call intent (type=${callType}, roomId=${roomId})`);\n return;\n }\n\n const isPtt = Boolean(content[\"io.element.ptt\"]);\n\n let dataChannelOptions: IGroupCallDataChannelOptions | undefined;\n\n if (content?.dataChannelsEnabled && content?.dataChannelOptions) {\n // Pull out just the dataChannelOptions we want to support.\n const { ordered, maxPacketLifeTime, maxRetransmits, protocol } = content.dataChannelOptions;\n dataChannelOptions = { ordered, maxPacketLifeTime, maxRetransmits, protocol };\n }\n\n const groupCall = new GroupCall(\n this.client,\n room,\n callType,\n isPtt,\n callIntent,\n groupCallId,\n // Because without Media section a WebRTC connection is not possible, so need a RTCDataChannel to set up a\n // no media WebRTC connection anyway.\n content?.dataChannelsEnabled || this.client.isVoipWithNoMediaAllowed,\n dataChannelOptions,\n this.client.isVoipWithNoMediaAllowed,\n this.client.useLivekitForGroupCalls,\n content[\"io.element.livekit_service_url\"],\n );\n\n this.groupCalls.set(room.roomId, groupCall);\n this.client.emit(GroupCallEventHandlerEvent.Incoming, groupCall);\n\n return groupCall;\n }\n\n private onRoomsChanged = (room: Room): void => {\n this.createGroupCallForRoom(room);\n };\n\n private onRoomStateChanged = (event: MatrixEvent, state: RoomState): void => {\n const eventType = event.getType();\n\n if (eventType === EventType.GroupCallPrefix) {\n const groupCallId = event.getStateKey();\n const content = event.getContent();\n\n const currentGroupCall = this.groupCalls.get(state.roomId);\n\n if (!currentGroupCall && !content[\"m.terminated\"] && !event.isRedacted()) {\n this.createGroupCallFromRoomStateEvent(event);\n } else if (currentGroupCall && currentGroupCall.groupCallId === groupCallId) {\n if (content[\"m.terminated\"] || event.isRedacted()) {\n currentGroupCall.terminate(false);\n } else if (content[\"m.type\"] !== currentGroupCall.type) {\n // TODO: Handle the callType changing when the room state changes\n logger.warn(\n `GroupCallEventHandler onRoomStateChanged() currently does not support changing type (roomId=${state.roomId})`,\n );\n }\n } else if (currentGroupCall && currentGroupCall.groupCallId !== groupCallId) {\n // TODO: Handle new group calls and multiple group calls\n logger.warn(\n `GroupCallEventHandler onRoomStateChanged() currently does not support multiple calls (roomId=${state.roomId})`,\n );\n }\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}