* Migrate Home Page to App Router * Update themeColor from layout.tsx * port room page to app router * small changes * port custom page to app router * port token and url api routes * port start stop routes * Refactor error handling in GET function * delete pages folder * remove unused function * remove deprecated field from docs: @deprecated — will be enabled by default and removed in Next.js 15 * wrap useSearchParams in Suspense * split up custom page into server and client component * update imports * simplify * Refactor error handling in GET function * refactor to use props for components * Refactor video codec validation and handling * Refactor LiveKitRoom component to handle null liveKitUrl * refactor: improve video codec validation and handling * add video codec typeguard * fix isVideoCodec
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import { EgressClient } from 'livekit-server-sdk';
|
|
import { NextResponse } from 'next/server';
|
|
|
|
export async function GET(req: Request) {
|
|
try {
|
|
const url = new URL(req.url);
|
|
const searchParams = url.searchParams;
|
|
const roomName = searchParams.get('roomName');
|
|
|
|
/**
|
|
* CAUTION:
|
|
* for simplicity this implementation does not authenticate users and therefore allows anyone with knowledge of a roomName
|
|
* to start/stop recordings for that room.
|
|
* DO NOT USE THIS FOR PRODUCTION PURPOSES AS IS
|
|
*/
|
|
|
|
if (typeof roomName !== 'string') {
|
|
return new NextResponse('Missing roomName parameter', { status: 403 });
|
|
}
|
|
|
|
const { LIVEKIT_API_KEY, LIVEKIT_API_SECRET, LIVEKIT_URL } = process.env;
|
|
|
|
const hostURL = new URL(LIVEKIT_URL!);
|
|
hostURL.protocol = 'https:';
|
|
|
|
const egressClient = new EgressClient(hostURL.origin, LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
|
const activeEgresses = (await egressClient.listEgress({ roomName })).filter(
|
|
(info) => info.status < 2,
|
|
);
|
|
if (activeEgresses.length === 0) {
|
|
return new NextResponse('No active recording found', { status: 404 });
|
|
}
|
|
await Promise.all(activeEgresses.map((info) => egressClient.stopEgress(info.egressId)));
|
|
|
|
return new NextResponse(null, { status: 200 });
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
return new NextResponse(error.message, { status: 500 });
|
|
}
|
|
}
|
|
}
|