capsule AI-native Unix-like composition layer

src/server/internal/livekit/room_manager.go

1,654 bytes · 70 lines · capsule://quake0day/[email protected] raw on github

package livekit

import (
	"context"
	"fmt"

	lksdk "github.com/livekit/server-sdk-go/v2"
	lkproto "github.com/livekit/protocol/livekit"
)

// RoomManager handles LiveKit room lifecycle.
type RoomManager struct {
	client *lksdk.RoomServiceClient
	url        string
	apiKey     string
	apiSecret  string
}

// NewRoomManager creates a new room manager connected to the LiveKit server.
func NewRoomManager(host, apiKey, apiSecret string) *RoomManager {
	client := lksdk.NewRoomServiceClient(host, apiKey, apiSecret)
	return &RoomManager{
		client:     client,
		url:        host,
		apiKey:     apiKey,
		apiSecret:  apiSecret,
	}
}

func (rm *RoomManager) URL() string {
	return rm.url
}

func (rm *RoomManager) APIKey() string {
	return rm.apiKey
}

func (rm *RoomManager) APISecret() string {
	return rm.apiSecret
}

// RoomName returns the standard room name for a session.
func RoomName(sessionID string) string {
	return "cyberverse-" + sessionID
}

// CreateRoom creates a new LiveKit room for a session.
func (rm *RoomManager) CreateRoom(ctx context.Context, roomName string) error {
	_, err := rm.client.CreateRoom(ctx, &lkproto.CreateRoomRequest{
		Name:            roomName,
		EmptyTimeout:    300, // 5 minutes
		MaxParticipants: 4,
	})
	if err != nil {
		return fmt.Errorf("failed to create room %s: %w", roomName, err)
	}
	return nil
}

// DeleteRoom deletes a LiveKit room.
func (rm *RoomManager) DeleteRoom(ctx context.Context, roomName string) error {
	_, err := rm.client.DeleteRoom(ctx, &lkproto.DeleteRoomRequest{
		Room: roomName,
	})
	if err != nil {
		return fmt.Errorf("failed to delete room %s: %w", roomName, err)
	}
	return nil
}