'use client'; import { formatChatMessageLinks, LiveKitRoom } from '@livekit/components-react'; import { ExternalE2EEKeyProvider, LogLevel, Room, RoomConnectOptions, RoomOptions, VideoPresets, type VideoCodec, } from 'livekit-client'; import { DebugMode } from '@/lib/Debug'; import { useMemo } from 'react'; import { decodePassphrase } from '@/lib/client-utils'; import { SettingsMenu } from '@/lib/SettingsMenu'; import { VideoConference } from '../components/VideoConference' export function VideoConferenceClientImpl(props: { liveKitUrl: string; token: string; codec: VideoCodec | undefined; }) { const worker = typeof window !== 'undefined' && new Worker(new URL('livekit-client/e2ee-worker', import.meta.url)); const keyProvider = new ExternalE2EEKeyProvider(); const e2eePassphrase = typeof window !== 'undefined' ? decodePassphrase(window.location.hash.substring(1)) : undefined; const e2eeEnabled = !!(e2eePassphrase && worker); const roomOptions = useMemo((): RoomOptions => { return { publishDefaults: { videoSimulcastLayers: [VideoPresets.h540, VideoPresets.h216], red: !e2eeEnabled, videoCodec: props.codec, }, adaptiveStream: { pixelDensity: 'screen' }, dynacast: true, e2ee: e2eeEnabled ? { keyProvider, worker, } : undefined, }; }, []); const room = useMemo(() => new Room(roomOptions), []); if (e2eeEnabled) { keyProvider.setKey(e2eePassphrase); room.setE2EEEnabled(true); } const connectOptions = useMemo((): RoomConnectOptions => { return { autoSubscribe: true, }; }, []); return ( ); }