Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion app/api/connection-details/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { randomString } from '@/lib/client-utils';
import { getLiveKitURL } from '@/lib/getLiveKitURL';
import { ConnectionDetails } from '@/lib/types';
import { AccessToken, AccessTokenOptions, VideoGrant } from 'livekit-server-sdk';
import { RoomAgentDispatch, RoomConfiguration } from '@livekit/protocol';
import { NextRequest, NextResponse } from 'next/server';

const API_KEY = process.env.LIVEKIT_API_KEY;
Expand All @@ -17,9 +18,11 @@ export async function GET(request: NextRequest) {
const participantName = request.nextUrl.searchParams.get('participantName');
const metadata = request.nextUrl.searchParams.get('metadata') ?? '';
const region = request.nextUrl.searchParams.get('region');
const language = request.nextUrl.searchParams.get('language') ?? 'en';
if (!LIVEKIT_URL) {
throw new Error('LIVEKIT_URL is not defined');
}

const livekitServerUrl = region ? getLiveKitURL(LIVEKIT_URL, region) : LIVEKIT_URL;
let randomParticipantPostfix = request.cookies.get(COOKIE_KEY)?.value;
if (livekitServerUrl === undefined) {
Expand All @@ -33,7 +36,6 @@ export async function GET(request: NextRequest) {
return new NextResponse('Missing required query parameter: participantName', { status: 400 });
}

// Generate participant token
if (!randomParticipantPostfix) {
randomParticipantPostfix = randomString(4);
}
Expand All @@ -42,10 +44,15 @@ export async function GET(request: NextRequest) {
identity: `${participantName}__${randomParticipantPostfix}`,
name: participantName,
metadata,
attributes: {
language,
}
},
roomName,
);

console.info("token:", participantToken);

// Return connection details
const data: ConnectionDetails = {
serverUrl: livekitServerUrl,
Expand Down Expand Up @@ -75,8 +82,14 @@ function createParticipantToken(userInfo: AccessTokenOptions, roomName: string)
canPublish: true,
canPublishData: true,
canSubscribe: true,
canUpdateOwnMetadata: true,
};
at.addGrant(grant);
at.roomConfig = new RoomConfiguration({
agents: [new RoomAgentDispatch({
agentName: "translator",
})],
})
return at.toJwt();
}

Expand Down
8 changes: 8 additions & 0 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ function Tabs(props: React.PropsWithChildren<{}>) {
function DemoMeetingTab(props: { label: string }) {
const router = useRouter();
const [e2ee, setE2ee] = useState(false);
// TODO(dz): we need to set this to the default language of the browser
const [language, setLanguage] = useState("en")
const [sharedPassphrase, setSharedPassphrase] = useState(randomString(64));
const startMeeting = () => {
if (e2ee) {
Expand All @@ -60,6 +62,12 @@ function DemoMeetingTab(props: { label: string }) {
</button>
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
<div style={{ display: 'flex', flexDirection: 'row', gap: '1rem' }}>
<select
id="language"
onChange={(ev) => setLanguage(ev.target.value)}
>

</select>
<input
id="use-e2ee"
type="checkbox"
Expand Down
12 changes: 8 additions & 4 deletions app/rooms/[roomName]/PageClientImpl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@ import { DebugMode } from '@/lib/Debug';
import { KeyboardShortcuts } from '@/lib/KeyboardShortcuts';
import { RecordingIndicator } from '@/lib/RecordingIndicator';
import { SettingsMenu } from '@/lib/SettingsMenu';
import { ConnectionDetails } from '@/lib/types';
import { ConnectionDetails, LocalUserChoices } from '@/lib/types';
import { VideoConference } from './VideoConference';
import { PreJoin } from './PreJoin';
import {
formatChatMessageLinks,
LocalUserChoices,
PreJoin,
RoomContext,
VideoConference,
} from '@livekit/components-react';
import {
ExternalE2EEKeyProvider,
Expand Down Expand Up @@ -43,13 +42,15 @@ export function PageClientImpl(props: {
const [preJoinChoices, setPreJoinChoices] = React.useState<LocalUserChoices | undefined>(
undefined,
);

const preJoinDefaults = React.useMemo(() => {
return {
username: '',
videoEnabled: true,
audioEnabled: true,
};
}, []);

const [connectionDetails, setConnectionDetails] = React.useState<ConnectionDetails | undefined>(
undefined,
);
Expand All @@ -59,6 +60,9 @@ export function PageClientImpl(props: {
const url = new URL(CONN_DETAILS_ENDPOINT, window.location.origin);
url.searchParams.append('roomName', props.roomName);
url.searchParams.append('participantName', values.username);
if (values.language) {
url.searchParams.append('language', values.language);
}
if (props.region) {
url.searchParams.append('region', props.region);
}
Expand Down
Loading
Loading