@stream-io/video-react-sdk 2.0.0-beta.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/css/embedded.css +2592 -1498
  3. package/dist/css/embedded.css.map +1 -1
  4. package/dist/css/styles.css +2388 -1222
  5. package/dist/css/styles.css.map +1 -1
  6. package/dist/embedded.cjs.js +535 -476
  7. package/dist/embedded.cjs.js.map +1 -1
  8. package/dist/esm/index.js +10 -7
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/src/components/Avatar/Avatar.js +13 -5
  11. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -1
  12. package/dist/esm/src/components/Badge/Badge.js +21 -0
  13. package/dist/esm/src/components/Badge/Badge.js.map +1 -0
  14. package/dist/esm/src/components/Button/Button.js +10 -0
  15. package/dist/esm/src/components/Button/Button.js.map +1 -0
  16. package/dist/esm/src/components/Button/CompositeButton.js +10 -17
  17. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -1
  18. package/dist/esm/src/components/Button/IconButton.js +3 -9
  19. package/dist/esm/src/components/Button/IconButton.js.map +1 -1
  20. package/dist/esm/src/components/CallControls/AcceptCallButton.js +3 -2
  21. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -1
  22. package/dist/esm/src/components/CallControls/CallControls.js +3 -0
  23. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -1
  24. package/dist/esm/src/components/CallControls/CancelCallButton.js +11 -6
  25. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -1
  26. package/dist/esm/src/components/CallControls/ReactionsButton.js +7 -3
  27. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -1
  28. package/dist/esm/src/components/CallControls/RecordCallButton.js +17 -11
  29. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -1
  30. package/dist/esm/src/components/CallControls/ScreenShareButton.js +11 -4
  31. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -1
  32. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +28 -17
  33. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -1
  34. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +9 -4
  35. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -1
  36. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +32 -23
  37. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -1
  38. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +3 -3
  39. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -1
  40. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +8 -3
  41. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -1
  42. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +20 -7
  43. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
  44. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +8 -5
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -1
  46. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +5 -2
  47. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -1
  48. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +7 -3
  49. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -1
  50. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +1 -1
  51. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -1
  52. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +1 -1
  53. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -1
  54. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +2 -2
  55. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -1
  56. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +8 -5
  57. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -1
  58. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +10 -4
  59. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -1
  60. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +1 -1
  61. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -1
  62. package/dist/esm/src/components/Menu/GenericMenu.js +2 -1
  63. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -1
  64. package/dist/esm/src/components/Menu/MenuToggle.js +3 -0
  65. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -1
  66. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +6 -3
  67. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -1
  68. package/dist/esm/src/components/Notification/Notification.js +12 -3
  69. package/dist/esm/src/components/Notification/Notification.js.map +1 -1
  70. package/dist/esm/src/components/Notification/PermissionNotification.js +2 -2
  71. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -1
  72. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +7 -3
  73. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -1
  74. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +7 -2
  75. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -1
  76. package/dist/esm/src/components/Permissions/PermissionRequests.js +13 -12
  77. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -1
  78. package/dist/esm/src/components/RingingCall/RingingCall.js +38 -14
  79. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -1
  80. package/dist/esm/src/components/RingingCall/RingingCallControls.js +7 -3
  81. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -1
  82. package/dist/esm/src/components/Search/SearchInput.js +1 -1
  83. package/dist/esm/src/components/Search/SearchInput.js.map +1 -1
  84. package/dist/esm/src/components/StreamTheme/StreamTheme.js +2 -2
  85. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -1
  86. package/dist/esm/src/components/Tooltip/Tooltip.js +8 -8
  87. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -1
  88. package/dist/esm/src/components/VideoPreview/VideoPreview.js +36 -5
  89. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -1
  90. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +38 -12
  91. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -1
  92. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +9 -5
  93. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -1
  94. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +9 -6
  95. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -1
  96. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +9 -6
  97. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -1
  98. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +11 -6
  99. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -1
  100. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js +25 -0
  101. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js.map +1 -0
  102. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +17 -13
  103. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
  104. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +13 -8
  105. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -1
  106. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +24 -3
  107. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -1
  108. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +3 -13
  109. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -1
  110. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +4 -2
  111. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -1
  112. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +4 -2
  113. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -1
  114. package/dist/esm/src/embedded/EmbeddedClientProvider.js +7 -4
  115. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -1
  116. package/dist/esm/src/embedded/call/CallControls.js +10 -6
  117. package/dist/esm/src/embedded/call/CallControls.js.map +1 -1
  118. package/dist/esm/src/embedded/call/CallHeader.js +10 -7
  119. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -1
  120. package/dist/esm/src/embedded/call/CallLayout.js +8 -5
  121. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -1
  122. package/dist/esm/src/embedded/call/CallStateRouter.js +7 -4
  123. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -1
  124. package/dist/esm/src/embedded/hooks/useLayout.js +7 -4
  125. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -1
  126. package/dist/esm/src/embedded/livestream/host/HostLayout.js +12 -7
  127. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -1
  128. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +12 -7
  129. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -1
  130. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +9 -6
  131. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -1
  132. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +12 -9
  133. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -1
  134. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +7 -4
  135. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -1
  136. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +13 -9
  137. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -1
  138. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js +40 -0
  139. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js.map +1 -0
  140. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +8 -6
  141. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -1
  142. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +26 -2
  143. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -1
  144. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +12 -6
  145. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -1
  146. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +8 -6
  147. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -1
  148. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +15 -14
  149. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -1
  150. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +4 -0
  151. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -1
  152. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +8 -6
  153. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -1
  154. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +11 -7
  155. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -1
  156. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +6 -4
  157. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -1
  158. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +10 -9
  159. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -1
  160. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +6 -4
  161. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -1
  162. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +8 -6
  163. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -1
  164. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +11 -9
  165. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -1
  166. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +6 -4
  167. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -1
  168. package/dist/esm/src/hooks/useDeviceList.js +4 -2
  169. package/dist/esm/src/hooks/useDeviceList.js.map +1 -1
  170. package/dist/esm/src/i18n/Streami18n.js +58 -0
  171. package/dist/esm/src/i18n/Streami18n.js.map +1 -0
  172. package/dist/esm/src/i18n/TranslationContext.js +42 -0
  173. package/dist/esm/src/i18n/TranslationContext.js.map +1 -0
  174. package/dist/esm/src/i18n/runtimeDefaults.js +20 -0
  175. package/dist/esm/src/i18n/runtimeDefaults.js.map +1 -0
  176. package/dist/esm/src/i18n/useStreami18n.js +49 -0
  177. package/dist/esm/src/i18n/useStreami18n.js.map +1 -0
  178. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +4 -0
  179. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  180. package/dist/index.cjs.js +559 -623
  181. package/dist/index.cjs.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/src/components/Avatar/Avatar.d.ts +9 -4
  184. package/dist/src/components/Badge/Badge.d.ts +23 -0
  185. package/dist/src/components/Badge/index.d.ts +1 -0
  186. package/dist/src/components/Button/Button.d.ts +16 -0
  187. package/dist/src/components/Button/CompositeButton.d.ts +6 -3
  188. package/dist/src/components/Button/IconButton.d.ts +7 -7
  189. package/dist/src/components/Button/index.d.ts +2 -2
  190. package/dist/src/components/CallControls/CancelCallButton.d.ts +3 -1
  191. package/dist/src/components/CallControls/ToggleAudioButton.d.ts +3 -3
  192. package/dist/src/components/CallControls/ToggleAudioOutputButton.d.ts +2 -2
  193. package/dist/src/components/CallControls/ToggleVideoButton.d.ts +3 -3
  194. package/dist/src/components/CallControls/index.d.ts +0 -1
  195. package/dist/src/components/Menu/GenericMenu.d.ts +1 -0
  196. package/dist/src/components/Notification/Notification.d.ts +2 -1
  197. package/dist/src/components/StreamTheme/StreamTheme.d.ts +2 -1
  198. package/dist/src/components/VideoPreview/VideoPreview.d.ts +6 -1
  199. package/dist/src/components/index.d.ts +1 -1
  200. package/dist/src/core/components/ParticipantView/ConnectionQualityIndicator.d.ts +10 -0
  201. package/dist/src/core/components/ParticipantView/index.d.ts +1 -0
  202. package/dist/src/core/components/StreamVideo/StreamVideo.d.ts +18 -2
  203. package/dist/src/embedded/shared/CallDuration/CallDuration.d.ts +9 -0
  204. package/dist/src/embedded/shared/index.d.ts +1 -0
  205. package/dist/src/i18n/Streami18n.d.ts +56 -0
  206. package/dist/src/i18n/TranslationContext.d.ts +30 -0
  207. package/dist/src/i18n/index.d.ts +16 -0
  208. package/dist/src/i18n/keys.d.ts +164 -0
  209. package/dist/src/i18n/runtimeDefaults.d.ts +17 -0
  210. package/dist/src/i18n/types.d.ts +45 -0
  211. package/dist/src/i18n/useStreami18n.d.ts +19 -0
  212. package/index.ts +1 -1
  213. package/package.json +18 -13
  214. package/src/components/Avatar/Avatar.tsx +53 -19
  215. package/src/components/Badge/Badge.tsx +48 -0
  216. package/src/components/Badge/index.ts +1 -0
  217. package/src/components/Button/Button.tsx +49 -0
  218. package/src/components/Button/CompositeButton.tsx +82 -73
  219. package/src/components/Button/IconButton.tsx +19 -29
  220. package/src/components/Button/index.ts +2 -2
  221. package/src/components/CallControls/AcceptCallButton.tsx +3 -1
  222. package/src/components/CallControls/CancelCallButton.tsx +32 -24
  223. package/src/components/CallControls/ReactionsButton.tsx +7 -3
  224. package/src/components/CallControls/RecordCallButton.tsx +50 -23
  225. package/src/components/CallControls/ScreenShareButton.tsx +27 -6
  226. package/src/components/CallControls/ToggleAudioButton.tsx +62 -61
  227. package/src/components/CallControls/ToggleAudioOutputButton.tsx +7 -4
  228. package/src/components/CallControls/ToggleVideoButton.tsx +66 -66
  229. package/src/components/CallControls/index.ts +0 -1
  230. package/src/components/CallParticipantsList/BlockedUserListing.tsx +9 -2
  231. package/src/components/CallParticipantsList/CallParticipantListHeader.tsx +10 -3
  232. package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +33 -8
  233. package/src/components/CallParticipantsList/CallParticipantsList.tsx +21 -5
  234. package/src/components/CallParticipantsList/EmptyParticipantSearchList.tsx +2 -2
  235. package/src/components/CallRecordingList/CallRecordingListHeader.tsx +11 -3
  236. package/src/components/DeviceSettings/DeviceAudioPreviewItem.tsx +3 -1
  237. package/src/components/DeviceSettings/DeviceSelector.tsx +1 -1
  238. package/src/components/DeviceSettings/DeviceSelectorAudio.tsx +2 -7
  239. package/src/components/DeviceSettings/DeviceSettings.tsx +14 -5
  240. package/src/components/DeviceSettings/SpeakerTest.tsx +7 -2
  241. package/src/components/DropdownSelect/DropdownSelect.tsx +3 -1
  242. package/src/components/Menu/GenericMenu.tsx +4 -0
  243. package/src/components/Notification/MicCaptureErrorNotification.tsx +7 -2
  244. package/src/components/Notification/Notification.tsx +20 -4
  245. package/src/components/Notification/PermissionNotification.tsx +2 -0
  246. package/src/components/Notification/RecordingInProgressNotification.tsx +5 -6
  247. package/src/components/Notification/SpeakingWhileMutedNotification.tsx +8 -2
  248. package/src/components/Permissions/PermissionRequests.tsx +50 -43
  249. package/src/components/RingingCall/RingingCall.tsx +40 -14
  250. package/src/components/RingingCall/RingingCallControls.tsx +2 -1
  251. package/src/components/Search/SearchInput.tsx +2 -3
  252. package/src/components/StreamTheme/StreamTheme.tsx +3 -1
  253. package/src/components/Tooltip/Tooltip.tsx +3 -10
  254. package/src/components/VideoPreview/VideoPreview.tsx +50 -5
  255. package/src/components/index.ts +1 -1
  256. package/src/core/components/CallLayout/LivestreamLayout.tsx +48 -18
  257. package/src/core/components/CallLayout/PaginatedGridLayout.tsx +14 -0
  258. package/src/core/components/CallLayout/PipLayout/Grid.tsx +10 -2
  259. package/src/core/components/CallLayout/PipLayout/Pip.tsx +6 -2
  260. package/src/core/components/CallLayout/SpeakerLayout.tsx +27 -0
  261. package/src/core/components/CallLayout/partcipantFilter.test.ts +38 -31
  262. package/src/core/components/ParticipantView/ConnectionQualityIndicator.tsx +54 -0
  263. package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +60 -27
  264. package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +63 -22
  265. package/src/core/components/ParticipantView/index.ts +1 -0
  266. package/src/core/components/StreamVideo/StreamVideo.tsx +39 -4
  267. package/src/core/components/Video/BaseVideoPlaceholder.tsx +13 -30
  268. package/src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx +5 -2
  269. package/src/core/components/Video/DefaultVideoPlaceholder.tsx +2 -2
  270. package/src/embedded/call/CallControls.tsx +9 -18
  271. package/src/embedded/call/CallHeader.tsx +3 -12
  272. package/src/embedded/call/CallLayout.tsx +1 -1
  273. package/src/embedded/livestream/host/HostLayout.tsx +26 -20
  274. package/src/embedded/livestream/host/HostStateRouter.tsx +12 -8
  275. package/src/embedded/livestream/viewer/ViewerLayout.tsx +8 -11
  276. package/src/embedded/livestream/viewer/ViewerLobby.tsx +31 -15
  277. package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +18 -12
  278. package/src/embedded/shared/CallDuration/CallDuration.tsx +32 -0
  279. package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +27 -13
  280. package/src/embedded/shared/CallFeedback/RatingScreen.tsx +20 -12
  281. package/src/embedded/shared/CallFeedback/StarRating.tsx +10 -3
  282. package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +6 -3
  283. package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +21 -14
  284. package/src/embedded/shared/JoinError/JoinError.tsx +7 -6
  285. package/src/embedded/shared/Lobby/DeviceControls.tsx +25 -3
  286. package/src/embedded/shared/Lobby/Lobby.tsx +19 -22
  287. package/src/embedded/shared/Lobby/ToggleMicButton.tsx +10 -3
  288. package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +4 -2
  289. package/src/embedded/shared/index.ts +1 -0
  290. package/src/hooks/useDeviceList.tsx +2 -2
  291. package/src/i18n/Streami18n.ts +67 -0
  292. package/src/i18n/TranslationContext.tsx +55 -0
  293. package/src/i18n/index.ts +22 -0
  294. package/src/i18n/keys.ts +169 -0
  295. package/src/i18n/runtimeDefaults.ts +17 -0
  296. package/src/i18n/types.ts +78 -0
  297. package/src/i18n/useStreami18n.ts +66 -0
  298. package/src/utilities/filter.test.ts +132 -124
  299. package/src/utilities/normalizeString.test.ts +50 -48
  300. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +0 -59
  301. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +0 -1
  302. package/dist/esm/src/components/Button/TextButton.js +0 -8
  303. package/dist/esm/src/components/Button/TextButton.js.map +0 -1
  304. package/dist/esm/src/components/CallControls/CallStatsButton.js +0 -18
  305. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +0 -1
  306. package/dist/esm/src/components/CallStats/CallStats.js +0 -180
  307. package/dist/esm/src/components/CallStats/CallStats.js.map +0 -1
  308. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js +0 -57
  309. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +0 -1
  310. package/dist/esm/src/translations/en.json.js +0 -177
  311. package/dist/esm/src/translations/en.json.js.map +0 -1
  312. package/dist/esm/src/translations/index.js +0 -6
  313. package/dist/esm/src/translations/index.js.map +0 -1
  314. package/dist/latency-chart-CpL1M_s0.cjs.js +0 -59
  315. package/dist/latency-chart-CpL1M_s0.cjs.js.map +0 -1
  316. package/dist/src/components/Button/TextButton.d.ts +0 -2
  317. package/dist/src/components/CallControls/CallStatsButton.d.ts +0 -4
  318. package/dist/src/components/CallStats/CallStats.d.ts +0 -22
  319. package/dist/src/components/CallStats/CallStatsLatencyChart.d.ts +0 -7
  320. package/dist/src/components/CallStats/index.d.ts +0 -1
  321. package/dist/src/translations/index.d.ts +0 -146
  322. package/src/components/Button/TextButton.tsx +0 -12
  323. package/src/components/CallControls/CallStatsButton.tsx +0 -37
  324. package/src/components/CallStats/CallStats.tsx +0 -439
  325. package/src/components/CallStats/CallStatsLatencyChart.tsx +0 -76
  326. package/src/components/CallStats/index.ts +0 -1
  327. package/src/translations/en.json +0 -154
  328. package/src/translations/index.ts +0 -3
@@ -1,146 +0,0 @@
1
- export declare const translations: {
2
- en: {
3
- Joining: string;
4
- Mic: string;
5
- "No internet connection": string;
6
- "Re-connecting": string;
7
- Ringing: string;
8
- "Screen Share": string;
9
- "Select a Camera": string;
10
- "Select a Mic": string;
11
- "Select Speakers": string;
12
- Speakers: string;
13
- Video: string;
14
- "You are muted. Unmute to speak.": string;
15
- "Background filters performance is degraded. Consider disabling filters for better performance.": string;
16
- Live: string;
17
- "Livestream starts soon": string;
18
- "Livestream starts at {{ time }}": string;
19
- "{{ count }} participants joined early_one": string;
20
- "{{ count }} participants joined early_other": string;
21
- "You can now speak.": string;
22
- "Awaiting for an approval to speak.": string;
23
- "You can no longer speak.": string;
24
- "You can now share your video.": string;
25
- "Awaiting for an approval to share your video.": string;
26
- "You can no longer share your video.": string;
27
- "Waiting for recording to stop...": string;
28
- "Waiting for recording to start...": string;
29
- "Record call": string;
30
- Reactions: string;
31
- Statistics: string;
32
- "You can now share your screen.": string;
33
- "Awaiting for an approval to share screen.": string;
34
- "You can no longer share your screen.": string;
35
- "Share screen": string;
36
- "Incoming Call...": string;
37
- "Calling...": string;
38
- "Mute All": string;
39
- Invite: string;
40
- Join: string;
41
- You: string;
42
- Me: string;
43
- Unknown: string;
44
- "Toggle device menu": string;
45
- Default: string;
46
- "Call Recordings": string;
47
- Refresh: string;
48
- "Check your browser video permissions": string;
49
- "Video publishing is disabled by the system": string;
50
- "You have no permission to share your video": string;
51
- "You have no permission to share your audio": string;
52
- "You are presenting your screen": string;
53
- "Stop Screen Sharing": string;
54
- "Audio is blocked by your system": string;
55
- "Click or tap to play audio": string;
56
- Allow: string;
57
- Revoke: string;
58
- Dismiss: string;
59
- "Microphone on": string;
60
- "Microphone off": string;
61
- "Microphone is paused by your system": string;
62
- "Camera on": string;
63
- "Camera off": string;
64
- "Camera is paused by your system": string;
65
- "No camera found": string;
66
- "Video is disabled": string;
67
- Pinned: string;
68
- Unpin: string;
69
- Pin: string;
70
- "Pin for everyone": string;
71
- "Unpin for everyone": string;
72
- Block: string;
73
- Kick: string;
74
- "Turn off video": string;
75
- "Turn off screen share": string;
76
- "Mute audio": string;
77
- "Mute screen share audio": string;
78
- "Allow audio": string;
79
- "Allow video": string;
80
- "Allow screen sharing": string;
81
- "Disable audio": string;
82
- "Disable video": string;
83
- "Disable screen sharing": string;
84
- Enter: string;
85
- Leave: string;
86
- "Leave call": string;
87
- "End call for all": string;
88
- "{{ direction }} fullscreen": string;
89
- "{{ direction }} picture-in-picture": string;
90
- "Dominant Speaker": string;
91
- "Poor connection quality": string;
92
- "Video paused due to insufficient bandwidth": string;
93
- "Audio is connecting...": string;
94
- "Video is connecting...": string;
95
- Participants: string;
96
- Anonymous: string;
97
- "No participants found": string;
98
- "Participants ({{ numberOfParticipants }})": string;
99
- "{{ userName }} is sharing their screen": string;
100
- "{{ userName }} is requesting to speak": string;
101
- "{{ userName }} is requesting to share their camera": string;
102
- "{{ userName }} is requesting to present their screen": string;
103
- "{{ userName }} is requesting permission: {{ permission }}": string;
104
- "Applying...": string;
105
- "Disable blur": string;
106
- "Blur background": string;
107
- "Migrating...": string;
108
- "Reconnecting...": string;
109
- "You are offline. Check your internet connection.": string;
110
- "Failed to restore connection. Please try again.": string;
111
- "Failed to join. Please try again.": string;
112
- "Set up your call before joining": string;
113
- "Please grant your browser permission to access your camera and microphone.": string;
114
- "Start call": string;
115
- Speaker: string;
116
- Microphone: string;
117
- Backstage: string;
118
- "Go Live": string;
119
- "Stop Live": string;
120
- "Enter Backstage": string;
121
- "Prepare your livestream": string;
122
- "Ready to go live": string;
123
- "Stream is ready!": string;
124
- "Waiting for the livestream to start": string;
125
- "{{ count }} waiting": string;
126
- "Join Stream": string;
127
- "Join automatically when stream starts": string;
128
- "Display name": string;
129
- "Permission needed": string;
130
- "Call ended": string;
131
- "Rejoin call": string;
132
- "Left by mistake?": string;
133
- "Help us improve": string;
134
- "Leave feedback": string;
135
- "Failed to rejoin. Please try again.": string;
136
- "Share your feedback": string;
137
- "Tell us about your experience...": string;
138
- "Submit feedback": string;
139
- "Feedback message": string;
140
- "How was your call quality?": string;
141
- "Rate {{ count }} star_one": string;
142
- "Rate {{ count }} star_other": string;
143
- "Thank you!": string;
144
- "Your feedback helps improve call quality.": string;
145
- };
146
- };
@@ -1,12 +0,0 @@
1
- import { ComponentProps } from 'react';
2
-
3
- export const TextButton = ({
4
- children,
5
- ...rest
6
- }: Omit<ComponentProps<'button'>, 'ref' | 'className'>) => {
7
- return (
8
- <button {...rest} className="str-video__text-button">
9
- {children}
10
- </button>
11
- );
12
- };
@@ -1,37 +0,0 @@
1
- import { forwardRef } from 'react';
2
- import { useI18n } from '@stream-io/video-react-bindings';
3
-
4
- import { CallStats } from '../CallStats';
5
- import { CompositeButton } from '../Button/';
6
- import { MenuToggle, ToggleMenuButtonProps } from '../Menu';
7
- import { Icon } from '../Icon';
8
-
9
- export type CallStatsButtonProps = {
10
- caption?: string;
11
- };
12
-
13
- export const CallStatsButton = () => (
14
- <MenuToggle placement="top-end" ToggleButton={ToggleMenuButton}>
15
- <CallStats />
16
- </MenuToggle>
17
- );
18
-
19
- const ToggleMenuButton = forwardRef<
20
- HTMLDivElement,
21
- ToggleMenuButtonProps<HTMLDivElement> & CallStatsButtonProps
22
- >(function ToggleMenuButtonRender(props, ref) {
23
- const { t } = useI18n();
24
- const { caption, menuShown } = props;
25
-
26
- return (
27
- <CompositeButton
28
- ref={ref}
29
- active={menuShown}
30
- caption={caption}
31
- title={caption || t('Statistics')}
32
- data-testid="stats-button"
33
- >
34
- <Icon icon="stats" />
35
- </CompositeButton>
36
- );
37
- });
@@ -1,439 +0,0 @@
1
- import { lazy, ReactNode, Suspense, useEffect, useRef, useState } from 'react';
2
- import clsx from 'clsx';
3
- import {
4
- AggregatedStatsReport,
5
- CallStatsReport,
6
- SfuModels,
7
- } from '@stream-io/video-client';
8
- import { useCallStateHooks, useI18n } from '@stream-io/video-react-bindings';
9
- import { useFloating, useHover, useInteractions } from '@floating-ui/react';
10
- import { Icon } from '../Icon';
11
-
12
- const CallStatsLatencyChart = lazy(() => import('./CallStatsLatencyChart'));
13
-
14
- enum Status {
15
- GOOD = 'Good',
16
- OK = 'Ok',
17
- BAD = 'Bad',
18
- }
19
-
20
- export type CallStatsProps = {
21
- latencyLowBound?: number;
22
- latencyHighBound?: number;
23
- audioJitterLowBound?: number;
24
- audioJitterHighBound?: number;
25
- videoJitterLowBound?: number;
26
- videoJitterHighBound?: number;
27
- showCodecInfo?: boolean;
28
- LatencyChartSuspenseFallback?: ReactNode;
29
- };
30
-
31
- export const CallStats = (props: CallStatsProps) => {
32
- const {
33
- latencyLowBound = 75,
34
- latencyHighBound = 400,
35
- audioJitterLowBound = 10,
36
- audioJitterHighBound = 30,
37
- videoJitterLowBound = 20,
38
- videoJitterHighBound = 50,
39
- showCodecInfo = false,
40
- LatencyChartSuspenseFallback = null,
41
- } = props;
42
- const [latencyBuffer, setLatencyBuffer] = useState<
43
- Array<{ x: number; y: number }>
44
- >(() => {
45
- const now = Date.now();
46
- return Array.from({ length: 20 }, (_, i) => ({ x: now + i, y: 0 }));
47
- });
48
-
49
- const { t } = useI18n();
50
- const [publishBitrate, setPublishBitrate] = useState('-');
51
- const [subscribeBitrate, setSubscribeBitrate] = useState('-');
52
- const [publishAudioBitrate, setPublishAudioBitrate] = useState('-');
53
- const [subscribeAudioBitrate, setSubscribeAudioBitrate] = useState('-');
54
- const previousStats = useRef<CallStatsReport>(undefined);
55
- const { useCallStatsReport } = useCallStateHooks();
56
- const callStatsReport = useCallStatsReport();
57
-
58
- useEffect(() => {
59
- if (!callStatsReport) return;
60
- if (!previousStats.current) {
61
- previousStats.current = callStatsReport;
62
- return;
63
- }
64
- const previousCallStatsReport = previousStats.current;
65
- setPublishBitrate(() => {
66
- return calculatePublishBitrate(previousCallStatsReport, callStatsReport);
67
- });
68
- setSubscribeBitrate(() => {
69
- return calculateSubscribeBitrate(
70
- previousCallStatsReport,
71
- callStatsReport,
72
- );
73
- });
74
- setPublishAudioBitrate(() => {
75
- return calculatePublishAudioBitrate(
76
- previousCallStatsReport,
77
- callStatsReport,
78
- );
79
- });
80
- setSubscribeAudioBitrate(() => {
81
- return calculateSubscribeAudioBitrate(
82
- previousCallStatsReport,
83
- callStatsReport,
84
- );
85
- });
86
-
87
- setLatencyBuffer((latencyBuf) => {
88
- const newLatencyBuffer = latencyBuf.slice(-19);
89
- newLatencyBuffer.push({
90
- x: callStatsReport.timestamp,
91
- y:
92
- callStatsReport.publisherStats.averageRoundTripTimeInMs ||
93
- callStatsReport.publisherAudioStats.averageRoundTripTimeInMs,
94
- });
95
- return newLatencyBuffer;
96
- });
97
-
98
- previousStats.current = callStatsReport;
99
- }, [callStatsReport]);
100
-
101
- const latencyComparison = {
102
- lowBound: latencyLowBound,
103
- highBound: latencyHighBound,
104
- value: callStatsReport?.publisherStats.averageRoundTripTimeInMs || 0,
105
- };
106
-
107
- const audioJitterComparison = {
108
- lowBound: audioJitterLowBound,
109
- highBound: audioJitterHighBound,
110
- };
111
-
112
- const videoJitterComparison = {
113
- lowBound: videoJitterLowBound,
114
- highBound: videoJitterHighBound,
115
- };
116
-
117
- return (
118
- <div className="str-video__call-stats">
119
- {callStatsReport && (
120
- <>
121
- <div className="str-video__call-stats__header">
122
- <h3 className="str-video__call-stats__heading">
123
- <Icon
124
- className="str-video__call-stats__icon"
125
- icon="call-latency"
126
- />
127
- {t('Call Latency')}
128
- </h3>
129
- <p className="str-video__call-stats__description">
130
- {t(
131
- 'Very high latency values may reduce call quality, cause lag, and make the call less enjoyable.',
132
- )}
133
- </p>
134
- </div>
135
-
136
- <div className="str-video__call-stats__latencychart">
137
- <Suspense fallback={LatencyChartSuspenseFallback}>
138
- <CallStatsLatencyChart values={latencyBuffer} />
139
- </Suspense>
140
- </div>
141
-
142
- <div className="str-video__call-stats__header">
143
- <h3 className="str-video__call-stats__heading">
144
- <Icon
145
- className="str-video__call-stats__icon"
146
- icon="network-quality"
147
- />
148
- {t('Video performance')}
149
- </h3>
150
- <p className="str-video__call-stats__description">
151
- {t('Review the key data points below to assess call performance')}
152
- </p>
153
- </div>
154
-
155
- <div className="str-video__call-stats__card-container">
156
- <StatCard label={t('Region')} value={callStatsReport.datacenter} />
157
- <StatCard
158
- label={t('Latency')}
159
- value={`${callStatsReport.publisherStats.averageRoundTripTimeInMs} ms.`}
160
- comparison={latencyComparison}
161
- />
162
- <StatCard
163
- label={t('Receive jitter')}
164
- value={`${callStatsReport.subscriberStats.averageJitterInMs} ms.`}
165
- comparison={{
166
- ...videoJitterComparison,
167
- value: callStatsReport.subscriberStats.averageJitterInMs,
168
- }}
169
- />
170
- <StatCard
171
- label={t('Publish jitter')}
172
- value={`${callStatsReport.publisherStats.averageJitterInMs} ms.`}
173
- comparison={{
174
- ...videoJitterComparison,
175
- value: callStatsReport.publisherStats.averageJitterInMs,
176
- }}
177
- />
178
- <StatCard
179
- label={`${t('Publish resolution')}${showCodecInfo ? formatCodec(callStatsReport) : ''}`}
180
- value={toFrameSize(callStatsReport.publisherStats)}
181
- />
182
- <StatCard
183
- label={t('Publish quality drop reason')}
184
- value={callStatsReport.publisherStats.qualityLimitationReasons}
185
- />
186
- <StatCard
187
- label={t('Receiving resolution')}
188
- value={toFrameSize(callStatsReport.subscriberStats)}
189
- />
190
- <StatCard
191
- label={t('Receive quality drop reason')}
192
- value={callStatsReport.subscriberStats.qualityLimitationReasons}
193
- />
194
- <StatCard label={t('Publish bitrate')} value={publishBitrate} />
195
- <StatCard label={t('Receiving bitrate')} value={subscribeBitrate} />
196
- </div>
197
-
198
- <div className="str-video__call-stats__header">
199
- <h3 className="str-video__call-stats__heading">
200
- <Icon className="str-video__call-stats__icon" icon="mic" />
201
- {t('Audio Performance')}
202
- </h3>
203
- <p className="str-video__call-stats__description">
204
- {t(
205
- 'Review the key audio data points below to assess audio performance',
206
- )}
207
- </p>
208
- </div>
209
-
210
- <div className="str-video__call-stats__card-container">
211
- <StatCard
212
- label={t('Latency')}
213
- value={`${callStatsReport.publisherAudioStats.averageRoundTripTimeInMs} ms.`}
214
- comparison={latencyComparison}
215
- />
216
- <StatCard
217
- label={t('Audio codec')}
218
- value={formatAudioCodec(callStatsReport)}
219
- />
220
- <StatCard
221
- label={t('Audio bitrate (publish)')}
222
- value={publishAudioBitrate}
223
- />
224
- <StatCard
225
- label={t('Audio bitrate (receive)')}
226
- value={subscribeAudioBitrate}
227
- />
228
- <StatCard
229
- label={t('Audio jitter (publish)')}
230
- value={`${callStatsReport.publisherAudioStats.averageJitterInMs} ms.`}
231
- comparison={{
232
- ...audioJitterComparison,
233
- value: callStatsReport.publisherAudioStats.averageJitterInMs,
234
- }}
235
- />
236
- <StatCard
237
- label={t('Audio jitter (receive)')}
238
- value={`${callStatsReport.subscriberAudioStats.averageJitterInMs} ms.`}
239
- comparison={{
240
- ...audioJitterComparison,
241
- value: callStatsReport.subscriberAudioStats.averageJitterInMs,
242
- }}
243
- />
244
- </div>
245
- </>
246
- )}
247
- </div>
248
- );
249
- };
250
-
251
- const StatCardExplanation = (props: { description: string }) => {
252
- const { description } = props;
253
- const [isOpen, setIsOpen] = useState(false);
254
-
255
- const { refs, floatingStyles, context } = useFloating({
256
- open: isOpen,
257
- onOpenChange: setIsOpen,
258
- });
259
-
260
- const hover = useHover(context);
261
-
262
- const { getReferenceProps, getFloatingProps } = useInteractions([hover]);
263
-
264
- return (
265
- <>
266
- <div
267
- className="str-video__call-explanation"
268
- ref={refs.setReference}
269
- {...getReferenceProps()}
270
- >
271
- <Icon className="str-video__call-explanation__icon" icon="info" />
272
- </div>
273
- {isOpen && (
274
- <div
275
- className="str-video__call-explanation__description"
276
- ref={refs.setFloating}
277
- style={floatingStyles}
278
- {...getFloatingProps()}
279
- >
280
- {description}
281
- </div>
282
- )}
283
- </>
284
- );
285
- };
286
-
287
- const StatsTag = (props: { children: ReactNode; status: Status }) => {
288
- const { children, status } = props;
289
- return (
290
- <div
291
- className={clsx('str-video__call-stats__tag', {
292
- 'str-video__call-stats__tag--good': status === Status.GOOD,
293
- 'str-video__call-stats__tag--ok': status === Status.OK,
294
- 'str-video__call-stats__tag--bad': status === Status.BAD,
295
- })}
296
- >
297
- <div className="str-video__call-stats__tag__text">{children}</div>
298
- </div>
299
- );
300
- };
301
-
302
- export const StatCard = (props: {
303
- label: string;
304
- value: string | ReactNode;
305
- description?: string;
306
- comparison?: { value: number; highBound: number; lowBound: number };
307
- }) => {
308
- const { label, value, description, comparison } = props;
309
-
310
- const { t } = useI18n();
311
- const status = comparison ? toStatus(comparison) : undefined;
312
-
313
- return (
314
- <div className="str-video__call-stats__card">
315
- <div className="str-video__call-stats__card-content">
316
- <div className="str-video__call-stats__card-label">
317
- {label}
318
- {description && <StatCardExplanation description={description} />}
319
- </div>
320
- <div className="str-video__call-stats__card-value">{value}</div>
321
- </div>
322
- {status && <StatsTag status={status}>{t(status)}</StatsTag>}
323
- </div>
324
- );
325
- };
326
-
327
- const toStatus = (config: {
328
- value: number;
329
- lowBound: number;
330
- highBound: number;
331
- }): Status => {
332
- const { value, lowBound, highBound } = config;
333
- if (value <= lowBound) return Status.GOOD;
334
- if (value >= lowBound && value <= highBound) return Status.OK;
335
- if (value >= highBound) return Status.BAD;
336
- return Status.GOOD;
337
- };
338
-
339
- const toFrameSize = (stats: AggregatedStatsReport) => {
340
- const {
341
- highestFrameWidth: w,
342
- highestFrameHeight: h,
343
- highestFramesPerSecond: fps,
344
- } = stats;
345
- let size = `-`;
346
- if (w && h) {
347
- size = `${w}x${h}`;
348
- if (fps) {
349
- size += `@${fps}fps.`;
350
- }
351
- }
352
- return size;
353
- };
354
-
355
- const formatCodec = (callStatsReport: CallStatsReport): string => {
356
- const { codecPerTrackType } = callStatsReport.publisherStats;
357
- if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.VIDEO]) {
358
- return '';
359
- }
360
- const [, name] = codecPerTrackType[SfuModels.TrackType.VIDEO].split('/');
361
- return name ? ` (${name})` : '';
362
- };
363
-
364
- const formatAudioCodec = (callStatsReport: CallStatsReport): string => {
365
- const { codecPerTrackType } = callStatsReport.publisherAudioStats;
366
- if (!codecPerTrackType || !codecPerTrackType[SfuModels.TrackType.AUDIO]) {
367
- return '';
368
- }
369
- const [, name] = codecPerTrackType[SfuModels.TrackType.AUDIO].split('/');
370
- return name ?? '';
371
- };
372
-
373
- const calculatePublishBitrate = (
374
- previousCallStatsReport: CallStatsReport,
375
- callStatsReport: CallStatsReport,
376
- ) => {
377
- const {
378
- publisherStats: {
379
- totalBytesSent: previousTotalBytesSent,
380
- timestamp: previousTimestamp,
381
- },
382
- } = previousCallStatsReport;
383
-
384
- const {
385
- publisherStats: { totalBytesSent, timestamp },
386
- } = callStatsReport;
387
-
388
- const bytesSent = totalBytesSent - previousTotalBytesSent;
389
- const timeElapsed = timestamp - previousTimestamp;
390
- return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
391
- };
392
-
393
- const calculateSubscribeBitrate = (
394
- previousCallStatsReport: CallStatsReport,
395
- callStatsReport: CallStatsReport,
396
- ) => {
397
- const {
398
- subscriberStats: {
399
- totalBytesReceived: previousTotalBytesReceived,
400
- timestamp: previousTimestamp,
401
- },
402
- } = previousCallStatsReport;
403
-
404
- const {
405
- subscriberStats: { totalBytesReceived, timestamp },
406
- } = callStatsReport;
407
-
408
- const bytesReceived = totalBytesReceived - previousTotalBytesReceived;
409
- const timeElapsed = timestamp - previousTimestamp;
410
- return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
411
- };
412
-
413
- const calculatePublishAudioBitrate = (
414
- previousCallStatsReport: CallStatsReport,
415
- callStatsReport: CallStatsReport,
416
- ) => {
417
- const previousAudioStats = previousCallStatsReport.publisherAudioStats;
418
- const audioStats = callStatsReport.publisherAudioStats;
419
-
420
- const bytesSent =
421
- audioStats.totalBytesSent - previousAudioStats.totalBytesSent;
422
- const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
423
-
424
- return `${((bytesSent * 8) / timeElapsed).toFixed(2)} kbps`;
425
- };
426
-
427
- const calculateSubscribeAudioBitrate = (
428
- previousCallStatsReport: CallStatsReport,
429
- callStatsReport: CallStatsReport,
430
- ) => {
431
- const previousAudioStats = previousCallStatsReport.subscriberAudioStats;
432
- const audioStats = callStatsReport.subscriberAudioStats;
433
-
434
- const bytesReceived =
435
- audioStats.totalBytesReceived - previousAudioStats.totalBytesReceived;
436
- const timeElapsed = audioStats.timestamp - previousAudioStats.timestamp;
437
-
438
- return `${((bytesReceived * 8) / timeElapsed).toFixed(2)} kbps`;
439
- };