// Implementation inspired from Outline import logger from "./logger"; import { SearchIndexClient } from "./search"; export enum PluginType { Search = "search", } interface PluginTypeMap { [PluginType.Search]: SearchIndexClient; } export interface TPlugin { type: T; name: string; provider: PluginProvider; } export interface PluginProvider { getClient(): Promise; } export class PluginManager { private static providers = new Map[]>(); static register(plugin: TPlugin): void { const p = PluginManager.providers.get(plugin.type); if (!p) { PluginManager.providers.set(plugin.type, [plugin]); return; } p.push(plugin); } static async getClient( type: T, ): Promise { const provider = PluginManager.providers.get(type); if (!provider) { return null; } return await provider[provider.length - 1].provider.getClient(); } static isRegistered(type: T): boolean { return !!PluginManager.providers.get(type); } static logAllPlugins() { logger.info("Plugins (Last one wins):"); for (const type of Object.values(PluginType)) { logger.info(` ${type}:`); const plugins = PluginManager.providers.get(type); if (!plugins) { logger.info(" - None"); continue; } for (const plugin of plugins) { logger.info(` - ${plugin.name}`); } } } }