NapCatQQ/packages/napcat-satori/network/index.ts
手瓜一十雪 26d38bebe7 Refactor imports and add generic protocol config API
Replaced all '@/napcat-satori/...' imports with relative paths for consistency and compatibility. Added generic protocol config get/set handlers and routes in the web UI backend to support extensible protocol configuration management. Improved error handling and default value logic for Satori protocol configuration.
2026-01-14 16:01:29 +08:00

73 lines
2.5 KiB
TypeScript

import { ISatoriNetworkAdapter, SatoriEmitEventContent } from './adapter';
import { SatoriNetworkAdapterConfig } from '../config/config';
export class SatoriNetworkManager {
adapters: Map<string, ISatoriNetworkAdapter<SatoriNetworkAdapterConfig>> = new Map();
async registerAdapter<T extends SatoriNetworkAdapterConfig> (
adapter: ISatoriNetworkAdapter<T>
): Promise<void> {
this.adapters.set(adapter.name, adapter as ISatoriNetworkAdapter<SatoriNetworkAdapterConfig>);
}
async registerAdapterAndOpen<T extends SatoriNetworkAdapterConfig> (
adapter: ISatoriNetworkAdapter<T>
): Promise<void> {
await this.registerAdapter(adapter);
await adapter.open();
}
findSomeAdapter (name: string): ISatoriNetworkAdapter<SatoriNetworkAdapterConfig> | undefined {
return this.adapters.get(name);
}
async openAllAdapters (): Promise<void> {
const openPromises = Array.from(this.adapters.values()).map((adapter) =>
Promise.resolve(adapter.open()).catch((e) => {
adapter.logger.logError(`[Satori] 适配器 ${adapter.name} 启动失败: ${e}`);
})
);
await Promise.all(openPromises);
}
async closeAllAdapters (): Promise<void> {
const closePromises = Array.from(this.adapters.values()).map((adapter) =>
Promise.resolve(adapter.close()).catch((e) => {
adapter.logger.logError(`[Satori] 适配器 ${adapter.name} 关闭失败: ${e}`);
})
);
await Promise.all(closePromises);
}
async closeSomeAdaterWhenOpen (
adapters: ISatoriNetworkAdapter<SatoriNetworkAdapterConfig>[]
): Promise<void> {
for (const adapter of adapters) {
if (adapter.isActive) {
await adapter.close();
}
this.adapters.delete(adapter.name);
}
}
async emitEvent<T extends SatoriEmitEventContent> (event: T): Promise<void> {
const emitPromises = Array.from(this.adapters.values())
.filter((adapter) => adapter.isActive)
.map((adapter) =>
adapter.onEvent(event).catch((e) => {
adapter.logger.logError(`[Satori] 适配器 ${adapter.name} 事件发送失败: ${e}`);
})
);
await Promise.all(emitPromises);
}
hasActiveAdapters (): boolean {
return Array.from(this.adapters.values()).some((adapter) => adapter.isActive);
}
}
export { ISatoriNetworkAdapter, SatoriEmitEventContent, SatoriNetworkReloadType } from './adapter';
export { SatoriWebSocketServerAdapter } from './websocket-server';
export { SatoriHttpServerAdapter } from './http-server';
export { SatoriWebHookClientAdapter } from './webhook-client';