82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
import { formatChatMessageLinks, LiveKitRoom, VideoConference } from '@livekit/components-react';
|
|
import {
|
|
ExternalE2EEKeyProvider,
|
|
LogLevel,
|
|
Room,
|
|
RoomConnectOptions,
|
|
RoomOptions,
|
|
VideoPresets,
|
|
} from 'livekit-client';
|
|
import { useRouter } from 'next/router';
|
|
import { useMemo } from 'react';
|
|
import { decodePassphrase } from '../../lib/client-utils';
|
|
import { DebugMode } from '../../lib/Debug';
|
|
|
|
export default function CustomRoomConnection() {
|
|
const router = useRouter();
|
|
const { liveKitUrl, token } = router.query;
|
|
|
|
const e2eePassphrase =
|
|
typeof window !== 'undefined' && decodePassphrase(window.location.hash.substring(1));
|
|
const worker =
|
|
typeof window !== 'undefined' &&
|
|
new Worker(new URL('livekit-client/e2ee-worker', import.meta.url));
|
|
const keyProvider = new ExternalE2EEKeyProvider();
|
|
|
|
const e2eeEnabled = !!(e2eePassphrase && worker);
|
|
|
|
const roomOptions = useMemo((): RoomOptions => {
|
|
return {
|
|
publishDefaults: {
|
|
videoSimulcastLayers: [VideoPresets.h540, VideoPresets.h216],
|
|
red: !e2eeEnabled,
|
|
// videoCodec: 'vp9', // TODO re-enable vp9
|
|
},
|
|
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,
|
|
};
|
|
}, []);
|
|
|
|
if (typeof liveKitUrl !== 'string') {
|
|
return <h2>Missing LiveKit URL</h2>;
|
|
}
|
|
if (typeof token !== 'string') {
|
|
return <h2>Missing LiveKit token</h2>;
|
|
}
|
|
|
|
return (
|
|
<main data-lk-theme="default">
|
|
{liveKitUrl && (
|
|
<LiveKitRoom
|
|
room={room}
|
|
token={token}
|
|
connectOptions={connectOptions}
|
|
serverUrl={liveKitUrl}
|
|
audio={true}
|
|
video={true}
|
|
>
|
|
<VideoConference chatMessageFormatter={formatChatMessageLinks} />
|
|
<DebugMode logLevel={LogLevel.info} />
|
|
</LiveKitRoom>
|
|
)}
|
|
</main>
|
|
);
|
|
}
|