feat: regenerate keys

This commit is contained in:
2025-02-01 01:12:40 +01:00
parent b830170642
commit 4d699340b3
6 changed files with 91 additions and 15 deletions

View File

@@ -38,6 +38,7 @@
"react-dom": "19",
"react-hook-form": "^7.54.2",
"sonner": "^1.4.41",
"swr": "^2.3.0",
"tailwind-merge": "^2.2.2",
"tailwindcss-animate": "^1.0.7",
"valtio": "^2.1.2",

View File

@@ -1,25 +1,38 @@
import { validateRequest } from '@/lib/auth';
import { ingressClient, roomService } from '@/lib/services/livekit';
import { IngressInput } from 'livekit-server-sdk';
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const room = searchParams.get('room');
export async function GET() {
const { user } = await validateRequest();
if (!room) {
return new Response('Missing room', { status: 400 });
if (!user) {
return new Response('Unauthorized', { status: 401 });
}
// delete all ingresses, deprecation should be fine :clueless:
const ingresses = await ingressClient.listIngress();
const userIngresses = ingresses.filter(ingress => ingress.name === user.username);
for (const ingress of userIngresses) {
await ingressClient.deleteIngress(ingress.ingressId);
}
// dleete and recreate room
const room = (await roomService.listRooms()).filter((r) => r.name === user.username)[0];
if (room) {
await roomService.deleteRoom(room.name);
}
await roomService.createRoom({
name: room,
})
const ingress = await ingressClient.createIngress(
IngressInput.RTMP_INPUT,
{
name: room,
roomName: room,
participantIdentity: 'streamer',
}
)
name: user.username,
});
// create new ingress
const ingress = await ingressClient.createIngress(IngressInput.RTMP_INPUT, {
name: user.username,
roomName: user.username,
participantIdentity: 'streamer',
});
return Response.json({ key: ingress.streamKey });
}

View File

@@ -12,6 +12,7 @@ import prisma from '@/lib/db';
import { roomService } from '@/lib/services/livekit';
import { UniversalForm } from '../UniversalForm/UniversalForm';
import { editStreamInfo } from '@/lib/form/actions';
import RegenerateKey from '../RegenerateKey/RegenerateKey';
export default async function EditLivestream() {
const { user } = await validateRequest();
@@ -55,6 +56,9 @@ export default async function EditLivestream() {
action={editStreamInfo}
submitButtonDivClassname="float-right"
submitText="Save"
otherSubmitButton={
<RegenerateKey />
}
key={streamInfo?.id}
/>
</DialogContent>

View File

@@ -0,0 +1,37 @@
'use client';
import { Button } from '@/components/ui/button';
import { fetcher as defaultFetcher } from '@/lib/services/swr';
import React from 'react';
import { toast } from 'sonner';
import useSWR from 'swr/mutation';
export default function RegenerateKey() {
const { error, isMutating, trigger } = useSWR('/api/livekit/broadcasterToken', async (url) =>
defaultFetcher(url)
);
React.useEffect(() => {
if (error) {
toast.error(error);
}
}, [error]);
return (
<Button
type="button"
variant="outline"
className="float-left"
loading={isMutating}
onClick={async () => {
const result = await trigger();
if (result?.key) {
await navigator.clipboard.writeText(result.key);
toast.success('Key regenerated and copied to clipboard');
}
}}
>
Regenerate key
</Button>
);
}

3
src/lib/services/swr.ts Normal file
View File

@@ -0,0 +1,3 @@
type FetcherArgs = Parameters<typeof fetch>;
export const fetcher = (...args: FetcherArgs): Promise<any> => fetch(...args).then(res => res.json());

View File

@@ -1807,6 +1807,11 @@ define-properties@^1.1.3, define-properties@^1.2.1:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
detect-libc@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
@@ -4255,6 +4260,14 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
swr@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/swr/-/swr-2.3.0.tgz#66fa45023efd4199f4e7ce608c255709a135943d"
integrity sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==
dependencies:
dequal "^2.0.3"
use-sync-external-store "^1.4.0"
tailwind-merge@^2.2.2:
version "2.6.0"
resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz#ac5fb7e227910c038d458f396b7400d93a3142d5"
@@ -4500,6 +4513,11 @@ use-sidecar@^1.1.2:
detect-node-es "^1.1.0"
tslib "^2.0.0"
use-sync-external-store@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc"
integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==
usehooks-ts@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-3.1.0.tgz#156119f36efc85f1b1952616c02580f140950eca"