@stream-io/video-react-sdk 1.40.2 → 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.
- package/CHANGELOG.md +33 -4
- package/dist/embedded.cjs.js +4 -4
- package/dist/embedded.cjs.js.map +1 -1
- package/dist/esm/embedded.js +3 -0
- package/dist/esm/embedded.js.map +1 -0
- package/dist/esm/index.js +92 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/src/components/Avatar/Avatar.js +14 -0
- package/dist/esm/src/components/Avatar/Avatar.js.map +1 -0
- package/dist/{background-filters-D2U5UBbH.es.js → esm/src/components/BackgroundFilters/BackgroundFilters.js} +1 -1
- package/dist/esm/src/components/BackgroundFilters/BackgroundFilters.js.map +1 -0
- package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js +33 -0
- package/dist/esm/src/components/BackgroundFilters/BackgroundFiltersProvider.js.map +1 -0
- package/dist/esm/src/components/Button/CompositeButton.js +29 -0
- package/dist/esm/src/components/Button/CompositeButton.js.map +1 -0
- package/dist/esm/src/components/Button/IconButton.js +18 -0
- package/dist/esm/src/components/Button/IconButton.js.map +1 -0
- package/dist/esm/src/components/Button/TextButton.js +8 -0
- package/dist/esm/src/components/Button/TextButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/AcceptCallButton.js +28 -0
- package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/CallControls.js +21 -0
- package/dist/esm/src/components/CallControls/CallControls.js.map +1 -0
- package/dist/esm/src/components/CallControls/CallStatsButton.js +18 -0
- package/dist/esm/src/components/CallControls/CallStatsButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/CancelCallButton.js +78 -0
- package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ReactionsButton.js +61 -0
- package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/RecordCallButton.js +64 -0
- package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ScreenShareButton.js +44 -0
- package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js +72 -0
- package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +27 -0
- package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -0
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js +81 -0
- package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +23 -0
- package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +15 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js +7 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListing.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +46 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +81 -0
- package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -0
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +10 -0
- package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -0
- package/dist/esm/src/components/CallPreview/CallPreview.js +24 -0
- package/dist/esm/src/components/CallPreview/CallPreview.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingList.js +12 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingList.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +12 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js +14 -0
- package/dist/esm/src/components/CallRecordingList/CallRecordingListItem.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js +8 -0
- package/dist/esm/src/components/CallRecordingList/EmptyCallRecordingListing.js.map +1 -0
- package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js +10 -0
- package/dist/esm/src/components/CallRecordingList/LoadingCallRecordingListing.js.map +1 -0
- package/dist/esm/src/components/CallStats/CallStats.js +180 -0
- package/dist/esm/src/components/CallStats/CallStats.js.map +1 -0
- package/dist/{latency-chart-Bj5OSYzg.es.js → esm/src/components/CallStats/CallStatsLatencyChart.js} +1 -1
- package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js +27 -0
- package/dist/esm/src/components/DeviceSettings/AudioVolumeIndicator.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +42 -0
- package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +67 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +26 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js +15 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSelectorVideo.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +26 -0
- package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js +42 -0
- package/dist/esm/src/components/DeviceSettings/DeviceVideoPreviewItem.js.map +1 -0
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +57 -0
- package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -0
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +79 -0
- package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -0
- package/dist/esm/src/components/Icon/Icon.js +7 -0
- package/dist/esm/src/components/Icon/Icon.js.map +1 -0
- package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js +9 -0
- package/dist/esm/src/components/LoadingIndicator/LoadingIndicator.js.map +1 -0
- package/dist/esm/src/components/Menu/GenericMenu.js +19 -0
- package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -0
- package/dist/esm/src/components/Menu/MenuToggle.js +75 -0
- package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -0
- package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js +96 -0
- package/dist/esm/src/components/NoiseCancellation/NoiseCancellationProvider.js.map +1 -0
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +23 -0
- package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/Notification.js +31 -0
- package/dist/esm/src/components/Notification/Notification.js.map +1 -0
- package/dist/esm/src/components/Notification/PermissionNotification.js +32 -0
- package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +23 -0
- package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -0
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +14 -0
- package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -0
- package/dist/esm/src/components/Permissions/PermissionRequests.js +99 -0
- package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -0
- package/dist/esm/src/components/Reaction/Reaction.js +32 -0
- package/dist/esm/src/components/Reaction/Reaction.js.map +1 -0
- package/dist/esm/src/components/RingingCall/RingingCall.js +48 -0
- package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -0
- package/dist/esm/src/components/RingingCall/RingingCallControls.js +34 -0
- package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -0
- package/dist/esm/src/components/Search/SearchInput.js +27 -0
- package/dist/esm/src/components/Search/SearchInput.js.map +1 -0
- package/dist/esm/src/components/Search/SearchResults.js +15 -0
- package/dist/esm/src/components/Search/SearchResults.js.map +1 -0
- package/dist/esm/src/components/Search/hooks/useSearch.js +38 -0
- package/dist/esm/src/components/Search/hooks/useSearch.js.map +1 -0
- package/dist/esm/src/components/StreamTheme/StreamTheme.js +9 -0
- package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -0
- package/dist/esm/src/components/Tooltip/Tooltip.js +29 -0
- package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/src/components/Tooltip/WithTooltip.js +15 -0
- package/dist/esm/src/components/Tooltip/WithTooltip.js.map +1 -0
- package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js +17 -0
- package/dist/esm/src/components/Tooltip/hooks/useEnterLeaveHandlers.js.map +1 -0
- package/dist/esm/src/components/VideoPreview/VideoPreview.js +37 -0
- package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -0
- package/dist/esm/src/core/components/Audio/Audio.js +22 -0
- package/dist/esm/src/core/components/Audio/Audio.js.map +1 -0
- package/dist/esm/src/core/components/Audio/ParticipantsAudio.js +23 -0
- package/dist/esm/src/core/components/Audio/ParticipantsAudio.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +150 -0
- package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +79 -0
- package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +80 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js +13 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Host.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +57 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/index.js +8 -0
- package/dist/esm/src/core/components/CallLayout/PipLayout/index.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +103 -0
- package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -0
- package/dist/esm/src/core/components/CallLayout/hooks.js +62 -0
- package/dist/esm/src/core/components/CallLayout/hooks.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +94 -0
- package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +97 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantView.js +65 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantView.js.map +1 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js +7 -0
- package/dist/esm/src/core/components/ParticipantView/ParticipantViewContext.js.map +1 -0
- package/dist/esm/src/core/components/StreamCall/StreamCall.js +8 -0
- package/dist/esm/src/core/components/StreamCall/StreamCall.js.map +1 -0
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +11 -0
- package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -0
- package/dist/esm/src/core/components/Video/BaseVideo.js +41 -0
- package/dist/esm/src/core/components/Video/BaseVideo.js.map +1 -0
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +21 -0
- package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +12 -0
- package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +12 -0
- package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -0
- package/dist/esm/src/core/components/Video/Video.js +88 -0
- package/dist/esm/src/core/components/Video/Video.js.map +1 -0
- package/dist/esm/src/core/hooks/useCalculateHardLimit.js +59 -0
- package/dist/esm/src/core/hooks/useCalculateHardLimit.js.map +1 -0
- package/dist/esm/src/core/hooks/usePictureInPictureState.js +24 -0
- package/dist/esm/src/core/hooks/usePictureInPictureState.js.map +1 -0
- package/dist/esm/src/core/hooks/useTrackElementVisibility.js +14 -0
- package/dist/esm/src/core/hooks/useTrackElementVisibility.js.map +1 -0
- package/dist/esm/src/embedded/EmbeddedClientProvider.js +83 -0
- package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -0
- package/dist/esm/src/embedded/call/CallControls.js +65 -0
- package/dist/esm/src/embedded/call/CallControls.js.map +1 -0
- package/dist/esm/src/embedded/call/CallHeader.js +57 -0
- package/dist/esm/src/embedded/call/CallHeader.js.map +1 -0
- package/dist/esm/src/embedded/call/CallLayout.js +63 -0
- package/dist/esm/src/embedded/call/CallLayout.js.map +1 -0
- package/dist/esm/src/embedded/call/CallStateRouter.js +87 -0
- package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/call/EmbeddedCall.js +12 -0
- package/dist/esm/src/embedded/call/EmbeddedCall.js.map +1 -0
- package/dist/esm/src/embedded/context/ConfigurationContext.js +21 -0
- package/dist/esm/src/embedded/context/ConfigurationContext.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useCallDuration.js +32 -0
- package/dist/esm/src/embedded/hooks/useCallDuration.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useEmbeddedClient.js +40 -0
- package/dist/esm/src/embedded/hooks/useEmbeddedClient.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useInitializeCall.js +39 -0
- package/dist/esm/src/embedded/hooks/useInitializeCall.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js +93 -0
- package/dist/esm/src/embedded/hooks/useInitializeVideoClient.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js +42 -0
- package/dist/esm/src/embedded/hooks/useIsLivestreamPaused.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useLayout.js +122 -0
- package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js +48 -0
- package/dist/esm/src/embedded/hooks/useNoiseCancellationLoader.js.map +1 -0
- package/dist/esm/src/embedded/hooks/useWakeLock.js +34 -0
- package/dist/esm/src/embedded/hooks/useWakeLock.js.map +1 -0
- package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js +11 -0
- package/dist/esm/src/embedded/livestream/EmbeddedLivestream.js.map +1 -0
- package/dist/esm/src/embedded/livestream/LivestreamUI.js +17 -0
- package/dist/esm/src/embedded/livestream/LivestreamUI.js.map +1 -0
- package/dist/esm/src/embedded/livestream/host/HostLayout.js +76 -0
- package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -0
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +110 -0
- package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +74 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +109 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +105 -0
- package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -0
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +65 -0
- package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +34 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js +35 -0
- package/dist/esm/src/embedded/shared/CallFeedback/CallFeedback.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +18 -0
- package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +37 -0
- package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -0
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +34 -0
- package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -0
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +56 -0
- package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -0
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +42 -0
- package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -0
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js +34 -0
- package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +44 -0
- package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +31 -0
- package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js +45 -0
- package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +40 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +41 -0
- package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -0
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +50 -0
- package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -0
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +31 -0
- package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -0
- package/dist/esm/src/hooks/useDeviceList.js +40 -0
- package/dist/esm/src/hooks/useDeviceList.js.map +1 -0
- package/dist/esm/src/hooks/useDragToScroll.js +116 -0
- package/dist/esm/src/hooks/useDragToScroll.js.map +1 -0
- package/dist/esm/src/hooks/useFloatingUIPreset.js +34 -0
- package/dist/esm/src/hooks/useFloatingUIPreset.js.map +1 -0
- package/dist/esm/src/hooks/useLoopbackRecording.js +138 -0
- package/dist/esm/src/hooks/useLoopbackRecording.js.map +1 -0
- package/dist/esm/src/hooks/useModeration.js +135 -0
- package/dist/esm/src/hooks/useModeration.js.map +1 -0
- package/dist/esm/src/hooks/usePersistedDevicePreferences.js +16 -0
- package/dist/esm/src/hooks/usePersistedDevicePreferences.js.map +1 -0
- package/dist/esm/src/hooks/useRequestPermission.js +41 -0
- package/dist/esm/src/hooks/useRequestPermission.js.map +1 -0
- package/dist/esm/src/hooks/useScrollPosition.js +66 -0
- package/dist/esm/src/hooks/useScrollPosition.js.map +1 -0
- package/dist/esm/src/translations/en.json.js +177 -0
- package/dist/esm/src/translations/en.json.js.map +1 -0
- package/dist/esm/src/translations/index.js +6 -0
- package/dist/esm/src/translations/index.js.map +1 -0
- package/dist/esm/src/utilities/applyElementToRef.js +10 -0
- package/dist/esm/src/utilities/applyElementToRef.js.map +1 -0
- package/dist/esm/src/utilities/callControlHandler.js +29 -0
- package/dist/esm/src/utilities/callControlHandler.js.map +1 -0
- package/dist/esm/src/utilities/chunk.js +7 -0
- package/dist/esm/src/utilities/chunk.js.map +1 -0
- package/dist/esm/src/utilities/filter.js +94 -0
- package/dist/esm/src/utilities/filter.js.map +1 -0
- package/dist/esm/src/utilities/isComponentType.js +10 -0
- package/dist/esm/src/utilities/isComponentType.js.map +1 -0
- package/dist/esm/src/utilities/normalizeString.js +11 -0
- package/dist/esm/src/utilities/normalizeString.js.map +1 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +105 -0
- package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -0
- package/dist/index.cjs.js +138 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/src/hooks/index.d.ts +1 -0
- package/dist/src/hooks/useLoopbackRecording.d.ts +23 -0
- package/dist/src/hooks/useRequestPermission.d.ts +2 -2
- package/index.ts +4 -0
- package/package.json +14 -10
- package/src/components/CallControls/ScreenShareButton.tsx +5 -2
- package/src/components/CallControls/ToggleAudioButton.tsx +6 -2
- package/src/components/CallControls/ToggleVideoButton.tsx +6 -2
- package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +16 -12
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useLoopbackRecording.ts +207 -0
- package/src/hooks/useRequestPermission.ts +4 -2
- package/dist/background-filters-D2U5UBbH.es.js.map +0 -1
- package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js +0 -420
- package/dist/embedded-BackgroundFilters-D2U5UBbH.es.js.map +0 -1
- package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js +0 -57
- package/dist/embedded-CallStatsLatencyChart-Bj5OSYzg.es.js.map +0 -1
- package/dist/embedded.es.js +0 -3536
- package/dist/embedded.es.js.map +0 -1
- package/dist/index.es.js +0 -3291
- package/dist/index.es.js.map +0 -1
- 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";
|
|
@@ -1193,7 +1325,7 @@ const ScreenShareButton = (props) => {
|
|
|
1193
1325
|
const { caption, optimisticUpdates } = props;
|
|
1194
1326
|
const { useHasOngoingScreenShare, useScreenShareState, useCallSettings } = videoReactBindings.useCallStateHooks();
|
|
1195
1327
|
const isSomeoneScreenSharing = useHasOngoingScreenShare();
|
|
1196
|
-
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.
|
|
1328
|
+
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.RequestPermissionRequestPermissionsEnum.SCREENSHARE);
|
|
1197
1329
|
const callSettings = useCallSettings();
|
|
1198
1330
|
const isScreenSharingAllowed = callSettings?.screensharing.enabled;
|
|
1199
1331
|
const { screenShare, optionsAwareIsMute, isTogglePending } = useScreenShareState({
|
|
@@ -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.
|
|
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;
|
|
@@ -1542,7 +1674,7 @@ const ToggleAudioPreviewButton = (props) => {
|
|
|
1542
1674
|
const ToggleAudioPublishingButton = (props) => {
|
|
1543
1675
|
const { t } = videoReactBindings.useI18n();
|
|
1544
1676
|
const { caption, Menu = jsxRuntime.jsx(DeviceSelectorAudioInput, { visualType: "list" }), menuPlacement = 'top', onMenuToggle, optimisticUpdates, ...restCompositeButtonProps } = props;
|
|
1545
|
-
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.
|
|
1677
|
+
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.RequestPermissionRequestPermissionsEnum.SEND_AUDIO);
|
|
1546
1678
|
const { useMicrophoneState, useLocalParticipant } = videoReactBindings.useCallStateHooks();
|
|
1547
1679
|
const { microphone, hasBrowserPermission, isPromptingPermission, isTogglePending, optionsAwareIsMute, } = useMicrophoneState({ optimisticUpdates });
|
|
1548
1680
|
const localParticipant = useLocalParticipant();
|
|
@@ -1594,7 +1726,7 @@ const ToggleVideoPreviewButton = (props) => {
|
|
|
1594
1726
|
const ToggleVideoPublishingButton = (props) => {
|
|
1595
1727
|
const { t } = videoReactBindings.useI18n();
|
|
1596
1728
|
const { caption, Menu = jsxRuntime.jsx(DeviceSelectorVideo, { visualType: "list" }), menuPlacement = 'top', onMenuToggle, optimisticUpdates, ...restCompositeButtonProps } = props;
|
|
1597
|
-
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.
|
|
1729
|
+
const { hasPermission, requestPermission, isAwaitingPermission } = useRequestPermission(videoClient.RequestPermissionRequestPermissionsEnum.SEND_VIDEO);
|
|
1598
1730
|
const { useCameraState, useCallSettings, useLocalParticipant } = videoReactBindings.useCallStateHooks();
|
|
1599
1731
|
const { camera, optionsAwareIsMute, hasBrowserPermission, isPromptingPermission, isTogglePending, } = useCameraState({ optimisticUpdates });
|
|
1600
1732
|
const localParticipant = useLocalParticipant();
|
|
@@ -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.
|
|
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;
|