mira-app-server
Version:
Mira Server - standalone server application using mira-app-core
146 lines • 5.28 kB
TypeScript
import { ILibraryServerData } from 'mira-app-core/storage/sqlite';
import { MiraWebsocketServer } from './WebSocketServer';
import { PluginRouteDefinition } from './ServerPlugin';
import type { Request, Response } from 'express';
import type { MetadataRule } from './services/MetadataService';
export interface PluginConfig {
name: string;
enabled: boolean;
path: string;
version?: string;
description?: string;
author?: string;
main?: string;
icon?: string | null;
title?: string;
category?: string;
tags?: string[];
registry?: string;
installedAt?: string;
}
export interface ServerWebPluginManifest {
pluginName: string;
pluginId: string;
version: string;
index: string;
serverPluginName: string;
[key: string]: any;
}
export interface HttpHookContext {
libraryId: string;
clientId?: string;
method: string;
path: string;
req: Request;
res: Response;
fields?: Record<string, any>;
}
export type HttpHookHandler = (context: HttpHookContext) => boolean | void | Promise<boolean | void>;
export interface HttpHookDefinition {
method?: string;
path: string | RegExp;
handler: HttpHookHandler;
}
export interface ServerFileFormatHandler {
id: string;
extensions?: string[];
mimeTypes?: string[];
thumbnailExtensions?: string[];
process?: (filePath: string, context?: Record<string, any>) => any | Promise<any>;
thumbnail?: (srcPath: string, destPath: string) => Promise<void>;
metadata?: MetadataRule['parse'];
getExtraFileList?: (filePath: string, context?: Record<string, any>) => string[] | Promise<string[]>;
getExtraFile?: (filePath: string, fileName: string, context?: Record<string, any>) => string | Promise<string>;
viewers?: ServerPreviewViewerDefinition[];
}
export interface ServerPreviewViewerContext {
libraryId: string;
fileId: string;
file: Record<string, any>;
filePath: string;
fileUrl: string;
getExtraFileUrl: (fileName: string) => string;
}
export interface ServerPreviewViewerDefinition {
viewerId: string;
title: string;
entry: string;
icon?: string;
priority?: number;
extensions?: string[];
mimeTypes?: string[];
getQuery?: (context: ServerPreviewViewerContext) => Record<string, unknown> | Promise<Record<string, unknown>>;
}
export interface ResolvedPreviewViewer {
viewerId: string;
pluginId: string;
pluginName: string;
serverPluginName: string;
title: string;
iframeUrl: string;
priority: number;
icon?: string;
}
export declare class ServerPluginManager {
pluginsDir: string;
server: MiraWebsocketServer;
private dbService;
private pluginsConfigPath;
private loadedPlugins;
private miraClient;
private httpHooks;
private fileFormatHandlers;
fields: Record<string, any>[];
constructor({ server, dbService, pluginsDir }: {
server: MiraWebsocketServer;
dbService: ILibraryServerData;
pluginsDir?: string;
});
getPluginDir(pluginName: string): string;
getPluginDistDir(pluginName: string): string;
getPluginWebDir(pluginName: string): string;
getLoadedWebPlugins(): ServerWebPluginManifest[];
private getPluginConfig;
loadPlugins(reload?: boolean): Promise<void>;
loadPlugin(pluginConfig: PluginConfig, reload?: boolean): Promise<void>;
registerFields(fields: Record<string, any>[]): void;
registerField(field: Record<string, any>): void;
registerHttpHook(hook: HttpHookDefinition): void;
registerFileFormat(pluginName: string, handler: ServerFileFormatHandler): () => void;
unregisterFileFormat(pluginName: string, id: string): boolean;
getFileFormatHandlers(): ServerFileFormatHandler[];
getPreviewViewers(context: ServerPreviewViewerContext): Promise<ResolvedPreviewViewer[]>;
processFile(filePath: string, context?: Record<string, any>): Promise<any>;
getExtraFileList(filePath: string, context?: Record<string, any>): Promise<string[] | undefined>;
getExtraFile(filePath: string, fileName: string, context?: Record<string, any>): Promise<string | undefined>;
private getFileFormatHandler;
runHttpHooks(context: HttpHookContext): Promise<boolean>;
private matchesHttpHook;
getPlugin<T>(name: string): T | undefined;
isPluginLoaded(name: string): boolean;
unloadPlugin(name: string): boolean;
reloadPlugin(name: string): Promise<boolean>;
/**
* 从插件目录的 package.json + icon 文件提取展示 meta
*/
private extractPluginMeta;
getPluginsList(): any[];
addPlugin(config: PluginConfig): Promise<void>;
/**
* 重新从 package.json 同步所有插件的展示 meta 到 plugins.json (供「检查更新」调用)
*/
syncPluginsMeta(): number;
/**
* 获取所有已加载插件的路由定�?
*/
getAllPluginRoutes(): PluginRouteDefinition[];
/**
* 获取指定插件的路由定�?
*/
getPluginRoutes(pluginName: string): PluginRouteDefinition[];
/**
* 手动注册插件实例(用于测试或特殊用途)
*/
registerPluginInstance(pluginName: string, pluginInstance: any): void;
}
//# sourceMappingURL=ServerPluginManager.d.ts.map