2024-11-09 18:36:24 -05:00
|
|
|
import { GlideClient } from '@valkey/valkey-glide';
|
2024-10-29 16:47:10 -04:00
|
|
|
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';
|
2024-10-29 16:47:10 -04:00
|
|
|
|
|
|
|
|
interface RoomManagerOptions {
|
|
|
|
|
provider?: ProviderType;
|
|
|
|
|
providerOptions?: ProviderConfig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class RoomManager {
|
2024-11-03 16:36:21 -05:00
|
|
|
private valkey: GlideClient;
|
2024-10-29 16:47:10 -04:00
|
|
|
private provider: BaseRoomProvider<RoomInfo>;
|
|
|
|
|
|
2024-11-09 18:36:24 -05:00
|
|
|
constructor(options: RoomManagerOptions = {}, valkeyClient:GlideClient) {
|
|
|
|
|
this.valkey = valkeyClient;
|
2024-10-29 16:47:10 -04:00
|
|
|
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);
|
|
|
|
|
/*
|
2024-10-29 16:47:10 -04:00
|
|
|
case 'docker':
|
|
|
|
|
return new DockerRoomProvider(this.redis, options);
|
|
|
|
|
case 'kubernetes':
|
|
|
|
|
return new KubernetesRoomProvider(this.redis, options);
|
2024-11-09 18:36:24 -05:00
|
|
|
*/
|
2024-10-29 16:47:10 -04: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;
|