mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-01-16 05:56:47 +01:00
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { PluginHandle } from './PluginHandle';
|
|
import { loadPlugins, PluginInfo } from './plugins';
|
|
|
|
export class PluginManager {
|
|
#handles: PluginHandle[] | null = null;
|
|
static #instance: PluginManager | null = null;
|
|
|
|
public static instance(): PluginManager {
|
|
if (PluginManager.#instance == null) {
|
|
PluginManager.#instance = new PluginManager();
|
|
PluginManager.#instance.plugins(); // Trigger workers to boot, as it takes a few seconds
|
|
}
|
|
return PluginManager.#instance;
|
|
}
|
|
|
|
async plugins(): Promise<PluginHandle[]> {
|
|
this.#handles = this.#handles ?? loadPlugins();
|
|
return this.#handles;
|
|
}
|
|
|
|
async #pluginsWithInfo(): Promise<{ plugin: PluginHandle; info: PluginInfo }[]> {
|
|
const plugins = await this.plugins();
|
|
return Promise.all(plugins.map(async (plugin) => ({ plugin, info: await plugin.getInfo() })));
|
|
}
|
|
|
|
async pluginsWith(capability: PluginInfo['capabilities'][0]): Promise<PluginHandle[]> {
|
|
return (await this.#pluginsWithInfo())
|
|
.filter((v) => v.info.capabilities.includes(capability))
|
|
.map((v) => v.plugin);
|
|
}
|
|
|
|
async plugin(name: string): Promise<PluginHandle | null> {
|
|
return (await this.#pluginsWithInfo()).find((v) => v.info.name === name)?.plugin ?? null;
|
|
}
|
|
|
|
async pluginOrThrow(name: string): Promise<PluginHandle> {
|
|
const plugin = await this.plugin(name);
|
|
if (plugin == null) {
|
|
throw new Error(`Failed to find plugin by ${name}`);
|
|
}
|
|
|
|
return plugin;
|
|
}
|
|
}
|