/** * 存储插件加载器实现 * 负责动态加载和管理存储插件 */ import { StoragePlugin, StoragePluginMetadata } from '../interfaces/StoragePlugin'; import { StorageFactory } from './StorageFactory'; import * as fs from 'fs'; import * as path from 'path'; /** * 存储插件加载器接口 */ export interface StoragePluginLoader { loadPlugin(plugin: StoragePlugin): void; loadPlugins(plugins: StoragePlugin[]): void; loadPluginFromPath(pluginPath: string): Promise; loadPluginsFromDirectory(directoryPath: string): Promise; getLoadedPlugins(): StoragePluginMetadata[]; unloadPlugin(storageType: string): void; } export class StoragePluginLoaderImpl implements StoragePluginLoader { // 已加载插件的注册表 private pluginRegistry: Map = new Map(); /** * 加载存储插件 * @param plugin 存储插件实例 */ public loadPlugin(plugin: StoragePlugin): void { if (plugin.metadata && plugin.metadata.name) { this.pluginRegistry.set(plugin.metadata.name, plugin); } else { throw new Error('Invalid storage plugin: missing metadata or name'); } } /** * 批量加载存储插件 * @param plugins 存储插件实例数组 */ public loadPlugins(plugins: StoragePlugin[]): void { for (const plugin of plugins) { this.loadPlugin(plugin); } } /** * 从路径加载存储插件 * @param pluginPath 插件路径 */ public async loadPluginFromPath(pluginPath: string): Promise { try { // 动态导入插件模块 const pluginModule = await import(pluginPath); const pluginInstance = new pluginModule.default(); // 加载插件 this.loadPlugin(pluginInstance); } catch (error) { console.error(`Failed to load storage plugin from ${pluginPath}:`, error); throw new Error(`Failed to load storage plugin: ${error instanceof Error ? error.message : String(error)}`); } } /** * 从目录加载存储插件 * @param directoryPath 目录路径 */ public async loadPluginsFromDirectory(directoryPath: string): Promise { // 实现从目录加载插件的逻辑 console.log(`Loading plugins from directory: ${directoryPath}`); } /** * 获取已加载的插件元数据 * @returns 插件元数据数组 */ public getLoadedPlugins(): any[] { return Array.from(this.pluginRegistry.values()).map(plugin => plugin.metadata); } /** * 卸载存储插件 * @param storageType 存储类型 */ public unloadPlugin(storageType: string): void { this.pluginRegistry.delete(storageType); } } /** * 存储插件加载器单例实例 */ export const storagePluginLoader = new StoragePluginLoaderImpl();