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 }); } } }