matrix-js-sdk 41.8.0 → 41.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -1
  3. package/lib/@types/AESEncryptedSecretStoragePayload.js +3 -1
  4. package/lib/@types/IIdentityServerProvider.js +3 -1
  5. package/lib/@types/PushRules.js +7 -7
  6. package/lib/@types/PushRules.js.map +1 -1
  7. package/lib/@types/auth.js +4 -4
  8. package/lib/@types/auth.js.map +1 -1
  9. package/lib/@types/beacon.js +2 -2
  10. package/lib/@types/beacon.js.map +1 -1
  11. package/lib/@types/common.js +3 -1
  12. package/lib/@types/crypto.js +3 -1
  13. package/lib/@types/event.js +20 -20
  14. package/lib/@types/event.js.map +1 -1
  15. package/lib/@types/events.js +3 -1
  16. package/lib/@types/extensible_events.js +6 -6
  17. package/lib/@types/extensible_events.js.map +1 -1
  18. package/lib/@types/global.d.js.map +1 -1
  19. package/lib/@types/json.js +3 -1
  20. package/lib/@types/local_notifications.js +3 -1
  21. package/lib/@types/location.js +4 -4
  22. package/lib/@types/location.js.map +1 -1
  23. package/lib/@types/matrix-sdk-crypto-wasm.d.js +3 -1
  24. package/lib/@types/media.js +3 -1
  25. package/lib/@types/membership.js +1 -1
  26. package/lib/@types/membership.js.map +1 -1
  27. package/lib/@types/partials.js +6 -6
  28. package/lib/@types/partials.js.map +1 -1
  29. package/lib/@types/polls.js +5 -5
  30. package/lib/@types/polls.js.map +1 -1
  31. package/lib/@types/read_receipts.js +2 -2
  32. package/lib/@types/read_receipts.js.map +1 -1
  33. package/lib/@types/registration.js +3 -1
  34. package/lib/@types/requests.js +1 -1
  35. package/lib/@types/requests.js.map +1 -1
  36. package/lib/@types/retention.js +1 -1
  37. package/lib/@types/retention.js.map +1 -1
  38. package/lib/@types/search.js +1 -1
  39. package/lib/@types/search.js.map +1 -1
  40. package/lib/@types/signed.js +3 -1
  41. package/lib/@types/spaces.js +3 -1
  42. package/lib/@types/state_events.js +3 -1
  43. package/lib/@types/synapse.js +3 -1
  44. package/lib/@types/sync.js +1 -1
  45. package/lib/@types/sync.js.map +1 -1
  46. package/lib/@types/threepids.js +1 -1
  47. package/lib/@types/threepids.js.map +1 -1
  48. package/lib/@types/topic.js +1 -1
  49. package/lib/@types/topic.js.map +1 -1
  50. package/lib/@types/uia.js +3 -1
  51. package/lib/NamespacedValue.js +8 -8
  52. package/lib/NamespacedValue.js.map +1 -1
  53. package/lib/ReEmitter.js +9 -16
  54. package/lib/ReEmitter.js.map +1 -1
  55. package/lib/ToDeviceMessageQueue.js +49 -57
  56. package/lib/ToDeviceMessageQueue.js.map +1 -1
  57. package/lib/autodiscovery.js +232 -247
  58. package/lib/autodiscovery.js.map +1 -1
  59. package/lib/base64.js +1 -1
  60. package/lib/base64.js.map +1 -1
  61. package/lib/browser-index.d.ts +2 -2
  62. package/lib/browser-index.d.ts.map +1 -1
  63. package/lib/browser-index.js +5 -5
  64. package/lib/browser-index.js.map +1 -1
  65. package/lib/capabilityPoller.js +19 -22
  66. package/lib/capabilityPoller.js.map +1 -1
  67. package/lib/client.d.ts +2 -8
  68. package/lib/client.d.ts.map +1 -1
  69. package/lib/client.js +2043 -2487
  70. package/lib/client.js.map +1 -1
  71. package/lib/common-crypto/CryptoBackend.js +2 -2
  72. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  73. package/lib/common-crypto/key-passphrase.js.map +1 -1
  74. package/lib/content-helpers.js +43 -48
  75. package/lib/content-helpers.js.map +1 -1
  76. package/lib/content-repo.js +14 -24
  77. package/lib/content-repo.js.map +1 -1
  78. package/lib/crypto/store/base.js +6 -6
  79. package/lib/crypto/store/base.js.map +1 -1
  80. package/lib/crypto/store/indexeddb-crypto-store-backend.js +190 -238
  81. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  82. package/lib/crypto/store/indexeddb-crypto-store.js +25 -30
  83. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  84. package/lib/crypto/store/localStorage-crypto-store.js +113 -145
  85. package/lib/crypto/store/localStorage-crypto-store.js.map +1 -1
  86. package/lib/crypto/store/memory-crypto-store.js +74 -105
  87. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  88. package/lib/crypto-api/CryptoEvent.js +1 -1
  89. package/lib/crypto-api/CryptoEvent.js.map +1 -1
  90. package/lib/crypto-api/CryptoEventHandlerMap.js +3 -1
  91. package/lib/crypto-api/index.d.ts +15 -6
  92. package/lib/crypto-api/index.d.ts.map +1 -1
  93. package/lib/crypto-api/index.js +22 -22
  94. package/lib/crypto-api/index.js.map +1 -1
  95. package/lib/crypto-api/key-passphrase.js +15 -23
  96. package/lib/crypto-api/key-passphrase.js.map +1 -1
  97. package/lib/crypto-api/keybackup.js +3 -1
  98. package/lib/crypto-api/recovery-key.js +11 -12
  99. package/lib/crypto-api/recovery-key.js.map +1 -1
  100. package/lib/crypto-api/verification.js +3 -3
  101. package/lib/crypto-api/verification.js.map +1 -1
  102. package/lib/digest.js +7 -14
  103. package/lib/digest.js.map +1 -1
  104. package/lib/embedded.d.ts.map +1 -1
  105. package/lib/embedded.js +380 -505
  106. package/lib/embedded.js.map +1 -1
  107. package/lib/errors.js +2 -2
  108. package/lib/errors.js.map +1 -1
  109. package/lib/event-mapper.js +10 -12
  110. package/lib/event-mapper.js.map +1 -1
  111. package/lib/extensible_events_v1/ExtensibleEvent.js.map +1 -1
  112. package/lib/extensible_events_v1/InvalidEventError.js.map +1 -1
  113. package/lib/extensible_events_v1/MessageEvent.js +11 -13
  114. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  115. package/lib/extensible_events_v1/PollEndEvent.js +3 -4
  116. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  117. package/lib/extensible_events_v1/PollResponseEvent.js +5 -6
  118. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  119. package/lib/extensible_events_v1/PollStartEvent.js +8 -10
  120. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  121. package/lib/extensible_events_v1/utilities.js.map +1 -1
  122. package/lib/feature.js +18 -31
  123. package/lib/feature.js.map +1 -1
  124. package/lib/filter-component.d.ts.map +1 -1
  125. package/lib/filter-component.js +20 -26
  126. package/lib/filter-component.js.map +1 -1
  127. package/lib/filter.js +14 -17
  128. package/lib/filter.js.map +1 -1
  129. package/lib/http-api/errors.js +28 -43
  130. package/lib/http-api/errors.js.map +1 -1
  131. package/lib/http-api/fetch.js +141 -159
  132. package/lib/http-api/fetch.js.map +1 -1
  133. package/lib/http-api/index.js +17 -20
  134. package/lib/http-api/index.js.map +1 -1
  135. package/lib/http-api/interface.js +1 -1
  136. package/lib/http-api/interface.js.map +1 -1
  137. package/lib/http-api/method.js +1 -1
  138. package/lib/http-api/method.js.map +1 -1
  139. package/lib/http-api/prefix.js +3 -3
  140. package/lib/http-api/prefix.js.map +1 -1
  141. package/lib/http-api/refresh.js +74 -94
  142. package/lib/http-api/refresh.js.map +1 -1
  143. package/lib/http-api/utils.d.ts +1 -1
  144. package/lib/http-api/utils.d.ts.map +1 -1
  145. package/lib/http-api/utils.js +34 -42
  146. package/lib/http-api/utils.js.map +1 -1
  147. package/lib/index.js.map +1 -1
  148. package/lib/indexeddb-helpers.js +3 -3
  149. package/lib/indexeddb-helpers.js.map +1 -1
  150. package/lib/indexeddb-worker.js.map +1 -1
  151. package/lib/interactive-auth.d.ts +5 -5
  152. package/lib/interactive-auth.d.ts.map +1 -1
  153. package/lib/interactive-auth.js +172 -204
  154. package/lib/interactive-auth.js.map +1 -1
  155. package/lib/logger.js +21 -57
  156. package/lib/logger.js.map +1 -1
  157. package/lib/matrix.js +7 -11
  158. package/lib/matrix.js.map +1 -1
  159. package/lib/matrixrtc/CallMembership.js +80 -74
  160. package/lib/matrixrtc/CallMembership.js.map +1 -1
  161. package/lib/matrixrtc/EncryptionManager.js +1 -1
  162. package/lib/matrixrtc/EncryptionManager.js.map +1 -1
  163. package/lib/matrixrtc/IKeyTransport.js +1 -1
  164. package/lib/matrixrtc/IKeyTransport.js.map +1 -1
  165. package/lib/matrixrtc/IMembershipManager.js +1 -1
  166. package/lib/matrixrtc/IMembershipManager.js.map +1 -1
  167. package/lib/matrixrtc/LivekitTransport.d.ts +1 -1
  168. package/lib/matrixrtc/LivekitTransport.js +4 -4
  169. package/lib/matrixrtc/LivekitTransport.js.map +1 -1
  170. package/lib/matrixrtc/MatrixRTCSession.js +137 -187
  171. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  172. package/lib/matrixrtc/MatrixRTCSessionManager.js +36 -41
  173. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -1
  174. package/lib/matrixrtc/MembershipManager.js +332 -378
  175. package/lib/matrixrtc/MembershipManager.js.map +1 -1
  176. package/lib/matrixrtc/MembershipManagerActionScheduler.js +54 -63
  177. package/lib/matrixrtc/MembershipManagerActionScheduler.js.map +1 -1
  178. package/lib/matrixrtc/RTCEncryptionManager.js +119 -143
  179. package/lib/matrixrtc/RTCEncryptionManager.js.map +1 -1
  180. package/lib/matrixrtc/ToDeviceKeyTransport.js +53 -58
  181. package/lib/matrixrtc/ToDeviceKeyTransport.js.map +1 -1
  182. package/lib/matrixrtc/index.js.map +1 -1
  183. package/lib/matrixrtc/membershipData/common.js +1 -1
  184. package/lib/matrixrtc/membershipData/common.js.map +1 -1
  185. package/lib/matrixrtc/membershipData/index.js.map +1 -1
  186. package/lib/matrixrtc/membershipData/rtc.js +15 -23
  187. package/lib/matrixrtc/membershipData/rtc.js.map +1 -1
  188. package/lib/matrixrtc/membershipData/session.js +4 -5
  189. package/lib/matrixrtc/membershipData/session.js.map +1 -1
  190. package/lib/matrixrtc/types.js +4 -6
  191. package/lib/matrixrtc/types.js.map +1 -1
  192. package/lib/matrixrtc/utils.js +4 -11
  193. package/lib/matrixrtc/utils.js.map +1 -1
  194. package/lib/models/MSC3089Branch.js +91 -116
  195. package/lib/models/MSC3089Branch.js.map +1 -1
  196. package/lib/models/MSC3089TreeSpace.js +209 -245
  197. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  198. package/lib/models/ToDeviceMessage.js +3 -1
  199. package/lib/models/beacon.js +14 -13
  200. package/lib/models/beacon.js.map +1 -1
  201. package/lib/models/compare-event-ordering.js +13 -13
  202. package/lib/models/compare-event-ordering.js.map +1 -1
  203. package/lib/models/device.js +3 -3
  204. package/lib/models/device.js.map +1 -1
  205. package/lib/models/event-context.js +5 -8
  206. package/lib/models/event-context.js.map +1 -1
  207. package/lib/models/event-status.js +1 -1
  208. package/lib/models/event-status.js.map +1 -1
  209. package/lib/models/event-timeline-set.js +88 -94
  210. package/lib/models/event-timeline-set.js.map +1 -1
  211. package/lib/models/event-timeline.js +28 -30
  212. package/lib/models/event-timeline.js.map +1 -1
  213. package/lib/models/event.js +182 -226
  214. package/lib/models/event.js.map +1 -1
  215. package/lib/models/invites-ignorer-types.js +4 -4
  216. package/lib/models/invites-ignorer-types.js.map +1 -1
  217. package/lib/models/invites-ignorer.js +159 -179
  218. package/lib/models/invites-ignorer.js.map +1 -1
  219. package/lib/models/poll.js +71 -81
  220. package/lib/models/poll.js.map +1 -1
  221. package/lib/models/profile-keys.js +2 -2
  222. package/lib/models/profile-keys.js.map +1 -1
  223. package/lib/models/read-receipt.js +40 -56
  224. package/lib/models/read-receipt.js.map +1 -1
  225. package/lib/models/related-relations.js.map +1 -1
  226. package/lib/models/relations-container.js +22 -23
  227. package/lib/models/relations-container.js.map +1 -1
  228. package/lib/models/relations.js +133 -159
  229. package/lib/models/relations.js.map +1 -1
  230. package/lib/models/room-member.js +24 -29
  231. package/lib/models/room-member.js.map +1 -1
  232. package/lib/models/room-receipts.js +29 -43
  233. package/lib/models/room-receipts.js.map +1 -1
  234. package/lib/models/room-retention.js +74 -83
  235. package/lib/models/room-retention.js.map +1 -1
  236. package/lib/models/room-state.js +143 -172
  237. package/lib/models/room-state.js.map +1 -1
  238. package/lib/models/room-sticky-events.d.ts +1 -0
  239. package/lib/models/room-sticky-events.d.ts.map +1 -1
  240. package/lib/models/room-sticky-events.js +45 -65
  241. package/lib/models/room-sticky-events.js.map +1 -1
  242. package/lib/models/room-summary.js.map +1 -1
  243. package/lib/models/room.d.ts.map +1 -1
  244. package/lib/models/room.js +765 -909
  245. package/lib/models/room.js.map +1 -1
  246. package/lib/models/search-result.js +5 -5
  247. package/lib/models/search-result.js.map +1 -1
  248. package/lib/models/thread.js +225 -285
  249. package/lib/models/thread.js.map +1 -1
  250. package/lib/models/typed-event-emitter.js +7 -18
  251. package/lib/models/typed-event-emitter.js.map +1 -1
  252. package/lib/models/user.js +8 -8
  253. package/lib/models/user.js.map +1 -1
  254. package/lib/oidc/authorize.js +208 -241
  255. package/lib/oidc/authorize.js.map +1 -1
  256. package/lib/oidc/discovery.js +23 -36
  257. package/lib/oidc/discovery.js.map +1 -1
  258. package/lib/oidc/error.js +1 -1
  259. package/lib/oidc/error.js.map +1 -1
  260. package/lib/oidc/index.js +1 -0
  261. package/lib/oidc/index.js.map +1 -1
  262. package/lib/oidc/register.js +60 -66
  263. package/lib/oidc/register.js.map +1 -1
  264. package/lib/oidc/tokenRefresher.js +77 -91
  265. package/lib/oidc/tokenRefresher.js.map +1 -1
  266. package/lib/oidc/validate.js +18 -18
  267. package/lib/oidc/validate.js.map +1 -1
  268. package/lib/pushprocessor.js +71 -82
  269. package/lib/pushprocessor.js.map +1 -1
  270. package/lib/randomstring.js +9 -9
  271. package/lib/randomstring.js.map +1 -1
  272. package/lib/realtime-callbacks.js +25 -28
  273. package/lib/realtime-callbacks.js.map +1 -1
  274. package/lib/receipt-accumulator.d.ts +2 -0
  275. package/lib/receipt-accumulator.d.ts.map +1 -1
  276. package/lib/receipt-accumulator.js +14 -22
  277. package/lib/receipt-accumulator.js.map +1 -1
  278. package/lib/rendezvous/MSC4108SignInWithQR.js +271 -302
  279. package/lib/rendezvous/MSC4108SignInWithQR.js.map +1 -1
  280. package/lib/rendezvous/RendezvousChannel.js +3 -1
  281. package/lib/rendezvous/RendezvousCode.js +3 -1
  282. package/lib/rendezvous/RendezvousError.js.map +1 -1
  283. package/lib/rendezvous/RendezvousFailureReason.js +2 -2
  284. package/lib/rendezvous/RendezvousFailureReason.js.map +1 -1
  285. package/lib/rendezvous/RendezvousIntent.js +1 -1
  286. package/lib/rendezvous/RendezvousIntent.js.map +1 -1
  287. package/lib/rendezvous/RendezvousTransport.js +3 -1
  288. package/lib/rendezvous/channels/MSC4108SecureChannel.js +123 -147
  289. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +1 -1
  290. package/lib/rendezvous/index.js +44 -69
  291. package/lib/rendezvous/index.js.map +1 -1
  292. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +1 -1
  293. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +134 -152
  294. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +1 -1
  295. package/lib/retentionPolicy.js +6 -9
  296. package/lib/retentionPolicy.js.map +1 -1
  297. package/lib/room-hierarchy.js +52 -60
  298. package/lib/room-hierarchy.js.map +1 -1
  299. package/lib/rust-crypto/CrossSigningIdentity.js +94 -104
  300. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
  301. package/lib/rust-crypto/DehydratedDeviceManager.js +157 -190
  302. package/lib/rust-crypto/DehydratedDeviceManager.js.map +1 -1
  303. package/lib/rust-crypto/KeyClaimManager.js +18 -22
  304. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  305. package/lib/rust-crypto/OutgoingRequestProcessor.js +109 -139
  306. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  307. package/lib/rust-crypto/OutgoingRequestsManager.js +66 -80
  308. package/lib/rust-crypto/OutgoingRequestsManager.js.map +1 -1
  309. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +1 -1
  310. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +196 -224
  311. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +1 -1
  312. package/lib/rust-crypto/RoomEncryptor.js +127 -143
  313. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  314. package/lib/rust-crypto/backup.js +453 -549
  315. package/lib/rust-crypto/backup.js.map +1 -1
  316. package/lib/rust-crypto/constants.js +1 -1
  317. package/lib/rust-crypto/constants.js.map +1 -1
  318. package/lib/rust-crypto/device-converter.js +15 -28
  319. package/lib/rust-crypto/device-converter.js.map +1 -1
  320. package/lib/rust-crypto/index.js +103 -116
  321. package/lib/rust-crypto/index.js.map +1 -1
  322. package/lib/rust-crypto/libolm_migration.js +303 -365
  323. package/lib/rust-crypto/libolm_migration.js.map +1 -1
  324. package/lib/rust-crypto/rust-crypto.d.ts +5 -1
  325. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  326. package/lib/rust-crypto/rust-crypto.js +1067 -1332
  327. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  328. package/lib/rust-crypto/secret-storage.js +12 -25
  329. package/lib/rust-crypto/secret-storage.js.map +1 -1
  330. package/lib/rust-crypto/verification.js +137 -189
  331. package/lib/rust-crypto/verification.js.map +1 -1
  332. package/lib/scheduler.js +44 -19
  333. package/lib/scheduler.js.map +1 -1
  334. package/lib/secret-storage.js +179 -213
  335. package/lib/secret-storage.js.map +1 -1
  336. package/lib/serverCapabilities.js +6 -9
  337. package/lib/serverCapabilities.js.map +1 -1
  338. package/lib/service-types.js +1 -1
  339. package/lib/service-types.js.map +1 -1
  340. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  341. package/lib/sliding-sync-sdk.js +368 -424
  342. package/lib/sliding-sync-sdk.js.map +1 -1
  343. package/lib/sliding-sync.js +135 -171
  344. package/lib/sliding-sync.js.map +1 -1
  345. package/lib/store/index.js +3 -1
  346. package/lib/store/indexeddb-backend.js +3 -1
  347. package/lib/store/indexeddb-local-backend.js +194 -253
  348. package/lib/store/indexeddb-local-backend.js.map +1 -1
  349. package/lib/store/indexeddb-remote-backend.js +33 -63
  350. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  351. package/lib/store/indexeddb-store-worker.js +22 -23
  352. package/lib/store/indexeddb-store-worker.js.map +1 -1
  353. package/lib/store/indexeddb.js +44 -71
  354. package/lib/store/indexeddb.js.map +1 -1
  355. package/lib/store/local-storage-events-emitter.js +2 -2
  356. package/lib/store/local-storage-events-emitter.js.map +1 -1
  357. package/lib/store/memory.js +34 -57
  358. package/lib/store/memory.js.map +1 -1
  359. package/lib/store/stub.js +22 -35
  360. package/lib/store/stub.js.map +1 -1
  361. package/lib/sync-accumulator.js +54 -66
  362. package/lib/sync-accumulator.js.map +1 -1
  363. package/lib/sync.d.ts.map +1 -1
  364. package/lib/sync.js +905 -998
  365. package/lib/sync.js.map +1 -1
  366. package/lib/testing.js +63 -105
  367. package/lib/testing.js.map +1 -1
  368. package/lib/thread-utils.js +1 -4
  369. package/lib/thread-utils.js.map +1 -1
  370. package/lib/timeline-window.js +89 -102
  371. package/lib/timeline-window.js.map +1 -1
  372. package/lib/types.js +1 -1
  373. package/lib/types.js.map +1 -1
  374. package/lib/utils/decryptAESSecretStorageItem.js +14 -25
  375. package/lib/utils/decryptAESSecretStorageItem.js.map +1 -1
  376. package/lib/utils/encryptAESSecretStorageItem.js +27 -38
  377. package/lib/utils/encryptAESSecretStorageItem.js.map +1 -1
  378. package/lib/utils/internal/deriveKeys.js +25 -32
  379. package/lib/utils/internal/deriveKeys.js.map +1 -1
  380. package/lib/utils/roomVersion.js +1 -1
  381. package/lib/utils/roomVersion.js.map +1 -1
  382. package/lib/utils.js +83 -135
  383. package/lib/utils.js.map +1 -1
  384. package/lib/version-support.js +3 -3
  385. package/lib/version-support.js.map +1 -1
  386. package/lib/webrtc/audioContext.js +5 -6
  387. package/lib/webrtc/audioContext.js.map +1 -1
  388. package/lib/webrtc/call.js +1081 -1250
  389. package/lib/webrtc/call.js.map +1 -1
  390. package/lib/webrtc/callEventHandler.js +202 -214
  391. package/lib/webrtc/callEventHandler.js.map +1 -1
  392. package/lib/webrtc/callEventTypes.js +2 -2
  393. package/lib/webrtc/callEventTypes.js.map +1 -1
  394. package/lib/webrtc/callFeed.js +18 -20
  395. package/lib/webrtc/callFeed.js.map +1 -1
  396. package/lib/webrtc/groupCall.js +513 -602
  397. package/lib/webrtc/groupCall.js.map +1 -1
  398. package/lib/webrtc/groupCallEventHandler.js +59 -62
  399. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  400. package/lib/webrtc/mediaHandler.js +198 -232
  401. package/lib/webrtc/mediaHandler.js.map +1 -1
  402. package/lib/webrtc/stats/callFeedStatsReporter.js +16 -20
  403. package/lib/webrtc/stats/callFeedStatsReporter.js.map +1 -1
  404. package/lib/webrtc/stats/callStatsReportGatherer.js +67 -75
  405. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  406. package/lib/webrtc/stats/callStatsReportSummary.js +3 -1
  407. package/lib/webrtc/stats/connectionStats.js.map +1 -1
  408. package/lib/webrtc/stats/connectionStatsBuilder.js +2 -2
  409. package/lib/webrtc/stats/connectionStatsBuilder.js.map +1 -1
  410. package/lib/webrtc/stats/connectionStatsReportBuilder.js +20 -24
  411. package/lib/webrtc/stats/connectionStatsReportBuilder.js.map +1 -1
  412. package/lib/webrtc/stats/groupCallStats.js +6 -8
  413. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  414. package/lib/webrtc/stats/media/mediaSsrcHandler.js +7 -8
  415. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
  416. package/lib/webrtc/stats/media/mediaTrackHandler.js +7 -9
  417. package/lib/webrtc/stats/media/mediaTrackHandler.js.map +1 -1
  418. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  419. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  420. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +7 -7
  421. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  422. package/lib/webrtc/stats/statsReport.js +1 -1
  423. package/lib/webrtc/stats/statsReport.js.map +1 -1
  424. package/lib/webrtc/stats/statsReportEmitter.js.map +1 -1
  425. package/lib/webrtc/stats/summaryStatsReportGatherer.js +14 -14
  426. package/lib/webrtc/stats/summaryStatsReportGatherer.js.map +1 -1
  427. package/lib/webrtc/stats/trackStatsBuilder.js +32 -34
  428. package/lib/webrtc/stats/trackStatsBuilder.js.map +1 -1
  429. package/lib/webrtc/stats/transportStats.js +3 -1
  430. package/lib/webrtc/stats/transportStatsBuilder.js +9 -9
  431. package/lib/webrtc/stats/transportStatsBuilder.js.map +1 -1
  432. package/lib/webrtc/stats/valueFormatter.js +1 -1
  433. package/lib/webrtc/stats/valueFormatter.js.map +1 -1
  434. package/package.json +18 -33
  435. package/src/@types/global.d.ts +2 -2
  436. package/src/ToDeviceMessageQueue.ts +2 -2
  437. package/src/browser-index.ts +4 -4
  438. package/src/client.ts +15 -20
  439. package/src/crypto-api/index.ts +17 -6
  440. package/src/embedded.ts +4 -6
  441. package/src/filter-component.ts +1 -0
  442. package/src/http-api/utils.ts +1 -1
  443. package/src/interactive-auth.ts +11 -5
  444. package/src/matrixrtc/LivekitTransport.ts +1 -1
  445. package/src/matrixrtc/MatrixRTCSession.ts +1 -1
  446. package/src/models/MSC3089Branch.ts +1 -1
  447. package/src/models/room-sticky-events.ts +1 -0
  448. package/src/models/room.ts +9 -11
  449. package/src/receipt-accumulator.ts +2 -0
  450. package/src/rendezvous/index.ts +1 -1
  451. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +2 -2
  452. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +1 -1
  453. package/src/rust-crypto/index.ts +6 -6
  454. package/src/rust-crypto/rust-crypto.ts +31 -7
  455. package/src/rust-crypto/verification.ts +1 -1
  456. package/src/sliding-sync-sdk.ts +5 -7
  457. package/src/store/indexeddb-local-backend.ts +3 -3
  458. package/src/sync.ts +6 -8
@@ -1,4 +1,3 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
1
  /*
3
2
  Copyright 2023 The Matrix.org Foundation C.I.C.
4
3
 
@@ -17,46 +16,43 @@ limitations under the License.
17
16
 
18
17
  export class ConnectionStatsReportBuilder {
19
18
  static build(stats) {
20
- var report = {};
19
+ const report = {};
21
20
 
22
21
  // process stats
23
- var totalPackets = {
22
+ const totalPackets = {
24
23
  download: 0,
25
24
  upload: 0
26
25
  };
27
- var lostPackets = {
26
+ const lostPackets = {
28
27
  download: 0,
29
28
  upload: 0
30
29
  };
31
- var bitrateDownload = 0;
32
- var bitrateUpload = 0;
33
- var resolutions = {
30
+ let bitrateDownload = 0;
31
+ let bitrateUpload = 0;
32
+ const resolutions = {
34
33
  local: new Map(),
35
34
  remote: new Map()
36
35
  };
37
- var framerates = {
36
+ const framerates = {
38
37
  local: new Map(),
39
38
  remote: new Map()
40
39
  };
41
- var codecs = {
40
+ const codecs = {
42
41
  local: new Map(),
43
42
  remote: new Map()
44
43
  };
45
- var jitter = new Map();
46
- var audioConcealment = new Map();
47
- var audioBitrateDownload = 0;
48
- var audioBitrateUpload = 0;
49
- var videoBitrateDownload = 0;
50
- var videoBitrateUpload = 0;
51
- var totalConcealedAudio = 0;
52
- var totalAudioDuration = 0;
53
- for (var _ref3 of stats) {
54
- var _ref2 = _slicedToArray(_ref3, 2);
55
- var trackId = _ref2[0];
56
- var trackStats = _ref2[1];
44
+ const jitter = new Map();
45
+ const audioConcealment = new Map();
46
+ let audioBitrateDownload = 0;
47
+ let audioBitrateUpload = 0;
48
+ let videoBitrateDownload = 0;
49
+ let videoBitrateUpload = 0;
50
+ let totalConcealedAudio = 0;
51
+ let totalAudioDuration = 0;
52
+ for (const [trackId, trackStats] of stats) {
57
53
  // process packet loss stats
58
- var loss = trackStats.getLoss();
59
- var type = loss.isDownloadStream ? "download" : "upload";
54
+ const loss = trackStats.getLoss();
55
+ const type = loss.isDownloadStream ? "download" : "upload";
60
56
  totalPackets[type] += loss.packetsTotal;
61
57
  lostPackets[type] += loss.packetsLost;
62
58
 
@@ -67,7 +63,7 @@ export class ConnectionStatsReportBuilder {
67
63
  // collect resolutions and framerates
68
64
  if (trackStats.kind === "audio") {
69
65
  // process audio quality stats
70
- var audioConcealmentForTrack = trackStats.getAudioConcealment();
66
+ const audioConcealmentForTrack = trackStats.getAudioConcealment();
71
67
  totalConcealedAudio += audioConcealmentForTrack.concealedAudio;
72
68
  totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;
73
69
  audioBitrateDownload += trackStats.getBitrate().download;
@@ -1 +1 @@
1
- {"version":3,"file":"connectionStatsReportBuilder.js","names":["ConnectionStatsReportBuilder","build","stats","report","totalPackets","download","upload","lostPackets","bitrateDownload","bitrateUpload","resolutions","local","Map","remote","framerates","codecs","jitter","audioConcealment","audioBitrateDownload","audioBitrateUpload","videoBitrateDownload","videoBitrateUpload","totalConcealedAudio","totalAudioDuration","_ref3","_ref2","_slicedToArray","trackId","trackStats","loss","getLoss","type","isDownloadStream","packetsTotal","packetsLost","getBitrate","kind","audioConcealmentForTrack","getAudioConcealment","concealedAudio","getType","set","getResolution","getFramerate","getCodec","getJitter","resetBitrate","bitrate","audio","video","packetLoss","total","calculatePacketLoss","totalAudioConcealment","framerate","resolution","codec","Math","round"],"sources":["../../../src/webrtc/stats/connectionStatsReportBuilder.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport {\n type AudioConcealment,\n type CodecMap,\n type ConnectionStatsReport,\n type FramerateMap,\n type ResolutionMap,\n type TrackID,\n} from \"./statsReport.ts\";\nimport { type MediaTrackStats, type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport class ConnectionStatsReportBuilder {\n public static build(stats: Map<TrackID, MediaTrackStats>): ConnectionStatsReport {\n const report = {} as ConnectionStatsReport;\n\n // process stats\n const totalPackets = {\n download: 0,\n upload: 0,\n };\n const lostPackets = {\n download: 0,\n upload: 0,\n };\n let bitrateDownload = 0;\n let bitrateUpload = 0;\n const resolutions: ResolutionMap = {\n local: new Map<TrackID, Resolution>(),\n remote: new Map<TrackID, Resolution>(),\n };\n const framerates: FramerateMap = { local: new Map<TrackID, number>(), remote: new Map<TrackID, number>() };\n const codecs: CodecMap = { local: new Map<TrackID, string>(), remote: new Map<TrackID, string>() };\n const jitter = new Map<TrackID, number>();\n const audioConcealment = new Map<TrackID, AudioConcealment>();\n\n let audioBitrateDownload = 0;\n let audioBitrateUpload = 0;\n let videoBitrateDownload = 0;\n let videoBitrateUpload = 0;\n\n let totalConcealedAudio = 0;\n let totalAudioDuration = 0;\n\n for (const [trackId, trackStats] of stats) {\n // process packet loss stats\n const loss = trackStats.getLoss();\n const type = loss.isDownloadStream ? \"download\" : \"upload\";\n\n totalPackets[type] += loss.packetsTotal;\n lostPackets[type] += loss.packetsLost;\n\n // process bitrate stats\n bitrateDownload += trackStats.getBitrate().download;\n bitrateUpload += trackStats.getBitrate().upload;\n\n // collect resolutions and framerates\n if (trackStats.kind === \"audio\") {\n // process audio quality stats\n const audioConcealmentForTrack = trackStats.getAudioConcealment();\n totalConcealedAudio += audioConcealmentForTrack.concealedAudio;\n totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;\n\n audioBitrateDownload += trackStats.getBitrate().download;\n audioBitrateUpload += trackStats.getBitrate().upload;\n } else {\n videoBitrateDownload += trackStats.getBitrate().download;\n videoBitrateUpload += trackStats.getBitrate().upload;\n }\n\n resolutions[trackStats.getType()].set(trackId, trackStats.getResolution());\n framerates[trackStats.getType()].set(trackId, trackStats.getFramerate());\n codecs[trackStats.getType()].set(trackId, trackStats.getCodec());\n if (trackStats.getType() === \"remote\") {\n jitter.set(trackId, trackStats.getJitter());\n if (trackStats.kind === \"audio\") {\n audioConcealment.set(trackId, trackStats.getAudioConcealment());\n }\n }\n\n trackStats.resetBitrate();\n }\n\n report.bitrate = {\n upload: bitrateUpload,\n download: bitrateDownload,\n };\n\n report.bitrate.audio = {\n upload: audioBitrateUpload,\n download: audioBitrateDownload,\n };\n\n report.bitrate.video = {\n upload: videoBitrateUpload,\n download: videoBitrateDownload,\n };\n\n report.packetLoss = {\n total: ConnectionStatsReportBuilder.calculatePacketLoss(\n lostPackets.download + lostPackets.upload,\n totalPackets.download + totalPackets.upload,\n ),\n download: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.download, totalPackets.download),\n upload: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.upload, totalPackets.upload),\n };\n report.audioConcealment = audioConcealment;\n report.totalAudioConcealment = {\n concealedAudio: totalConcealedAudio,\n totalAudioDuration,\n };\n\n report.framerate = framerates;\n report.resolution = resolutions;\n report.codec = codecs;\n report.jitter = jitter;\n return report;\n }\n\n private static calculatePacketLoss(lostPackets: number, totalPackets: number): number {\n if (!totalPackets || totalPackets <= 0 || !lostPackets || lostPackets <= 0) {\n return 0;\n }\n\n return Math.round((lostPackets / totalPackets) * 100);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"connectionStatsReportBuilder.js","names":[],"sources":["../../../src/webrtc/stats/connectionStatsReportBuilder.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport {\n type AudioConcealment,\n type CodecMap,\n type ConnectionStatsReport,\n type FramerateMap,\n type ResolutionMap,\n type TrackID,\n} from \"./statsReport.ts\";\nimport { type MediaTrackStats, type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport class ConnectionStatsReportBuilder {\n public static build(stats: Map<TrackID, MediaTrackStats>): ConnectionStatsReport {\n const report = {} as ConnectionStatsReport;\n\n // process stats\n const totalPackets = {\n download: 0,\n upload: 0,\n };\n const lostPackets = {\n download: 0,\n upload: 0,\n };\n let bitrateDownload = 0;\n let bitrateUpload = 0;\n const resolutions: ResolutionMap = {\n local: new Map<TrackID, Resolution>(),\n remote: new Map<TrackID, Resolution>(),\n };\n const framerates: FramerateMap = { local: new Map<TrackID, number>(), remote: new Map<TrackID, number>() };\n const codecs: CodecMap = { local: new Map<TrackID, string>(), remote: new Map<TrackID, string>() };\n const jitter = new Map<TrackID, number>();\n const audioConcealment = new Map<TrackID, AudioConcealment>();\n\n let audioBitrateDownload = 0;\n let audioBitrateUpload = 0;\n let videoBitrateDownload = 0;\n let videoBitrateUpload = 0;\n\n let totalConcealedAudio = 0;\n let totalAudioDuration = 0;\n\n for (const [trackId, trackStats] of stats) {\n // process packet loss stats\n const loss = trackStats.getLoss();\n const type = loss.isDownloadStream ? \"download\" : \"upload\";\n\n totalPackets[type] += loss.packetsTotal;\n lostPackets[type] += loss.packetsLost;\n\n // process bitrate stats\n bitrateDownload += trackStats.getBitrate().download;\n bitrateUpload += trackStats.getBitrate().upload;\n\n // collect resolutions and framerates\n if (trackStats.kind === \"audio\") {\n // process audio quality stats\n const audioConcealmentForTrack = trackStats.getAudioConcealment();\n totalConcealedAudio += audioConcealmentForTrack.concealedAudio;\n totalAudioDuration += audioConcealmentForTrack.totalAudioDuration;\n\n audioBitrateDownload += trackStats.getBitrate().download;\n audioBitrateUpload += trackStats.getBitrate().upload;\n } else {\n videoBitrateDownload += trackStats.getBitrate().download;\n videoBitrateUpload += trackStats.getBitrate().upload;\n }\n\n resolutions[trackStats.getType()].set(trackId, trackStats.getResolution());\n framerates[trackStats.getType()].set(trackId, trackStats.getFramerate());\n codecs[trackStats.getType()].set(trackId, trackStats.getCodec());\n if (trackStats.getType() === \"remote\") {\n jitter.set(trackId, trackStats.getJitter());\n if (trackStats.kind === \"audio\") {\n audioConcealment.set(trackId, trackStats.getAudioConcealment());\n }\n }\n\n trackStats.resetBitrate();\n }\n\n report.bitrate = {\n upload: bitrateUpload,\n download: bitrateDownload,\n };\n\n report.bitrate.audio = {\n upload: audioBitrateUpload,\n download: audioBitrateDownload,\n };\n\n report.bitrate.video = {\n upload: videoBitrateUpload,\n download: videoBitrateDownload,\n };\n\n report.packetLoss = {\n total: ConnectionStatsReportBuilder.calculatePacketLoss(\n lostPackets.download + lostPackets.upload,\n totalPackets.download + totalPackets.upload,\n ),\n download: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.download, totalPackets.download),\n upload: ConnectionStatsReportBuilder.calculatePacketLoss(lostPackets.upload, totalPackets.upload),\n };\n report.audioConcealment = audioConcealment;\n report.totalAudioConcealment = {\n concealedAudio: totalConcealedAudio,\n totalAudioDuration,\n };\n\n report.framerate = framerates;\n report.resolution = resolutions;\n report.codec = codecs;\n report.jitter = jitter;\n return report;\n }\n\n private static calculatePacketLoss(lostPackets: number, totalPackets: number): number {\n if (!totalPackets || totalPackets <= 0 || !lostPackets || lostPackets <= 0) {\n return 0;\n }\n\n return Math.round((lostPackets / totalPackets) * 100);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -19,15 +19,14 @@ import { StatsReportEmitter } from "./statsReportEmitter.js";
19
19
  import { SummaryStatsReportGatherer } from "./summaryStatsReportGatherer.js";
20
20
  import { logger } from "../../logger.js";
21
21
  export class GroupCallStats {
22
- constructor(groupCallId, userId) {
23
- var interval = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000;
24
- this.groupCallId = groupCallId;
25
- this.userId = userId;
26
- this.interval = interval;
22
+ constructor(groupCallId, userId, interval = 10000) {
27
23
  _defineProperty(this, "timer", void 0);
28
24
  _defineProperty(this, "gatherers", new Map());
29
25
  _defineProperty(this, "reports", new StatsReportEmitter());
30
26
  _defineProperty(this, "summaryStatsReportGatherer", new SummaryStatsReportGatherer(this.reports));
27
+ this.groupCallId = groupCallId;
28
+ this.userId = userId;
29
+ this.interval = interval;
31
30
  }
32
31
  start() {
33
32
  if (this.timer === undefined && this.interval > 0) {
@@ -59,11 +58,10 @@ export class GroupCallStats {
59
58
  return this.hasStatsReportGatherer(callId) ? this.gatherers.get(callId) : undefined;
60
59
  }
61
60
  updateOpponentMember(callId, opponentMember) {
62
- var _this$getStatsReportG;
63
- (_this$getStatsReportG = this.getStatsReportGatherer(callId)) === null || _this$getStatsReportG === void 0 || _this$getStatsReportG.setOpponentMemberId(opponentMember);
61
+ this.getStatsReportGatherer(callId)?.setOpponentMemberId(opponentMember);
64
62
  }
65
63
  processStats() {
66
- var summary = [];
64
+ const summary = [];
67
65
  this.gatherers.forEach(c => {
68
66
  summary.push(c.processStats(this.groupCallId, this.userId));
69
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"groupCallStats.js","names":["CallStatsReportGatherer","StatsReportEmitter","SummaryStatsReportGatherer","logger","GroupCallStats","constructor","groupCallId","userId","interval","arguments","length","undefined","_defineProperty","Map","reports","start","timer","setInterval","processStats","stop","clearInterval","gatherers","forEach","c","stopProcessingStats","hasStatsReportGatherer","callId","has","addStatsReportGatherer","opponentMemberId","peerConnection","set","removeStatsReportGatherer","delete","getStatsReportGatherer","get","updateOpponentMember","opponentMember","_this$getStatsReportG","setOpponentMemberId","summary","push","Promise","all","then","s","summaryStatsReportGatherer","build","catch","err","error"],"sources":["../../../src/webrtc/stats/groupCallStats.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport { CallStatsReportGatherer } from \"./callStatsReportGatherer.ts\";\nimport { StatsReportEmitter } from \"./statsReportEmitter.ts\";\nimport { type CallStatsReportSummary } from \"./callStatsReportSummary.ts\";\nimport { SummaryStatsReportGatherer } from \"./summaryStatsReportGatherer.ts\";\nimport { logger } from \"../../logger.ts\";\n\nexport class GroupCallStats {\n private timer: undefined | ReturnType<typeof setTimeout>;\n private readonly gatherers: Map<string, CallStatsReportGatherer> = new Map<string, CallStatsReportGatherer>();\n public readonly reports = new StatsReportEmitter();\n private readonly summaryStatsReportGatherer = new SummaryStatsReportGatherer(this.reports);\n\n public constructor(\n private groupCallId: string,\n private userId: string,\n private interval: number = 10000,\n ) {}\n\n public start(): void {\n if (this.timer === undefined && this.interval > 0) {\n this.timer = setInterval(() => {\n this.processStats();\n }, this.interval);\n }\n }\n\n public stop(): void {\n if (this.timer !== undefined) {\n clearInterval(this.timer);\n this.gatherers.forEach((c) => c.stopProcessingStats());\n }\n }\n\n public hasStatsReportGatherer(callId: string): boolean {\n return this.gatherers.has(callId);\n }\n\n public addStatsReportGatherer(\n callId: string,\n opponentMemberId: string,\n peerConnection: RTCPeerConnection,\n ): boolean {\n if (this.hasStatsReportGatherer(callId)) {\n return false;\n }\n this.gatherers.set(callId, new CallStatsReportGatherer(callId, opponentMemberId, peerConnection, this.reports));\n return true;\n }\n\n public removeStatsReportGatherer(callId: string): boolean {\n return this.gatherers.delete(callId);\n }\n\n public getStatsReportGatherer(callId: string): CallStatsReportGatherer | undefined {\n return this.hasStatsReportGatherer(callId) ? this.gatherers.get(callId) : undefined;\n }\n\n public updateOpponentMember(callId: string, opponentMember: string): void {\n this.getStatsReportGatherer(callId)?.setOpponentMemberId(opponentMember);\n }\n\n private processStats(): void {\n const summary: Promise<CallStatsReportSummary>[] = [];\n this.gatherers.forEach((c) => {\n summary.push(c.processStats(this.groupCallId, this.userId));\n });\n\n Promise.all(summary)\n .then((s: Awaited<CallStatsReportSummary>[]) => this.summaryStatsReportGatherer.build(s))\n .catch((err) => {\n logger.error(\"Could not build summary stats report\", err);\n });\n }\n\n public setInterval(interval: number): void {\n this.interval = interval;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"groupCallStats.js","names":[],"sources":["../../../src/webrtc/stats/groupCallStats.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport { CallStatsReportGatherer } from \"./callStatsReportGatherer.ts\";\nimport { StatsReportEmitter } from \"./statsReportEmitter.ts\";\nimport { type CallStatsReportSummary } from \"./callStatsReportSummary.ts\";\nimport { SummaryStatsReportGatherer } from \"./summaryStatsReportGatherer.ts\";\nimport { logger } from \"../../logger.ts\";\n\nexport class GroupCallStats {\n private timer: undefined | ReturnType<typeof setTimeout>;\n private readonly gatherers: Map<string, CallStatsReportGatherer> = new Map<string, CallStatsReportGatherer>();\n public readonly reports = new StatsReportEmitter();\n private readonly summaryStatsReportGatherer = new SummaryStatsReportGatherer(this.reports);\n\n public constructor(\n private groupCallId: string,\n private userId: string,\n private interval: number = 10000,\n ) {}\n\n public start(): void {\n if (this.timer === undefined && this.interval > 0) {\n this.timer = setInterval(() => {\n this.processStats();\n }, this.interval);\n }\n }\n\n public stop(): void {\n if (this.timer !== undefined) {\n clearInterval(this.timer);\n this.gatherers.forEach((c) => c.stopProcessingStats());\n }\n }\n\n public hasStatsReportGatherer(callId: string): boolean {\n return this.gatherers.has(callId);\n }\n\n public addStatsReportGatherer(\n callId: string,\n opponentMemberId: string,\n peerConnection: RTCPeerConnection,\n ): boolean {\n if (this.hasStatsReportGatherer(callId)) {\n return false;\n }\n this.gatherers.set(callId, new CallStatsReportGatherer(callId, opponentMemberId, peerConnection, this.reports));\n return true;\n }\n\n public removeStatsReportGatherer(callId: string): boolean {\n return this.gatherers.delete(callId);\n }\n\n public getStatsReportGatherer(callId: string): CallStatsReportGatherer | undefined {\n return this.hasStatsReportGatherer(callId) ? this.gatherers.get(callId) : undefined;\n }\n\n public updateOpponentMember(callId: string, opponentMember: string): void {\n this.getStatsReportGatherer(callId)?.setOpponentMemberId(opponentMember);\n }\n\n private processStats(): void {\n const summary: Promise<CallStatsReportSummary>[] = [];\n this.gatherers.forEach((c) => {\n summary.push(c.processStats(this.groupCallId, this.userId));\n });\n\n Promise.all(summary)\n .then((s: Awaited<CallStatsReportSummary>[]) => this.summaryStatsReportGatherer.build(s))\n .catch((err) => {\n logger.error(\"Could not build summary stats report\", err);\n });\n }\n\n public setInterval(interval: number): void {\n this.interval = interval;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,7 +24,7 @@ export class MediaSsrcHandler {
24
24
  });
25
25
  }
26
26
  findMidBySsrc(ssrc, type) {
27
- var mid;
27
+ let mid;
28
28
  this.ssrcToMid[type].forEach((ssrcs, m) => {
29
29
  if (ssrcs.find(s => s == ssrc)) {
30
30
  mid = m;
@@ -34,18 +34,17 @@ export class MediaSsrcHandler {
34
34
  return mid;
35
35
  }
36
36
  parse(description, type) {
37
- var sdp = parseSdp(description);
38
- var ssrcToMid = new Map();
37
+ const sdp = parseSdp(description);
38
+ const ssrcToMid = new Map();
39
39
  sdp.media.forEach(m => {
40
40
  if (!!m.mid && m.type === "video" || m.type === "audio") {
41
- var _m$ssrcs;
42
- var ssrcs = [];
43
- (_m$ssrcs = m.ssrcs) === null || _m$ssrcs === void 0 || _m$ssrcs.forEach(ssrc => {
41
+ const ssrcs = [];
42
+ m.ssrcs?.forEach(ssrc => {
44
43
  if (ssrc.attribute === "cname") {
45
- ssrcs.push("".concat(ssrc.id));
44
+ ssrcs.push(`${ssrc.id}`);
46
45
  }
47
46
  });
48
- ssrcToMid.set("".concat(m.mid), ssrcs);
47
+ ssrcToMid.set(`${m.mid}`, ssrcs);
49
48
  }
50
49
  });
51
50
  this.ssrcToMid[type] = ssrcToMid;
@@ -1 +1 @@
1
- {"version":3,"file":"mediaSsrcHandler.js","names":["parse","parseSdp","MediaSsrcHandler","constructor","_defineProperty","local","Map","remote","findMidBySsrc","ssrc","type","mid","ssrcToMid","forEach","ssrcs","m","find","s","description","sdp","media","_m$ssrcs","attribute","push","concat","id","set","getSsrcToMidMap"],"sources":["../../../../src/webrtc/stats/media/mediaSsrcHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { parse as parseSdp } from \"sdp-transform\";\n\nexport type Mid = string;\nexport type Ssrc = string;\nexport type MapType = \"local\" | \"remote\";\n\nexport class MediaSsrcHandler {\n private readonly ssrcToMid = { local: new Map<Mid, Ssrc[]>(), remote: new Map<Mid, Ssrc[]>() };\n\n public findMidBySsrc(ssrc: Ssrc, type: \"local\" | \"remote\"): Mid | undefined {\n let mid: Mid | undefined;\n this.ssrcToMid[type].forEach((ssrcs, m) => {\n if (ssrcs.find((s) => s == ssrc)) {\n mid = m;\n return;\n }\n });\n return mid;\n }\n\n public parse(description: string, type: MapType): void {\n const sdp = parseSdp(description);\n const ssrcToMid = new Map<Mid, Ssrc[]>();\n sdp.media.forEach((m) => {\n if ((!!m.mid && m.type === \"video\") || m.type === \"audio\") {\n const ssrcs: Ssrc[] = [];\n m.ssrcs?.forEach((ssrc) => {\n if (ssrc.attribute === \"cname\") {\n ssrcs.push(`${ssrc.id}`);\n }\n });\n ssrcToMid.set(`${m.mid}`, ssrcs);\n }\n });\n this.ssrcToMid[type] = ssrcToMid;\n }\n\n public getSsrcToMidMap(type: MapType): Map<Mid, Ssrc[]> {\n return this.ssrcToMid[type];\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,IAAIC,QAAQ,QAAQ,eAAe;AAMjD,OAAO,MAAMC,gBAAgB,CAAC;EAAAC,YAAA;IAAAC,eAAA,oBACG;MAAEC,KAAK,EAAE,IAAIC,GAAG,CAAc,CAAC;MAAEC,MAAM,EAAE,IAAID,GAAG,CAAc;IAAE,CAAC;EAAA;EAEvFE,aAAaA,CAACC,IAAU,EAAEC,IAAwB,EAAmB;IACxE,IAAIC,GAAoB;IACxB,IAAI,CAACC,SAAS,CAACF,IAAI,CAAC,CAACG,OAAO,CAAC,CAACC,KAAK,EAAEC,CAAC,KAAK;MACvC,IAAID,KAAK,CAACE,IAAI,CAAEC,CAAC,IAAKA,CAAC,IAAIR,IAAI,CAAC,EAAE;QAC9BE,GAAG,GAAGI,CAAC;QACP;MACJ;IACJ,CAAC,CAAC;IACF,OAAOJ,GAAG;EACd;EAEOX,KAAKA,CAACkB,WAAmB,EAAER,IAAa,EAAQ;IACnD,IAAMS,GAAG,GAAGlB,QAAQ,CAACiB,WAAW,CAAC;IACjC,IAAMN,SAAS,GAAG,IAAIN,GAAG,CAAc,CAAC;IACxCa,GAAG,CAACC,KAAK,CAACP,OAAO,CAAEE,CAAC,IAAK;MACrB,IAAK,CAAC,CAACA,CAAC,CAACJ,GAAG,IAAII,CAAC,CAACL,IAAI,KAAK,OAAO,IAAKK,CAAC,CAACL,IAAI,KAAK,OAAO,EAAE;QAAA,IAAAW,QAAA;QACvD,IAAMP,KAAa,GAAG,EAAE;QACxB,CAAAO,QAAA,GAAAN,CAAC,CAACD,KAAK,cAAAO,QAAA,eAAPA,QAAA,CAASR,OAAO,CAAEJ,IAAI,IAAK;UACvB,IAAIA,IAAI,CAACa,SAAS,KAAK,OAAO,EAAE;YAC5BR,KAAK,CAACS,IAAI,IAAAC,MAAA,CAAIf,IAAI,CAACgB,EAAE,CAAE,CAAC;UAC5B;QACJ,CAAC,CAAC;QACFb,SAAS,CAACc,GAAG,IAAAF,MAAA,CAAIT,CAAC,CAACJ,GAAG,GAAIG,KAAK,CAAC;MACpC;IACJ,CAAC,CAAC;IACF,IAAI,CAACF,SAAS,CAACF,IAAI,CAAC,GAAGE,SAAS;EACpC;EAEOe,eAAeA,CAACjB,IAAa,EAAoB;IACpD,OAAO,IAAI,CAACE,SAAS,CAACF,IAAI,CAAC;EAC/B;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"mediaSsrcHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaSsrcHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { parse as parseSdp } from \"sdp-transform\";\n\nexport type Mid = string;\nexport type Ssrc = string;\nexport type MapType = \"local\" | \"remote\";\n\nexport class MediaSsrcHandler {\n private readonly ssrcToMid = { local: new Map<Mid, Ssrc[]>(), remote: new Map<Mid, Ssrc[]>() };\n\n public findMidBySsrc(ssrc: Ssrc, type: \"local\" | \"remote\"): Mid | undefined {\n let mid: Mid | undefined;\n this.ssrcToMid[type].forEach((ssrcs, m) => {\n if (ssrcs.find((s) => s == ssrc)) {\n mid = m;\n return;\n }\n });\n return mid;\n }\n\n public parse(description: string, type: MapType): void {\n const sdp = parseSdp(description);\n const ssrcToMid = new Map<Mid, Ssrc[]>();\n sdp.media.forEach((m) => {\n if ((!!m.mid && m.type === \"video\") || m.type === \"audio\") {\n const ssrcs: Ssrc[] = [];\n m.ssrcs?.forEach((ssrc) => {\n if (ssrc.attribute === \"cname\") {\n ssrcs.push(`${ssrc.id}`);\n }\n });\n ssrcToMid.set(`${m.mid}`, ssrcs);\n }\n });\n this.ssrcToMid[type] = ssrcToMid;\n }\n\n public getSsrcToMidMap(type: MapType): Map<Mid, Ssrc[]> {\n return this.ssrcToMid[type];\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,KAAK,IAAI,QAAQ,QAAQ,eAAe;AAMjD,OAAO,MAAM,gBAAgB,CAAC;EAAA;IAAA,mCACG;MAAE,KAAK,EAAE,IAAI,GAAG,CAAc,CAAC;MAAE,MAAM,EAAE,IAAI,GAAG,CAAc;IAAE,CAAC;EAAA;EAEvF,aAAa,CAAC,IAAU,EAAE,IAAwB,EAAmB;IACxE,IAAI,GAAoB;IACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK;MACvC,IAAI,KAAK,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,IAAI,IAAI,CAAC,EAAE;QAC9B,GAAG,GAAG,CAAC;QACP;MACJ;IACJ,CAAC,CAAC;IACF,OAAO,GAAG;EACd;EAEO,KAAK,CAAC,WAAmB,EAAE,IAAa,EAAQ;IACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAc,CAAC;IACxC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,IAAK;MACrB,IAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAK,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;QACvD,MAAM,KAAa,GAAG,EAAE;QACxB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAE,IAAI,IAAK;UACvB,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;UAC5B;QACJ,CAAC,CAAC;QACF,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;MACpC;IACJ,CAAC,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS;EACpC;EAEO,eAAe,CAAC,IAAa,EAAoB;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;EAC/B;AACJ","ignoreList":[]}
@@ -19,31 +19,29 @@ export class MediaTrackHandler {
19
19
  this.pc = pc;
20
20
  }
21
21
  getLocalTracks(kind) {
22
- var isNotNullAndKind = track => {
22
+ const isNotNullAndKind = track => {
23
23
  return track !== null && track.kind === kind;
24
24
  };
25
25
  return this.pc.getTransceivers().filter(t => t.currentDirection === "sendonly" || t.currentDirection === "sendrecv").filter(t => t.sender !== null).map(t => t.sender).map(s => s.track).filter(isNotNullAndKind);
26
26
  }
27
27
  getTackById(trackId) {
28
28
  return this.pc.getTransceivers().map(t => {
29
- if ((t === null || t === void 0 ? void 0 : t.sender.track) !== null && t.sender.track.id === trackId) {
29
+ if (t?.sender.track !== null && t.sender.track.id === trackId) {
30
30
  return t.sender.track;
31
31
  }
32
- if ((t === null || t === void 0 ? void 0 : t.receiver.track) !== null && t.receiver.track.id === trackId) {
32
+ if (t?.receiver.track !== null && t.receiver.track.id === trackId) {
33
33
  return t.receiver.track;
34
34
  }
35
35
  return undefined;
36
36
  }).find(t => t !== undefined);
37
37
  }
38
38
  getLocalTrackIdByMid(mid) {
39
- var _transceiver$sender;
40
- var transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
41
- return transceiver === null || transceiver === void 0 || (_transceiver$sender = transceiver.sender) === null || _transceiver$sender === void 0 || (_transceiver$sender = _transceiver$sender.track) === null || _transceiver$sender === void 0 ? void 0 : _transceiver$sender.id;
39
+ const transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
40
+ return transceiver?.sender?.track?.id;
42
41
  }
43
42
  getRemoteTrackIdByMid(mid) {
44
- var _transceiver$receiver;
45
- var transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
46
- return transceiver === null || transceiver === void 0 || (_transceiver$receiver = transceiver.receiver) === null || _transceiver$receiver === void 0 || (_transceiver$receiver = _transceiver$receiver.track) === null || _transceiver$receiver === void 0 ? void 0 : _transceiver$receiver.id;
43
+ const transceiver = this.pc.getTransceivers().find(t => t.mid === mid);
44
+ return transceiver?.receiver?.track?.id;
47
45
  }
48
46
  getActiveSimulcastStreams() {
49
47
  //@TODO implement this right.. Check how many layer configured
@@ -1 +1 @@
1
- {"version":3,"file":"mediaTrackHandler.js","names":["MediaTrackHandler","constructor","pc","getLocalTracks","kind","isNotNullAndKind","track","getTransceivers","filter","t","currentDirection","sender","map","s","getTackById","trackId","id","receiver","undefined","find","getLocalTrackIdByMid","mid","_transceiver$sender","transceiver","getRemoteTrackIdByMid","_transceiver$receiver","getActiveSimulcastStreams","getTransceiverByTrackId"],"sources":["../../../../src/webrtc/stats/media/mediaTrackHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nexport type TrackId = string;\n\nexport class MediaTrackHandler {\n public constructor(private readonly pc: RTCPeerConnection) {}\n\n public getLocalTracks(kind: \"audio\" | \"video\"): MediaStreamTrack[] {\n const isNotNullAndKind = (track: MediaStreamTrack | null): boolean => {\n return track !== null && track.kind === kind;\n };\n return this.pc\n .getTransceivers()\n .filter((t) => t.currentDirection === \"sendonly\" || t.currentDirection === \"sendrecv\")\n .filter((t) => t.sender !== null)\n .map((t) => t.sender)\n .map((s) => s.track)\n .filter(isNotNullAndKind) as MediaStreamTrack[];\n }\n\n public getTackById(trackId: string): MediaStreamTrack | undefined {\n return this.pc\n .getTransceivers()\n .map((t) => {\n if (t?.sender.track !== null && t.sender.track.id === trackId) {\n return t.sender.track;\n }\n if (t?.receiver.track !== null && t.receiver.track.id === trackId) {\n return t.receiver.track;\n }\n return undefined;\n })\n .find((t) => t !== undefined);\n }\n\n public getLocalTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.sender?.track?.id;\n }\n\n public getRemoteTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.receiver?.track?.id;\n }\n\n public getActiveSimulcastStreams(): number {\n //@TODO implement this right.. Check how many layer configured\n return 3;\n }\n\n public getTransceiverByTrackId(trackId: TrackId): RTCRtpTransceiver | undefined {\n return this.pc.getTransceivers().find((t) => {\n return t.receiver.track.id === trackId || (t.sender.track !== null && t.sender.track.id === trackId);\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mediaTrackHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nexport type TrackId = string;\n\nexport class MediaTrackHandler {\n public constructor(private readonly pc: RTCPeerConnection) {}\n\n public getLocalTracks(kind: \"audio\" | \"video\"): MediaStreamTrack[] {\n const isNotNullAndKind = (track: MediaStreamTrack | null): boolean => {\n return track !== null && track.kind === kind;\n };\n return this.pc\n .getTransceivers()\n .filter((t) => t.currentDirection === \"sendonly\" || t.currentDirection === \"sendrecv\")\n .filter((t) => t.sender !== null)\n .map((t) => t.sender)\n .map((s) => s.track)\n .filter(isNotNullAndKind) as MediaStreamTrack[];\n }\n\n public getTackById(trackId: string): MediaStreamTrack | undefined {\n return this.pc\n .getTransceivers()\n .map((t) => {\n if (t?.sender.track !== null && t.sender.track.id === trackId) {\n return t.sender.track;\n }\n if (t?.receiver.track !== null && t.receiver.track.id === trackId) {\n return t.receiver.track;\n }\n return undefined;\n })\n .find((t) => t !== undefined);\n }\n\n public getLocalTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.sender?.track?.id;\n }\n\n public getRemoteTrackIdByMid(mid: string): string | undefined {\n const transceiver = this.pc.getTransceivers().find((t) => t.mid === mid);\n return transceiver?.receiver?.track?.id;\n }\n\n public getActiveSimulcastStreams(): number {\n //@TODO implement this right.. Check how many layer configured\n return 3;\n }\n\n public getTransceiverByTrackId(trackId: TrackId): RTCRtpTransceiver | undefined {\n return this.pc.getTransceivers().find((t) => {\n return t.receiver.track.id === trackId || (t.sender.track !== null && t.sender.track.id === trackId);\n });\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,MAAM,iBAAiB,CAAC;EACpB,WAAW,CAAkB,EAAqB,EAAE;IAAA,KAAvB,EAAqB,GAArB,EAAqB;EAAG;EAErD,cAAc,CAAC,IAAuB,EAAsB;IAC/D,MAAM,gBAAgB,GAAI,KAA8B,IAAc;MAClE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;IAChD,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CACT,eAAe,CAAC,CAAC,CACjB,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,gBAAgB,KAAK,UAAU,IAAI,CAAC,CAAC,gBAAgB,KAAK,UAAU,CAAC,CACrF,MAAM,CAAE,CAAC,IAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAChC,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,MAAM,CAAC,CACpB,GAAG,CAAE,CAAC,IAAK,CAAC,CAAC,KAAK,CAAC,CACnB,MAAM,CAAC,gBAAgB,CAAC;EACjC;EAEO,WAAW,CAAC,OAAe,EAAgC;IAC9D,OAAO,IAAI,CAAC,EAAE,CACT,eAAe,CAAC,CAAC,CACjB,GAAG,CAAE,CAAC,IAAK;MACR,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;QAC3D,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK;MACzB;MACA,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE;QAC/D,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK;MAC3B;MACA,OAAO,SAAS;IACpB,CAAC,CAAC,CACD,IAAI,CAAE,CAAC,IAAK,CAAC,KAAK,SAAS,CAAC;EACrC;EAEO,oBAAoB,CAAC,GAAW,EAAsB;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACxE,OAAO,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;EACzC;EAEO,qBAAqB,CAAC,GAAW,EAAsB;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;IACxE,OAAO,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;EAC3C;EAEO,yBAAyB,GAAW;IACvC;IACA,OAAO,CAAC;EACZ;EAEO,uBAAuB,CAAC,OAAgB,EAAiC;IAC5E,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,IAAK;MACzC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,IAAK,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,OAAQ;IACxG,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
@@ -17,9 +17,6 @@ limitations under the License.
17
17
 
18
18
  export class MediaTrackStats {
19
19
  constructor(trackId, type, kind) {
20
- this.trackId = trackId;
21
- this.type = type;
22
- this.kind = kind;
23
20
  _defineProperty(this, "loss", {
24
21
  packetsTotal: 0,
25
22
  packetsLost: 0,
@@ -43,6 +40,9 @@ export class MediaTrackStats {
43
40
  _defineProperty(this, "isAlive", true);
44
41
  _defineProperty(this, "isMuted", false);
45
42
  _defineProperty(this, "isEnabled", true);
43
+ this.trackId = trackId;
44
+ this.type = type;
45
+ this.kind = kind;
46
46
  }
47
47
  getType() {
48
48
  return this.type;
@@ -1 +1 @@
1
- {"version":3,"file":"mediaTrackStats.js","names":["MediaTrackStats","constructor","trackId","type","kind","_defineProperty","packetsTotal","packetsLost","isDownloadStream","download","upload","width","height","concealedAudio","totalAudioDuration","getType","setLoss","loss","getLoss","setResolution","resolution","getResolution","setFramerate","framerate","getFramerate","setBitrate","bitrate","getBitrate","setCodec","codecShortType","codec","getCodec","resetBitrate","alive","isAlive","muted","isMuted","enabled","isEnabled","setJitter","jitter","getJitter","setAudioConcealment","concealedAudioDuration","audioConcealment","getAudioConcealment"],"sources":["../../../../src/webrtc/stats/media/mediaTrackStats.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type AudioConcealment } from \"../statsReport.ts\";\nimport { type TrackId } from \"./mediaTrackHandler.ts\";\n\nexport interface PacketLoss {\n packetsTotal: number;\n packetsLost: number;\n isDownloadStream: boolean;\n}\n\nexport interface Bitrate {\n /**\n * bytes per second\n */\n download: number;\n /**\n * bytes per second\n */\n upload: number;\n}\nexport interface ConcealedAudio {\n /**\n * duration in ms\n */\n duration: number;\n\n ratio: number;\n}\nexport interface Resolution {\n width: number;\n height: number;\n}\n\nexport type TrackStatsType = \"local\" | \"remote\";\n\nexport class MediaTrackStats {\n private loss: PacketLoss = { packetsTotal: 0, packetsLost: 0, isDownloadStream: false };\n private bitrate: Bitrate = { download: 0, upload: 0 };\n private resolution: Resolution = { width: -1, height: -1 };\n private audioConcealment: AudioConcealment = { concealedAudio: 0, totalAudioDuration: 0 };\n private framerate = 0;\n private jitter = 0;\n private codec = \"\";\n private isAlive = true;\n private isMuted = false;\n private isEnabled = true;\n\n public constructor(\n public readonly trackId: TrackId,\n public readonly type: TrackStatsType,\n public readonly kind: \"audio\" | \"video\",\n ) {}\n\n public getType(): TrackStatsType {\n return this.type;\n }\n\n public setLoss(loss: PacketLoss): void {\n this.loss = loss;\n }\n\n public getLoss(): PacketLoss {\n return this.loss;\n }\n\n public setResolution(resolution: Resolution): void {\n this.resolution = resolution;\n }\n\n public getResolution(): Resolution {\n return this.resolution;\n }\n\n public setFramerate(framerate: number): void {\n this.framerate = framerate;\n }\n\n public getFramerate(): number {\n return this.framerate;\n }\n\n public setBitrate(bitrate: Bitrate): void {\n this.bitrate = bitrate;\n }\n\n public getBitrate(): Bitrate {\n return this.bitrate;\n }\n\n public setCodec(codecShortType: string): boolean {\n this.codec = codecShortType;\n return true;\n }\n\n public getCodec(): string {\n return this.codec;\n }\n\n public resetBitrate(): void {\n this.bitrate = { download: 0, upload: 0 };\n }\n\n public set alive(isAlive: boolean) {\n this.isAlive = isAlive;\n }\n\n /**\n * A MediaTrackState is alive if the corresponding MediaStreamTrack track bound to a transceiver and the\n * MediaStreamTrack is in state MediaStreamTrack.readyState === live\n */\n public get alive(): boolean {\n return this.isAlive;\n }\n\n public set muted(isMuted: boolean) {\n this.isMuted = isMuted;\n }\n\n /**\n * A MediaTrackState.isMuted corresponding to MediaStreamTrack.muted.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get muted(): boolean {\n return this.isMuted;\n }\n\n public set enabled(isEnabled: boolean) {\n this.isEnabled = isEnabled;\n }\n\n /**\n * A MediaTrackState.isEnabled corresponding to MediaStreamTrack.enabled.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get enabled(): boolean {\n return this.isEnabled;\n }\n\n public setJitter(jitter: number): void {\n this.jitter = jitter;\n }\n\n /**\n * Jitter in milliseconds\n */\n public getJitter(): number {\n return this.jitter;\n }\n\n /**\n * Audio concealment ration (conceled duration / total duration)\n */\n public setAudioConcealment(concealedAudioDuration: number, totalAudioDuration: number): void {\n this.audioConcealment.concealedAudio = concealedAudioDuration;\n this.audioConcealment.totalAudioDuration = totalAudioDuration;\n }\n\n public getAudioConcealment(): AudioConcealment {\n return this.audioConcealment;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mediaTrackStats.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackStats.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type AudioConcealment } from \"../statsReport.ts\";\nimport { type TrackId } from \"./mediaTrackHandler.ts\";\n\nexport interface PacketLoss {\n packetsTotal: number;\n packetsLost: number;\n isDownloadStream: boolean;\n}\n\nexport interface Bitrate {\n /**\n * bytes per second\n */\n download: number;\n /**\n * bytes per second\n */\n upload: number;\n}\nexport interface ConcealedAudio {\n /**\n * duration in ms\n */\n duration: number;\n\n ratio: number;\n}\nexport interface Resolution {\n width: number;\n height: number;\n}\n\nexport type TrackStatsType = \"local\" | \"remote\";\n\nexport class MediaTrackStats {\n private loss: PacketLoss = { packetsTotal: 0, packetsLost: 0, isDownloadStream: false };\n private bitrate: Bitrate = { download: 0, upload: 0 };\n private resolution: Resolution = { width: -1, height: -1 };\n private audioConcealment: AudioConcealment = { concealedAudio: 0, totalAudioDuration: 0 };\n private framerate = 0;\n private jitter = 0;\n private codec = \"\";\n private isAlive = true;\n private isMuted = false;\n private isEnabled = true;\n\n public constructor(\n public readonly trackId: TrackId,\n public readonly type: TrackStatsType,\n public readonly kind: \"audio\" | \"video\",\n ) {}\n\n public getType(): TrackStatsType {\n return this.type;\n }\n\n public setLoss(loss: PacketLoss): void {\n this.loss = loss;\n }\n\n public getLoss(): PacketLoss {\n return this.loss;\n }\n\n public setResolution(resolution: Resolution): void {\n this.resolution = resolution;\n }\n\n public getResolution(): Resolution {\n return this.resolution;\n }\n\n public setFramerate(framerate: number): void {\n this.framerate = framerate;\n }\n\n public getFramerate(): number {\n return this.framerate;\n }\n\n public setBitrate(bitrate: Bitrate): void {\n this.bitrate = bitrate;\n }\n\n public getBitrate(): Bitrate {\n return this.bitrate;\n }\n\n public setCodec(codecShortType: string): boolean {\n this.codec = codecShortType;\n return true;\n }\n\n public getCodec(): string {\n return this.codec;\n }\n\n public resetBitrate(): void {\n this.bitrate = { download: 0, upload: 0 };\n }\n\n public set alive(isAlive: boolean) {\n this.isAlive = isAlive;\n }\n\n /**\n * A MediaTrackState is alive if the corresponding MediaStreamTrack track bound to a transceiver and the\n * MediaStreamTrack is in state MediaStreamTrack.readyState === live\n */\n public get alive(): boolean {\n return this.isAlive;\n }\n\n public set muted(isMuted: boolean) {\n this.isMuted = isMuted;\n }\n\n /**\n * A MediaTrackState.isMuted corresponding to MediaStreamTrack.muted.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get muted(): boolean {\n return this.isMuted;\n }\n\n public set enabled(isEnabled: boolean) {\n this.isEnabled = isEnabled;\n }\n\n /**\n * A MediaTrackState.isEnabled corresponding to MediaStreamTrack.enabled.\n * But these values only match if MediaTrackState.isAlive.\n */\n public get enabled(): boolean {\n return this.isEnabled;\n }\n\n public setJitter(jitter: number): void {\n this.jitter = jitter;\n }\n\n /**\n * Jitter in milliseconds\n */\n public getJitter(): number {\n return this.jitter;\n }\n\n /**\n * Audio concealment ration (conceled duration / total duration)\n */\n public setAudioConcealment(concealedAudioDuration: number, totalAudioDuration: number): void {\n this.audioConcealment.concealedAudio = concealedAudioDuration;\n this.audioConcealment.totalAudioDuration = totalAudioDuration;\n }\n\n public getAudioConcealment(): AudioConcealment {\n return this.audioConcealment;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -18,9 +18,9 @@ limitations under the License.
18
18
  import { MediaTrackStats } from "./mediaTrackStats.js";
19
19
  export class MediaTrackStatsHandler {
20
20
  constructor(mediaSsrcHandler, mediaTrackHandler) {
21
+ _defineProperty(this, "track2stats", new Map());
21
22
  this.mediaSsrcHandler = mediaSsrcHandler;
22
23
  this.mediaTrackHandler = mediaTrackHandler;
23
- _defineProperty(this, "track2stats", new Map());
24
24
  }
25
25
 
26
26
  /**
@@ -31,13 +31,13 @@ export class MediaTrackStatsHandler {
31
31
  * https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats
32
32
  */
33
33
  findTrack2Stats(report, type) {
34
- var trackID;
34
+ let trackID;
35
35
  if (report.trackIdentifier) {
36
36
  trackID = report.trackIdentifier;
37
37
  } else if (report.mid) {
38
38
  trackID = type === "remote" ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid) : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);
39
39
  } else if (report.ssrc) {
40
- var mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);
40
+ const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);
41
41
  if (!mid) {
42
42
  return undefined;
43
43
  }
@@ -46,11 +46,11 @@ export class MediaTrackStatsHandler {
46
46
  if (!trackID) {
47
47
  return undefined;
48
48
  }
49
- var trackStats = this.track2stats.get(trackID);
49
+ let trackStats = this.track2stats.get(trackID);
50
50
  if (!trackStats) {
51
- var track = this.mediaTrackHandler.getTackById(trackID);
51
+ const track = this.mediaTrackHandler.getTackById(trackID);
52
52
  if (track !== undefined) {
53
- var kind = track.kind === "audio" ? track.kind : "video";
53
+ const kind = track.kind === "audio" ? track.kind : "video";
54
54
  trackStats = new MediaTrackStats(trackID, type, kind);
55
55
  this.track2stats.set(trackID, trackStats);
56
56
  } else {
@@ -60,7 +60,7 @@ export class MediaTrackStatsHandler {
60
60
  return trackStats;
61
61
  }
62
62
  findLocalVideoTrackStats(report) {
63
- var localVideoTracks = this.mediaTrackHandler.getLocalTracks("video");
63
+ const localVideoTracks = this.mediaTrackHandler.getLocalTracks("video");
64
64
  if (localVideoTracks.length === 0) {
65
65
  return undefined;
66
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mediaTrackStatsHandler.js","names":["MediaTrackStats","MediaTrackStatsHandler","constructor","mediaSsrcHandler","mediaTrackHandler","_defineProperty","Map","findTrack2Stats","report","type","trackID","trackIdentifier","mid","getRemoteTrackIdByMid","getLocalTrackIdByMid","ssrc","findMidBySsrc","undefined","trackStats","track2stats","get","track","getTackById","kind","set","findLocalVideoTrackStats","localVideoTracks","getLocalTracks","length","getTrack2stats","findTransceiverByTrackId","getTransceiverByTrackId"],"sources":["../../../../src/webrtc/stats/media/mediaTrackStatsHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport { type TrackID } from \"../statsReport.ts\";\nimport { MediaTrackStats } from \"./mediaTrackStats.ts\";\nimport { type MediaTrackHandler, type TrackId } from \"./mediaTrackHandler.ts\";\nimport { type MediaSsrcHandler } from \"./mediaSsrcHandler.ts\";\n\nexport class MediaTrackStatsHandler {\n private readonly track2stats = new Map<TrackID, MediaTrackStats>();\n\n public constructor(\n public readonly mediaSsrcHandler: MediaSsrcHandler,\n public readonly mediaTrackHandler: MediaTrackHandler,\n ) {}\n\n /**\n * Find tracks by rtc stats\n * Argument report is any because the stats api is not consistent:\n * For example `trackIdentifier`, `mid` not existing in every implementations\n * https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats\n * https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats\n */\n public findTrack2Stats(report: any, type: \"remote\" | \"local\"): MediaTrackStats | undefined {\n let trackID;\n if (report.trackIdentifier) {\n trackID = report.trackIdentifier;\n } else if (report.mid) {\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n } else if (report.ssrc) {\n const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);\n if (!mid) {\n return undefined;\n }\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n }\n\n if (!trackID) {\n return undefined;\n }\n\n let trackStats = this.track2stats.get(trackID);\n\n if (!trackStats) {\n const track = this.mediaTrackHandler.getTackById(trackID);\n if (track !== undefined) {\n const kind: \"audio\" | \"video\" = track.kind === \"audio\" ? track.kind : \"video\";\n trackStats = new MediaTrackStats(trackID, type, kind);\n this.track2stats.set(trackID, trackStats);\n } else {\n return undefined;\n }\n }\n return trackStats;\n }\n\n public findLocalVideoTrackStats(report: any): MediaTrackStats | undefined {\n const localVideoTracks = this.mediaTrackHandler.getLocalTracks(\"video\");\n if (localVideoTracks.length === 0) {\n return undefined;\n }\n return this.findTrack2Stats(report, \"local\");\n }\n\n public getTrack2stats(): Map<TrackID, MediaTrackStats> {\n return this.track2stats;\n }\n\n public findTransceiverByTrackId(trackID: TrackId): undefined | RTCRtpTransceiver {\n return this.mediaTrackHandler.getTransceiverByTrackId(trackID);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,eAAe,QAAQ,sBAAsB;AAItD,OAAO,MAAMC,sBAAsB,CAAC;EAGzBC,WAAWA,CACEC,gBAAkC,EAClCC,iBAAoC,EACtD;IAAA,KAFkBD,gBAAkC,GAAlCA,gBAAkC;IAAA,KAClCC,iBAAoC,GAApCA,iBAAoC;IAAAC,eAAA,sBAJzB,IAAIC,GAAG,CAA2B,CAAC;EAK/D;;EAEH;AACJ;AACA;AACA;AACA;AACA;AACA;EACWC,eAAeA,CAACC,MAAW,EAAEC,IAAwB,EAA+B;IACvF,IAAIC,OAAO;IACX,IAAIF,MAAM,CAACG,eAAe,EAAE;MACxBD,OAAO,GAAGF,MAAM,CAACG,eAAe;IACpC,CAAC,MAAM,IAAIH,MAAM,CAACI,GAAG,EAAE;MACnBF,OAAO,GACHD,IAAI,KAAK,QAAQ,GACX,IAAI,CAACL,iBAAiB,CAACS,qBAAqB,CAACL,MAAM,CAACI,GAAG,CAAC,GACxD,IAAI,CAACR,iBAAiB,CAACU,oBAAoB,CAACN,MAAM,CAACI,GAAG,CAAC;IACrE,CAAC,MAAM,IAAIJ,MAAM,CAACO,IAAI,EAAE;MACpB,IAAMH,GAAG,GAAG,IAAI,CAACT,gBAAgB,CAACa,aAAa,CAACR,MAAM,CAACO,IAAI,EAAEN,IAAI,CAAC;MAClE,IAAI,CAACG,GAAG,EAAE;QACN,OAAOK,SAAS;MACpB;MACAP,OAAO,GACHD,IAAI,KAAK,QAAQ,GACX,IAAI,CAACL,iBAAiB,CAACS,qBAAqB,CAACL,MAAM,CAACI,GAAG,CAAC,GACxD,IAAI,CAACR,iBAAiB,CAACU,oBAAoB,CAACN,MAAM,CAACI,GAAG,CAAC;IACrE;IAEA,IAAI,CAACF,OAAO,EAAE;MACV,OAAOO,SAAS;IACpB;IAEA,IAAIC,UAAU,GAAG,IAAI,CAACC,WAAW,CAACC,GAAG,CAACV,OAAO,CAAC;IAE9C,IAAI,CAACQ,UAAU,EAAE;MACb,IAAMG,KAAK,GAAG,IAAI,CAACjB,iBAAiB,CAACkB,WAAW,CAACZ,OAAO,CAAC;MACzD,IAAIW,KAAK,KAAKJ,SAAS,EAAE;QACrB,IAAMM,IAAuB,GAAGF,KAAK,CAACE,IAAI,KAAK,OAAO,GAAGF,KAAK,CAACE,IAAI,GAAG,OAAO;QAC7EL,UAAU,GAAG,IAAIlB,eAAe,CAACU,OAAO,EAAED,IAAI,EAAEc,IAAI,CAAC;QACrD,IAAI,CAACJ,WAAW,CAACK,GAAG,CAACd,OAAO,EAAEQ,UAAU,CAAC;MAC7C,CAAC,MAAM;QACH,OAAOD,SAAS;MACpB;IACJ;IACA,OAAOC,UAAU;EACrB;EAEOO,wBAAwBA,CAACjB,MAAW,EAA+B;IACtE,IAAMkB,gBAAgB,GAAG,IAAI,CAACtB,iBAAiB,CAACuB,cAAc,CAAC,OAAO,CAAC;IACvE,IAAID,gBAAgB,CAACE,MAAM,KAAK,CAAC,EAAE;MAC/B,OAAOX,SAAS;IACpB;IACA,OAAO,IAAI,CAACV,eAAe,CAACC,MAAM,EAAE,OAAO,CAAC;EAChD;EAEOqB,cAAcA,CAAA,EAAkC;IACnD,OAAO,IAAI,CAACV,WAAW;EAC3B;EAEOW,wBAAwBA,CAACpB,OAAgB,EAAiC;IAC7E,OAAO,IAAI,CAACN,iBAAiB,CAAC2B,uBAAuB,CAACrB,OAAO,CAAC;EAClE;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"mediaTrackStatsHandler.js","names":[],"sources":["../../../../src/webrtc/stats/media/mediaTrackStatsHandler.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport { type TrackID } from \"../statsReport.ts\";\nimport { MediaTrackStats } from \"./mediaTrackStats.ts\";\nimport { type MediaTrackHandler, type TrackId } from \"./mediaTrackHandler.ts\";\nimport { type MediaSsrcHandler } from \"./mediaSsrcHandler.ts\";\n\nexport class MediaTrackStatsHandler {\n private readonly track2stats = new Map<TrackID, MediaTrackStats>();\n\n public constructor(\n public readonly mediaSsrcHandler: MediaSsrcHandler,\n public readonly mediaTrackHandler: MediaTrackHandler,\n ) {}\n\n /**\n * Find tracks by rtc stats\n * Argument report is any because the stats api is not consistent:\n * For example `trackIdentifier`, `mid` not existing in every implementations\n * https://www.w3.org/TR/webrtc-stats/#dom-rtcinboundrtpstreamstats\n * https://developer.mozilla.org/en-US/docs/Web/API/RTCInboundRtpStreamStats\n */\n public findTrack2Stats(report: any, type: \"remote\" | \"local\"): MediaTrackStats | undefined {\n let trackID;\n if (report.trackIdentifier) {\n trackID = report.trackIdentifier;\n } else if (report.mid) {\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n } else if (report.ssrc) {\n const mid = this.mediaSsrcHandler.findMidBySsrc(report.ssrc, type);\n if (!mid) {\n return undefined;\n }\n trackID =\n type === \"remote\"\n ? this.mediaTrackHandler.getRemoteTrackIdByMid(report.mid)\n : this.mediaTrackHandler.getLocalTrackIdByMid(report.mid);\n }\n\n if (!trackID) {\n return undefined;\n }\n\n let trackStats = this.track2stats.get(trackID);\n\n if (!trackStats) {\n const track = this.mediaTrackHandler.getTackById(trackID);\n if (track !== undefined) {\n const kind: \"audio\" | \"video\" = track.kind === \"audio\" ? track.kind : \"video\";\n trackStats = new MediaTrackStats(trackID, type, kind);\n this.track2stats.set(trackID, trackStats);\n } else {\n return undefined;\n }\n }\n return trackStats;\n }\n\n public findLocalVideoTrackStats(report: any): MediaTrackStats | undefined {\n const localVideoTracks = this.mediaTrackHandler.getLocalTracks(\"video\");\n if (localVideoTracks.length === 0) {\n return undefined;\n }\n return this.findTrack2Stats(report, \"local\");\n }\n\n public getTrack2stats(): Map<TrackID, MediaTrackStats> {\n return this.track2stats;\n }\n\n public findTransceiverByTrackId(trackID: TrackId): undefined | RTCRtpTransceiver {\n return this.mediaTrackHandler.getTransceiverByTrackId(trackID);\n }\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,eAAe,QAAQ,sBAAsB;AAItD,OAAO,MAAM,sBAAsB,CAAC;EAGzB,WAAW,CACE,gBAAkC,EAClC,iBAAoC,EACtD;IAAA,qCAL6B,IAAI,GAAG,CAA2B,CAAC;IAAA,KAG9C,gBAAkC,GAAlC,gBAAkC;IAAA,KAClC,iBAAoC,GAApC,iBAAoC;EACrD;;EAEH;AACJ;AACA;AACA;AACA;AACA;AACA;EACW,eAAe,CAAC,MAAW,EAAE,IAAwB,EAA+B;IACvF,IAAI,OAAO;IACX,IAAI,MAAM,CAAC,eAAe,EAAE;MACxB,OAAO,GAAG,MAAM,CAAC,eAAe;IACpC,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE;MACnB,OAAO,GACH,IAAI,KAAK,QAAQ,GACX,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,GACxD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;MACpB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;MAClE,IAAI,CAAC,GAAG,EAAE;QACN,OAAO,SAAS;MACpB;MACA,OAAO,GACH,IAAI,KAAK,QAAQ,GACX,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,GAAG,CAAC,GACxD,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE;IAEA,IAAI,CAAC,OAAO,EAAE;MACV,OAAO,SAAS;IACpB;IAEA,IAAI,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;IAE9C,IAAI,CAAC,UAAU,EAAE;MACb,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC;MACzD,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,MAAM,IAAuB,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,OAAO;QAC7E,UAAU,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC;MAC7C,CAAC,MAAM;QACH,OAAO,SAAS;MACpB;IACJ;IACA,OAAO,UAAU;EACrB;EAEO,wBAAwB,CAAC,MAAW,EAA+B;IACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC;IACvE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;MAC/B,OAAO,SAAS;IACpB;IACA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;EAChD;EAEO,cAAc,GAAkC;IACnD,OAAO,IAAI,CAAC,WAAW;EAC3B;EAEO,wBAAwB,CAAC,OAAgB,EAAiC;IAC7E,OAAO,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,OAAO,CAAC;EAClE;AACJ","ignoreList":[]}
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- export var StatsReport = /*#__PURE__*/function (StatsReport) {
17
+ export let StatsReport = /*#__PURE__*/function (StatsReport) {
18
18
  StatsReport["CONNECTION_STATS"] = "StatsReport.connection_stats";
19
19
  StatsReport["CALL_FEED_REPORT"] = "StatsReport.call_feed_report";
20
20
  StatsReport["BYTE_SENT_STATS"] = "StatsReport.byte_sent_stats";
@@ -1 +1 @@
1
- {"version":3,"file":"statsReport.js","names":["StatsReport"],"sources":["../../../src/webrtc/stats/statsReport.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type ConnectionStatsBandwidth, type ConnectionStatsBitrate, type PacketLoss } from \"./connectionStats.ts\";\nimport { type TransportStats } from \"./transportStats.ts\";\nimport { type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport enum StatsReport {\n CONNECTION_STATS = \"StatsReport.connection_stats\",\n CALL_FEED_REPORT = \"StatsReport.call_feed_report\",\n BYTE_SENT_STATS = \"StatsReport.byte_sent_stats\",\n SUMMARY_STATS = \"StatsReport.summary_stats\",\n}\n\n/// ByteSentStatsReport ################################################################################################\nexport interface ByteSentStatsReport extends Map<TrackID, ByteSend> {\n callId?: string;\n opponentMemberId?: string;\n // is a map: `local trackID` => byte send\n}\n\nexport type TrackID = string;\nexport type ByteSend = number;\n\n/// ConnectionStatsReport ##############################################################################################\nexport interface ConnectionStatsReport {\n callId?: string;\n opponentMemberId?: string;\n bandwidth: ConnectionStatsBandwidth;\n bitrate: ConnectionStatsBitrate;\n packetLoss: PacketLoss;\n audioConcealment: Map<TrackID, AudioConcealment>;\n totalAudioConcealment: AudioConcealment;\n resolution: ResolutionMap;\n framerate: FramerateMap;\n codec: CodecMap;\n jitter: Map<TrackID, number>;\n transport: TransportStats[];\n}\n\nexport interface AudioConcealment {\n concealedAudio: number;\n totalAudioDuration: number;\n}\n\nexport interface ResolutionMap {\n local: Map<TrackID, Resolution>;\n remote: Map<TrackID, Resolution>;\n}\n\nexport interface FramerateMap {\n local: Map<TrackID, number>;\n remote: Map<TrackID, number>;\n}\n\nexport interface CodecMap {\n local: Map<TrackID, string>;\n remote: Map<TrackID, string>;\n}\n\n/// SummaryStatsReport #################################################################################################\nexport interface SummaryStatsReport {\n /**\n * Aggregated the information for percentage of received media\n *\n * This measure whether the current user receive data from a call participants.\n * As soon as a participant sends at least a byte media to this user, this counts as one measurement unit.\n * The units of measure divided by the total number of participants is a value between 0 and 1.\n */\n percentageReceivedMedia: number;\n percentageReceivedAudioMedia: number;\n percentageReceivedVideoMedia: number;\n maxJitter: number;\n maxPacketLoss: number;\n percentageConcealedAudio: number;\n peerConnections: number;\n opponentUsersInCall?: number;\n opponentDevicesInCall?: number;\n diffDevicesToPeerConnections?: number;\n ratioPeerConnectionToDevices?: number;\n // Todo: Decide if we want an index (or a timestamp) of this report in relation to the group call, to help differenciate when issues occur and ignore/track initial connection delays.\n}\n\n/// CallFeedReport #####################################################################################################\nexport interface CallFeedReport {\n callId: string;\n opponentMemberId: string;\n transceiver: TransceiverStats[];\n callFeeds: CallFeedStats[];\n}\n\nexport interface CallFeedStats {\n stream: string;\n type: \"remote\" | \"local\";\n audio: TrackStats | null;\n video: TrackStats | null;\n purpose: string;\n prefix: string;\n isVideoMuted: boolean;\n isAudioMuted: boolean;\n}\n\nexport interface TransceiverStats {\n readonly mid: string;\n readonly sender: TrackStats | null;\n readonly receiver: TrackStats | null;\n readonly direction: string;\n readonly currentDirection: string;\n}\n\nexport interface TrackStats {\n readonly id: string;\n readonly kind: \"audio\" | \"video\";\n readonly settingDeviceId: string;\n readonly constrainDeviceId: string;\n readonly muted: boolean;\n readonly enabled: boolean;\n readonly readyState: \"ended\" | \"live\";\n readonly label: string;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,WAAYA,WAAW,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;;AAOvB;;AAUA;;AAoCA;;AAuBA","ignoreList":[]}
1
+ {"version":3,"file":"statsReport.js","names":[],"sources":["../../../src/webrtc/stats/statsReport.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { type ConnectionStatsBandwidth, type ConnectionStatsBitrate, type PacketLoss } from \"./connectionStats.ts\";\nimport { type TransportStats } from \"./transportStats.ts\";\nimport { type Resolution } from \"./media/mediaTrackStats.ts\";\n\nexport enum StatsReport {\n CONNECTION_STATS = \"StatsReport.connection_stats\",\n CALL_FEED_REPORT = \"StatsReport.call_feed_report\",\n BYTE_SENT_STATS = \"StatsReport.byte_sent_stats\",\n SUMMARY_STATS = \"StatsReport.summary_stats\",\n}\n\n/// ByteSentStatsReport ################################################################################################\nexport interface ByteSentStatsReport extends Map<TrackID, ByteSend> {\n callId?: string;\n opponentMemberId?: string;\n // is a map: `local trackID` => byte send\n}\n\nexport type TrackID = string;\nexport type ByteSend = number;\n\n/// ConnectionStatsReport ##############################################################################################\nexport interface ConnectionStatsReport {\n callId?: string;\n opponentMemberId?: string;\n bandwidth: ConnectionStatsBandwidth;\n bitrate: ConnectionStatsBitrate;\n packetLoss: PacketLoss;\n audioConcealment: Map<TrackID, AudioConcealment>;\n totalAudioConcealment: AudioConcealment;\n resolution: ResolutionMap;\n framerate: FramerateMap;\n codec: CodecMap;\n jitter: Map<TrackID, number>;\n transport: TransportStats[];\n}\n\nexport interface AudioConcealment {\n concealedAudio: number;\n totalAudioDuration: number;\n}\n\nexport interface ResolutionMap {\n local: Map<TrackID, Resolution>;\n remote: Map<TrackID, Resolution>;\n}\n\nexport interface FramerateMap {\n local: Map<TrackID, number>;\n remote: Map<TrackID, number>;\n}\n\nexport interface CodecMap {\n local: Map<TrackID, string>;\n remote: Map<TrackID, string>;\n}\n\n/// SummaryStatsReport #################################################################################################\nexport interface SummaryStatsReport {\n /**\n * Aggregated the information for percentage of received media\n *\n * This measure whether the current user receive data from a call participants.\n * As soon as a participant sends at least a byte media to this user, this counts as one measurement unit.\n * The units of measure divided by the total number of participants is a value between 0 and 1.\n */\n percentageReceivedMedia: number;\n percentageReceivedAudioMedia: number;\n percentageReceivedVideoMedia: number;\n maxJitter: number;\n maxPacketLoss: number;\n percentageConcealedAudio: number;\n peerConnections: number;\n opponentUsersInCall?: number;\n opponentDevicesInCall?: number;\n diffDevicesToPeerConnections?: number;\n ratioPeerConnectionToDevices?: number;\n // Todo: Decide if we want an index (or a timestamp) of this report in relation to the group call, to help differenciate when issues occur and ignore/track initial connection delays.\n}\n\n/// CallFeedReport #####################################################################################################\nexport interface CallFeedReport {\n callId: string;\n opponentMemberId: string;\n transceiver: TransceiverStats[];\n callFeeds: CallFeedStats[];\n}\n\nexport interface CallFeedStats {\n stream: string;\n type: \"remote\" | \"local\";\n audio: TrackStats | null;\n video: TrackStats | null;\n purpose: string;\n prefix: string;\n isVideoMuted: boolean;\n isAudioMuted: boolean;\n}\n\nexport interface TransceiverStats {\n readonly mid: string;\n readonly sender: TrackStats | null;\n readonly receiver: TrackStats | null;\n readonly direction: string;\n readonly currentDirection: string;\n}\n\nexport interface TrackStats {\n readonly id: string;\n readonly kind: \"audio\" | \"video\";\n readonly settingDeviceId: string;\n readonly constrainDeviceId: string;\n readonly muted: boolean;\n readonly enabled: boolean;\n readonly readyState: \"ended\" | \"live\";\n readonly label: string;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA,WAAY,WAAW,0BAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAX,WAAW;EAAA,OAAX,WAAW;AAAA;;AAOvB;;AAUA;;AAoCA;;AAuBA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"statsReportEmitter.js","names":["TypedEventEmitter","StatsReport","StatsReportEmitter","emitByteSendReport","byteSentStats","emit","BYTE_SENT_STATS","emitConnectionStatsReport","report","CONNECTION_STATS","emitCallFeedReport","CALL_FEED_REPORT","emitSummaryStatsReport","SUMMARY_STATS"],"sources":["../../../src/webrtc/stats/statsReportEmitter.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { TypedEventEmitter } from \"../../models/typed-event-emitter.ts\";\nimport {\n type ByteSentStatsReport,\n type CallFeedReport,\n type ConnectionStatsReport,\n StatsReport,\n type SummaryStatsReport,\n} from \"./statsReport.ts\";\n\nexport type StatsReportHandlerMap = {\n [StatsReport.BYTE_SENT_STATS]: (report: ByteSentStatsReport) => void;\n [StatsReport.CONNECTION_STATS]: (report: ConnectionStatsReport) => void;\n [StatsReport.CALL_FEED_REPORT]: (report: CallFeedReport) => void;\n [StatsReport.SUMMARY_STATS]: (report: SummaryStatsReport) => void;\n};\n\nexport class StatsReportEmitter extends TypedEventEmitter<StatsReport, StatsReportHandlerMap> {\n public emitByteSendReport(byteSentStats: ByteSentStatsReport): void {\n this.emit(StatsReport.BYTE_SENT_STATS, byteSentStats);\n }\n\n public emitConnectionStatsReport(report: ConnectionStatsReport): void {\n this.emit(StatsReport.CONNECTION_STATS, report);\n }\n\n public emitCallFeedReport(report: CallFeedReport): void {\n this.emit(StatsReport.CALL_FEED_REPORT, report);\n }\n\n public emitSummaryStatsReport(report: SummaryStatsReport): void {\n this.emit(StatsReport.SUMMARY_STATS, report);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,qCAAqC;AACvE,SAIIC,WAAW,QAER,kBAAkB;AASzB,OAAO,MAAMC,kBAAkB,SAASF,iBAAiB,CAAqC;EACnFG,kBAAkBA,CAACC,aAAkC,EAAQ;IAChE,IAAI,CAACC,IAAI,CAACJ,WAAW,CAACK,eAAe,EAAEF,aAAa,CAAC;EACzD;EAEOG,yBAAyBA,CAACC,MAA6B,EAAQ;IAClE,IAAI,CAACH,IAAI,CAACJ,WAAW,CAACQ,gBAAgB,EAAED,MAAM,CAAC;EACnD;EAEOE,kBAAkBA,CAACF,MAAsB,EAAQ;IACpD,IAAI,CAACH,IAAI,CAACJ,WAAW,CAACU,gBAAgB,EAAEH,MAAM,CAAC;EACnD;EAEOI,sBAAsBA,CAACJ,MAA0B,EAAQ;IAC5D,IAAI,CAACH,IAAI,CAACJ,WAAW,CAACY,aAAa,EAAEL,MAAM,CAAC;EAChD;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"statsReportEmitter.js","names":[],"sources":["../../../src/webrtc/stats/statsReportEmitter.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { TypedEventEmitter } from \"../../models/typed-event-emitter.ts\";\nimport {\n type ByteSentStatsReport,\n type CallFeedReport,\n type ConnectionStatsReport,\n StatsReport,\n type SummaryStatsReport,\n} from \"./statsReport.ts\";\n\nexport type StatsReportHandlerMap = {\n [StatsReport.BYTE_SENT_STATS]: (report: ByteSentStatsReport) => void;\n [StatsReport.CONNECTION_STATS]: (report: ConnectionStatsReport) => void;\n [StatsReport.CALL_FEED_REPORT]: (report: CallFeedReport) => void;\n [StatsReport.SUMMARY_STATS]: (report: SummaryStatsReport) => void;\n};\n\nexport class StatsReportEmitter extends TypedEventEmitter<StatsReport, StatsReportHandlerMap> {\n public emitByteSendReport(byteSentStats: ByteSentStatsReport): void {\n this.emit(StatsReport.BYTE_SENT_STATS, byteSentStats);\n }\n\n public emitConnectionStatsReport(report: ConnectionStatsReport): void {\n this.emit(StatsReport.CONNECTION_STATS, report);\n }\n\n public emitCallFeedReport(report: CallFeedReport): void {\n this.emit(StatsReport.CALL_FEED_REPORT, report);\n }\n\n public emitSummaryStatsReport(report: SummaryStatsReport): void {\n this.emit(StatsReport.SUMMARY_STATS, report);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,iBAAiB,QAAQ,qCAAqC;AACvE,SAII,WAAW,QAER,kBAAkB;AASzB,OAAO,MAAM,kBAAkB,SAAS,iBAAiB,CAAqC;EACnF,kBAAkB,CAAC,aAAkC,EAAQ;IAChE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC;EACzD;EAEO,yBAAyB,CAAC,MAA6B,EAAQ;IAClE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;EACnD;EAEO,kBAAkB,CAAC,MAAsB,EAAQ;IACpD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC;EACnD;EAEO,sBAAsB,CAAC,MAA0B,EAAQ;IAC5D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC;EAChD;AACJ","ignoreList":[]}
@@ -19,30 +19,30 @@ export class SummaryStatsReportGatherer {
19
19
  // Filter all stats which collect the first time webrtc stats.
20
20
  // Because stats based on time interval and the first collection of a summery stats has no previous
21
21
  // webrtcStats as basement all the calculation are 0. We don't want track the 0 stats.
22
- var summary = allSummary.filter(s => !s.isFirstCollection);
23
- var summaryTotalCount = summary.length;
22
+ const summary = allSummary.filter(s => !s.isFirstCollection);
23
+ const summaryTotalCount = summary.length;
24
24
  // For counting the peer connections we also want to consider the ignored summaries
25
- var peerConnectionsCount = allSummary.length;
25
+ const peerConnectionsCount = allSummary.length;
26
26
  if (summaryTotalCount === 0) {
27
27
  return;
28
28
  }
29
- var summaryCounter = {
29
+ const summaryCounter = {
30
30
  receivedAudio: 0,
31
31
  receivedVideo: 0,
32
32
  receivedMedia: 0,
33
33
  concealedAudio: 0,
34
34
  totalAudio: 0
35
35
  };
36
- var maxJitter = 0;
37
- var maxPacketLoss = 0;
36
+ let maxJitter = 0;
37
+ let maxPacketLoss = 0;
38
38
  summary.forEach(stats => {
39
39
  this.countTrackListReceivedMedia(summaryCounter, stats);
40
40
  this.countConcealedAudio(summaryCounter, stats);
41
41
  maxJitter = this.buildMaxJitter(maxJitter, stats);
42
42
  maxPacketLoss = this.buildMaxPacketLoss(maxPacketLoss, stats);
43
43
  });
44
- var decimalPlaces = 5;
45
- var report = {
44
+ const decimalPlaces = 5;
45
+ const report = {
46
46
  percentageReceivedMedia: Number((summaryCounter.receivedMedia / summaryTotalCount).toFixed(decimalPlaces)),
47
47
  percentageReceivedVideoMedia: Number((summaryCounter.receivedVideo / summaryTotalCount).toFixed(decimalPlaces)),
48
48
  percentageReceivedAudioMedia: Number((summaryCounter.receivedAudio / summaryTotalCount).toFixed(decimalPlaces)),
@@ -57,11 +57,11 @@ export class SummaryStatsReportGatherer {
57
57
  // Calculate the actual number of devices based on the participants state event
58
58
  // (this is used, to compare the expected participant count from the room state with the acutal peer connections)
59
59
  // const devices = callParticipants.()
60
- var devices = [];
61
- var users = [];
62
- for (var userEntry of callParticipants) {
60
+ const devices = [];
61
+ const users = [];
62
+ for (const userEntry of callParticipants) {
63
63
  users.push(userEntry);
64
- for (var device of userEntry[1]) {
64
+ for (const device of userEntry[1]) {
65
65
  devices.push(device);
66
66
  }
67
67
  }
@@ -71,8 +71,8 @@ export class SummaryStatsReportGatherer {
71
71
  report.ratioPeerConnectionToDevices = Math.max(0, devices.length - 1) == 0 ? 0 : report.peerConnections / (devices.length - 1);
72
72
  }
73
73
  countTrackListReceivedMedia(counter, stats) {
74
- var hasReceivedAudio = false;
75
- var hasReceivedVideo = false;
74
+ let hasReceivedAudio = false;
75
+ let hasReceivedVideo = false;
76
76
  if (stats.receivedAudioMedia > 0 || stats.audioTrackSummary.count === 0) {
77
77
  counter.receivedAudio++;
78
78
  hasReceivedAudio = true;