You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
'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 (
|
|
<LiveKitRoom
|
|
room={room}
|
|
token={props.token}
|
|
connectOptions={connectOptions}
|
|
serverUrl={props.liveKitUrl}
|
|
audio={true}
|
|
video={true}
|
|
>
|
|
<VideoConference
|
|
chatMessageFormatter={formatChatMessageLinks}
|
|
SettingsComponent={
|
|
process.env.NEXT_PUBLIC_SHOW_SETTINGS_MENU === 'true' ? SettingsMenu : undefined
|
|
}
|
|
/>
|
|
<DebugMode logLevel={LogLevel.debug} />
|
|
</LiveKitRoom>
|
|
);
|
|
}
|