/** * A class to get connections to the correct "api" server given a room name. */ import { RoomManagerClient } from "../Messages/generated/messages_grpc_pb"; import grpc from "grpc"; import crypto from "crypto"; import { API_URL } from "../Enum/EnvironmentVariable"; import Debug from "debug"; const debug = Debug("apiClientRespository"); class ApiClientRepository { private roomManagerClients: RoomManagerClient[] = []; public constructor(private apiUrls: string[]) {} public async getClient(roomId: string): Promise { const array = new Uint32Array(crypto.createHash("md5").update(roomId).digest()); const index = array[0] % this.apiUrls.length; let client = this.roomManagerClients[index]; if (client === undefined) { this.roomManagerClients[index] = client = new RoomManagerClient( this.apiUrls[index], grpc.credentials.createInsecure() ); debug("Mapping room %s to API server %s", roomId, this.apiUrls[index]); } return Promise.resolve(client); } public async getAllClients(): Promise { return [await this.getClient("")]; } } const apiClientRepository = new ApiClientRepository(API_URL.split(",")); export { apiClientRepository };