@stream-io/video-react-sdk 1.41.0 → 1.42.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 (305) hide show
  1. package/CHANGELOG.md +22 -6
  2. package/dist/embedded.cjs.js +1 -1
  3. package/dist/esm/embedded.js +3 -0
  4. package/dist/esm/embedded.js.map +1 -0
  5. package/dist/esm/index.js +92 -0
  6. package/dist/esm/index.js.map +1 -0
  7. package/dist/esm/src/components/Avatar/Avatar.js +14 -0
  8. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -0
  9. package/dist/{background-filters-D2U5UBbH.es.js → esm/src/components/BackgroundFilters/BackgroundFilters.js} +1 -1
  10. package/dist/esm/src/components/BackgroundFilters/BackgroundFilters.js.map +1 -0
  11. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js +33 -0
  12. package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js.map +1 -0
  13. package/dist/esm/src/components/Button/CompositeButton.js +29 -0
  14. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -0
  15. package/dist/esm/src/components/Button/IconButton.js +18 -0
  16. package/dist/esm/src/components/Button/IconButton.js.map +1 -0
  17. package/dist/esm/src/components/Button/TextButton.js +8 -0
  18. package/dist/esm/src/components/Button/TextButton.js.map +1 -0
  19. package/dist/esm/src/components/CallControls/AcceptCallButton.js +28 -0
  20. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -0
  21. package/dist/esm/src/components/CallControls/CallControls.js +21 -0
  22. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -0
  23. package/dist/esm/src/components/CallControls/CallStatsButton.js +18 -0
  24. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +1 -0
  25. package/dist/esm/src/components/CallControls/CancelCallButton.js +78 -0
  26. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -0
  27. package/dist/esm/src/components/CallControls/ReactionsButton.js +61 -0
  28. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -0
  29. package/dist/esm/src/components/CallControls/RecordCallButton.js +64 -0
  30. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -0
  31. package/dist/esm/src/components/CallControls/ScreenShareButton.js +44 -0
  32. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -0
  33. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +72 -0
  34. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -0
  35. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +27 -0
  36. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -0
  37. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +81 -0
  38. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -0
  39. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +23 -0
  40. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -0
  41. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +15 -0
  42. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -0
  43. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js +7 -0
  44. package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js.map +1 -0
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +46 -0
  46. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -0
  47. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +81 -0
  48. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -0
  49. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +10 -0
  50. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -0
  51. package/dist/esm/src/components/CallPreview/CallPreview.js +24 -0
  52. package/dist/esm/src/components/CallPreview/CallPreview.js.map +1 -0
  53. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js +12 -0
  54. package/dist/esm/src/components/CallRecordingList/CallRecordingList.js.map +1 -0
  55. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +12 -0
  56. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -0
  57. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js +14 -0
  58. package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js.map +1 -0
  59. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js +8 -0
  60. package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js.map +1 -0
  61. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js +10 -0
  62. package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js.map +1 -0
  63. package/dist/esm/src/components/CallStats/CallStats.js +180 -0
  64. package/dist/esm/src/components/CallStats/CallStats.js.map +1 -0
  65. package/dist/{latency-chart-Bj5OSYzg.es.js → esm/src/components/CallStats/CallStatsLatencyChart.js} +1 -1
  66. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +1 -0
  67. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js +27 -0
  68. package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js.map +1 -0
  69. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +42 -0
  70. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -0
  71. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +67 -0
  72. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -0
  73. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +26 -0
  74. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -0
  75. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js +15 -0
  76. package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js.map +1 -0
  77. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +26 -0
  78. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -0
  79. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js +42 -0
  80. package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js.map +1 -0
  81. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +57 -0
  82. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -0
  83. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +79 -0
  84. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -0
  85. package/dist/esm/src/components/Icon/Icon.js +7 -0
  86. package/dist/esm/src/components/Icon/Icon.js.map +1 -0
  87. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js +9 -0
  88. package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js.map +1 -0
  89. package/dist/esm/src/components/Menu/GenericMenu.js +19 -0
  90. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -0
  91. package/dist/esm/src/components/Menu/MenuToggle.js +75 -0
  92. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -0
  93. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js +96 -0
  94. package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js.map +1 -0
  95. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +23 -0
  96. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -0
  97. package/dist/esm/src/components/Notification/Notification.js +31 -0
  98. package/dist/esm/src/components/Notification/Notification.js.map +1 -0
  99. package/dist/esm/src/components/Notification/PermissionNotification.js +32 -0
  100. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -0
  101. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +23 -0
  102. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -0
  103. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +14 -0
  104. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -0
  105. package/dist/esm/src/components/Permissions/PermissionRequests.js +99 -0
  106. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -0
  107. package/dist/esm/src/components/Reaction/Reaction.js +32 -0
  108. package/dist/esm/src/components/Reaction/Reaction.js.map +1 -0
  109. package/dist/esm/src/components/RingingCall/RingingCall.js +48 -0
  110. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -0
  111. package/dist/esm/src/components/RingingCall/RingingCallControls.js +34 -0
  112. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -0
  113. package/dist/esm/src/components/Search/SearchInput.js +27 -0
  114. package/dist/esm/src/components/Search/SearchInput.js.map +1 -0
  115. package/dist/esm/src/components/Search/SearchResults.js +15 -0
  116. package/dist/esm/src/components/Search/SearchResults.js.map +1 -0
  117. package/dist/esm/src/components/Search/hooks/useSearch.js +38 -0
  118. package/dist/esm/src/components/Search/hooks/useSearch.js.map +1 -0
  119. package/dist/esm/src/components/StreamTheme/StreamTheme.js +9 -0
  120. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -0
  121. package/dist/esm/src/components/Tooltip/Tooltip.js +29 -0
  122. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -0
  123. package/dist/esm/src/components/Tooltip/WithTooltip.js +15 -0
  124. package/dist/esm/src/components/Tooltip/WithTooltip.js.map +1 -0
  125. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js +17 -0
  126. package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js.map +1 -0
  127. package/dist/esm/src/components/VideoPreview/VideoPreview.js +37 -0
  128. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -0
  129. package/dist/esm/src/core/components/Audio/Audio.js +22 -0
  130. package/dist/esm/src/core/components/Audio/Audio.js.map +1 -0
  131. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js +23 -0
  132. package/dist/esm/src/core/components/Audio/ParticipantsAudio.js.map +1 -0
  133. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +150 -0
  134. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -0
  135. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +79 -0
  136. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -0
  137. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +80 -0
  138. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -0
  139. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js +13 -0
  140. package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js.map +1 -0
  141. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +57 -0
  142. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -0
  143. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js +8 -0
  144. package/dist/esm/src/core/components/CallLayout/PipLayout/index.js.map +1 -0
  145. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +103 -0
  146. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -0
  147. package/dist/esm/src/core/components/CallLayout/hooks.js +62 -0
  148. package/dist/esm/src/core/components/CallLayout/hooks.js.map +1 -0
  149. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +94 -0
  150. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -0
  151. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +97 -0
  152. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -0
  153. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js +65 -0
  154. package/dist/esm/src/core/components/ParticipantView/ParticipantView.js.map +1 -0
  155. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js +7 -0
  156. package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js.map +1 -0
  157. package/dist/esm/src/core/components/StreamCall/StreamCall.js +8 -0
  158. package/dist/esm/src/core/components/StreamCall/StreamCall.js.map +1 -0
  159. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +11 -0
  160. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -0
  161. package/dist/esm/src/core/components/Video/BaseVideo.js +41 -0
  162. package/dist/esm/src/core/components/Video/BaseVideo.js.map +1 -0
  163. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +21 -0
  164. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -0
  165. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +12 -0
  166. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -0
  167. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +12 -0
  168. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -0
  169. package/dist/esm/src/core/components/Video/Video.js +88 -0
  170. package/dist/esm/src/core/components/Video/Video.js.map +1 -0
  171. package/dist/esm/src/core/hooks/useCalculateHardLimit.js +59 -0
  172. package/dist/esm/src/core/hooks/useCalculateHardLimit.js.map +1 -0
  173. package/dist/esm/src/core/hooks/usePictureInPictureState.js +24 -0
  174. package/dist/esm/src/core/hooks/usePictureInPictureState.js.map +1 -0
  175. package/dist/esm/src/core/hooks/useTrackElementVisibility.js +14 -0
  176. package/dist/esm/src/core/hooks/useTrackElementVisibility.js.map +1 -0
  177. package/dist/esm/src/embedded/EmbeddedClientProvider.js +83 -0
  178. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -0
  179. package/dist/esm/src/embedded/call/CallControls.js +65 -0
  180. package/dist/esm/src/embedded/call/CallControls.js.map +1 -0
  181. package/dist/esm/src/embedded/call/CallHeader.js +57 -0
  182. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -0
  183. package/dist/esm/src/embedded/call/CallLayout.js +63 -0
  184. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -0
  185. package/dist/esm/src/embedded/call/CallStateRouter.js +87 -0
  186. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -0
  187. package/dist/esm/src/embedded/call/EmbeddedCall.js +12 -0
  188. package/dist/esm/src/embedded/call/EmbeddedCall.js.map +1 -0
  189. package/dist/esm/src/embedded/context/ConfigurationContext.js +21 -0
  190. package/dist/esm/src/embedded/context/ConfigurationContext.js.map +1 -0
  191. package/dist/esm/src/embedded/hooks/useCallDuration.js +32 -0
  192. package/dist/esm/src/embedded/hooks/useCallDuration.js.map +1 -0
  193. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js +40 -0
  194. package/dist/esm/src/embedded/hooks/useEmbeddedClient.js.map +1 -0
  195. package/dist/esm/src/embedded/hooks/useInitializeCall.js +39 -0
  196. package/dist/esm/src/embedded/hooks/useInitializeCall.js.map +1 -0
  197. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js +93 -0
  198. package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js.map +1 -0
  199. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js +42 -0
  200. package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js.map +1 -0
  201. package/dist/esm/src/embedded/hooks/useLayout.js +122 -0
  202. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -0
  203. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js +48 -0
  204. package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js.map +1 -0
  205. package/dist/esm/src/embedded/hooks/useWakeLock.js +34 -0
  206. package/dist/esm/src/embedded/hooks/useWakeLock.js.map +1 -0
  207. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js +11 -0
  208. package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js.map +1 -0
  209. package/dist/esm/src/embedded/livestream/LivestreamUI.js +17 -0
  210. package/dist/esm/src/embedded/livestream/LivestreamUI.js.map +1 -0
  211. package/dist/esm/src/embedded/livestream/host/HostLayout.js +76 -0
  212. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -0
  213. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +110 -0
  214. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -0
  215. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +74 -0
  216. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -0
  217. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +109 -0
  218. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -0
  219. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +105 -0
  220. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -0
  221. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +65 -0
  222. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -0
  223. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +34 -0
  224. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -0
  225. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js +35 -0
  226. package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js.map +1 -0
  227. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +18 -0
  228. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -0
  229. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +37 -0
  230. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -0
  231. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +34 -0
  232. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -0
  233. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +56 -0
  234. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -0
  235. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +42 -0
  236. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -0
  237. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +34 -0
  238. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -0
  239. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +44 -0
  240. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -0
  241. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +31 -0
  242. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -0
  243. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +45 -0
  244. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -0
  245. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +40 -0
  246. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -0
  247. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +41 -0
  248. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -0
  249. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +50 -0
  250. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -0
  251. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +31 -0
  252. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -0
  253. package/dist/esm/src/hooks/useDeviceList.js +40 -0
  254. package/dist/esm/src/hooks/useDeviceList.js.map +1 -0
  255. package/dist/esm/src/hooks/useDragToScroll.js +116 -0
  256. package/dist/esm/src/hooks/useDragToScroll.js.map +1 -0
  257. package/dist/esm/src/hooks/useFloatingUIPreset.js +34 -0
  258. package/dist/esm/src/hooks/useFloatingUIPreset.js.map +1 -0
  259. package/dist/esm/src/hooks/useLoopbackRecording.js +138 -0
  260. package/dist/esm/src/hooks/useLoopbackRecording.js.map +1 -0
  261. package/dist/esm/src/hooks/useModeration.js +135 -0
  262. package/dist/esm/src/hooks/useModeration.js.map +1 -0
  263. package/dist/esm/src/hooks/usePersistedDevicePreferences.js +16 -0
  264. package/dist/esm/src/hooks/usePersistedDevicePreferences.js.map +1 -0
  265. package/dist/esm/src/hooks/useRequestPermission.js +41 -0
  266. package/dist/esm/src/hooks/useRequestPermission.js.map +1 -0
  267. package/dist/esm/src/hooks/useScrollPosition.js +66 -0
  268. package/dist/esm/src/hooks/useScrollPosition.js.map +1 -0
  269. package/dist/esm/src/translations/en.json.js +177 -0
  270. package/dist/esm/src/translations/en.json.js.map +1 -0
  271. package/dist/esm/src/translations/index.js +6 -0
  272. package/dist/esm/src/translations/index.js.map +1 -0
  273. package/dist/esm/src/utilities/applyElementToRef.js +10 -0
  274. package/dist/esm/src/utilities/applyElementToRef.js.map +1 -0
  275. package/dist/esm/src/utilities/callControlHandler.js +29 -0
  276. package/dist/esm/src/utilities/callControlHandler.js.map +1 -0
  277. package/dist/esm/src/utilities/chunk.js +7 -0
  278. package/dist/esm/src/utilities/chunk.js.map +1 -0
  279. package/dist/esm/src/utilities/filter.js +94 -0
  280. package/dist/esm/src/utilities/filter.js.map +1 -0
  281. package/dist/esm/src/utilities/isComponentType.js +10 -0
  282. package/dist/esm/src/utilities/isComponentType.js.map +1 -0
  283. package/dist/esm/src/utilities/normalizeString.js +11 -0
  284. package/dist/esm/src/utilities/normalizeString.js.map +1 -0
  285. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +105 -0
  286. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -0
  287. package/dist/index.cjs.js +135 -2
  288. package/dist/index.cjs.js.map +1 -1
  289. package/dist/index.d.ts +1 -1
  290. package/dist/src/hooks/index.d.ts +1 -0
  291. package/dist/src/hooks/useLoopbackRecording.d.ts +23 -0
  292. package/index.ts +4 -0
  293. package/package.json +14 -10
  294. package/src/hooks/index.ts +1 -0
  295. package/src/hooks/useLoopbackRecording.ts +207 -0
  296. package/dist/background-filters-D2U5UBbH.es.js.map +0 -1
  297. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js +0 -420
  298. package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js.map +0 -1
  299. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +0 -57
  300. package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +0 -1
  301. package/dist/embedded.es.js +0 -3536
  302. package/dist/embedded.es.js.map +0 -1
  303. package/dist/index.es.js +0 -3291
  304. package/dist/index.es.js.map +0 -1
  305. package/dist/latency-chart-Bj5OSYzg.es.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect } from 'react';
3
+ import { CallingState } from '@stream-io/video-client';
4
+ import { useStreamVideoClient, useEffectEvent, useCallStateHooks, useCall } from '@stream-io/video-react-bindings';
5
+ import '../../core/components/Audio/Audio.js';
6
+ import '../../core/components/Audio/ParticipantsAudio.js';
7
+ import '../../core/components/ParticipantView/ParticipantViewContext.js';
8
+ import '../../components/Menu/MenuToggle.js';
9
+ import 'clsx';
10
+ import '../../core/components/ParticipantView/ParticipantView.js';
11
+ import '../../core/components/ParticipantView/DefaultParticipantViewUI.js';
12
+ import { StreamCall } from '../../core/components/StreamCall/StreamCall.js';
13
+ import '../../core/components/StreamVideo/StreamVideo.js';
14
+ import '../../core/components/Video/BaseVideo.js';
15
+ import '../../core/components/Video/Video.js';
16
+ import { LivestreamLayout, BackstageLayout } from '../../core/components/CallLayout/LivestreamLayout.js';
17
+ import '../../core/components/CallLayout/PaginatedGridLayout.js';
18
+ import '../../core/components/CallLayout/SpeakerLayout.js';
19
+ import '../../core/components/CallLayout/PipLayout/Pip.js';
20
+ import '../../core/components/CallLayout/PipLayout/Host.js';
21
+ import '../../core/components/CallLayout/PipLayout/Grid.js';
22
+
23
+ const LivestreamPlayer = (props) => {
24
+ const { callType, callId, children, ...restProps } = props;
25
+ const client = useStreamVideoClient();
26
+ const [call, setCall] = useState();
27
+ const onError = useEffectEvent(props.onError ?? (() => { }));
28
+ useEffect(() => {
29
+ if (!client)
30
+ return;
31
+ const myCall = client.call(callType, callId);
32
+ setCall(myCall);
33
+ myCall.get().catch((e) => {
34
+ console.error('Failed to fetch call', e);
35
+ onError(e);
36
+ });
37
+ return () => {
38
+ myCall.leave().catch((e) => {
39
+ console.error('Failed to leave call', e);
40
+ });
41
+ setCall(undefined);
42
+ };
43
+ }, [callId, callType, client]);
44
+ if (!call) {
45
+ return null;
46
+ }
47
+ return (jsxs(StreamCall, { call: call, children: [jsx(LivestreamCall, { ...restProps }), children] }));
48
+ };
49
+ const LivestreamCall = (props) => {
50
+ const call = useLivestreamCall(props);
51
+ const { useIsCallLive } = useCallStateHooks();
52
+ const isLive = useIsCallLive();
53
+ if (!call)
54
+ return null;
55
+ if (isLive) {
56
+ return jsx(LivestreamLayout, { ...props.layoutProps });
57
+ }
58
+ return jsx(BackstageLayout, { ...props.backstageProps });
59
+ };
60
+ const useLivestreamCall = (props) => {
61
+ const call = useCall();
62
+ const { useIsCallLive, useOwnCapabilities } = useCallStateHooks();
63
+ const canJoinLive = useIsCallLive();
64
+ const canJoinEarly = useCanJoinEarly();
65
+ const canJoinBackstage = useOwnCapabilities()?.includes('join-backstage') ?? false;
66
+ const canJoinAsap = canJoinLive || canJoinEarly || canJoinBackstage;
67
+ const joinBehavior = props.joinBehavior ?? 'asap';
68
+ const canJoin = (joinBehavior === 'asap' && canJoinAsap) ||
69
+ (joinBehavior === 'live' && canJoinLive);
70
+ const onError = useEffectEvent(props.onError ?? (() => { }));
71
+ useEffect(() => {
72
+ if (call && call.state.callingState === CallingState.IDLE && canJoin) {
73
+ call.join().catch((e) => {
74
+ console.error('Failed to join call', e);
75
+ onError(e);
76
+ });
77
+ }
78
+ }, [call, canJoin]);
79
+ return call;
80
+ };
81
+ const useCanJoinEarly = () => {
82
+ const { useCallStartsAt, useCallSettings } = useCallStateHooks();
83
+ const startsAt = useCallStartsAt();
84
+ const settings = useCallSettings();
85
+ const joinAheadTimeSeconds = settings?.backstage.join_ahead_time_seconds;
86
+ const [canJoinEarly, setCanJoinEarly] = useState(() => checkCanJoinEarly(startsAt, joinAheadTimeSeconds));
87
+ useEffect(() => {
88
+ if (canJoinEarly)
89
+ return;
90
+ const handle = setInterval(() => {
91
+ setCanJoinEarly(checkCanJoinEarly(startsAt, joinAheadTimeSeconds));
92
+ }, 1000);
93
+ return () => clearInterval(handle);
94
+ }, [canJoinEarly, startsAt, joinAheadTimeSeconds]);
95
+ return canJoinEarly;
96
+ };
97
+ const checkCanJoinEarly = (startsAt, joinAheadTimeSeconds) => {
98
+ if (!startsAt) {
99
+ return false;
100
+ }
101
+ return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;
102
+ };
103
+
104
+ export { LivestreamPlayer };
105
+ //# sourceMappingURL=LivestreamPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LivestreamPlayer.js","sources":["../../../../../../../src/wrappers/LivestreamPlayer/LivestreamPlayer.tsx"],"sourcesContent":["import { PropsWithChildren, useEffect, useState } from 'react';\nimport { Call, CallingState } from '@stream-io/video-client';\nimport {\n useCall,\n useCallStateHooks,\n useEffectEvent,\n useStreamVideoClient,\n} from '@stream-io/video-react-bindings';\nimport {\n BackstageLayout,\n BackstageLayoutProps,\n LivestreamLayout,\n LivestreamLayoutProps,\n StreamCall,\n} from '../../core';\n\nexport type LivestreamPlayerProps = {\n /**\n * The call type. Usually `livestream`.\n */\n callType: string;\n /**\n * The call ID.\n */\n callId: string;\n /**\n * Determines when the viewer joins the call.\n *\n * `\"asap\"` behavior means joining the call as soon as it is possible\n * (either the `join_ahead_time_seconds` setting allows it, or the user\n * has the capability to join backstage).\n *\n * `\"live\"` behavior means joining the call when it goes live.\n *\n * @default \"asap\"\n */\n joinBehavior?: 'asap' | 'live';\n /**\n * The props for the {@link LivestreamLayout} component.\n */\n layoutProps?: LivestreamLayoutProps;\n /**\n * The props for the {@link BackstageLayout} component.\n */\n backstageProps?: BackstageLayoutProps;\n /**\n * Callback to handle errors while fetching or joining livestream.\n */\n onError?: (error: any) => void;\n};\n\nexport const LivestreamPlayer = (\n props: PropsWithChildren<LivestreamPlayerProps>,\n) => {\n const { callType, callId, children, ...restProps } = props;\n const client = useStreamVideoClient();\n const [call, setCall] = useState<Call>();\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (!client) return;\n const myCall = client.call(callType, callId);\n setCall(myCall);\n myCall.get().catch((e) => {\n console.error('Failed to fetch call', e);\n onError(e);\n });\n return () => {\n myCall.leave().catch((e) => {\n console.error('Failed to leave call', e);\n });\n setCall(undefined);\n };\n }, [callId, callType, client]);\n\n if (!call) {\n return null;\n }\n\n return (\n <StreamCall call={call}>\n <LivestreamCall {...restProps} />\n {children}\n </StreamCall>\n );\n};\n\nconst LivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n layoutProps?: LivestreamLayoutProps;\n backstageProps?: BackstageLayoutProps;\n onError?: (error: any) => void;\n}) => {\n const call = useLivestreamCall(props);\n const { useIsCallLive } = useCallStateHooks();\n const isLive = useIsCallLive();\n\n if (!call) return null;\n\n if (isLive) {\n return <LivestreamLayout {...props.layoutProps} />;\n }\n\n return <BackstageLayout {...props.backstageProps} />;\n};\n\nconst useLivestreamCall = (props: {\n joinBehavior?: 'asap' | 'live';\n onError?: (error: any) => void;\n}) => {\n const call = useCall();\n const { useIsCallLive, useOwnCapabilities } = useCallStateHooks();\n const canJoinLive = useIsCallLive();\n const canJoinEarly = useCanJoinEarly();\n const canJoinBackstage =\n useOwnCapabilities()?.includes('join-backstage') ?? false;\n const canJoinAsap = canJoinLive || canJoinEarly || canJoinBackstage;\n const joinBehavior = props.joinBehavior ?? 'asap';\n const canJoin =\n (joinBehavior === 'asap' && canJoinAsap) ||\n (joinBehavior === 'live' && canJoinLive);\n const onError = useEffectEvent(props.onError ?? (() => {}));\n\n useEffect(() => {\n if (call && call.state.callingState === CallingState.IDLE && canJoin) {\n call.join().catch((e) => {\n console.error('Failed to join call', e);\n onError(e);\n });\n }\n }, [call, canJoin]);\n\n return call;\n};\n\nconst useCanJoinEarly = () => {\n const { useCallStartsAt, useCallSettings } = useCallStateHooks();\n const startsAt = useCallStartsAt();\n const settings = useCallSettings();\n const joinAheadTimeSeconds = settings?.backstage.join_ahead_time_seconds;\n const [canJoinEarly, setCanJoinEarly] = useState(() =>\n checkCanJoinEarly(startsAt, joinAheadTimeSeconds),\n );\n\n useEffect(() => {\n if (canJoinEarly) return;\n const handle = setInterval(() => {\n setCanJoinEarly(checkCanJoinEarly(startsAt, joinAheadTimeSeconds));\n }, 1000);\n\n return () => clearInterval(handle);\n }, [canJoinEarly, startsAt, joinAheadTimeSeconds]);\n\n return canJoinEarly;\n};\n\nconst checkCanJoinEarly = (\n startsAt: Date | undefined,\n joinAheadTimeSeconds: number | undefined,\n) => {\n if (!startsAt) {\n return false;\n }\n\n return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmDO,MAAM,gBAAgB,GAAG,CAC9B,KAA+C,KAC7C;AACF,IAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK;AAC1D,IAAA,MAAM,MAAM,GAAG,oBAAoB,EAAE;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAQ;AACxC,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,KAAK,MAAK,EAAE,CAAC,CAAC,CAAC;IAE3D,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC;QACf,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC,CAAC;AACZ,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAK;YACV,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AACzB,gBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAC1C,YAAA,CAAC,CAAC;YACF,OAAO,CAAC,SAAS,CAAC;AACpB,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE9B,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QACEA,IAAA,CAAC,UAAU,EAAA,EAAC,IAAI,EAAE,IAAI,EAAA,QAAA,EAAA,CACpBC,GAAA,CAAC,cAAc,OAAK,SAAS,EAAA,CAAI,EAChC,QAAQ,CAAA,EAAA,CACE;AAEjB;AAEA,MAAM,cAAc,GAAG,CAAC,KAKvB,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC;AACrC,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,iBAAiB,EAAE;AAC7C,IAAA,MAAM,MAAM,GAAG,aAAa,EAAE;AAE9B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;IAEtB,IAAI,MAAM,EAAE;AACV,QAAA,OAAOA,IAAC,gBAAgB,EAAA,EAAA,GAAK,KAAK,CAAC,WAAW,GAAI;IACpD;AAEA,IAAA,OAAOA,IAAC,eAAe,EAAA,EAAA,GAAK,KAAK,CAAC,cAAc,GAAI;AACtD,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,KAG1B,KAAI;AACH,IAAA,MAAM,IAAI,GAAG,OAAO,EAAE;IACtB,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE;AACjE,IAAA,MAAM,WAAW,GAAG,aAAa,EAAE;AACnC,IAAA,MAAM,YAAY,GAAG,eAAe,EAAE;IACtC,MAAM,gBAAgB,GACpB,kBAAkB,EAAE,EAAE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK;AAC3D,IAAA,MAAM,WAAW,GAAG,WAAW,IAAI,YAAY,IAAI,gBAAgB;AACnE,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,MAAM;IACjD,MAAM,OAAO,GACX,CAAC,YAAY,KAAK,MAAM,IAAI,WAAW;AACvC,SAAC,YAAY,KAAK,MAAM,IAAI,WAAW,CAAC;AAC1C,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,KAAK,MAAK,EAAE,CAAC,CAAC,CAAC;IAE3D,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE;YACpE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAI;AACtB,gBAAA,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC;gBACvC,OAAO,CAAC,CAAC,CAAC;AACZ,YAAA,CAAC,CAAC;QACJ;AACF,IAAA,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAEnB,IAAA,OAAO,IAAI;AACb,CAAC;AAED,MAAM,eAAe,GAAG,MAAK;IAC3B,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE;AAChE,IAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAA,MAAM,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAA,MAAM,oBAAoB,GAAG,QAAQ,EAAE,SAAS,CAAC,uBAAuB;AACxE,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,MAC/C,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAClD;IAED,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,YAAY;YAAE;AAClB,QAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAK;YAC9B,eAAe,CAAC,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QACpE,CAAC,EAAE,IAAI,CAAC;AAER,QAAA,OAAO,MAAM,aAAa,CAAC,MAAM,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AAElD,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,iBAAiB,GAAG,CACxB,QAA0B,EAC1B,oBAAwC,KACtC;IACF,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,oBAAoB,IAAI,CAAC,IAAI,IAAI;AACrE,CAAC;;;;"}
package/dist/index.cjs.js CHANGED
@@ -458,6 +458,138 @@ function useDragToScroll(element, options = {}) {
458
458
  }, [element, enabled, decay, minVelocity, dragThreshold]);
459
459
  }
460
460
 
461
+ const attachHiddenMediaSink = (stream) => {
462
+ const logger = videoClient.videoLoggerSystem.getLogger('useLoopbackRecording');
463
+ const element = document.createElement('video');
464
+ element.muted = true;
465
+ element.autoplay = true;
466
+ element.playsInline = true;
467
+ element.srcObject = stream;
468
+ element.play().catch((error) => {
469
+ logger.warn('sink element failed to play; recording may be empty', error);
470
+ });
471
+ return () => {
472
+ element.pause();
473
+ element.srcObject = null;
474
+ };
475
+ };
476
+ /** Records SFU loopback streams for pre-call testing. */
477
+ const useLoopbackRecording = () => {
478
+ const call = videoReactBindings.useCall();
479
+ const { useCallCallingState, useParticipantCount, useLocalParticipant } = videoReactBindings.useCallStateHooks();
480
+ const callingState = useCallCallingState();
481
+ const participantCount = useParticipantCount();
482
+ const localParticipant = useLocalParticipant();
483
+ const [recordingState, setRecordingState] = react.useState('idle');
484
+ const recordingStateRef = react.useRef('idle');
485
+ const isMountedRef = react.useRef(true);
486
+ const awaitAbortRef = react.useRef(null);
487
+ const stopRef = react.useRef(null);
488
+ const runRef = react.useRef(null);
489
+ const loopbackStreams = react.useMemo(() => videoClient.getLoopbackStreams(call, localParticipant), [call, localParticipant]);
490
+ const updateState = react.useCallback((next) => {
491
+ recordingStateRef.current = next;
492
+ if (isMountedRef.current) {
493
+ setRecordingState(next);
494
+ }
495
+ }, []);
496
+ const stopRecording = react.useCallback(async () => {
497
+ const current = recordingStateRef.current;
498
+ if (current === 'idle')
499
+ return;
500
+ if (current === 'awaiting-streams') {
501
+ videoClient.videoLoggerSystem
502
+ .getLogger('useLoopbackRecording')
503
+ .debug('aborting the awaiting-streams wait');
504
+ awaitAbortRef.current?.abort();
505
+ return;
506
+ }
507
+ stopRef.current?.();
508
+ await runRef.current;
509
+ }, []);
510
+ const startRecording = react.useCallback(async ({ includeVideo = true, maxDurationMs = videoClient.DEFAULT_LOOPBACK_RECORDING_DURATION_MS, } = {}) => {
511
+ const logger = videoClient.videoLoggerSystem.getLogger('useLoopbackRecording');
512
+ if (!call)
513
+ return null;
514
+ if (recordingStateRef.current !== 'idle') {
515
+ logger.warn('a recording is already running');
516
+ return null;
517
+ }
518
+ if (call.state.participantCount > 1) {
519
+ logger.warn('cannot start recording with other participants present');
520
+ return null;
521
+ }
522
+ const run = async () => {
523
+ awaitAbortRef.current = new AbortController();
524
+ updateState('awaiting-streams');
525
+ try {
526
+ const tracks = await videoClient.waitForLoopbackStreams(call, {
527
+ includeVideo,
528
+ signal: awaitAbortRef.current.signal,
529
+ timeoutMs: videoClient.LOOPBACK_STREAMS_WAIT_TIMEOUT_MS,
530
+ });
531
+ if (tracks === null) {
532
+ logger.debug('loopback stream wait was aborted');
533
+ return null;
534
+ }
535
+ updateState('recording');
536
+ const restoreAudio = videoClient.enableLoopbackAudio(tracks);
537
+ const stream = new MediaStream([tracks.audioTrack, tracks.videoTrack].filter((track) => !!track));
538
+ const detachSink = attachHiddenMediaSink(stream);
539
+ const recorder = new videoClient.MediaStreamRecorder(stream, {
540
+ maxDurationMs: videoClient.clampLoopbackRecordingDuration(maxDurationMs),
541
+ });
542
+ stopRef.current = recorder.stop;
543
+ try {
544
+ return await recorder.start();
545
+ }
546
+ finally {
547
+ detachSink();
548
+ restoreAudio();
549
+ }
550
+ }
551
+ catch (err) {
552
+ logger.error('loopback recording failed', err);
553
+ throw err;
554
+ }
555
+ finally {
556
+ awaitAbortRef.current = null;
557
+ stopRef.current = null;
558
+ updateState('idle');
559
+ }
560
+ };
561
+ const promise = run();
562
+ runRef.current = promise.catch(() => undefined);
563
+ return promise;
564
+ }, [call, updateState]);
565
+ react.useEffect(() => {
566
+ if (callingState === videoClient.CallingState.LEFT ||
567
+ callingState === videoClient.CallingState.IDLE) {
568
+ stopRecording().catch(() => { });
569
+ }
570
+ }, [callingState, stopRecording]);
571
+ react.useEffect(() => {
572
+ if (recordingState !== 'idle' && participantCount > 1) {
573
+ stopRecording().catch(() => { });
574
+ }
575
+ }, [participantCount, recordingState, stopRecording]);
576
+ react.useEffect(() => {
577
+ isMountedRef.current = true;
578
+ return () => {
579
+ isMountedRef.current = false;
580
+ awaitAbortRef.current?.abort('the component unmounted');
581
+ stopRef.current?.();
582
+ };
583
+ }, []);
584
+ return {
585
+ startRecording,
586
+ stopRecording,
587
+ recordingState,
588
+ loopbackVideoStream: loopbackStreams.loopbackVideoStream,
589
+ loopbackAudioStream: loopbackStreams.loopbackAudioStream,
590
+ };
591
+ };
592
+
461
593
  exports.MenuVisualType = void 0;
462
594
  (function (MenuVisualType) {
463
595
  MenuVisualType["PORTAL"] = "portal";
@@ -1406,7 +1538,7 @@ const SpeakerTest = (props) => {
1406
1538
  const audioElementRef = react.useRef(null);
1407
1539
  const [isPlaying, setIsPlaying] = react.useState(false);
1408
1540
  const { t } = videoReactBindings.useI18n();
1409
- const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.41.0"}/assets/piano.mp3`, } = props;
1541
+ const { audioUrl = `https://unpkg.com/${"@stream-io/video-react-sdk"}@${"1.42.0"}/assets/piano.mp3`, } = props;
1410
1542
  // Update audio output device when selection changes
1411
1543
  react.useEffect(() => {
1412
1544
  const audio = audioElementRef.current;
@@ -3279,7 +3411,7 @@ const checkCanJoinEarly = (startsAt, joinAheadTimeSeconds) => {
3279
3411
  return Date.now() >= +startsAt - (joinAheadTimeSeconds ?? 0) * 1000;
3280
3412
  };
3281
3413
 
3282
- const [major, minor, patch] = ("1.41.0").split('.');
3414
+ const [major, minor, patch] = ("1.42.0").split('.');
3283
3415
  videoClient.setSdkInfo({
3284
3416
  type: videoClient.SfuModels.SdkType.REACT,
3285
3417
  major,
@@ -3379,6 +3511,7 @@ exports.useBackgroundFilters = useBackgroundFilters;
3379
3511
  exports.useDeviceList = useDeviceList;
3380
3512
  exports.useFilteredParticipants = useFilteredParticipants;
3381
3513
  exports.useHorizontalScrollPosition = useHorizontalScrollPosition;
3514
+ exports.useLoopbackRecording = useLoopbackRecording;
3382
3515
  exports.useMenuContext = useMenuContext;
3383
3516
  exports.useModeration = useModeration;
3384
3517
  exports.useNoiseCancellation = useNoiseCancellation;