From 621e41cc96f3061d5c98a99a44b525d31e059833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Thu, 14 Nov 2024 17:00:34 +0800 Subject: [PATCH] feat: new config helper/nnetwork --- src/onebot/nnetwork/config.ts | 56 ++++++++++++++++++++++++ src/onebot/nnetwork/httpClientAdapter.ts | 0 src/onebot/nnetwork/httpServerAdapter.ts | 0 src/onebot/nnetwork/index.ts | 52 ++++++++++++++++++++++ src/onebot/nnetwork/wsClientAdapter.ts | 0 src/onebot/nnetwork/wsServerAdapter.ts | 0 6 files changed, 108 insertions(+) create mode 100644 src/onebot/nnetwork/config.ts create mode 100644 src/onebot/nnetwork/httpClientAdapter.ts create mode 100644 src/onebot/nnetwork/httpServerAdapter.ts create mode 100644 src/onebot/nnetwork/index.ts create mode 100644 src/onebot/nnetwork/wsClientAdapter.ts create mode 100644 src/onebot/nnetwork/wsServerAdapter.ts diff --git a/src/onebot/nnetwork/config.ts b/src/onebot/nnetwork/config.ts new file mode 100644 index 00000000..fe543ec2 --- /dev/null +++ b/src/onebot/nnetwork/config.ts @@ -0,0 +1,56 @@ +export interface AdapterConfig { + type: string; // websocket-client, websocket-server, http-server, http-client + enabled: boolean; + [key: string]: any; +} + +const createDefaultConfig = (config: T): T => config; + +export const httpServerDefaultConfig = createDefaultConfig({ + type: 'http-server', + enabled: false, + port: '3000', + host: '0.0.0.0', + enableCors: true, + enableWebsocket: true, + messagePostFormat: 'array', + reportSelfMessage: false, + token: '', +}); + +export const httpClientDefaultConfig = createDefaultConfig({ + type: 'http-client', + enabled: false, + url: 'http://localhost:8080', + messagePostFormat: 'array', + reportSelfMessage: false, + token: '', +}); + +export const websocketServerDefaultConfig = createDefaultConfig({ + type: 'websocket-server', + enabled: false, + host: '0.0.0.0', + port: '3001', + messagePostFormat: 'array', + reportSelfMessage: false, + token: '', +}); + +export const websocketClientDefaultConfig = createDefaultConfig({ + type: 'websocket-client', + enabled: false, + url: 'ws://localhost:8082', + messagePostFormat: 'array', + reportSelfMessage: false, + token: '', +}); + +export type HttpServerConfig = typeof httpServerDefaultConfig; +export type HttpClientConfig = typeof httpClientDefaultConfig; +export type WebsocketServerConfig = typeof websocketServerDefaultConfig; +export type WebsocketClientConfig = typeof websocketClientDefaultConfig; + +export function mergeConfigs(defaultConfig: T, userConfig: Partial): T { + return { ...defaultConfig, ...userConfig }; +} \ No newline at end of file diff --git a/src/onebot/nnetwork/httpClientAdapter.ts b/src/onebot/nnetwork/httpClientAdapter.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/onebot/nnetwork/httpServerAdapter.ts b/src/onebot/nnetwork/httpServerAdapter.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/onebot/nnetwork/index.ts b/src/onebot/nnetwork/index.ts new file mode 100644 index 00000000..4a2a597d --- /dev/null +++ b/src/onebot/nnetwork/index.ts @@ -0,0 +1,52 @@ +import { OB11BaseEvent } from '@/onebot/event/OB11BaseEvent'; +import { OB11Message } from '@/onebot'; + +export type OB11EmitEventContent = OB11BaseEvent | OB11Message; + +export interface IOB11NetworkAdapter { + + onEvent(event: T): void; + + open(): void | Promise; + + close(): void | Promise; + +} +export class OneBotNetworkManager { + adapters: IOB11NetworkAdapter[] = []; + + async openAllAdapters() { + return Promise.all(this.adapters.map(adapter => adapter.open())); + } + + async emitEvent(event: OB11EmitEventContent) { + //console.log('adapters', this.adapters.length); + return Promise.all(this.adapters.map(adapter => adapter.onEvent(event))); + } + + registerAdapter(adapter: IOB11NetworkAdapter) { + this.adapters.push(adapter); + } + + async registerAdapterAndOpen(adapter: IOB11NetworkAdapter) { + this.registerAdapter(adapter); + await adapter.open(); + } + + async closeSomeAdapters(adaptersToClose: IOB11NetworkAdapter[]) { + this.adapters = this.adapters.filter(adapter => !adaptersToClose.includes(adapter)); + await Promise.all(adaptersToClose.map(adapter => adapter.close())); + } + + /** + * Close all adapters that satisfy the predicate. + */ + async closeAdapterByPredicate(closeFilter: (adapter: IOB11NetworkAdapter) => boolean) { + await this.closeSomeAdapters(this.adapters.filter(closeFilter)); + } + + async closeAllAdapters() { + await Promise.all(this.adapters.map(adapter => adapter.close())); + this.adapters = []; + } +} \ No newline at end of file diff --git a/src/onebot/nnetwork/wsClientAdapter.ts b/src/onebot/nnetwork/wsClientAdapter.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/onebot/nnetwork/wsServerAdapter.ts b/src/onebot/nnetwork/wsServerAdapter.ts new file mode 100644 index 00000000..e69de29b