diff options
| author | MohamedBassem <me@mbassem.com> | 2025-07-27 19:37:11 +0100 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2025-07-27 19:37:11 +0100 |
| commit | b94896a0f8fa43b957a9bdd6ab57ada0ab8101af (patch) | |
| tree | ed8f79ce7d407379fa0d8210db52959f849fac0e /packages/shared/plugins.ts | |
| parent | 7bb7f18fbf8e374efde2fe28bacfc29157b9fa19 (diff) | |
| download | karakeep-b94896a0f8fa43b957a9bdd6ab57ada0ab8101af.tar.zst | |
refactor: Extract meilisearch as a plugin
Diffstat (limited to '')
| -rw-r--r-- | packages/shared/plugins.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/shared/plugins.ts b/packages/shared/plugins.ts new file mode 100644 index 00000000..2ce5826a --- /dev/null +++ b/packages/shared/plugins.ts @@ -0,0 +1,64 @@ +// 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<T extends PluginType> { + type: T; + name: string; + provider: PluginProvider<PluginTypeMap[T]>; +} + +export interface PluginProvider<T> { + getClient(): Promise<T | null>; +} + +export class PluginManager { + private static providers = new Map<PluginType, TPlugin<PluginType>[]>(); + + static register<T extends PluginType>(plugin: TPlugin<T>): void { + const p = PluginManager.providers.get(plugin.type); + if (!p) { + PluginManager.providers.set(plugin.type, [plugin]); + return; + } + p.push(plugin); + } + + static async getClient<T extends PluginType>( + type: T, + ): Promise<PluginTypeMap[T] | null> { + const provider = PluginManager.providers.get(type); + if (!provider) { + return null; + } + return await provider[provider.length - 1].provider.getClient(); + } + + static isRegistered<T extends PluginType>(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}`); + } + } + } +} |
