Files
var-monorepo/apps/dispatch/app/api/token/route.ts
PxlLoewe 5f6f2362f0 modified: apps/dispatch/app/_components/left/Report.tsx
renamed:    apps/dispatch/app/api/keywords/token/route.ts -> apps/dispatch/app/api/token/route.ts
	modified:   grafana/grafana.db
2025-05-13 21:33:29 -07:00

53 lines
1.3 KiB
TypeScript

import { getServerSession } from "api/auth/[...nextauth]/auth";
import { ROOMS } from "_data/livekitRooms";
import { AccessToken } from "livekit-server-sdk";
import { NextRequest } from "next/server";
import { prisma } from "@repo/db";
if (!process.env.LIVEKIT_API_KEY) throw new Error("LIVEKIT_API_KEY not set");
if (!process.env.LIVEKIT_API_SECRET)
throw new Error("LIVEKIT_API_SECRET not set");
export const GET = async (request: NextRequest) => {
const roomName = request.nextUrl.searchParams.get("roomName");
if (!roomName)
return Response.json({ message: "Missing roomName" }, { status: 400 });
const session = await getServerSession();
if (!session)
return Response.json({ message: "Unauthorized" }, { status: 401 });
const user = await prisma.user.findUnique({
where: {
id: session.user.id,
},
});
if (!user || !user.permissions.includes("AUDIO"))
return Response.json({ message: "Missing permissions" }, { status: 401 });
const participantName = user.publicId;
const at = new AccessToken(
process.env.LIVEKIT_API_KEY,
process.env.LIVEKIT_API_SECRET,
{
identity: participantName,
// Token to expire after 10 minutes
ttl: "1d",
},
);
at.addGrant({
room: roomName,
roomJoin: true,
canPublish: true,
canSubscribe: true,
});
const token = await at.toJwt();
return Response.json({ token });
};