@werxt/livekit-components-react 2.9.20
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/LICENSE +201 -0
- package/README.md +36 -0
- package/dist/assets/icons/CameraDisabledIcon.d.ts +11 -0
- package/dist/assets/icons/CameraDisabledIcon.d.ts.map +1 -0
- package/dist/assets/icons/CameraIcon.d.ts +11 -0
- package/dist/assets/icons/CameraIcon.d.ts.map +1 -0
- package/dist/assets/icons/ChatCloseIcon.d.ts +11 -0
- package/dist/assets/icons/ChatCloseIcon.d.ts.map +1 -0
- package/dist/assets/icons/ChatIcon.d.ts +11 -0
- package/dist/assets/icons/ChatIcon.d.ts.map +1 -0
- package/dist/assets/icons/Chevron.d.ts +11 -0
- package/dist/assets/icons/Chevron.d.ts.map +1 -0
- package/dist/assets/icons/FocusToggleIcon.d.ts +11 -0
- package/dist/assets/icons/FocusToggleIcon.d.ts.map +1 -0
- package/dist/assets/icons/GearIcon.d.ts +11 -0
- package/dist/assets/icons/GearIcon.d.ts.map +1 -0
- package/dist/assets/icons/LeaveIcon.d.ts +11 -0
- package/dist/assets/icons/LeaveIcon.d.ts.map +1 -0
- package/dist/assets/icons/LockLockedIcon.d.ts +11 -0
- package/dist/assets/icons/LockLockedIcon.d.ts.map +1 -0
- package/dist/assets/icons/MicDisabledIcon.d.ts +11 -0
- package/dist/assets/icons/MicDisabledIcon.d.ts.map +1 -0
- package/dist/assets/icons/MicIcon.d.ts +11 -0
- package/dist/assets/icons/MicIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityExcellentIcon.d.ts +11 -0
- package/dist/assets/icons/QualityExcellentIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityGoodIcon.d.ts +11 -0
- package/dist/assets/icons/QualityGoodIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityPoorIcon.d.ts +11 -0
- package/dist/assets/icons/QualityPoorIcon.d.ts.map +1 -0
- package/dist/assets/icons/QualityUnknownIcon.d.ts +11 -0
- package/dist/assets/icons/QualityUnknownIcon.d.ts.map +1 -0
- package/dist/assets/icons/ScreenShareIcon.d.ts +11 -0
- package/dist/assets/icons/ScreenShareIcon.d.ts.map +1 -0
- package/dist/assets/icons/ScreenShareStopIcon.d.ts +11 -0
- package/dist/assets/icons/ScreenShareStopIcon.d.ts.map +1 -0
- package/dist/assets/icons/SpinnerIcon.d.ts +11 -0
- package/dist/assets/icons/SpinnerIcon.d.ts.map +1 -0
- package/dist/assets/icons/UnfocusToggleIcon.d.ts +11 -0
- package/dist/assets/icons/UnfocusToggleIcon.d.ts.map +1 -0
- package/dist/assets/icons/index.d.ts +20 -0
- package/dist/assets/icons/index.d.ts.map +1 -0
- package/dist/assets/icons/util.d.ts +11 -0
- package/dist/assets/icons/util.d.ts.map +1 -0
- package/dist/assets/images/ParticipantPlaceholder.d.ts +11 -0
- package/dist/assets/images/ParticipantPlaceholder.d.ts.map +1 -0
- package/dist/assets/images/index.d.ts +2 -0
- package/dist/assets/images/index.d.ts.map +1 -0
- package/dist/components/ChatEntry.d.ts +35 -0
- package/dist/components/ChatEntry.d.ts.map +1 -0
- package/dist/components/ConnectionState.d.ts +23 -0
- package/dist/components/ConnectionState.d.ts.map +1 -0
- package/dist/components/ConnectionStateToast.d.ts +13 -0
- package/dist/components/ConnectionStateToast.d.ts.map +1 -0
- package/dist/components/LiveKitRoom.d.ts +92 -0
- package/dist/components/LiveKitRoom.d.ts.map +1 -0
- package/dist/components/ParticipantLoop.d.ts +28 -0
- package/dist/components/ParticipantLoop.d.ts.map +1 -0
- package/dist/components/RoomAudioRenderer.d.ts +29 -0
- package/dist/components/RoomAudioRenderer.d.ts.map +1 -0
- package/dist/components/RoomName.d.ts +20 -0
- package/dist/components/RoomName.d.ts.map +1 -0
- package/dist/components/SessionProvider.d.ts +13 -0
- package/dist/components/SessionProvider.d.ts.map +1 -0
- package/dist/components/Toast.d.ts +14 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/TrackLoop.d.ts +26 -0
- package/dist/components/TrackLoop.d.ts.map +1 -0
- package/dist/components/controls/ChatToggle.d.ts +19 -0
- package/dist/components/controls/ChatToggle.d.ts.map +1 -0
- package/dist/components/controls/ClearPinButton.d.ts +20 -0
- package/dist/components/controls/ClearPinButton.d.ts.map +1 -0
- package/dist/components/controls/DisconnectButton.d.ts +19 -0
- package/dist/components/controls/DisconnectButton.d.ts.map +1 -0
- package/dist/components/controls/FocusToggle.d.ts +21 -0
- package/dist/components/controls/FocusToggle.d.ts.map +1 -0
- package/dist/components/controls/MediaDeviceSelect.d.ts +40 -0
- package/dist/components/controls/MediaDeviceSelect.d.ts.map +1 -0
- package/dist/components/controls/PaginationControl.d.ts +9 -0
- package/dist/components/controls/PaginationControl.d.ts.map +1 -0
- package/dist/components/controls/PaginationIndicator.d.ts +7 -0
- package/dist/components/controls/PaginationIndicator.d.ts.map +1 -0
- package/dist/components/controls/SettingsMenuToggle.d.ts +13 -0
- package/dist/components/controls/SettingsMenuToggle.d.ts.map +1 -0
- package/dist/components/controls/StartAudio.d.ts +24 -0
- package/dist/components/controls/StartAudio.d.ts.map +1 -0
- package/dist/components/controls/StartMediaButton.d.ts +22 -0
- package/dist/components/controls/StartMediaButton.d.ts.map +1 -0
- package/dist/components/controls/TrackToggle.d.ts +32 -0
- package/dist/components/controls/TrackToggle.d.ts.map +1 -0
- package/dist/components/index.d.ts +30 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/layout/CarouselLayout.d.ts +27 -0
- package/dist/components/layout/CarouselLayout.d.ts.map +1 -0
- package/dist/components/layout/FocusLayout.d.ts +25 -0
- package/dist/components/layout/FocusLayout.d.ts.map +1 -0
- package/dist/components/layout/GridLayout.d.ts +26 -0
- package/dist/components/layout/GridLayout.d.ts.map +1 -0
- package/dist/components/layout/LayoutContextProvider.d.ts +12 -0
- package/dist/components/layout/LayoutContextProvider.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +4 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/participant/AudioTrack.d.ts +33 -0
- package/dist/components/participant/AudioTrack.d.ts.map +1 -0
- package/dist/components/participant/AudioVisualizer.d.ts +22 -0
- package/dist/components/participant/AudioVisualizer.d.ts.map +1 -0
- package/dist/components/participant/BarVisualizer.d.ts +77 -0
- package/dist/components/participant/BarVisualizer.d.ts.map +1 -0
- package/dist/components/participant/ConnectionQualityIndicator.d.ts +16 -0
- package/dist/components/participant/ConnectionQualityIndicator.d.ts.map +1 -0
- package/dist/components/participant/ParticipantAudioTile.d.ts +14 -0
- package/dist/components/participant/ParticipantAudioTile.d.ts.map +1 -0
- package/dist/components/participant/ParticipantName.d.ts +17 -0
- package/dist/components/participant/ParticipantName.d.ts.map +1 -0
- package/dist/components/participant/ParticipantTile.d.ts +49 -0
- package/dist/components/participant/ParticipantTile.d.ts.map +1 -0
- package/dist/components/participant/TrackMutedIndicator.d.ts +19 -0
- package/dist/components/participant/TrackMutedIndicator.d.ts.map +1 -0
- package/dist/components/participant/VideoTrack.d.ts +23 -0
- package/dist/components/participant/VideoTrack.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/connectingSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/connectingSequence.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/listeningSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/listeningSequence.d.ts.map +1 -0
- package/dist/components/participant/animationSequences/thinkingSequence.d.ts +2 -0
- package/dist/components/participant/animationSequences/thinkingSequence.d.ts.map +1 -0
- package/dist/components/participant/animators/useBarAnimator.d.ts +3 -0
- package/dist/components/participant/animators/useBarAnimator.d.ts.map +1 -0
- package/dist/components-lNrIMTWQ.mjs +1051 -0
- package/dist/components-lNrIMTWQ.mjs.map +1 -0
- package/dist/context/chat-context.d.ts +23 -0
- package/dist/context/chat-context.d.ts.map +1 -0
- package/dist/context/feature-context.d.ts +14 -0
- package/dist/context/feature-context.d.ts.map +1 -0
- package/dist/context/index.d.ts +10 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/layout-context.d.ts +32 -0
- package/dist/context/layout-context.d.ts.map +1 -0
- package/dist/context/participant-context.d.ts +22 -0
- package/dist/context/participant-context.d.ts.map +1 -0
- package/dist/context/pin-context.d.ts +17 -0
- package/dist/context/pin-context.d.ts.map +1 -0
- package/dist/context/room-context.d.ts +22 -0
- package/dist/context/room-context.d.ts.map +1 -0
- package/dist/context/session-context.d.ts +22 -0
- package/dist/context/session-context.d.ts.map +1 -0
- package/dist/context/track-reference-context.d.ts +25 -0
- package/dist/context/track-reference-context.d.ts.map +1 -0
- package/dist/contexts-D4V9wQRc.mjs +4026 -0
- package/dist/contexts-D4V9wQRc.mjs.map +1 -0
- package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts +42 -0
- package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +54 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/internal/index.d.ts +10 -0
- package/dist/hooks/internal/index.d.ts.map +1 -0
- package/dist/hooks/internal/useMediaQuery.d.ts +7 -0
- package/dist/hooks/internal/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/internal/useObservableState.d.ts +6 -0
- package/dist/hooks/internal/useObservableState.d.ts.map +1 -0
- package/dist/hooks/internal/useResizeObserver.d.ts +14 -0
- package/dist/hooks/internal/useResizeObserver.d.ts.map +1 -0
- package/dist/hooks/useAgent.d.ts +219 -0
- package/dist/hooks/useAgent.d.ts.map +1 -0
- package/dist/hooks/useAudioPlayback.d.ts +15 -0
- package/dist/hooks/useAudioPlayback.d.ts.map +1 -0
- package/dist/hooks/useChat.d.ts +43 -0
- package/dist/hooks/useChat.d.ts.map +1 -0
- package/dist/hooks/useChatToggle.d.ts +21 -0
- package/dist/hooks/useChatToggle.d.ts.map +1 -0
- package/dist/hooks/useClearPinButton.d.ts +15 -0
- package/dist/hooks/useClearPinButton.d.ts.map +1 -0
- package/dist/hooks/useConnectionQualityIndicator.d.ts +20 -0
- package/dist/hooks/useConnectionQualityIndicator.d.ts.map +1 -0
- package/dist/hooks/useConnectionStatus.d.ts +12 -0
- package/dist/hooks/useConnectionStatus.d.ts.map +1 -0
- package/dist/hooks/useDataChannel.d.ts +38 -0
- package/dist/hooks/useDataChannel.d.ts.map +1 -0
- package/dist/hooks/useDisconnectButton.d.ts +21 -0
- package/dist/hooks/useDisconnectButton.d.ts.map +1 -0
- package/dist/hooks/useEvents.d.ts +9 -0
- package/dist/hooks/useEvents.d.ts.map +1 -0
- package/dist/hooks/useFacingMode.d.ts +10 -0
- package/dist/hooks/useFacingMode.d.ts.map +1 -0
- package/dist/hooks/useFocusToggle.d.ts +26 -0
- package/dist/hooks/useFocusToggle.d.ts.map +1 -0
- package/dist/hooks/useGridLayout.d.ts +27 -0
- package/dist/hooks/useGridLayout.d.ts.map +1 -0
- package/dist/hooks/useIsEncrypted.d.ts +12 -0
- package/dist/hooks/useIsEncrypted.d.ts.map +1 -0
- package/dist/hooks/useIsMuted.d.ts +22 -0
- package/dist/hooks/useIsMuted.d.ts.map +1 -0
- package/dist/hooks/useIsRecording.d.ts +11 -0
- package/dist/hooks/useIsRecording.d.ts.map +1 -0
- package/dist/hooks/useIsSpeaking.d.ts +11 -0
- package/dist/hooks/useIsSpeaking.d.ts.map +1 -0
- package/dist/hooks/useLiveKitRoom.d.ts +19 -0
- package/dist/hooks/useLiveKitRoom.d.ts.map +1 -0
- package/dist/hooks/useLocalParticipant.d.ts +29 -0
- package/dist/hooks/useLocalParticipant.d.ts.map +1 -0
- package/dist/hooks/useLocalParticipantPermissions.d.ts +12 -0
- package/dist/hooks/useLocalParticipantPermissions.d.ts.map +1 -0
- package/dist/hooks/useMediaDeviceSelect.d.ts +41 -0
- package/dist/hooks/useMediaDeviceSelect.d.ts.map +1 -0
- package/dist/hooks/useMediaDevices.d.ts +15 -0
- package/dist/hooks/useMediaDevices.d.ts.map +1 -0
- package/dist/hooks/useMediaTrackBySourceOrName.d.ts +18 -0
- package/dist/hooks/useMediaTrackBySourceOrName.d.ts.map +1 -0
- package/dist/hooks/usePagination.d.ts +24 -0
- package/dist/hooks/usePagination.d.ts.map +1 -0
- package/dist/hooks/useParticipantAttributes.d.ts +30 -0
- package/dist/hooks/useParticipantAttributes.d.ts.map +1 -0
- package/dist/hooks/useParticipantInfo.d.ts +21 -0
- package/dist/hooks/useParticipantInfo.d.ts.map +1 -0
- package/dist/hooks/useParticipantPermissions.d.ts +17 -0
- package/dist/hooks/useParticipantPermissions.d.ts.map +1 -0
- package/dist/hooks/useParticipantTile.d.ts +22 -0
- package/dist/hooks/useParticipantTile.d.ts.map +1 -0
- package/dist/hooks/useParticipantTracks.d.ts +14 -0
- package/dist/hooks/useParticipantTracks.d.ts.map +1 -0
- package/dist/hooks/useParticipants.d.ts +30 -0
- package/dist/hooks/useParticipants.d.ts.map +1 -0
- package/dist/hooks/usePersistentUserChoices.d.ts +35 -0
- package/dist/hooks/usePersistentUserChoices.d.ts.map +1 -0
- package/dist/hooks/usePinnedTracks.d.ts +14 -0
- package/dist/hooks/usePinnedTracks.d.ts.map +1 -0
- package/dist/hooks/useRemoteParticipant.d.ts +35 -0
- package/dist/hooks/useRemoteParticipant.d.ts.map +1 -0
- package/dist/hooks/useRemoteParticipants.d.ts +30 -0
- package/dist/hooks/useRemoteParticipants.d.ts.map +1 -0
- package/dist/hooks/useRoomInfo.d.ts +21 -0
- package/dist/hooks/useRoomInfo.d.ts.map +1 -0
- package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts +27 -0
- package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts.map +1 -0
- package/dist/hooks/useSession.d.ts +130 -0
- package/dist/hooks/useSession.d.ts.map +1 -0
- package/dist/hooks/useSessionMessages.d.ts +29 -0
- package/dist/hooks/useSessionMessages.d.ts.map +1 -0
- package/dist/hooks/useSettingsToggle.d.ts +20 -0
- package/dist/hooks/useSettingsToggle.d.ts.map +1 -0
- package/dist/hooks/useSortedParticipants.d.ts +7 -0
- package/dist/hooks/useSortedParticipants.d.ts.map +1 -0
- package/dist/hooks/useSpeakingParticipants.d.ts +16 -0
- package/dist/hooks/useSpeakingParticipants.d.ts.map +1 -0
- package/dist/hooks/useStartAudio.d.ts +27 -0
- package/dist/hooks/useStartAudio.d.ts.map +1 -0
- package/dist/hooks/useStartVideo.d.ts +26 -0
- package/dist/hooks/useStartVideo.d.ts.map +1 -0
- package/dist/hooks/useSwipe.d.ts +24 -0
- package/dist/hooks/useSwipe.d.ts.map +1 -0
- package/dist/hooks/useTextStream.d.ts +20 -0
- package/dist/hooks/useTextStream.d.ts.map +1 -0
- package/dist/hooks/useToken.d.ts +20 -0
- package/dist/hooks/useToken.d.ts.map +1 -0
- package/dist/hooks/useTrack.d.ts +4 -0
- package/dist/hooks/useTrack.d.ts.map +1 -0
- package/dist/hooks/useTrackByName.d.ts +10 -0
- package/dist/hooks/useTrackByName.d.ts.map +1 -0
- package/dist/hooks/useTrackMutedIndicator.d.ts +18 -0
- package/dist/hooks/useTrackMutedIndicator.d.ts.map +1 -0
- package/dist/hooks/useTrackRefBySourceOrName.d.ts +7 -0
- package/dist/hooks/useTrackRefBySourceOrName.d.ts.map +1 -0
- package/dist/hooks/useTrackSyncTime.d.ts +10 -0
- package/dist/hooks/useTrackSyncTime.d.ts.map +1 -0
- package/dist/hooks/useTrackToggle.d.ts +27 -0
- package/dist/hooks/useTrackToggle.d.ts.map +1 -0
- package/dist/hooks/useTrackTranscription.d.ts +26 -0
- package/dist/hooks/useTrackTranscription.d.ts.map +1 -0
- package/dist/hooks/useTrackVolume.d.ts +49 -0
- package/dist/hooks/useTrackVolume.d.ts.map +1 -0
- package/dist/hooks/useTracks.d.ts +29 -0
- package/dist/hooks/useTracks.d.ts.map +1 -0
- package/dist/hooks/useTranscriptions.d.ts +21 -0
- package/dist/hooks/useTranscriptions.d.ts.map +1 -0
- package/dist/hooks/useVisualStableUpdate.d.ts +27 -0
- package/dist/hooks/useVisualStableUpdate.d.ts.map +1 -0
- package/dist/hooks/useVoiceAssistant.d.ts +43 -0
- package/dist/hooks/useVoiceAssistant.d.ts.map +1 -0
- package/dist/hooks/useWarnAboutMissingStyles.d.ts +5 -0
- package/dist/hooks/useWarnAboutMissingStyles.d.ts.map +1 -0
- package/dist/hooks-hQJmeINB.mjs +1992 -0
- package/dist/hooks-hQJmeINB.mjs.map +1 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.js +2 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.mjs +64 -0
- package/dist/hooks.mjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.docs.d.ts +6 -0
- package/dist/index.docs.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +157 -0
- package/dist/index.mjs.map +1 -0
- package/dist/krisp.d.ts +2 -0
- package/dist/krisp.js +2 -0
- package/dist/krisp.js.map +1 -0
- package/dist/krisp.mjs +45 -0
- package/dist/krisp.mjs.map +1 -0
- package/dist/mergeProps.d.ts +25 -0
- package/dist/mergeProps.d.ts.map +1 -0
- package/dist/prefabs/AudioConference.d.ts +22 -0
- package/dist/prefabs/AudioConference.d.ts.map +1 -0
- package/dist/prefabs/Chat.d.ts +35 -0
- package/dist/prefabs/Chat.d.ts.map +1 -0
- package/dist/prefabs/ControlBar.d.ts +45 -0
- package/dist/prefabs/ControlBar.d.ts.map +1 -0
- package/dist/prefabs/MediaDeviceMenu.d.ts +36 -0
- package/dist/prefabs/MediaDeviceMenu.d.ts.map +1 -0
- package/dist/prefabs/PreJoin.d.ts +59 -0
- package/dist/prefabs/PreJoin.d.ts.map +1 -0
- package/dist/prefabs/VideoConference.d.ts +35 -0
- package/dist/prefabs/VideoConference.d.ts.map +1 -0
- package/dist/prefabs/VoiceAssistantControlBar.d.ts +32 -0
- package/dist/prefabs/VoiceAssistantControlBar.d.ts.map +1 -0
- package/dist/prefabs/index.d.ts +8 -0
- package/dist/prefabs/index.d.ts.map +1 -0
- package/dist/prefabs.d.ts +2 -0
- package/dist/prefabs.js +2 -0
- package/dist/prefabs.js.map +1 -0
- package/dist/prefabs.mjs +579 -0
- package/dist/prefabs.mjs.map +1 -0
- package/dist/room-BP3SCCCd.mjs +191 -0
- package/dist/room-BP3SCCCd.mjs.map +1 -0
- package/dist/shared-88J2fzv7.js +2 -0
- package/dist/shared-88J2fzv7.js.map +1 -0
- package/dist/shared-BDr0qLg4.js +4 -0
- package/dist/shared-BDr0qLg4.js.map +1 -0
- package/dist/shared-CjI_UuOX.js +2 -0
- package/dist/shared-CjI_UuOX.js.map +1 -0
- package/dist/shared-DTHOl3uJ.js +2 -0
- package/dist/shared-DTHOl3uJ.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +104 -0
- package/src/assets/icons/CameraDisabledIcon.tsx +15 -0
- package/src/assets/icons/CameraIcon.tsx +14 -0
- package/src/assets/icons/ChatCloseIcon.tsx +17 -0
- package/src/assets/icons/ChatIcon.tsx +25 -0
- package/src/assets/icons/Chevron.tsx +19 -0
- package/src/assets/icons/FocusToggleIcon.tsx +16 -0
- package/src/assets/icons/GearIcon.tsx +19 -0
- package/src/assets/icons/LeaveIcon.tsx +25 -0
- package/src/assets/icons/LockLockedIcon.tsx +19 -0
- package/src/assets/icons/MicDisabledIcon.tsx +15 -0
- package/src/assets/icons/MicIcon.tsx +19 -0
- package/src/assets/icons/QualityExcellentIcon.tsx +15 -0
- package/src/assets/icons/QualityGoodIcon.tsx +19 -0
- package/src/assets/icons/QualityPoorIcon.tsx +20 -0
- package/src/assets/icons/QualityUnknownIcon.tsx +17 -0
- package/src/assets/icons/ScreenShareIcon.tsx +25 -0
- package/src/assets/icons/ScreenShareStopIcon.tsx +21 -0
- package/src/assets/icons/SpinnerIcon.tsx +93 -0
- package/src/assets/icons/UnfocusToggleIcon.tsx +16 -0
- package/src/assets/icons/index.ts +19 -0
- package/src/assets/icons/util.tsx +47 -0
- package/src/assets/images/ParticipantPlaceholder.tsx +31 -0
- package/src/assets/images/index.ts +1 -0
- package/src/assets/template.js +21 -0
- package/src/components/ChatEntry.tsx +112 -0
- package/src/components/ConnectionState.tsx +36 -0
- package/src/components/ConnectionStateToast.tsx +47 -0
- package/src/components/LiveKitRoom.tsx +122 -0
- package/src/components/ParticipantLoop.tsx +41 -0
- package/src/components/RoomAudioRenderer.tsx +57 -0
- package/src/components/RoomName.tsx +36 -0
- package/src/components/SessionProvider.tsx +22 -0
- package/src/components/Toast.tsx +18 -0
- package/src/components/TrackLoop.tsx +45 -0
- package/src/components/controls/ChatToggle.tsx +32 -0
- package/src/components/controls/ClearPinButton.tsx +32 -0
- package/src/components/controls/DisconnectButton.tsx +32 -0
- package/src/components/controls/FocusToggle.tsx +54 -0
- package/src/components/controls/MediaDeviceSelect.tsx +144 -0
- package/src/components/controls/PaginationControl.tsx +51 -0
- package/src/components/controls/PaginationIndicator.tsx +26 -0
- package/src/components/controls/SettingsMenuToggle.tsx +26 -0
- package/src/components/controls/StartAudio.tsx +40 -0
- package/src/components/controls/StartMediaButton.tsx +41 -0
- package/src/components/controls/TrackToggle.tsx +54 -0
- package/src/components/index.ts +34 -0
- package/src/components/layout/CarouselLayout.tsx +80 -0
- package/src/components/layout/FocusLayout.tsx +37 -0
- package/src/components/layout/GridLayout.tsx +63 -0
- package/src/components/layout/LayoutContextProvider.tsx +36 -0
- package/src/components/layout/index.ts +3 -0
- package/src/components/participant/AudioTrack.tsx +89 -0
- package/src/components/participant/AudioVisualizer.tsx +67 -0
- package/src/components/participant/BarVisualizer.tsx +164 -0
- package/src/components/participant/ConnectionQualityIndicator.tsx +36 -0
- package/src/components/participant/ParticipantAudioTile.tsx +67 -0
- package/src/components/participant/ParticipantName.tsx +50 -0
- package/src/components/participant/ParticipantTile.tsx +192 -0
- package/src/components/participant/TrackMutedIndicator.tsx +53 -0
- package/src/components/participant/VideoTrack.tsx +92 -0
- package/src/components/participant/animationSequences/connectingSequence.ts +9 -0
- package/src/components/participant/animationSequences/listeningSequence.ts +6 -0
- package/src/components/participant/animationSequences/thinkingSequence.ts +12 -0
- package/src/components/participant/animators/useBarAnimator.ts +55 -0
- package/src/context/chat-context.ts +37 -0
- package/src/context/feature-context.ts +28 -0
- package/src/context/index.ts +27 -0
- package/src/context/layout-context.ts +72 -0
- package/src/context/participant-context.ts +44 -0
- package/src/context/pin-context.ts +27 -0
- package/src/context/room-context.ts +42 -0
- package/src/context/session-context.ts +43 -0
- package/src/context/track-reference-context.ts +47 -0
- package/src/hooks/cloud/krisp/useKrispNoiseFilter.ts +110 -0
- package/src/hooks/index.ts +72 -0
- package/src/hooks/internal/index.ts +10 -0
- package/src/hooks/internal/useMediaQuery.ts +46 -0
- package/src/hooks/internal/useObservableState.ts +24 -0
- package/src/hooks/internal/useResizeObserver.ts +124 -0
- package/src/hooks/useAgent.ts +945 -0
- package/src/hooks/useAudioPlayback.ts +34 -0
- package/src/hooks/useChat.ts +57 -0
- package/src/hooks/useChatToggle.ts +38 -0
- package/src/hooks/useClearPinButton.ts +29 -0
- package/src/hooks/useConnectionQualityIndicator.ts +33 -0
- package/src/hooks/useConnectionStatus.ts +22 -0
- package/src/hooks/useDataChannel.ts +73 -0
- package/src/hooks/useDisconnectButton.ts +36 -0
- package/src/hooks/useEvents.ts +39 -0
- package/src/hooks/useFacingMode.ts +22 -0
- package/src/hooks/useFocusToggle.ts +59 -0
- package/src/hooks/useGridLayout.ts +44 -0
- package/src/hooks/useIsEncrypted.ts +29 -0
- package/src/hooks/useIsMuted.ts +51 -0
- package/src/hooks/useIsRecording.ts +23 -0
- package/src/hooks/useIsSpeaking.ts +21 -0
- package/src/hooks/useLiveKitRoom.ts +186 -0
- package/src/hooks/useLocalParticipant.ts +73 -0
- package/src/hooks/useLocalParticipantPermissions.ts +24 -0
- package/src/hooks/useMediaDeviceSelect.ts +81 -0
- package/src/hooks/useMediaDevices.ts +28 -0
- package/src/hooks/useMediaTrackBySourceOrName.ts +97 -0
- package/src/hooks/usePagination.test.ts +77 -0
- package/src/hooks/usePagination.ts +67 -0
- package/src/hooks/useParticipantAttributes.ts +69 -0
- package/src/hooks/useParticipantInfo.ts +35 -0
- package/src/hooks/useParticipantPermissions.ts +29 -0
- package/src/hooks/useParticipantTile.ts +81 -0
- package/src/hooks/useParticipantTracks.ts +54 -0
- package/src/hooks/useParticipants.ts +42 -0
- package/src/hooks/usePersistentUserChoices.ts +64 -0
- package/src/hooks/usePinnedTracks.ts +24 -0
- package/src/hooks/useRemoteParticipant.ts +79 -0
- package/src/hooks/useRemoteParticipants.ts +45 -0
- package/src/hooks/useRoomInfo.ts +32 -0
- package/src/hooks/useSequentialRoomConnectDisconnect.ts +171 -0
- package/src/hooks/useSession.ts +642 -0
- package/src/hooks/useSessionMessages.ts +158 -0
- package/src/hooks/useSettingsToggle.ts +32 -0
- package/src/hooks/useSortedParticipants.ts +20 -0
- package/src/hooks/useSpeakingParticipants.ts +27 -0
- package/src/hooks/useStartAudio.ts +50 -0
- package/src/hooks/useStartVideo.ts +49 -0
- package/src/hooks/useSwipe.ts +68 -0
- package/src/hooks/useTextStream.ts +35 -0
- package/src/hooks/useToken.ts +54 -0
- package/src/hooks/useTrack.ts +11 -0
- package/src/hooks/useTrackByName.ts +15 -0
- package/src/hooks/useTrackMutedIndicator.ts +44 -0
- package/src/hooks/useTrackRefBySourceOrName.ts +30 -0
- package/src/hooks/useTrackSyncTime.ts +18 -0
- package/src/hooks/useTrackToggle.ts +93 -0
- package/src/hooks/useTrackTranscription.ts +75 -0
- package/src/hooks/useTrackVolume.ts +283 -0
- package/src/hooks/useTracks.test.ts +60 -0
- package/src/hooks/useTracks.ts +154 -0
- package/src/hooks/useTranscriptions.ts +48 -0
- package/src/hooks/useVisualStableUpdate.ts +63 -0
- package/src/hooks/useVoiceAssistant.ts +109 -0
- package/src/hooks/useWarnAboutMissingStyles.ts +11 -0
- package/src/index.docs.ts +12 -0
- package/src/index.ts +32 -0
- package/src/mergeProps.ts +87 -0
- package/src/prefabs/AudioConference.tsx +57 -0
- package/src/prefabs/Chat.tsx +153 -0
- package/src/prefabs/ControlBar.tsx +227 -0
- package/src/prefabs/MediaDeviceMenu.tsx +159 -0
- package/src/prefabs/PreJoin.tsx +439 -0
- package/src/prefabs/VideoConference.tsx +184 -0
- package/src/prefabs/VoiceAssistantControlBar.tsx +109 -0
- package/src/prefabs/index.ts +11 -0
- package/src/utils.ts +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefabs.mjs","sources":["../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n * return (\n * <LiveKitRoom data-lk-theme=\"default\">\n * <Chat />\n * </LiveKitRoom>\n * );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n messageFormatter,\n messageDecoder,\n messageEncoder,\n channelTopic,\n ...props\n}: ChatProps) {\n const ulRef = React.useRef<HTMLUListElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const chatOptions: ChatOptions = React.useMemo(() => {\n return { messageDecoder, messageEncoder, channelTopic };\n }, [messageDecoder, messageEncoder, channelTopic]);\n\n const { chatMessages, send, isSending } = useChat(chatOptions);\n\n const layoutContext = useMaybeLayoutContext();\n const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n async function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (inputRef.current && inputRef.current.value.trim() !== '') {\n await send(inputRef.current.value);\n inputRef.current.value = '';\n inputRef.current.focus();\n }\n }\n\n React.useEffect(() => {\n if (ulRef) {\n ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n }\n }, [ulRef, chatMessages]);\n\n React.useEffect(() => {\n if (!layoutContext || chatMessages.length === 0) {\n return;\n }\n\n if (\n layoutContext.widget.state?.showChat &&\n chatMessages.length > 0 &&\n lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n ) {\n lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n return;\n }\n\n const unreadMessageCount = chatMessages.filter(\n (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n ).length;\n\n const { widget } = layoutContext;\n if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n }\n }, [chatMessages, layoutContext?.widget]);\n\n return (\n <div {...props} className=\"lk-chat\">\n <div className=\"lk-chat-header\">\n Messages\n {layoutContext && (\n <ChatToggle className=\"lk-close-button\">\n <ChatCloseIcon />\n </ChatToggle>\n )}\n </div>\n\n <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n {props.children\n ? chatMessages.map((msg, idx) =>\n cloneSingleChild(props.children, {\n entry: msg,\n key: msg.id ?? idx,\n messageFormatter,\n }),\n )\n : chatMessages.map((msg, idx, allMsg) => {\n const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n // If the time delta between two messages is bigger than 60s show timestamp.\n const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n return (\n <ChatEntry\n key={msg.id ?? idx}\n hideName={hideName}\n hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n entry={msg}\n messageFormatter={messageFormatter}\n />\n );\n })}\n </ul>\n <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n <input\n className=\"lk-form-control lk-chat-form-input\"\n disabled={isSending}\n ref={inputRef}\n type=\"text\"\n placeholder=\"Enter a message...\"\n onInput={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n onKeyUp={(ev) => ev.stopPropagation()}\n />\n <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n Send\n </button>\n </form>\n </div>\n );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n kind?: MediaDeviceKind;\n initialSelection?: string;\n onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\n tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link PreJoin}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n kind,\n initialSelection,\n onActiveDeviceChange,\n tracks,\n requestPermissions = false,\n ...props\n}: MediaDeviceMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n log.debug('handle device change');\n setIsOpen(false);\n onActiveDeviceChange?.(kind, deviceId);\n };\n\n const button = React.useRef<HTMLButtonElement>(null);\n const tooltip = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isOpen) {\n setNeedPermissions(true);\n }\n }, [isOpen]);\n\n React.useLayoutEffect(() => {\n let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n if (button.current && tooltip.current && (devices || updateRequired)) {\n cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n if (tooltip.current) {\n Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n }\n });\n }\n setUpdateRequired(false);\n return () => {\n cleanup?.();\n };\n }, [button, tooltip, devices, updateRequired]);\n\n const handleClickOutside = React.useCallback(\n (event: MouseEvent) => {\n if (!tooltip.current) {\n return;\n }\n if (event.target === button.current) {\n return;\n }\n if (isOpen && wasClickOutside(tooltip.current, event)) {\n setIsOpen(false);\n }\n },\n [isOpen, tooltip, button],\n );\n\n React.useEffect(() => {\n document.addEventListener<'click'>('click', handleClickOutside);\n return () => {\n document.removeEventListener<'click'>('click', handleClickOutside);\n };\n }, [handleClickOutside]);\n\n return (\n <>\n <button\n className=\"lk-button lk-button-menu\"\n aria-pressed={isOpen}\n {...props}\n onClick={() => setIsOpen(!isOpen)}\n ref={button}\n >\n {props.children}\n </button>\n {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n {!props.disabled && (\n <div\n className=\"lk-device-menu\"\n ref={tooltip}\n style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n >\n {kind ? (\n <MediaDeviceSelect\n initialSelection={initialSelection}\n onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n onDeviceListChange={setDevices}\n kind={kind}\n track={tracks?.[kind]}\n requestPermissions={needPermissions}\n />\n ) : (\n <>\n <div className=\"lk-device-menu-heading\">Audio inputs</div>\n <MediaDeviceSelect\n kind=\"audioinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('audioinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.audioinput}\n requestPermissions={needPermissions}\n />\n <div className=\"lk-device-menu-heading\">Video inputs</div>\n <MediaDeviceSelect\n kind=\"videoinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('videoinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.videoinput}\n requestPermissions={needPermissions}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n React.useEffect(() => {\n warnAboutMissingStyles();\n }, []);\n}\n","import type {\n CreateLocalTracksOptions,\n LocalAudioTrack,\n LocalVideoTrack,\n TrackProcessor,\n} from 'livekit-client';\nimport {\n createLocalAudioTrack,\n createLocalTracks,\n createLocalVideoTrack,\n facingModeFromLocalTrack,\n Track,\n VideoPresets,\n Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n /** This function is called with the `LocalUserChoices` if validation is passed. */\n onSubmit?: (values: LocalUserChoices) => void;\n /**\n * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n */\n onValidate?: (values: LocalUserChoices) => boolean;\n onError?: (error: Error) => void;\n /** Prefill the input form with initial values. */\n defaults?: Partial<LocalUserChoices>;\n /** Display a debug window for your convenience. */\n debug?: boolean;\n joinLabel?: string;\n micLabel?: string;\n camLabel?: string;\n userLabel?: string;\n /**\n * If true, user choices are persisted across sessions.\n * @defaultValue true\n * @alpha\n */\n persistUserChoices?: boolean;\n videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n options: CreateLocalTracksOptions,\n onError?: (err: Error) => void,\n) {\n const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n const trackLock = React.useMemo(() => new Mutex(), []);\n\n React.useEffect(() => {\n let needsCleanup = false;\n let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n trackLock.lock().then(async (unlock) => {\n try {\n if (options.audio || options.video) {\n localTracks = (await createLocalTracks(options)) as Array<\n LocalAudioTrack | LocalVideoTrack\n >;\n\n if (needsCleanup) {\n localTracks.forEach((tr) => tr.stop());\n } else {\n setTracks(localTracks);\n }\n }\n } catch (e: unknown) {\n if (onError && e instanceof Error) {\n onError(e);\n } else {\n log.error(e);\n }\n } finally {\n unlock();\n }\n });\n\n return () => {\n needsCleanup = true;\n localTracks.forEach((track) => {\n track.stop();\n });\n };\n }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n enabled: boolean,\n deviceId: string,\n kind: 'videoinput' | 'audioinput',\n) {\n const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n const devices = useMediaDevices({ kind });\n const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n undefined,\n );\n\n const [localTrack, setLocalTrack] = React.useState<T>();\n const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n React.useEffect(() => {\n setLocalDeviceId(deviceId);\n }, [deviceId]);\n\n const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n try {\n const track =\n kind === 'videoinput'\n ? await createLocalVideoTrack({\n deviceId,\n resolution: VideoPresets.h720.resolution,\n })\n : await createLocalAudioTrack({ deviceId });\n\n const newDeviceId = await track.getDeviceId(false);\n if (newDeviceId && deviceId !== newDeviceId) {\n prevDeviceId.current = newDeviceId;\n setLocalDeviceId(newDeviceId);\n }\n setLocalTrack(track as T);\n } catch (e) {\n if (e instanceof Error) {\n setDeviceError(e);\n }\n }\n };\n\n const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n await track.setDeviceId(id);\n prevDeviceId.current = id;\n };\n\n const prevDeviceId = React.useRef(localDeviceId);\n\n React.useEffect(() => {\n if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n log.debug('creating track', kind);\n setIsCreatingTrack(true);\n createTrack(localDeviceId, kind).finally(() => {\n setIsCreatingTrack(false);\n });\n }\n }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n // switch camera device\n React.useEffect(() => {\n if (!localTrack) {\n return;\n }\n if (!enabled) {\n log.debug(`muting ${kind} track`);\n localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n switchDevice(localTrack, selectedDevice.deviceId);\n } else {\n log.debug(`unmuting local ${kind} track`);\n localTrack.unmute();\n }\n }, [localTrack, selectedDevice, enabled, kind]);\n\n React.useEffect(() => {\n return () => {\n if (localTrack) {\n log.debug(`stopping local ${kind} track`);\n localTrack.stop();\n localTrack.mute();\n }\n };\n }, []);\n\n React.useEffect(() => {\n setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n }, [localDeviceId, devices]);\n\n return {\n selectedDevice,\n localTrack,\n deviceError,\n };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n defaults = {},\n onValidate,\n onSubmit,\n onError,\n debug,\n joinLabel = 'Join Room',\n micLabel = 'Microphone',\n camLabel = 'Camera',\n userLabel = 'Username',\n persistUserChoices = true,\n videoProcessor,\n ...htmlProps\n}: PreJoinProps) {\n const {\n userChoices: initialUserChoices,\n saveAudioInputDeviceId,\n saveAudioInputEnabled,\n saveVideoInputDeviceId,\n saveVideoInputEnabled,\n saveUsername,\n } = usePersistentUserChoices({\n defaults,\n preventSave: !persistUserChoices,\n preventLoad: !persistUserChoices,\n });\n\n const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n // Initialize device settings\n const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n const [username, setUsername] = React.useState(userChoices.username);\n\n // Save user choices to persistent storage.\n React.useEffect(() => {\n saveAudioInputEnabled(audioEnabled);\n }, [audioEnabled, saveAudioInputEnabled]);\n React.useEffect(() => {\n saveVideoInputEnabled(videoEnabled);\n }, [videoEnabled, saveVideoInputEnabled]);\n React.useEffect(() => {\n saveAudioInputDeviceId(audioDeviceId);\n }, [audioDeviceId, saveAudioInputDeviceId]);\n React.useEffect(() => {\n saveVideoInputDeviceId(videoDeviceId);\n }, [videoDeviceId, saveVideoInputDeviceId]);\n React.useEffect(() => {\n saveUsername(username);\n }, [username, saveUsername]);\n\n const tracks = usePreviewTracks(\n {\n audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n video: videoEnabled\n ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n : false,\n },\n onError,\n );\n\n const videoEl = React.useRef(null);\n\n const videoTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n [tracks],\n );\n\n const facingMode = React.useMemo(() => {\n if (videoTrack) {\n const { facingMode } = facingModeFromLocalTrack(videoTrack);\n return facingMode;\n } else {\n return 'undefined';\n }\n }, [videoTrack]);\n\n const audioTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n [tracks],\n );\n\n React.useEffect(() => {\n if (videoEl.current && videoTrack) {\n videoTrack.unmute();\n videoTrack.attach(videoEl.current);\n }\n\n return () => {\n videoTrack?.detach();\n };\n }, [videoTrack]);\n\n const [isValid, setIsValid] = React.useState<boolean>();\n\n const handleValidation = React.useCallback(\n (values: LocalUserChoices) => {\n if (typeof onValidate === 'function') {\n return onValidate(values);\n } else {\n return values.username !== '';\n }\n },\n [onValidate],\n );\n\n React.useEffect(() => {\n const newUserChoices = {\n username,\n videoEnabled,\n videoDeviceId,\n audioEnabled,\n audioDeviceId,\n };\n setUserChoices(newUserChoices);\n setIsValid(handleValidation(newUserChoices));\n }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (handleValidation(userChoices)) {\n if (typeof onSubmit === 'function') {\n onSubmit(userChoices);\n }\n } else {\n log.warn('Validation failed with: ', userChoices);\n }\n }\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-prejoin\" {...htmlProps}>\n <div className=\"lk-video-container\">\n {videoTrack && (\n <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n )}\n {(!videoTrack || !videoEnabled) && (\n <div className=\"lk-camera-off-note\">\n <ParticipantPlaceholder />\n </div>\n )}\n </div>\n <div className=\"lk-button-group-container\">\n <div className=\"lk-button-group audio\">\n <TrackToggle\n initialState={audioEnabled}\n source={Track.Source.Microphone}\n onChange={(enabled) => setAudioEnabled(enabled)}\n >\n {micLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={audioDeviceId}\n kind=\"audioinput\"\n disabled={!audioTrack}\n tracks={{ audioinput: audioTrack }}\n onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n />\n </div>\n </div>\n <div className=\"lk-button-group video\">\n <TrackToggle\n initialState={videoEnabled}\n source={Track.Source.Camera}\n onChange={(enabled) => setVideoEnabled(enabled)}\n >\n {camLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={videoDeviceId}\n kind=\"videoinput\"\n disabled={!videoTrack}\n tracks={{ videoinput: videoTrack }}\n onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n />\n </div>\n </div>\n </div>\n\n <form className=\"lk-username-container\">\n <input\n className=\"lk-form-control\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n defaultValue={username}\n placeholder={userLabel}\n onChange={(inputEl) => setUsername(inputEl.target.value)}\n autoComplete=\"off\"\n />\n <button\n className=\"lk-button lk-join-button\"\n type=\"submit\"\n onClick={handleSubmit}\n disabled={!isValid}\n >\n {joinLabel}\n </button>\n </form>\n\n {debug && (\n <>\n <strong>User Choices:</strong>\n <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n <li>Username: {`${userChoices.username}`}</li>\n <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n </ul>\n </>\n )}\n </div>\n );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const className = 'lk-button lk-settings-toggle';\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_settings' });\n },\n 'aria-pressed': state?.showSettings ? 'true' : 'false',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n const { mergedProps } = useSettingsToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n microphone?: boolean;\n camera?: boolean;\n chat?: boolean;\n screenShare?: boolean;\n leave?: boolean;\n settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n switch (source) {\n case Track.Source.Camera:\n return 1;\n case Track.Source.Microphone:\n return 2;\n case Track.Source.ScreenShare:\n return 3;\n default:\n return 0;\n }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n variation?: 'minimal' | 'verbose' | 'textOnly';\n controls?: ControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enable the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n * @alpha\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n variation,\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: ControlBarProps) {\n const [isChatOpen, setIsChatOpen] = React.useState(false);\n const layoutContext = useMaybeLayoutContext();\n React.useEffect(() => {\n if (layoutContext?.widget.state?.showChat !== undefined) {\n setIsChatOpen(layoutContext?.widget.state?.showChat);\n }\n }, [layoutContext?.widget.state?.showChat]);\n const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n variation ??= defaultVariation;\n\n const visibleControls = { leave: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n\n if (!localPermissions) {\n visibleControls.camera = false;\n visibleControls.chat = false;\n visibleControls.microphone = false;\n visibleControls.screenShare = false;\n } else {\n const canPublishSource = (source: Track.Source) => {\n return (\n localPermissions.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n );\n };\n visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n }\n\n const showIcon = React.useMemo(\n () => variation === 'minimal' || variation === 'verbose',\n [variation],\n );\n const showText = React.useMemo(\n () => variation === 'textOnly' || variation === 'verbose',\n [variation],\n );\n\n const browserSupportsScreenSharing = supportsScreenSharing();\n\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n const onScreenShareChange = React.useCallback(\n (enabled: boolean) => {\n setIsScreenShareEnabled(enabled);\n },\n [setIsScreenShareEnabled],\n );\n\n const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n [saveAudioInputEnabled],\n );\n\n const cameraOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n [saveVideoInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={showIcon}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n {showText && 'Microphone'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.camera && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Camera}\n showIcon={showIcon}\n onChange={cameraOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n >\n {showText && 'Camera'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"videoinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveVideoInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.screenShare && browserSupportsScreenSharing && (\n <TrackToggle\n source={Track.Source.ScreenShare}\n captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n showIcon={showIcon}\n onChange={onScreenShareChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n >\n {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n </TrackToggle>\n )}\n {visibleControls.chat && (\n <ChatToggle>\n {showIcon && <ChatIcon />}\n {showText && 'Chat'}\n </ChatToggle>\n )}\n {visibleControls.settings && (\n <SettingsMenuToggle>\n {showIcon && <GearIcon />}\n {showText && 'Settings'}\n </SettingsMenuToggle>\n )}\n {visibleControls.leave && (\n <DisconnectButton>\n {showIcon && <LeaveIcon />}\n {showText && 'Leave'}\n </DisconnectButton>\n )}\n <StartMediaButton />\n </div>\n );\n}\n","import type {\n MessageDecoder,\n MessageEncoder,\n TrackReferenceOrPlaceholder,\n WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n CarouselLayout,\n ConnectionStateToast,\n FocusLayout,\n FocusLayoutContainer,\n GridLayout,\n LayoutContextProvider,\n ParticipantTile,\n RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar, type ControlBarProps } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n chatMessageFormatter?: MessageFormatter;\n chatMessageEncoder?: MessageEncoder;\n chatMessageDecoder?: MessageDecoder;\n /** @alpha */\n SettingsComponent?: React.ComponentType;\n controlBarProops?: Partial<ControlBarProps>;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n chatMessageFormatter,\n chatMessageDecoder,\n chatMessageEncoder,\n SettingsComponent,\n controlBarProops = {},\n ...props\n}: VideoConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n showSettings: false,\n });\n const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n const tracks = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n );\n\n const widgetUpdate = (state: WidgetState) => {\n log.debug('updating widget state', state);\n setWidgetState(state);\n };\n\n const layoutContext = useCreateLayoutContext();\n\n const screenShareTracks = tracks\n .filter(isTrackReference)\n .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n const focusTrack = usePinnedTracks(layoutContext)?.[0];\n const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n React.useEffect(() => {\n // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n if (\n screenShareTracks.some((track) => track.publication.isSubscribed) &&\n lastAutoFocusedScreenShareTrack.current === null\n ) {\n log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n } else if (\n lastAutoFocusedScreenShareTrack.current &&\n !screenShareTracks.some(\n (track) =>\n track.publication.trackSid ===\n lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n )\n ) {\n log.debug('Auto clearing screen share focus.');\n layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n lastAutoFocusedScreenShareTrack.current = null;\n }\n if (focusTrack && !isTrackReference(focusTrack)) {\n const updatedFocusTrack = tracks.find(\n (tr) =>\n tr.participant.identity === focusTrack.participant.identity &&\n tr.source === focusTrack.source,\n );\n if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n }\n }\n }, [\n screenShareTracks\n .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n .join(),\n focusTrack?.publication?.trackSid,\n tracks,\n ]);\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-video-conference\" {...props}>\n {isWeb() && (\n <LayoutContextProvider\n value={layoutContext}\n // onPinChange={handleFocusStateChange}\n onWidgetChange={widgetUpdate}\n >\n <div className=\"lk-video-conference-inner\">\n {!focusTrack ? (\n <div className=\"lk-grid-layout-wrapper\">\n <GridLayout tracks={tracks}>\n <ParticipantTile />\n </GridLayout>\n </div>\n ) : (\n <div className=\"lk-focus-layout-wrapper\">\n <FocusLayoutContainer>\n <CarouselLayout tracks={carouselTracks}>\n <ParticipantTile />\n </CarouselLayout>\n {focusTrack && <FocusLayout trackRef={focusTrack} />}\n </FocusLayoutContainer>\n </div>\n )}\n <ControlBar\n controls={{ chat: true, settings: !!SettingsComponent, ...controlBarProops }}\n />\n </div>\n <Chat\n style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n messageFormatter={chatMessageFormatter}\n messageEncoder={chatMessageEncoder}\n messageDecoder={chatMessageDecoder}\n />\n {SettingsComponent && (\n <div\n className=\"lk-settings-menu-modal\"\n style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n >\n <SettingsComponent />\n </div>\n )}\n </LayoutContextProvider>\n )}\n <RoomAudioRenderer />\n <ConnectionStateToast />\n </div>\n );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n });\n\n const audioTracks = useTracks([Track.Source.Microphone]);\n\n useWarnAboutMissingStyles();\n\n return (\n <LayoutContextProvider onWidgetChange={setWidgetState}>\n <div className=\"lk-audio-conference\" {...props}>\n <div className=\"lk-audio-conference-stage\">\n <TrackLoop tracks={audioTracks}>\n <ParticipantAudioTile />\n </TrackLoop>\n </div>\n <ControlBar\n controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n />\n {widgetState.showChat && <Chat />}\n </div>\n </LayoutContextProvider>\n );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n useLocalParticipant,\n useLocalParticipantPermissions,\n usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n microphone?: boolean;\n leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n controls?: VoiceAssistantControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enables the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n * <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: VoiceAssistantControlBarProps) {\n const visibleControls = { leave: true, microphone: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n return {\n participant: localParticipant,\n source: Track.Source.Microphone,\n publication: microphoneTrack,\n };\n }, [localParticipant, microphoneTrack]);\n\n if (!localPermissions) {\n visibleControls.microphone = false;\n } else {\n visibleControls.microphone ??= localPermissions.canPublish;\n }\n\n const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) {\n saveAudioInputEnabled(enabled);\n }\n },\n [saveAudioInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={true}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n\n {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n <StartMediaButton />\n </div>\n );\n}\n"],"names":["Chat","messageFormatter","messageDecoder","messageEncoder","channelTopic","props","ulRef","React","inputRef","chatOptions","chatMessages","send","isSending","useChat","layoutContext","useMaybeLayoutContext","lastReadMsgAt","handleSubmit","event","_a","_b","_c","unreadMessageCount","msg","widget","_d","_e","ChatToggle","ChatCloseIcon","idx","cloneSingleChild","allMsg","hideName","hideTimestamp","ChatEntry","ev","MediaDeviceMenu","kind","initialSelection","onActiveDeviceChange","tracks","requestPermissions","isOpen","setIsOpen","devices","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","handleActiveDeviceChange","deviceId","log","button","tooltip","cleanup","computeMenuPosition","x","y","handleClickOutside","wasClickOutside","MediaDeviceSelect","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","options","onError","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","e","track","roomOptionsStringifyReplacer","usePreviewDevice","enabled","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","htmlProps","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","Track","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","ParticipantPlaceholder","TrackToggle","_","inputEl","useSettingsToggle","dispatch","state","useLayoutContext","className","mergeProps","SettingsMenuToggle","ref","mergedProps","trackSourceToProtocol","source","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","useMediaQuery","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showIcon","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","DisconnectButton","LeaveIcon","StartMediaButton","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","controlBarProops","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","useTracks","RoomEvent","widgetUpdate","useCreateLayoutContext","screenShareTracks","isTrackReference","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","LayoutContextProvider","FocusLayoutContainer","CarouselLayout","ParticipantTile","FocusLayout","GridLayout","RoomAudioRenderer","ConnectionStateToast","AudioConference","audioTracks","TrackLoop","ParticipantAudioTile","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef","BarVisualizer"],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as i from "react";
|
|
2
|
+
import { l as u, s as x, R as V, L as j } from "./contexts-D4V9wQRc.mjs";
|
|
3
|
+
import { Room as U, RoomEvent as l, MediaDeviceFailure as _ } from "livekit-client";
|
|
4
|
+
function L(n) {
|
|
5
|
+
var e, o, t = "";
|
|
6
|
+
if (typeof n == "string" || typeof n == "number") t += n;
|
|
7
|
+
else if (typeof n == "object") if (Array.isArray(n)) {
|
|
8
|
+
var r = n.length;
|
|
9
|
+
for (e = 0; e < r; e++) n[e] && (o = L(n[e])) && (t && (t += " "), t += o);
|
|
10
|
+
} else for (o in n) n[o] && (t && (t += " "), t += o);
|
|
11
|
+
return t;
|
|
12
|
+
}
|
|
13
|
+
function A() {
|
|
14
|
+
for (var n, e, o = 0, t = "", r = arguments.length; o < r; o++) (n = arguments[o]) && (e = L(n)) && (t && (t += " "), t += e);
|
|
15
|
+
return t;
|
|
16
|
+
}
|
|
17
|
+
function I(...n) {
|
|
18
|
+
return (...e) => {
|
|
19
|
+
for (const o of n)
|
|
20
|
+
if (typeof o == "function")
|
|
21
|
+
try {
|
|
22
|
+
o(...e);
|
|
23
|
+
} catch (t) {
|
|
24
|
+
console.error(t);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function M(...n) {
|
|
29
|
+
const e = { ...n[0] };
|
|
30
|
+
for (let o = 1; o < n.length; o++) {
|
|
31
|
+
const t = n[o];
|
|
32
|
+
for (const r in t) {
|
|
33
|
+
const d = e[r], a = t[r];
|
|
34
|
+
typeof d == "function" && typeof a == "function" && // This is a lot faster than a regex.
|
|
35
|
+
r[0] === "o" && r[1] === "n" && r.charCodeAt(2) >= /* 'A' */
|
|
36
|
+
65 && r.charCodeAt(2) <= /* 'Z' */
|
|
37
|
+
90 ? e[r] = I(d, a) : (r === "className" || r === "UNSAFE_className") && typeof d == "string" && typeof a == "string" ? e[r] = A(d, a) : e[r] = a !== void 0 ? a : d;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return e;
|
|
41
|
+
}
|
|
42
|
+
function J(n) {
|
|
43
|
+
return n !== void 0;
|
|
44
|
+
}
|
|
45
|
+
function G(...n) {
|
|
46
|
+
return M(...n.filter(J));
|
|
47
|
+
}
|
|
48
|
+
function H(n, e, o) {
|
|
49
|
+
return i.Children.map(n, (t) => i.isValidElement(t) && i.Children.only(n) ? (t.props.className && (e ?? (e = {}), e.className = A(t.props.className, e.className), e.style = { ...t.props.style, ...e.style }), i.cloneElement(t, { ...e, key: o })) : t);
|
|
50
|
+
}
|
|
51
|
+
function Q(n) {
|
|
52
|
+
var e, o;
|
|
53
|
+
if (typeof window < "u" && typeof process < "u" && // eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
54
|
+
(((e = process == null ? void 0 : process.env) == null ? void 0 : e.NODE_ENV) === "dev" || // eslint-disable-next-line turbo/no-undeclared-env-vars
|
|
55
|
+
((o = process == null ? void 0 : process.env) == null ? void 0 : o.NODE_ENV) === "development")) {
|
|
56
|
+
const t = document.querySelector(".lk-room-container");
|
|
57
|
+
t && !getComputedStyle(t).getPropertyValue("--lk-has-imported-styles") && u.warn(
|
|
58
|
+
"It looks like you're not using the `@livekit/components-styles package`. To render the UI with the default styling, please import it in your layout or page."
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function T(n, e) {
|
|
63
|
+
return n === "processor" && e && typeof e == "object" && "name" in e ? e.name : n === "e2ee" && e ? "e2ee-enabled" : e;
|
|
64
|
+
}
|
|
65
|
+
const q = {
|
|
66
|
+
connect: !0,
|
|
67
|
+
audio: !1,
|
|
68
|
+
video: !1
|
|
69
|
+
};
|
|
70
|
+
function $(n) {
|
|
71
|
+
const {
|
|
72
|
+
token: e,
|
|
73
|
+
serverUrl: o,
|
|
74
|
+
options: t,
|
|
75
|
+
room: r,
|
|
76
|
+
connectOptions: d,
|
|
77
|
+
connect: a,
|
|
78
|
+
audio: p,
|
|
79
|
+
video: y,
|
|
80
|
+
screen: g,
|
|
81
|
+
onConnected: v,
|
|
82
|
+
onDisconnected: h,
|
|
83
|
+
onError: c,
|
|
84
|
+
onMediaDeviceFailure: b,
|
|
85
|
+
onEncryptionError: E,
|
|
86
|
+
simulateParticipants: w,
|
|
87
|
+
...N
|
|
88
|
+
} = { ...q, ...n };
|
|
89
|
+
t && r && u.warn(
|
|
90
|
+
"when using a manually created room, the options object will be ignored. set the desired options directly when creating the room instead."
|
|
91
|
+
);
|
|
92
|
+
const [s, O] = i.useState(), C = i.useRef(a);
|
|
93
|
+
i.useEffect(() => {
|
|
94
|
+
O(r ?? new U(t));
|
|
95
|
+
}, [r, JSON.stringify(t, T)]);
|
|
96
|
+
const F = i.useMemo(() => {
|
|
97
|
+
const { className: m } = x();
|
|
98
|
+
return M(N, { className: m });
|
|
99
|
+
}, [N]);
|
|
100
|
+
return i.useEffect(() => {
|
|
101
|
+
if (!s) return;
|
|
102
|
+
const m = () => {
|
|
103
|
+
const f = s.localParticipant;
|
|
104
|
+
u.debug("trying to publish local tracks"), Promise.all([
|
|
105
|
+
f.setMicrophoneEnabled(!!p, typeof p != "boolean" ? p : void 0),
|
|
106
|
+
f.setCameraEnabled(!!y, typeof y != "boolean" ? y : void 0),
|
|
107
|
+
f.setScreenShareEnabled(!!g, typeof g != "boolean" ? g : void 0)
|
|
108
|
+
]).catch((R) => {
|
|
109
|
+
u.warn(R), c == null || c(R);
|
|
110
|
+
});
|
|
111
|
+
}, P = (f, R) => {
|
|
112
|
+
const K = _.getFailure(f);
|
|
113
|
+
b == null || b(K, R);
|
|
114
|
+
}, S = (f) => {
|
|
115
|
+
E == null || E(f);
|
|
116
|
+
}, k = (f) => {
|
|
117
|
+
h == null || h(f);
|
|
118
|
+
}, D = () => {
|
|
119
|
+
v == null || v();
|
|
120
|
+
};
|
|
121
|
+
return s.on(l.SignalConnected, m).on(l.MediaDevicesError, P).on(l.EncryptionError, S).on(l.Disconnected, k).on(l.Connected, D), () => {
|
|
122
|
+
s.off(l.SignalConnected, m).off(l.MediaDevicesError, P).off(l.EncryptionError, S).off(l.Disconnected, k).off(l.Connected, D);
|
|
123
|
+
};
|
|
124
|
+
}, [
|
|
125
|
+
s,
|
|
126
|
+
p,
|
|
127
|
+
y,
|
|
128
|
+
g,
|
|
129
|
+
c,
|
|
130
|
+
E,
|
|
131
|
+
b,
|
|
132
|
+
v,
|
|
133
|
+
h
|
|
134
|
+
]), i.useEffect(() => {
|
|
135
|
+
if (s) {
|
|
136
|
+
if (w) {
|
|
137
|
+
s.simulateParticipants({
|
|
138
|
+
participants: {
|
|
139
|
+
count: w
|
|
140
|
+
},
|
|
141
|
+
publish: {
|
|
142
|
+
audio: !0,
|
|
143
|
+
useRealTracks: !0
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (a) {
|
|
149
|
+
if (C.current = !0, u.debug("connecting"), !e) {
|
|
150
|
+
u.debug("no token yet");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!o) {
|
|
154
|
+
u.warn("no livekit url provided"), c == null || c(Error("no livekit url provided"));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
s.connect(o, e, d).catch((m) => {
|
|
158
|
+
u.warn(m), C.current === !0 && (c == null || c(m));
|
|
159
|
+
});
|
|
160
|
+
} else
|
|
161
|
+
u.debug("disconnecting because connect is false"), C.current = !1, s.disconnect();
|
|
162
|
+
}
|
|
163
|
+
}, [
|
|
164
|
+
a,
|
|
165
|
+
e,
|
|
166
|
+
JSON.stringify(d),
|
|
167
|
+
s,
|
|
168
|
+
c,
|
|
169
|
+
o,
|
|
170
|
+
w
|
|
171
|
+
]), i.useEffect(() => {
|
|
172
|
+
if (s)
|
|
173
|
+
return () => {
|
|
174
|
+
u.info("disconnecting on onmount"), s.disconnect();
|
|
175
|
+
};
|
|
176
|
+
}, [s]), { room: s, htmlProps: F };
|
|
177
|
+
}
|
|
178
|
+
const W = /* @__PURE__ */ i.forwardRef(function(e, o) {
|
|
179
|
+
const { room: t, htmlProps: r } = $(e);
|
|
180
|
+
return /* @__PURE__ */ i.createElement("div", { ref: o, ...r }, t && /* @__PURE__ */ i.createElement(V.Provider, { value: t }, /* @__PURE__ */ i.createElement(j.Provider, { value: e.featureFlags }, e.children)));
|
|
181
|
+
});
|
|
182
|
+
export {
|
|
183
|
+
W as L,
|
|
184
|
+
G as a,
|
|
185
|
+
H as c,
|
|
186
|
+
M as m,
|
|
187
|
+
T as r,
|
|
188
|
+
$ as u,
|
|
189
|
+
Q as w
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=room-BP3SCCCd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-BP3SCCCd.mjs","sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/mergeProps.ts","../src/utils.ts","../src/hooks/useLiveKitRoom.ts","../src/components/LiveKitRoom.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport clsx from 'clsx';\n\n/**\n * Calls all functions in the order they were chained with the same arguments.\n * @internal\n */\nexport function chain(...callbacks: any[]): (...args: any[]) => void {\n return (...args: any[]) => {\n for (const callback of callbacks) {\n if (typeof callback === 'function') {\n try {\n callback(...args);\n } catch (e) {\n console.error(e);\n }\n }\n }\n };\n}\n\ninterface Props {\n [key: string]: any;\n}\n\n// taken from: https://stackoverflow.com/questions/51603250/typescript-3-parameter-list-intersection-type/51604379#51604379\ntype TupleTypes<T> = { [P in keyof T]: T[P] } extends { [key: number]: infer V } ? V : never;\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never;\n\n/**\n * Merges multiple props objects together. Event handlers are chained,\n * classNames are combined, and ids are deduplicated - different ids\n * will trigger a side-effect and re-render components hooked up with `useId`.\n * For all other props, the last prop object overrides all previous ones.\n * @param args - Multiple sets of props to merge together.\n * @internal\n */\nexport function mergeProps<T extends Props[]>(...args: T): UnionToIntersection<TupleTypes<T>> {\n // Start with a base clone of the first argument. This is a lot faster than starting\n // with an empty object and adding properties as we go.\n const result: Props = { ...args[0] };\n for (let i = 1; i < args.length; i++) {\n const props = args[i];\n for (const key in props) {\n const a = result[key];\n const b = props[key];\n\n // Chain events\n if (\n typeof a === 'function' &&\n typeof b === 'function' &&\n // This is a lot faster than a regex.\n key[0] === 'o' &&\n key[1] === 'n' &&\n key.charCodeAt(2) >= /* 'A' */ 65 &&\n key.charCodeAt(2) <= /* 'Z' */ 90\n ) {\n result[key] = chain(a, b);\n\n // Merge classnames, sometimes classNames are empty string which eval to false, so we just need to do a type check\n } else if (\n (key === 'className' || key === 'UNSAFE_className') &&\n typeof a === 'string' &&\n typeof b === 'string'\n ) {\n result[key] = clsx(a, b);\n } else {\n result[key] = b !== undefined ? b : a;\n }\n }\n }\n\n return result as UnionToIntersection<TupleTypes<T>>;\n}\n","import * as React from 'react';\nimport { mergeProps as mergePropsReactAria } from './mergeProps';\nimport { log } from '@livekit/components-core';\nimport clsx from 'clsx';\n\n/** @internal */\nexport function isProp<U extends HTMLElement, T extends React.HTMLAttributes<U>>(\n prop: T | undefined,\n): prop is T {\n return prop !== undefined;\n}\n\n/** @internal */\nexport function mergeProps<\n U extends HTMLElement,\n T extends Array<React.HTMLAttributes<U> | undefined>,\n>(...props: T) {\n return mergePropsReactAria(...props.filter(isProp));\n}\n\n/** @internal */\nexport function cloneSingleChild(\n children: React.ReactNode | React.ReactNode[],\n props?: Record<string, any>,\n key?: any,\n) {\n return React.Children.map(children, (child) => {\n // Checking isValidElement is the safe way and avoids a typescript\n // error too.\n if (React.isValidElement(child) && React.Children.only(children)) {\n if (child.props.className) {\n // make sure we retain classnames of both passed props and child\n props ??= {};\n props.className = clsx(child.props.className, props.className);\n props.style = { ...child.props.style, ...props.style };\n }\n return React.cloneElement(child, { ...props, key });\n }\n return child;\n });\n}\n\n/**\n * @internal\n */\nexport function warnAboutMissingStyles(el?: HTMLElement) {\n if (\n typeof window !== 'undefined' &&\n typeof process !== 'undefined' &&\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n (process?.env?.NODE_ENV === 'dev' ||\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n process?.env?.NODE_ENV === 'development')\n ) {\n const target = el ?? document.querySelector('.lk-room-container');\n if (target && !getComputedStyle(target).getPropertyValue('--lk-has-imported-styles')) {\n log.warn(\n \"It looks like you're not using the `@livekit/components-styles package`. To render the UI with the default styling, please import it in your layout or page.\",\n );\n }\n }\n}\n\n/**\n *\n * @internal\n * used to stringify room options to detect dependency changes for react hooks.\n * Replaces processors and e2ee options with strings.\n */\nexport function roomOptionsStringifyReplacer(key: string, val: unknown) {\n if (key === 'processor' && val && typeof val === 'object' && 'name' in val) {\n return val.name;\n }\n if (key === 'e2ee' && val) {\n return 'e2ee-enabled';\n }\n return val;\n}\n","import { log, setupLiveKitRoom } from '@livekit/components-core';\nimport type { DisconnectReason } from 'livekit-client';\nimport { Room, MediaDeviceFailure, RoomEvent } from 'livekit-client';\nimport * as React from 'react';\nimport type { HTMLAttributes } from 'react';\n\nimport type { LiveKitRoomProps } from '../components';\nimport { mergeProps } from '../mergeProps';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\nconst defaultRoomProps: Partial<LiveKitRoomProps> = {\n connect: true,\n audio: false,\n video: false,\n};\n\n/**\n * The `useLiveKitRoom` hook is used to implement the `LiveKitRoom` or your custom implementation of it.\n * It returns a `Room` instance and HTML props that should be applied to the root element of the component.\n *\n * @example\n * ```tsx\n * const { room, htmlProps } = useLiveKitRoom();\n * return <div {...htmlProps}>...</div>;\n * ```\n * @public\n */\nexport function useLiveKitRoom<T extends HTMLElement>(\n props: LiveKitRoomProps,\n): {\n room: Room | undefined;\n htmlProps: HTMLAttributes<T>;\n} {\n const {\n token,\n serverUrl,\n options,\n room: passedRoom,\n connectOptions,\n connect,\n audio,\n video,\n screen,\n onConnected,\n onDisconnected,\n onError,\n onMediaDeviceFailure,\n onEncryptionError,\n simulateParticipants,\n ...rest\n } = { ...defaultRoomProps, ...props };\n if (options && passedRoom) {\n log.warn(\n 'when using a manually created room, the options object will be ignored. set the desired options directly when creating the room instead.',\n );\n }\n\n const [room, setRoom] = React.useState<Room | undefined>();\n\n const shouldConnect = React.useRef(connect);\n\n React.useEffect(() => {\n setRoom(passedRoom ?? new Room(options));\n }, [passedRoom, JSON.stringify(options, roomOptionsStringifyReplacer)]);\n\n const htmlProps = React.useMemo(() => {\n const { className } = setupLiveKitRoom();\n return mergeProps(rest, { className }) as HTMLAttributes<T>;\n }, [rest]);\n\n React.useEffect(() => {\n if (!room) return;\n const onSignalConnected = () => {\n const localP = room.localParticipant;\n\n log.debug('trying to publish local tracks');\n Promise.all([\n localP.setMicrophoneEnabled(!!audio, typeof audio !== 'boolean' ? audio : undefined),\n localP.setCameraEnabled(!!video, typeof video !== 'boolean' ? video : undefined),\n localP.setScreenShareEnabled(!!screen, typeof screen !== 'boolean' ? screen : undefined),\n ]).catch((e) => {\n log.warn(e);\n onError?.(e as Error);\n });\n };\n\n const handleMediaDeviceError = (e: Error, kind?: MediaDeviceKind) => {\n const mediaDeviceFailure = MediaDeviceFailure.getFailure(e);\n onMediaDeviceFailure?.(mediaDeviceFailure, kind);\n };\n const handleEncryptionError = (e: Error) => {\n onEncryptionError?.(e);\n };\n const handleDisconnected = (reason?: DisconnectReason) => {\n onDisconnected?.(reason);\n };\n const handleConnected = () => {\n onConnected?.();\n };\n\n room\n .on(RoomEvent.SignalConnected, onSignalConnected)\n .on(RoomEvent.MediaDevicesError, handleMediaDeviceError)\n .on(RoomEvent.EncryptionError, handleEncryptionError)\n .on(RoomEvent.Disconnected, handleDisconnected)\n .on(RoomEvent.Connected, handleConnected);\n\n return () => {\n room\n .off(RoomEvent.SignalConnected, onSignalConnected)\n .off(RoomEvent.MediaDevicesError, handleMediaDeviceError)\n .off(RoomEvent.EncryptionError, handleEncryptionError)\n .off(RoomEvent.Disconnected, handleDisconnected)\n .off(RoomEvent.Connected, handleConnected);\n };\n }, [\n room,\n audio,\n video,\n screen,\n onError,\n onEncryptionError,\n onMediaDeviceFailure,\n onConnected,\n onDisconnected,\n ]);\n\n React.useEffect(() => {\n if (!room) return;\n\n if (simulateParticipants) {\n room.simulateParticipants({\n participants: {\n count: simulateParticipants,\n },\n publish: {\n audio: true,\n useRealTracks: true,\n },\n });\n return;\n }\n\n if (connect) {\n shouldConnect.current = true;\n log.debug('connecting');\n if (!token) {\n log.debug('no token yet');\n return;\n }\n if (!serverUrl) {\n log.warn('no livekit url provided');\n onError?.(Error('no livekit url provided'));\n return;\n }\n room.connect(serverUrl, token, connectOptions).catch((e) => {\n log.warn(e);\n if (shouldConnect.current === true) {\n onError?.(e as Error);\n }\n });\n } else {\n log.debug('disconnecting because connect is false');\n shouldConnect.current = false;\n room.disconnect();\n }\n }, [\n connect,\n token,\n JSON.stringify(connectOptions),\n room,\n onError,\n serverUrl,\n simulateParticipants,\n ]);\n\n React.useEffect(() => {\n if (!room) return;\n return () => {\n log.info('disconnecting on onmount');\n room.disconnect();\n };\n }, [room]);\n\n return { room, htmlProps };\n}\n","import type {\n AudioCaptureOptions,\n DisconnectReason,\n RoomConnectOptions,\n RoomOptions,\n ScreenShareCaptureOptions,\n VideoCaptureOptions,\n} from 'livekit-client';\nimport type { MediaDeviceFailure, Room } from 'livekit-client';\nimport * as React from 'react';\nimport { type FeatureFlags, LKFeatureContext, RoomContext } from '../context';\nimport { useLiveKitRoom } from '../hooks';\n\n/** @public */\nexport interface LiveKitRoomProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onError'> {\n /**\n * URL to the LiveKit server.\n * For example: `wss://<domain>.livekit.cloud`\n * To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string url can the connection be established.\n */\n serverUrl: string | undefined;\n /**\n * A user specific access token for a client to authenticate to the room.\n * This token is necessary to establish a connection to the room.\n * To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string token can the connection be established.\n *\n * @see https://docs.livekit.io/cloud/project-management/keys-and-tokens/#generating-access-tokens\n */\n token: string | undefined;\n /**\n * Publish audio immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/AudioCaptureOptions.html\n */\n audio?: AudioCaptureOptions | boolean;\n /**\n * Publish video immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/VideoCaptureOptions.html\n */\n video?: VideoCaptureOptions | boolean;\n /**\n * Publish screen share immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/ScreenShareCaptureOptions.html\n */\n screen?: ScreenShareCaptureOptions | boolean;\n /**\n * If set to true a connection to LiveKit room is initiated.\n * @defaultValue `true`\n */\n connect?: boolean;\n /**\n * Options for when creating a new room.\n * When you pass your own room instance to this component, these options have no effect.\n * Instead, set the options directly in the room instance.\n *\n * @see https://docs.livekit.io/client-sdk-js/interfaces/RoomOptions.html\n */\n options?: RoomOptions;\n /**\n * Define options how to connect to the LiveKit server.\n *\n * @see https://docs.livekit.io/client-sdk-js/interfaces/RoomConnectOptions.html\n */\n connectOptions?: RoomConnectOptions;\n onConnected?: () => void;\n onDisconnected?: (reason?: DisconnectReason) => void;\n onError?: (error: Error) => void;\n onMediaDeviceFailure?: (failure?: MediaDeviceFailure, kind?: MediaDeviceKind) => void;\n onEncryptionError?: (error: Error) => void;\n /**\n * Optional room instance.\n * By passing your own room instance you overwrite the `options` parameter,\n * make sure to set the options directly on the room instance itself.\n */\n room?: Room;\n\n simulateParticipants?: number | undefined;\n\n /**\n * @internal\n */\n featureFlags?: FeatureFlags;\n}\n\n/**\n * The `LiveKitRoom` component provides the room context to all its child components.\n * It is generally the starting point of your LiveKit app and the root of the LiveKit component tree.\n * It provides the room state as a React context to all child components, so you don't have to pass it yourself.\n *\n * @example\n * ```tsx\n * <LiveKitRoom\n * token='<livekit-token>'\n * serverUrl='<url-to-livekit-server>'\n * connect={true}\n * >\n * ...\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const LiveKitRoom: (\n props: React.PropsWithChildren<LiveKitRoomProps> & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<\n HTMLDivElement,\n React.PropsWithChildren<LiveKitRoomProps>\n>(function LiveKitRoom(props: React.PropsWithChildren<LiveKitRoomProps>, ref) {\n const { room, htmlProps } = useLiveKitRoom(props);\n return (\n <div ref={ref} {...htmlProps}>\n {room && (\n <RoomContext.Provider value={room}>\n <LKFeatureContext.Provider value={props.featureFlags}>\n {props.children}\n </LKFeatureContext.Provider>\n </RoomContext.Provider>\n )}\n </div>\n );\n});\n"],"names":["r","e","t","f","n","o","clsx","chain","callbacks","args","callback","mergeProps","result","i","props","key","a","b","isProp","prop","mergePropsReactAria","cloneSingleChild","children","React","child","warnAboutMissingStyles","el","_a","_b","target","log","roomOptionsStringifyReplacer","val","defaultRoomProps","useLiveKitRoom","token","serverUrl","options","passedRoom","connectOptions","connect","audio","video","screen","onConnected","onDisconnected","onError","onMediaDeviceFailure","onEncryptionError","simulateParticipants","rest","room","setRoom","shouldConnect","Room","htmlProps","className","setupLiveKitRoom","onSignalConnected","localP","handleMediaDeviceError","kind","mediaDeviceFailure","MediaDeviceFailure","handleEncryptionError","handleDisconnected","reason","handleConnected","RoomEvent","LiveKitRoom","ref","RoomContext","LKFeatureContext"],"mappings":";;;AAAA,SAASA,EAAEC,GAAE;AAAC,MAAIC,GAAEC,GAAEC,IAAE;AAAG,MAAa,OAAOH,KAAjB,YAA8B,OAAOA,KAAjB,SAAmB,CAAAG,KAAGH;AAAA,WAAoB,OAAOA,KAAjB,SAAmB,KAAG,MAAM,QAAQA,CAAC,GAAE;AAAC,QAAII,IAAEJ,EAAE;AAAO,SAAIC,IAAE,GAAEA,IAAEG,GAAEH,IAAI,CAAAD,EAAEC,CAAC,MAAIC,IAAEH,EAAEC,EAAEC,CAAC,CAAC,OAAKE,MAAIA,KAAG,MAAKA,KAAGD;AAAA,EAAE,MAAM,MAAIA,KAAKF,EAAE,CAAAA,EAAEE,CAAC,MAAIC,MAAIA,KAAG,MAAKA,KAAGD;AAAG,SAAOC;AAAC;AAAQ,SAASE,IAAM;AAAC,WAAQL,GAAEC,GAAEC,IAAE,GAAEC,IAAE,IAAGC,IAAE,UAAU,QAAOF,IAAEE,GAAEF,IAAI,EAACF,IAAE,UAAUE,CAAC,OAAKD,IAAEF,EAAEC,CAAC,OAAKG,MAAIA,KAAG,MAAKA,KAAGF;AAAG,SAAOE;AAAC;ACkBxW,SAASG,KAASC,GAA4C;AACnE,SAAO,IAAIC,MAAgB;AACzB,eAAWC,KAAYF;AACrB,UAAI,OAAOE,KAAa;AACtB,YAAI;AACF,UAAAA,EAAS,GAAGD,CAAI;AAAA,QAClB,SAASR,GAAG;AACV,kBAAQ,MAAMA,CAAC;AAAA,QACjB;AAAA,EAGN;AACF;AAoBO,SAASU,KAAiCF,GAA6C;AAG5F,QAAMG,IAAgB,EAAE,GAAGH,EAAK,CAAC,EAAA;AACjC,WAASI,IAAI,GAAGA,IAAIJ,EAAK,QAAQI,KAAK;AACpC,UAAMC,IAAQL,EAAKI,CAAC;AACpB,eAAWE,KAAOD,GAAO;AACvB,YAAME,IAAIJ,EAAOG,CAAG,GACdE,IAAIH,EAAMC,CAAG;AAGnB,MACE,OAAOC,KAAM,cACb,OAAOC,KAAM;AAAA,MAEbF,EAAI,CAAC,MAAM,OACXA,EAAI,CAAC,MAAM,OACXA,EAAI,WAAW,CAAC;AAAA,MAAe,MAC/BA,EAAI,WAAW,CAAC;AAAA,MAAe,KAE/BH,EAAOG,CAAG,IAAIR,EAAMS,GAAGC,CAAC,KAIvBF,MAAQ,eAAeA,MAAQ,uBAChC,OAAOC,KAAM,YACb,OAAOC,KAAM,WAEbL,EAAOG,CAAG,IAAIT,EAAKU,GAAGC,CAAC,IAEvBL,EAAOG,CAAG,IAAIE,MAAM,SAAYA,IAAID;AAAA,IAExC;AAAA,EACF;AAEA,SAAOJ;AACT;AChFO,SAASM,EACdC,GACW;AACX,SAAOA,MAAS;AAClB;AAGO,SAASR,KAGXG,GAAU;AACb,SAAOM,EAAoB,GAAGN,EAAM,OAAOI,CAAM,CAAC;AACpD;AAGO,SAASG,EACdC,GACAR,GACAC,GACA;AACA,SAAOQ,EAAM,SAAS,IAAID,GAAU,CAACE,MAG/BD,EAAM,eAAeC,CAAK,KAAKD,EAAM,SAAS,KAAKD,CAAQ,KACzDE,EAAM,MAAM,cAEdV,UAAU,CAAA,IACVA,EAAM,YAAYR,EAAKkB,EAAM,MAAM,WAAWV,EAAM,SAAS,GAC7DA,EAAM,QAAQ,EAAE,GAAGU,EAAM,MAAM,OAAO,GAAGV,EAAM,MAAA,IAE1CS,EAAM,aAAaC,GAAO,EAAE,GAAGV,GAAO,KAAAC,GAAK,KAE7CS,CACR;AACH;AAKO,SAASC,EAAuBC,GAAkB;;AACvD,MACE,OAAO,SAAW,OAClB,OAAO,UAAY;AAAA,KAElBC,IAAA,mCAAS,QAAT,gBAAAA,EAAc,cAAa;AAAA,IAE1BC,IAAA,mCAAS,QAAT,gBAAAA,EAAc,cAAa,gBAC7B;AACA,UAAMC,IAAe,SAAS,cAAc,oBAAoB;AAChE,IAAIA,KAAU,CAAC,iBAAiBA,CAAM,EAAE,iBAAiB,0BAA0B,KACjFC,EAAI;AAAA,MACF;AAAA,IAAA;AAAA,EAGN;AACF;AAQO,SAASC,EAA6BhB,GAAaiB,GAAc;AACtE,SAAIjB,MAAQ,eAAeiB,KAAO,OAAOA,KAAQ,YAAY,UAAUA,IAC9DA,EAAI,OAETjB,MAAQ,UAAUiB,IACb,iBAEFA;AACT;ACnEA,MAAMC,IAA8C;AAAA,EAClD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AACT;AAaO,SAASC,EACdpB,GAIA;AACA,QAAM;AAAA,IACJ,OAAAqB;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,MAAMC;AAAA,IACN,gBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACD,EAAE,GAAGjB,GAAkB,GAAGnB,EAAA;AAC9B,EAAIuB,KAAWC,KACbR,EAAI;AAAA,IACF;AAAA,EAAA;AAIJ,QAAM,CAACqB,GAAMC,CAAO,IAAI7B,EAAM,SAAA,GAExB8B,IAAgB9B,EAAM,OAAOiB,CAAO;AAE1C,EAAAjB,EAAM,UAAU,MAAM;AACpB,IAAA6B,EAAQd,KAAc,IAAIgB,EAAKjB,CAAO,CAAC;AAAA,EACzC,GAAG,CAACC,GAAY,KAAK,UAAUD,GAASN,CAA4B,CAAC,CAAC;AAEtE,QAAMwB,IAAYhC,EAAM,QAAQ,MAAM;AACpC,UAAM,EAAE,WAAAiC,EAAA,IAAcC,EAAA;AACtB,WAAO9C,EAAWuC,GAAM,EAAE,WAAAM,GAAW;AAAA,EACvC,GAAG,CAACN,CAAI,CAAC;AAET,SAAA3B,EAAM,UAAU,MAAM;AACpB,QAAI,CAAC4B,EAAM;AACX,UAAMO,IAAoB,MAAM;AAC9B,YAAMC,IAASR,EAAK;AAEpB,MAAArB,EAAI,MAAM,gCAAgC,GAC1C,QAAQ,IAAI;AAAA,QACV6B,EAAO,qBAAqB,CAAC,CAAClB,GAAO,OAAOA,KAAU,YAAYA,IAAQ,MAAS;AAAA,QACnFkB,EAAO,iBAAiB,CAAC,CAACjB,GAAO,OAAOA,KAAU,YAAYA,IAAQ,MAAS;AAAA,QAC/EiB,EAAO,sBAAsB,CAAC,CAAChB,GAAQ,OAAOA,KAAW,YAAYA,IAAS,MAAS;AAAA,MAAA,CACxF,EAAE,MAAM,CAAC1C,MAAM;AACd,QAAA6B,EAAI,KAAK7B,CAAC,GACV6C,KAAA,QAAAA,EAAU7C;AAAA,MACZ,CAAC;AAAA,IACH,GAEM2D,IAAyB,CAAC3D,GAAU4D,MAA2B;AACnE,YAAMC,IAAqBC,EAAmB,WAAW9D,CAAC;AAC1D,MAAA8C,KAAA,QAAAA,EAAuBe,GAAoBD;AAAA,IAC7C,GACMG,IAAwB,CAAC/D,MAAa;AAC1C,MAAA+C,KAAA,QAAAA,EAAoB/C;AAAA,IACtB,GACMgE,IAAqB,CAACC,MAA8B;AACxD,MAAArB,KAAA,QAAAA,EAAiBqB;AAAA,IACnB,GACMC,IAAkB,MAAM;AAC5B,MAAAvB,KAAA,QAAAA;AAAA,IACF;AAEA,WAAAO,EACG,GAAGiB,EAAU,iBAAiBV,CAAiB,EAC/C,GAAGU,EAAU,mBAAmBR,CAAsB,EACtD,GAAGQ,EAAU,iBAAiBJ,CAAqB,EACnD,GAAGI,EAAU,cAAcH,CAAkB,EAC7C,GAAGG,EAAU,WAAWD,CAAe,GAEnC,MAAM;AACX,MAAAhB,EACG,IAAIiB,EAAU,iBAAiBV,CAAiB,EAChD,IAAIU,EAAU,mBAAmBR,CAAsB,EACvD,IAAIQ,EAAU,iBAAiBJ,CAAqB,EACpD,IAAII,EAAU,cAAcH,CAAkB,EAC9C,IAAIG,EAAU,WAAWD,CAAe;AAAA,IAC7C;AAAA,EACF,GAAG;AAAA,IACDhB;AAAA,IACAV;AAAA,IACAC;AAAA,IACAC;AAAA,IACAG;AAAA,IACAE;AAAA,IACAD;AAAA,IACAH;AAAA,IACAC;AAAA,EAAA,CACD,GAEDtB,EAAM,UAAU,MAAM;AACpB,QAAK4B,GAEL;AAAA,UAAIF,GAAsB;AACxB,QAAAE,EAAK,qBAAqB;AAAA,UACxB,cAAc;AAAA,YACZ,OAAOF;AAAA,UAAA;AAAA,UAET,SAAS;AAAA,YACP,OAAO;AAAA,YACP,eAAe;AAAA,UAAA;AAAA,QACjB,CACD;AACD;AAAA,MACF;AAEA,UAAIT,GAAS;AAGX,YAFAa,EAAc,UAAU,IACxBvB,EAAI,MAAM,YAAY,GAClB,CAACK,GAAO;AACV,UAAAL,EAAI,MAAM,cAAc;AACxB;AAAA,QACF;AACA,YAAI,CAACM,GAAW;AACd,UAAAN,EAAI,KAAK,yBAAyB,GAClCgB,KAAA,QAAAA,EAAU,MAAM,yBAAyB;AACzC;AAAA,QACF;AACA,QAAAK,EAAK,QAAQf,GAAWD,GAAOI,CAAc,EAAE,MAAM,CAACtC,MAAM;AAC1D,UAAA6B,EAAI,KAAK7B,CAAC,GACNoD,EAAc,YAAY,OAC5BP,KAAA,QAAAA,EAAU7C;AAAA,QAEd,CAAC;AAAA,MACH;AACE,QAAA6B,EAAI,MAAM,wCAAwC,GAClDuB,EAAc,UAAU,IACxBF,EAAK,WAAA;AAAA;AAAA,EAET,GAAG;AAAA,IACDX;AAAA,IACAL;AAAA,IACA,KAAK,UAAUI,CAAc;AAAA,IAC7BY;AAAA,IACAL;AAAA,IACAV;AAAA,IACAa;AAAA,EAAA,CACD,GAED1B,EAAM,UAAU,MAAM;AACpB,QAAK4B;AACL,aAAO,MAAM;AACX,QAAArB,EAAI,KAAK,0BAA0B,GACnCqB,EAAK,WAAA;AAAA,MACP;AAAA,EACF,GAAG,CAACA,CAAI,CAAC,GAEF,EAAE,MAAAA,GAAM,WAAAI,EAAA;AACjB;AClFO,MAAMc,IAE0B,gBAAA9C,EAAM,WAG3C,SAAqBT,GAAkDwD,GAAK;AAC5E,QAAM,EAAE,MAAAnB,GAAM,WAAAI,MAAcrB,EAAepB,CAAK;AAChD,SACE,gBAAAS,EAAA,cAAC,SAAI,KAAA+C,GAAW,GAAGf,KAChBJ,KACC,gBAAA5B,EAAA,cAACgD,EAAY,UAAZ,EAAqB,OAAOpB,KAC3B,gBAAA5B,EAAA,cAACiD,EAAiB,UAAjB,EAA0B,OAAO1D,EAAM,aAAA,GACrCA,EAAM,QACT,CACF,CAEJ;AAEJ,CAAC;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const j=require("react"),b=require("./shared-BDr0qLg4.js"),M=require("./shared-CjI_UuOX.js"),d=require("livekit-client");function we(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const r=we(j),ee=r.createContext(void 0);function Re(){const e=r.useContext(ee);if(!e)throw Error("tried to access session context outside of SessionProvider component");return e}function te(){return r.useContext(ee)}function pe(e){const t=te(),n=e??t;if(!n)throw new Error("No session provided, make sure you are inside a Session context or pass the session explicitly");return n}function Me(e){const t=b.useEnsureRoom(e),n=r.useCallback(async()=>{await t.startAudio()},[t]),s=r.useMemo(()=>b.roomAudioPlaybackAllowedObservable(t),[t]),{canPlayAudio:f}=M.useObservableState(s,{canPlayAudio:t.canPlaybackAudio});return{canPlayAudio:f,startAudio:n}}function Ae(e){const{state:t,dispatch:n}=M.useLayoutContext().pin;return{buttonProps:r.useMemo(()=>{const{className:f}=b.setupClearPinButton();return M.mergeProps(e,{className:f,disabled:!(t!=null&&t.length),onClick:()=>{n&&n({msg:"clear_pin"})}})},[e,n,t])}}function Le(e,t){const n=typeof e=="function"?e:t,s=typeof e=="string"?e:void 0,f=b.useRoomContext(),{send:c,messageObservable:o,isSendingObservable:p}=r.useMemo(()=>b.setupDataMessageHandler(f,s,n),[f,s,n]),T=M.useObservableState(o,void 0),E=M.useObservableState(p,!1);return{message:T,send:c,isSending:E}}const Oe={connect:!0,audio:!1,video:!1};function xe(e){const{token:t,serverUrl:n,options:s,room:f,connectOptions:c,connect:o,audio:p,video:T,screen:E,onConnected:v,onDisconnected:m,onError:u,onMediaDeviceFailure:k,onEncryptionError:R,simulateParticipants:x,...L}={...Oe,...e};s&&f&&b.log.warn("when using a manually created room, the options object will be ignored. set the desired options directly when creating the room instead.");const[A,I]=r.useState(),D=r.useRef(o);r.useEffect(()=>{I(f??new d.Room(s))},[f,JSON.stringify(s,M.roomOptionsStringifyReplacer)]);const a=r.useMemo(()=>{const{className:i}=b.setupLiveKitRoom();return M.mergeProps(L,{className:i})},[L]);return r.useEffect(()=>{if(!A)return;const i=()=>{const C=A.localParticipant;b.log.debug("trying to publish local tracks"),Promise.all([C.setMicrophoneEnabled(!!p,typeof p!="boolean"?p:void 0),C.setCameraEnabled(!!T,typeof T!="boolean"?T:void 0),C.setScreenShareEnabled(!!E,typeof E!="boolean"?E:void 0)]).catch(P=>{b.log.warn(P),u==null||u(P)})},l=(C,P)=>{const N=d.MediaDeviceFailure.getFailure(C);k==null||k(N,P)},h=C=>{R==null||R(C)},S=C=>{m==null||m(C)},y=()=>{v==null||v()};return A.on(d.RoomEvent.SignalConnected,i).on(d.RoomEvent.MediaDevicesError,l).on(d.RoomEvent.EncryptionError,h).on(d.RoomEvent.Disconnected,S).on(d.RoomEvent.Connected,y),()=>{A.off(d.RoomEvent.SignalConnected,i).off(d.RoomEvent.MediaDevicesError,l).off(d.RoomEvent.EncryptionError,h).off(d.RoomEvent.Disconnected,S).off(d.RoomEvent.Connected,y)}},[A,p,T,E,u,R,k,v,m]),r.useEffect(()=>{if(A){if(x){A.simulateParticipants({participants:{count:x},publish:{audio:!0,useRealTracks:!0}});return}if(o){if(D.current=!0,b.log.debug("connecting"),!t){b.log.debug("no token yet");return}if(!n){b.log.warn("no livekit url provided"),u==null||u(Error("no livekit url provided"));return}A.connect(n,t,c).catch(i=>{b.log.warn(i),D.current===!0&&(u==null||u(i))})}else b.log.debug("disconnecting because connect is false"),D.current=!1,A.disconnect()}},[o,t,JSON.stringify(c),A,u,n,x]),r.useEffect(()=>{if(A)return()=>{b.log.info("disconnecting on onmount"),A.disconnect()}},[A]),{room:A,htmlProps:a}}function he(e={}){let t=M.useMaybeParticipantContext();e.participant&&(t=e.participant);const n=r.useMemo(()=>b.participantInfoObserver(t),[t]),{identity:s,name:f,metadata:c}=M.useObservableState(n,{name:t==null?void 0:t.name,identity:t==null?void 0:t.identity,metadata:t==null?void 0:t.metadata});return{identity:s,name:f,metadata:c}}function De(e={}){const t=M.useEnsureParticipant(e.participant),n=r.useMemo(()=>b.participantPermissionObserver(t),[t]);return M.useObservableState(n,t.permissions)}function Z(e={}){const t=b.useEnsureRoom(e.room),[n,s]=r.useState([]);return r.useEffect(()=>{const f=b.connectedParticipantsObserver(t,{additionalRoomEvents:e.updateOnlyOn}).subscribe(s);return()=>f.unsubscribe()},[t,JSON.stringify(e.updateOnlyOn)]),n}function ve(e={}){const t=Z(e),{localParticipant:n}=b.useLocalParticipant(e);return r.useMemo(()=>[n,...t],[n,t])}function Ne(e,t={}){const n=b.useRoomContext(),[s]=r.useState(t.updateOnlyOn),f=r.useMemo(()=>typeof e=="string"?b.connectedParticipantObserver(n,e,{additionalEvents:s}):b.participantByIdentifierObserver(n,e,{additionalEvents:s}),[n,JSON.stringify(e),s]),[c,o]=r.useState({p:void 0});return r.useEffect(()=>{const p=f.subscribe(T=>o({p:T}));return()=>p.unsubscribe()},[f]),c.p}function _e(e={}){const t=b.useEnsureRoom(e.room),n=r.useMemo(()=>b.roomInfoObserver(t),[t]),{name:s,metadata:f}=M.useObservableState(n,{name:t.name,metadata:t.metadata});return{name:s,metadata:f}}function be(e){const t=b.useEnsureRoom(e==null?void 0:e.room),n=r.useMemo(()=>b.activeSpeakerObserver(t),[t]);return M.useObservableState(n,t.activeSpeakers)}function Ie(e){const[t,n]=r.useState(b.sortParticipants(e)),s=be();return r.useEffect(()=>{n(b.sortParticipants(e))},[s,e]),t}function Fe(e,t,n={}){const[s,f]=r.useState(void 0);return r.useEffect(()=>{var o;if(e===void 0)throw Error("token endpoint needs to be defined");if(((o=n.userInfo)==null?void 0:o.identity)===void 0)return;(async()=>{b.log.debug("fetching token");const p=new URLSearchParams({...n.userInfo,roomName:t}),T=await fetch(`${e}?${p.toString()}`);if(!T.ok){b.log.error(`Could not fetch token. Server responded with status ${T.status}: ${T.statusText}`);return}const{accessToken:E}=await T.json();f(E)})()},[e,t,JSON.stringify(n)]),s}function Ue(e){const[t,n]=r.useState(b.getTrackByIdentifier(e)),{trackObserver:s}=r.useMemo(()=>b.setupMediaTrack(e),[e.participant.sid??e.participant.identity,e.source]);return r.useEffect(()=>{const f=s.subscribe(c=>{n(c)});return()=>f==null?void 0:f.unsubscribe()},[s]),{participant:e.participant,source:e.source??d.Track.Source.Unknown,publication:t}}function je(e,t){const n=M.useEnsureParticipant(t);return Ue({name:e,participant:n})}function Q(e,t={}){let n,s;typeof t=="string"?n=t:(n=t==null?void 0:t.participantIdentity,s=t==null?void 0:t.room);const f=M.useMaybeParticipantContext(),c=ve({room:s,updateOnlyOn:[]}),o=r.useMemo(()=>n?c.find(E=>E.identity===n):f,[n,c,f]),p=r.useMemo(()=>{if(o)return b.participantTracksObservable(o,{sources:e})},[o,JSON.stringify(e)]);return M.useObservableState(p,[])}function He(e){var n,s,f;const t=r.useMemo(()=>{var c;return(c=e==null?void 0:e.publication)!=null&&c.track?b.trackSyncTimeObserver(e==null?void 0:e.publication.track):void 0},[(n=e==null?void 0:e.publication)==null?void 0:n.track]);return M.useObservableState(t,{timestamp:Date.now(),rtpTimestamp:(f=(s=e==null?void 0:e.publication)==null?void 0:s.track)==null?void 0:f.rtpTimestamp})}const Be={bufferSize:100};function ge(e,t){const n={...Be,...t},[s,f]=r.useState([]),c=He(e),o=p=>{var T;(T=n.onTranscription)==null||T.call(n,p),f(E=>b.dedupeSegments(E,p.map(v=>b.addMediaTimestampToTranscription(v,c)),n.bufferSize))};return r.useEffect(()=>{if(!(e!=null&&e.publication))return;const p=b.trackTranscriptionObserver(e.publication).subscribe(T=>{o(...T)});return()=>{p.unsubscribe()}},[e&&b.getTrackReferenceId(e),o]),{segments:s}}function Se(e={}){const t=M.useMaybeParticipantContext(),n=e.participant??t,s=r.useMemo(()=>b.participantAttributesObserver(n),[n]);return M.useObservableState(s,{attributes:n==null?void 0:n.attributes})}function We(e,t={}){const n=M.useEnsureParticipant(t.participant),[s,f]=r.useState(n.attributes[e]);return r.useEffect(()=>{if(!n)return;const c=b.participantAttributesObserver(n).subscribe(o=>{o.changed[e]!==void 0&&f(o.attributes[e])});return()=>{c.unsubscribe()}},[n,e]),s}const ce=b.ParticipantAgentAttributes.AgentState;function qe(){const e=Z(),t=e.find(m=>m.kind===d.ParticipantKind.AGENT&&!(b.ParticipantAgentAttributes.PublishOnBehalf in m.attributes)),n=e.find(m=>m.kind===d.ParticipantKind.AGENT&&m.attributes[b.ParticipantAgentAttributes.PublishOnBehalf]===(t==null?void 0:t.identity)),s=Q([d.Track.Source.Microphone,d.Track.Source.Camera],t==null?void 0:t.identity),f=Q([d.Track.Source.Microphone,d.Track.Source.Camera],n==null?void 0:n.identity),c=s.find(m=>m.source===d.Track.Source.Microphone)??f.find(m=>m.source===d.Track.Source.Microphone),o=s.find(m=>m.source===d.Track.Source.Camera)??f.find(m=>m.source===d.Track.Source.Camera),{segments:p}=ge(c),T=M.useConnectionState(),{attributes:E}=Se({participant:t}),v=r.useMemo(()=>T===d.ConnectionState.Disconnected?"disconnected":T===d.ConnectionState.Connecting||!t||!(E!=null&&E[ce])?"connecting":E[ce],[E,t,T]);return{agent:t,state:v,audioTrack:c,videoTrack:o,agentTranscriptions:p,agentAttributes:E}}function Ge(e){const t=b.useEnsureRoom(e),n=M.useConnectionState(t),s=r.useMemo(()=>b.recordingStatusObservable(t),[t,n]);return M.useObservableState(s,t.isRecording)}function Ce(e,t){const n=b.useEnsureRoom(t==null?void 0:t.room),f=M.useConnectionState(n)===d.ConnectionState.Disconnected,c=r.useMemo(()=>b.setupTextStream(n,e),[n,e]),o=f?void 0:c;return{textStreams:M.useObservableState(o,[])}}function Te(e){const{participantIdentities:t,trackSids:n}=e??{},{textStreams:s}=Ce(b.DataTopic.TRANSCRIPTION,{room:e==null?void 0:e.room});return r.useMemo(()=>s.filter(c=>t?t.includes(c.participantInfo.identity):!0).filter(c=>{var o;return n?n.includes(((o=c.streamInfo.attributes)==null?void 0:o[b.ParticipantAgentAttributes.TranscribedTrackId])??""):!0}),[s,t,n])}const ue=2,de=400,le=3,fe=1e3;function Ke(e){const t=j.useRef([]),n=j.useMemo(()=>new d.Mutex,[]),s=j.useCallback(async()=>n.lock().then(async v=>{for(;;){const m=t.current.pop();if(!m){v();break}switch(m.type){case"connect":await m.room.connect(...m.args).then(m.resolve).catch(m.reject);break;case"disconnect":await m.room.disconnect(...m.args).then(m.resolve).catch(m.reject);break}}}),[]),f=j.useRef([]),c=j.useCallback(v=>{let m=0;f.current=f.current.filter(u=>{const k=v.getTime()-u.getTime()<fe;return k&&(m+=1),k}),m>le&&b.log.warn(`useSequentialRoomConnectDisconnect: room changed reference rapidly (over ${le}x in ${fe}ms). This is not recommended.`)},[]);j.useEffect(()=>{t.current=[];const v=new Date;f.current.push(v),c(v)},[e,c]);const o=j.useRef([]),p=j.useCallback(v=>{let m=0;o.current=o.current.filter(u=>{const k=v.getTime()-u.getTime()<de;return k&&(m+=1),k}),m>ue&&b.log.warn(`useSequentialRoomConnectDisconnect: room connect / disconnect occurring in rapid sequence (over ${ue}x in ${de}ms). This is not recommended and may be the sign of a bug like a useEffect dependency changing every render.`)},[]),T=j.useCallback(async(...v)=>new Promise((m,u)=>{if(!e)throw new Error("Called connect(), but room was unset");const k=new Date;p(k),t.current.push({type:"connect",room:e,args:v,resolve:m,reject:u}),o.current.push(k),s()}),[e,p,s]),E=j.useCallback(async(...v)=>new Promise((m,u)=>{if(!e)throw new Error("Called discconnect(), but room was unset");const k=new Date;p(k),t.current.push({type:"disconnect",room:e,args:v,resolve:m,reject:u}),o.current.push(k),s()}),[e,p,s]);return{connect:e?T:null,disconnect:e?E:null}}var X={exports:{}},me;function $e(){if(me)return X.exports;me=1;var e=typeof Reflect=="object"?Reflect:null,t=e&&typeof e.apply=="function"?e.apply:function(i,l,h){return Function.prototype.apply.call(i,l,h)},n;e&&typeof e.ownKeys=="function"?n=e.ownKeys:Object.getOwnPropertySymbols?n=function(i){return Object.getOwnPropertyNames(i).concat(Object.getOwnPropertySymbols(i))}:n=function(i){return Object.getOwnPropertyNames(i)};function s(a){console&&console.warn&&console.warn(a)}var f=Number.isNaN||function(i){return i!==i};function c(){c.init.call(this)}X.exports=c,X.exports.once=A,c.EventEmitter=c,c.prototype._events=void 0,c.prototype._eventsCount=0,c.prototype._maxListeners=void 0;var o=10;function p(a){if(typeof a!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof a)}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(a){if(typeof a!="number"||a<0||f(a))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+a+".");o=a}}),c.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},c.prototype.setMaxListeners=function(i){if(typeof i!="number"||i<0||f(i))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+i+".");return this._maxListeners=i,this};function T(a){return a._maxListeners===void 0?c.defaultMaxListeners:a._maxListeners}c.prototype.getMaxListeners=function(){return T(this)},c.prototype.emit=function(i){for(var l=[],h=1;h<arguments.length;h++)l.push(arguments[h]);var S=i==="error",y=this._events;if(y!==void 0)S=S&&y.error===void 0;else if(!S)return!1;if(S){var C;if(l.length>0&&(C=l[0]),C instanceof Error)throw C;var P=new Error("Unhandled error."+(C?" ("+C.message+")":""));throw P.context=C,P}var N=y[i];if(N===void 0)return!1;if(typeof N=="function")t(N,this,l);else for(var H=N.length,U=R(N,H),h=0;h<H;++h)t(U[h],this,l);return!0};function E(a,i,l,h){var S,y,C;if(p(l),y=a._events,y===void 0?(y=a._events=Object.create(null),a._eventsCount=0):(y.newListener!==void 0&&(a.emit("newListener",i,l.listener?l.listener:l),y=a._events),C=y[i]),C===void 0)C=y[i]=l,++a._eventsCount;else if(typeof C=="function"?C=y[i]=h?[l,C]:[C,l]:h?C.unshift(l):C.push(l),S=T(a),S>0&&C.length>S&&!C.warned){C.warned=!0;var P=new Error("Possible EventEmitter memory leak detected. "+C.length+" "+String(i)+" listeners added. Use emitter.setMaxListeners() to increase limit");P.name="MaxListenersExceededWarning",P.emitter=a,P.type=i,P.count=C.length,s(P)}return a}c.prototype.addListener=function(i,l){return E(this,i,l,!1)},c.prototype.on=c.prototype.addListener,c.prototype.prependListener=function(i,l){return E(this,i,l,!0)};function v(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function m(a,i,l){var h={fired:!1,wrapFn:void 0,target:a,type:i,listener:l},S=v.bind(h);return S.listener=l,h.wrapFn=S,S}c.prototype.once=function(i,l){return p(l),this.on(i,m(this,i,l)),this},c.prototype.prependOnceListener=function(i,l){return p(l),this.prependListener(i,m(this,i,l)),this},c.prototype.removeListener=function(i,l){var h,S,y,C,P;if(p(l),S=this._events,S===void 0)return this;if(h=S[i],h===void 0)return this;if(h===l||h.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete S[i],S.removeListener&&this.emit("removeListener",i,h.listener||l));else if(typeof h!="function"){for(y=-1,C=h.length-1;C>=0;C--)if(h[C]===l||h[C].listener===l){P=h[C].listener,y=C;break}if(y<0)return this;y===0?h.shift():x(h,y),h.length===1&&(S[i]=h[0]),S.removeListener!==void 0&&this.emit("removeListener",i,P||l)}return this},c.prototype.off=c.prototype.removeListener,c.prototype.removeAllListeners=function(i){var l,h,S;if(h=this._events,h===void 0)return this;if(h.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):h[i]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete h[i]),this;if(arguments.length===0){var y=Object.keys(h),C;for(S=0;S<y.length;++S)C=y[S],C!=="removeListener"&&this.removeAllListeners(C);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=h[i],typeof l=="function")this.removeListener(i,l);else if(l!==void 0)for(S=l.length-1;S>=0;S--)this.removeListener(i,l[S]);return this};function u(a,i,l){var h=a._events;if(h===void 0)return[];var S=h[i];return S===void 0?[]:typeof S=="function"?l?[S.listener||S]:[S]:l?L(S):R(S,S.length)}c.prototype.listeners=function(i){return u(this,i,!0)},c.prototype.rawListeners=function(i){return u(this,i,!1)},c.listenerCount=function(a,i){return typeof a.listenerCount=="function"?a.listenerCount(i):k.call(a,i)},c.prototype.listenerCount=k;function k(a){var i=this._events;if(i!==void 0){var l=i[a];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}c.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]};function R(a,i){for(var l=new Array(i),h=0;h<i;++h)l[h]=a[h];return l}function x(a,i){for(;i+1<a.length;i++)a[i]=a[i+1];a.pop()}function L(a){for(var i=new Array(a.length),l=0;l<i.length;++l)i[l]=a[l].listener||a[l];return i}function A(a,i){return new Promise(function(l,h){function S(C){a.removeListener(i,y),h(C)}function y(){typeof a.removeListener=="function"&&a.removeListener("error",S),l([].slice.call(arguments))}D(a,i,y,{once:!0}),i!=="error"&&I(a,S,{once:!0})})}function I(a,i,l){typeof a.on=="function"&&D(a,"error",i,l)}function D(a,i,l,h){if(typeof a.on=="function")h.once?a.once(i,l):a.on(i,l);else if(typeof a.addEventListener=="function")a.addEventListener(i,function S(y){h.once&&a.removeEventListener(i,S),l(y)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof a)}return X.exports}var ne=$e();const ze=2e4;var Ee=(e=>(e.CameraChanged="cameraChanged",e.MicrophoneChanged="microphoneChanged",e.StateChanged="stateChanged",e))(Ee||{});const F=e=>({isConnected:e==="listening"||e==="thinking"||e==="speaking",canListen:e==="pre-connect-buffering"||e==="listening"||e==="thinking"||e==="speaking",isFinished:e==="disconnected"||e==="failed",isPending:e==="connecting"||e==="initializing"||e==="idle"}),Je=()=>{const[e,t]=r.useState(null),[n,s]=r.useState(null),f=r.useRef("connecting"),c=r.useRef(!1),o=p=>setTimeout(()=>{if(!c.current){t("Agent did not join the room.");return}const{isConnected:T}=F(f.current);if(!T){t("Agent joined the room but did not complete initializing.");return}},p??ze);return{agentTimeoutFailureReason:e,startAgentTimeout:r.useCallback(p=>{n&&clearTimeout(n),t(null),s(o(p)),f.current="connecting",c.current=!1},[n]),clearAgentTimeout:r.useCallback(()=>{n&&clearTimeout(n),t(null),s(null),f.current="connecting",c.current=!1},[n]),clearAgentTimeoutFailureReason:r.useCallback(()=>{t(null)},[]),updateAgentTimeoutState:r.useCallback(p=>{f.current=p},[]),updateAgentTimeoutParticipantExists:r.useCallback(p=>{c.current=p},[])}};function Ve(e,t){const n=r.useRef(t);r.useEffect(()=>{n.current=t},[t]);const s=r.useCallback(async o=>{const{isConnected:p}=F(n.current);if(!p)return new Promise((T,E)=>{const v=k=>{const{isConnected:R}=F(k);R&&(u(),T())},m=()=>{u(),E(new Error("useAgent(/* ... */).waitUntilConnected - signal aborted"))},u=()=>{e.off("stateChanged",v),o==null||o.removeEventListener("abort",m)};e.on("stateChanged",v),o==null||o.addEventListener("abort",m)})},[e]),f=r.useCallback(async o=>{const{canListen:p}=F(n.current);if(!p)return new Promise((T,E)=>{const v=k=>{const{canListen:R}=F(k);R&&(u(),T())},m=()=>{u(),E(new Error("useAgent(/* ... */).waitUntilCouldBeListening - signal aborted"))},u=()=>{e.off("stateChanged",v),o==null||o.removeEventListener("abort",m)};e.on("stateChanged",v),o==null||o.addEventListener("abort",m)})},[e]),c=r.useCallback(async o=>{const{isFinished:p}=F(n.current);if(!p)return new Promise((T,E)=>{const v=k=>{const{isFinished:R}=F(k);R&&(u(),T())},m=()=>{u(),E(new Error("useAgent(/* ... */).waitUntilFinished - signal aborted"))},u=()=>{e.off("stateChanged",v),o==null||o.removeEventListener("abort",m)};e.on("stateChanged",v),o==null||o.addEventListener("abort",m)})},[e]);return{waitUntilConnected:s,waitUntilCouldBeListening:f,waitUntilFinished:c}}function re(e){const t=te();if(e=e??t,!e)throw new Error("No session provided, make sure you are inside a Session context or pass the session explicitly");const{room:n,internal:{agentConnectTimeoutMilliseconds:s,agentTimeoutFailureReason:f,startAgentTimeout:c,clearAgentTimeout:o,clearAgentTimeoutFailureReason:p,updateAgentTimeoutState:T,updateAgentTimeoutParticipantExists:E}}=e,v=r.useMemo(()=>new ne.EventEmitter,[]),m=Z({room:n}),u=r.useMemo(()=>m.find(g=>g.kind===d.ParticipantKind.AGENT&&!(b.ParticipantAgentAttributes.PublishOnBehalf in g.attributes))??null,[m]),k=r.useMemo(()=>u?m.find(g=>g.kind===d.ParticipantKind.AGENT&&g.attributes[b.ParticipantAgentAttributes.PublishOnBehalf]===u.identity)??null:null,[u,m]),[R,x]=r.useState((u==null?void 0:u.attributes)??{});r.useEffect(()=>{if(!u)return;const g=_=>{x(_)};return u.on(d.ParticipantEvent.AttributesChanged,g),()=>{u.off(d.ParticipantEvent.AttributesChanged,g)}},[u,v]);const L=Q([d.Track.Source.Camera,d.Track.Source.Microphone],{room:n,participantIdentity:u==null?void 0:u.identity}),A=Q([d.Track.Source.Camera,d.Track.Source.Microphone],{room:n,participantIdentity:k==null?void 0:k.identity}),I=r.useMemo(()=>L.find(g=>g.source===d.Track.Source.Camera)??A.find(g=>g.source===d.Track.Source.Camera),[L,A]);r.useEffect(()=>{v.emit("cameraChanged",I)},[v,I]);const D=r.useMemo(()=>L.find(g=>g.source===d.Track.Source.Microphone)??A.find(g=>g.source===d.Track.Source.Microphone),[L,A]);r.useEffect(()=>{v.emit("microphoneChanged",D)},[v,D]);const[a,i]=r.useState(n.state);r.useEffect(()=>{const g=_=>{i(_)};return n.on(d.RoomEvent.ConnectionStateChanged,g),()=>{n.off(d.RoomEvent.ConnectionStateChanged,g)}},[n]),r.useEffect(()=>{u&&p()},[u]);const[l,h]=r.useState(null);r.useEffect(()=>{if(!u)return;const g=_=>{_.identity===(u==null?void 0:u.identity)&&h("Agent left the room unexpectedly.")};return n.on(d.RoomEvent.ParticipantDisconnected,g),()=>{n.off(d.RoomEvent.ParticipantDisconnected,g)}},[u,n]),r.useEffect(()=>{a===d.ConnectionState.Disconnected&&h(null)},[a]);const[S,y]=r.useState(()=>n.localParticipant.getTrackPublication(d.Track.Source.Microphone)??null);r.useEffect(()=>{const g=()=>{y(n.localParticipant.getTrackPublication(d.Track.Source.Microphone)??null)},_=()=>{y(null)};return n.localParticipant.on(d.ParticipantEvent.LocalTrackPublished,g),n.localParticipant.on(d.ParticipantEvent.LocalTrackUnpublished,_),()=>{n.localParticipant.off(d.ParticipantEvent.LocalTrackPublished,g),n.localParticipant.off(d.ParticipantEvent.LocalTrackUnpublished,_)}},[n.localParticipant]);const C=r.useMemo(()=>{const g=[];return f&&g.push(f),l&&g.push(l),g},[f,l]),P=r.useMemo(()=>{if(C.length>0)return"failed";let g="disconnected";return a!==d.ConnectionState.Disconnected&&(g="connecting"),S&&(g="pre-connect-buffering"),u&&R[b.ParticipantAgentAttributes.AgentState]&&(g=R[b.ParticipantAgentAttributes.AgentState]),g},[C,a,S,u,R]);r.useEffect(()=>{v.emit("stateChanged",P),T(P)},[v,P]),r.useEffect(()=>{E(u!==null)},[u]);const N=e.connectionState==="disconnected";r.useEffect(()=>{if(!N)return c(s),()=>{o()}},[N,s]);const{identity:H,name:U,metadata:$}=he({participant:u??void 0}),V=r.useMemo(()=>{const g={attributes:R,internal:{agentParticipant:u,workerParticipant:k,emitter:v}};switch(P){case"disconnected":return{...g,identity:void 0,name:void 0,metadata:void 0,state:P,...F(P),failureReasons:null,cameraTrack:void 0,microphoneTrack:void 0};case"connecting":return{...g,identity:void 0,name:void 0,metadata:void 0,state:P,...F(P),failureReasons:null,cameraTrack:void 0,microphoneTrack:void 0};case"initializing":case"idle":return{...g,identity:H,name:U,metadata:$,state:P,...F(P),failureReasons:null,cameraTrack:I,microphoneTrack:D};case"pre-connect-buffering":return{...g,identity:H,name:U,metadata:$,state:P,...F(P),failureReasons:null,cameraTrack:I,microphoneTrack:D};case"listening":case"thinking":case"speaking":return{...g,identity:H,name:U,metadata:$,state:P,...F(P),failureReasons:null,cameraTrack:I,microphoneTrack:D};case"failed":return{...g,identity:void 0,name:void 0,metadata:void 0,state:"failed",...F("failed"),failureReasons:C,cameraTrack:void 0,microphoneTrack:void 0}}},[H,U,$,R,v,u,P,I,D]),{waitUntilConnected:z,waitUntilCouldBeListening:w,waitUntilFinished:O}=Ve(v,P),B=r.useCallback(g=>new Promise((_,J)=>{const W=K=>{K&&(G(),_(K))},q=()=>{G(),J(new Error("useAgent(/* ... */).waitUntilCamera - signal aborted"))},G=()=>{v.off("cameraChanged",W),g==null||g.removeEventListener("abort",q)};v.on("cameraChanged",W),g==null||g.addEventListener("abort",q)}),[v]),Y=r.useCallback(g=>new Promise((_,J)=>{const W=K=>{K&&(G(),_(K))},q=()=>{G(),J(new Error("useAgent(/* ... */).waitUntilMicrophone - signal aborted"))},G=()=>{v.off("microphoneChanged",W),g==null||g.removeEventListener("abort",q)};v.on("microphoneChanged",W),g==null||g.addEventListener("abort",q)}),[v]);return r.useMemo(()=>({...V,waitUntilConnected:z,waitUntilCouldBeListening:w,waitUntilFinished:O,waitUntilCamera:B,waitUntilMicrophone:Y}),[V,z,w,O,B,Y])}var ke=(e=>(e.ConnectionStateChanged="connectionStateChanged",e.MediaDevicesError="mediaDevicesError",e.EncryptionError="encryptionError",e))(ke||{});function Qe(e,t){const n=new Set([...Object.keys(e),...Object.keys(t)]);for(const s of n)switch(s){case"roomName":case"participantName":case"participantIdentity":case"participantMetadata":case"participantAttributes":case"agentName":case"agentMetadata":if(e[s]!==t[s])return!1;break;default:const f=s;throw new Error(`Options key ${f} not being checked for equality!`)}return!0}function Ye(e,t){const n=r.useRef(t);return r.useEffect(()=>{n.current=t},[t]),r.useCallback(async(f,c)=>{if(n.current!==f)return new Promise((o,p)=>{const T=m=>{m===f&&(v(),o())},E=()=>{v(),p(new Error(`useSession(/* ... */).waitUntilConnectionState(${f}, /* signal */) - signal aborted`))},v=()=>{e.off("connectionStateChanged",T),c==null||c.removeEventListener("abort",E)};e.on("connectionStateChanged",T),c==null||c.addEventListener("abort",E)})},[e])}function Xe(e,t){const n=e instanceof d.TokenSourceConfigurable,s=r.useRef(n?t:null);return r.useEffect(()=>{if(!n){s.current=null;return}s.current!==null&&Qe(s.current,t)||(s.current=t)},[n,t]),r.useCallback(async()=>{if(n){if(!s.current)throw new Error("AgentSession - memoized token fetch options are not set, but the passed tokenSource was an instance of TokenSourceConfigurable. If you are seeing this please make a new GitHub issue!");return e.fetch(s.current)}else return e.fetch()},[n,e])}function Ze(e,t={}){const{room:n,agentConnectTimeoutMilliseconds:s,...f}=t,c=b.useMaybeRoomContext(),o=r.useMemo(()=>c??n??new d.Room,[c,n]),p=r.useMemo(()=>new ne.EventEmitter,[]),T=r.useCallback(w=>({isConnected:w===d.ConnectionState.Connected||w===d.ConnectionState.Reconnecting||w===d.ConnectionState.SignalReconnecting}),[]),[E,v]=r.useState(o.state);r.useEffect(()=>{const w=O=>{v(O)};return o.on(d.RoomEvent.ConnectionStateChanged,w),()=>{o.off(d.RoomEvent.ConnectionStateChanged,w)}},[o]),r.useEffect(()=>{const w=async O=>{p.emit("mediaDevicesError",O)};return o.on(d.RoomEvent.MediaDevicesError,w),()=>{o.off(d.RoomEvent.MediaDevicesError,w)}},[o,p]),r.useEffect(()=>{const w=async O=>{p.emit("encryptionError",O)};return o.on(d.RoomEvent.EncryptionError,w),()=>{o.off(d.RoomEvent.EncryptionError,w)}},[o,p]);const{localParticipant:m}=b.useLocalParticipant({room:o}),u=m.getTrackPublication(d.Track.Source.Camera),k=r.useMemo(()=>{if(u)return{source:d.Track.Source.Camera,participant:m,publication:u}},[m,u]),R=m.getTrackPublication(d.Track.Source.Microphone),x=r.useMemo(()=>{if(R)return{source:d.Track.Source.Microphone,participant:m,publication:R}},[m,R]),L=m.getTrackPublication(d.Track.Source.ScreenShare),A=r.useMemo(()=>{if(L)return{source:d.Track.Source.ScreenShare,participant:m,publication:L}},[m,L]),{agentTimeoutFailureReason:I,startAgentTimeout:D,clearAgentTimeout:a,clearAgentTimeoutFailureReason:i,updateAgentTimeoutState:l,updateAgentTimeoutParticipantExists:h}=Je(),S=r.useMemo(()=>({emitter:p,tokenSource:e,agentConnectTimeoutMilliseconds:s,agentTimeoutFailureReason:I,startAgentTimeout:D,clearAgentTimeout:a,clearAgentTimeoutFailureReason:i,updateAgentTimeoutState:l,updateAgentTimeoutParticipantExists:h}),[p,s,e,I,D,a,i,l,h]),y=r.useMemo(()=>{const w={room:o,internal:S};switch(E){case d.ConnectionState.Connecting:return{...w,connectionState:d.ConnectionState.Connecting,...T(d.ConnectionState.Connecting),local:{cameraTrack:void 0,microphoneTrack:void 0,screenShareTrack:void 0}};case d.ConnectionState.Connected:case d.ConnectionState.Reconnecting:case d.ConnectionState.SignalReconnecting:return{...w,connectionState:E,...T(E),local:{cameraTrack:k,microphoneTrack:x,screenShareTrack:A}};case d.ConnectionState.Disconnected:return{...w,connectionState:d.ConnectionState.Disconnected,...T(d.ConnectionState.Disconnected),local:{cameraTrack:void 0,microphoneTrack:void 0,screenShareTrack:void 0}}}},[S,o,E,k,x,T]);r.useEffect(()=>{p.emit("connectionStateChanged",y.connectionState)},[p,y.connectionState]);const C=Ye(p,y.connectionState),P=r.useCallback(async w=>C(d.ConnectionState.Connected,w),[C]),N=r.useCallback(async w=>C(d.ConnectionState.Disconnected,w),[C]),H=re(r.useMemo(()=>({connectionState:y.connectionState,room:o,internal:S}),[y,o,S])),U=Xe(e,f),$=r.useCallback(async(w={})=>{var J,W,q,G,K,oe;const{signal:O,tracks:B={microphone:{enabled:!0,publishOptions:{preConnectBuffer:!0}}},roomConnectOptions:Y}=w;await N(O);const g=()=>{o.disconnect()};O==null||O.addEventListener("abort",g);let _=!1;await Promise.all([U().then(({serverUrl:Pe,participantToken:ie})=>{var se,ae;return _=(((ae=(se=d.decodeTokenPayload(ie).roomConfig)==null?void 0:se.agents)==null?void 0:ae.length)??0)>0,o.connect(Pe,ie,Y)}),(J=B.microphone)!=null&&J.enabled?o.localParticipant.setMicrophoneEnabled(!0,void 0,((W=B.microphone)==null?void 0:W.publishOptions)??{}):Promise.resolve(),(q=B.camera)!=null&&q.enabled?o.localParticipant.setCameraEnabled(!0,void 0,((G=B.camera)==null?void 0:G.publishOptions)??{}):Promise.resolve(),(K=B.screenShare)!=null&&K.enabled?o.localParticipant.setScreenShareEnabled(!0,void 0,((oe=B.screenShare)==null?void 0:oe.publishOptions)??{}):Promise.resolve()]),await P(O),_&&await H.waitUntilConnected(O),O==null||O.removeEventListener("abort",g)},[o,N,U,P,H.waitUntilConnected]),V=r.useCallback(async()=>{await o.disconnect()},[o]),z=r.useCallback(async()=>{const w=await U();await o.prepareConnection(w.serverUrl,w.participantToken)},[U,o]);return r.useEffect(()=>{z().catch(w=>{console.warn("WARNING: Room.prepareConnection failed:",w)})},[]),r.useMemo(()=>({...y,waitUntilConnected:P,waitUntilDisconnected:N,prepareConnection:z,start:$,end:V}),[y,P,N,z,$,V])}function et(e,t,n,s){const f=r.useMemo(()=>()=>{},[]),c=r.useCallback(n??f,s??[]),o=s?c:n,p=r.useMemo(()=>e?"internal"in e?e.internal.emitter:e:null,[e]);r.useEffect(()=>{if(!(!p||!o))return p.on(t,o),()=>{p.off(t,o)}},[p,t,o])}var ye=(e=>(e.MessageReceived="messageReceived",e))(ye||{});function tt(e){const{room:t}=pe(e),n=r.useMemo(()=>new ne.EventEmitter,[]),s=re(e),f=Te({room:t}),c=r.useMemo(()=>({room:t}),[t]),o=M.useChat(c),p=r.useMemo(()=>f.map(u=>{var k,R,x;switch(u.participantInfo.identity){case t.localParticipant.identity:return{type:"userTranscript",message:u.text,id:u.streamInfo.id,timestamp:u.streamInfo.timestamp,from:t.localParticipant};case((k=s.internal.agentParticipant)==null?void 0:k.identity):case((R=s.internal.workerParticipant)==null?void 0:R.identity):return{type:"agentTranscript",message:u.text,id:u.streamInfo.id,timestamp:u.streamInfo.timestamp,from:((x=s.internal.agentParticipant)==null?void 0:x.identity)===u.participantInfo.identity?s.internal.agentParticipant:s.internal.workerParticipant};default:return{type:"agentTranscript",message:u.text,id:u.streamInfo.id,timestamp:u.streamInfo.timestamp,from:Array.from(t.remoteParticipants.values()).find(L=>L.identity===u.participantInfo.identity)}}}),[f,t]),T=r.useMemo(()=>[...p,...o.chatMessages],[p,o.chatMessages]),E=r.useRef(new Map),v=r.useMemo(()=>{const u=new Date;for(const k of T)E.current.has(k.id)||E.current.set(k.id,u);return T.sort((k,R)=>{const x=E.current.get(k.id),L=E.current.get(R.id);return typeof x>"u"||typeof L>"u"?0:x.getTime()-L.getTime()})},[T]),m=r.useRef(new Set);return r.useEffect(()=>{for(const u of v)m.current.has(u.id)||(m.current.add(u.id),n.emit("messageReceived",u))},[v]),r.useMemo(()=>({messages:v,send:o.send,isSending:o.isSending,internal:{emitter:n}}),[v,o.send,o.isSending])}exports.AgentEvent=Ee;exports.MessagesEvent=ye;exports.SessionContext=ee;exports.SessionEvent=ke;exports.useAgent=re;exports.useAudioPlayback=Me;exports.useClearPinButton=Ae;exports.useDataChannel=Le;exports.useEnsureSession=pe;exports.useEvents=et;exports.useIsRecording=Ge;exports.useLiveKitRoom=xe;exports.useMaybeSessionContext=te;exports.useParticipantAttribute=We;exports.useParticipantAttributes=Se;exports.useParticipantInfo=he;exports.useParticipantPermissions=De;exports.useParticipantTracks=Q;exports.useParticipants=ve;exports.useRemoteParticipant=Ne;exports.useRemoteParticipants=Z;exports.useRoomInfo=_e;exports.useSequentialRoomConnectDisconnect=Ke;exports.useSession=Ze;exports.useSessionContext=Re;exports.useSessionMessages=tt;exports.useSortedParticipants=Ie;exports.useSpeakingParticipants=be;exports.useTextStream=Ce;exports.useToken=Fe;exports.useTrackByName=je;exports.useTrackTranscription=ge;exports.useTranscriptions=Te;exports.useVoiceAssistant=qe;
|
|
2
|
+
//# sourceMappingURL=shared-88J2fzv7.js.map
|