RocketChat/Rocket.Chat

View on GitHub
packages/core-services/src/lib/Api.ts

Summary

Maintainability
A
0 mins
Test Coverage
import type { EventSignatures } from '../events/Events';
import type { IApiService } from '../types/IApiService';
import type { IBroker, IBrokerNode } from '../types/IBroker';
import type { IServiceClass } from '../types/ServiceClass';

export class Api implements IApiService {
    private services: Set<IServiceClass> = new Set<IServiceClass>();

    private broker?: IBroker;

    // set a broker for the API and registers all services in the broker
    setBroker(broker: IBroker): void {
        this.broker = broker;

        this.services.forEach((service) => this.broker?.createService(service));
    }

    async destroyService(instance: IServiceClass): Promise<void> {
        if (!this.services.has(instance)) {
            return;
        }

        if (this.broker) {
            await this.broker.destroyService(instance);
        }

        this.services.delete(instance);
    }

    registerService(instance: IServiceClass, serviceDependencies?: string[]): void {
        this.services.add(instance);

        instance.setApi(this);

        if (this.broker) {
            this.broker.createService(instance, serviceDependencies);
        }
    }

    async call(method: string, data?: unknown): Promise<any> {
        return this.broker?.call(method, data);
    }

    async waitAndCall(method: string, data: any): Promise<any> {
        return this.broker?.waitAndCall(method, data);
    }

    async broadcast<T extends keyof EventSignatures>(event: T, ...args: Parameters<EventSignatures[T]>): Promise<void> {
        if (!this.broker) {
            throw new Error(`No broker set to broadcast: ${event}`);
        }

        return this.broker.broadcast(event, ...args);
    }

    async broadcastToServices<T extends keyof EventSignatures>(
        services: string[],
        event: T,
        ...args: Parameters<EventSignatures[T]>
    ): Promise<void> {
        return this.broker?.broadcastToServices(services, event, ...args);
    }

    async broadcastLocal<T extends keyof EventSignatures>(event: T, ...args: Parameters<EventSignatures[T]>): Promise<void> {
        return this.broker?.broadcastLocal(event, ...args);
    }

    nodeList(): Promise<IBrokerNode[]> {
        if (!this.broker) {
            throw new Error('No broker set to start.');
        }
        return this.broker.nodeList();
    }

    async start(): Promise<void> {
        if (!this.broker) {
            throw new Error('No broker set to start.');
        }
        await this.broker.start();
    }
}