EvalueTonSavoir/server/controllers/rooms.ts

78 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-11-09 18:36:24 -05:00
import { GlideClient } from '@valkey/valkey-glide';
import {
RoomInfo,
RoomOptions,
ProviderType,
ProviderConfig
} from '../../types/room';
2024-11-09 18:36:24 -05:00
import { BaseRoomProvider } from '../roomsProviders/base-provider';
import { ClusterRoomProvider } from '../roomsProviders/cluster-provider';
//import { DockerRoomProvider } from '../roomsProviders/docker-provider';
//import { KubernetesRoomProvider } from '../roomsProviders/kubernetes-provider';
interface RoomManagerOptions {
provider?: ProviderType;
providerOptions?: ProviderConfig;
}
export class RoomManager {
2024-11-03 16:36:21 -05:00
private valkey: GlideClient;
private provider: BaseRoomProvider<RoomInfo>;
2024-11-09 18:36:24 -05:00
constructor(options: RoomManagerOptions = {}, valkeyClient:GlideClient) {
this.valkey = valkeyClient;
this.provider = this.createProvider(
options.provider || process.env.ROOM_PROVIDER as ProviderType || 'cluster',
options.providerOptions
);
this.setupCleanup();
}
private createProvider(
type: ProviderType,
options?: ProviderConfig
): BaseRoomProvider<RoomInfo> {
switch (type) {
case 'cluster':
2024-11-09 18:36:24 -05:00
return new ClusterRoomProvider(this.valkey, options);
/*
case 'docker':
return new DockerRoomProvider(this.redis, options);
case 'kubernetes':
return new KubernetesRoomProvider(this.redis, options);
2024-11-09 18:36:24 -05:00
*/
default:
throw new Error(`Unknown provider type: ${type}`);
}
}
private setupCleanup(): void {
setInterval(() => {
this.provider.cleanup().catch(console.error);
}, 30000);
}
async createRoom(options: RoomOptions = {}): Promise<RoomInfo> {
const roomId = options.roomId || this.generateRoomId();
return await this.provider.createRoom(roomId, options);
}
async deleteRoom(roomId: string): Promise<void> {
return await this.provider.deleteRoom(roomId);
}
async getRoomStatus(roomId: string): Promise<RoomInfo | null> {
return await this.provider.getRoomStatus(roomId);
}
async listRooms(): Promise<RoomInfo[]> {
return await this.provider.listRooms();
}
private generateRoomId(): string {
return `room-${Math.random().toString(36).substr(2, 9)}`;
}
2024-11-09 18:36:24 -05:00
}
module.exports = RoomManager;