From 9717f64abd4b268ef59fcf4311560413fe598686 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: Fri, 31 May 2024 13:55:28 +0800 Subject: [PATCH] refactor:NTEvent --- src/common/utils/EventTask.ts | 231 ++++++++++++++++++++-------------- 1 file changed, 138 insertions(+), 93 deletions(-) diff --git a/src/common/utils/EventTask.ts b/src/common/utils/EventTask.ts index 6a939df1..4f03023c 100644 --- a/src/common/utils/EventTask.ts +++ b/src/common/utils/EventTask.ts @@ -1,99 +1,144 @@ +import { NodeIQQNTWrapperSession } from "@/core/wrapper"; import { randomUUID } from "crypto"; -export enum NTEventMode { - Once = 1, - Twice = 2 +// export enum NTEventMode { +// Once = 1, +// Twice = 2 +// } +// export interface NTEventType Promise> { +// EventName: string, +// EventFunction: U, +// ListenerName: string, +// ListenerFunction: Function +// } +// interface Internal_MapKey { +// mode: NTEventMode, +// timeout: number, +// createtime: number, +// func: Function +// } +// export class NTEvent any, R = any> { +// EventData: NTEventType; +// EventTask: Map = new Map(); +// constructor(params: NTEventType) { +// params.ListenerFunction = this.DispatcherListener.bind(this); +// this.EventData = params; +// this.EventData.EventFunction = params.EventFunction.bind(this) as any; +// } +// async DispatcherListener(...args: any[]) { +// console.log(...args); +// this.EventTask.forEach((task, uuid) => { +// if (task.createtime + task.timeout > Date.now()) { +// this.EventTask.delete(uuid); +// return; +// } +// task.func(...args); +// }) +// } +// async CallTwiceEvent(timeout: number = 3000, ...args: Parameters) { +// return new Promise((resolve, reject) => { +// const id = randomUUID(); +// let complete = 0; +// let retData: R | undefined = undefined; +// let databack = () => { +// if (!complete) { +// this.EventTask.delete(id); +// reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout')); +// } else { +// resolve(retData as R); +// } +// } + +// let Timeouter = setTimeout(databack, timeout); + +// this.EventTask.set(id, { +// mode: NTEventMode.Once, +// timeout: timeout, +// createtime: Date.now(), +// func: (...args: any[]) => { +// complete++; +// retData = args as R; +// if (complete == 2) { +// clearTimeout(Timeouter); +// databack(); +// } +// } +// }); +// this.EventData.EventFunction(...args); +// }); +// } + +// async CallOnceEvent(timeout: number = 3000, ...args: Parameters) { +// return new Promise((resolve, reject) => { +// const id = randomUUID(); +// let complete = false; +// let retData: R | undefined = undefined; +// let databack = () => { +// if (!complete) { +// this.EventTask.delete(id); +// reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout')); +// } else { +// resolve(retData as R); +// } +// } +// let Timeouter = setTimeout(databack, timeout); + +// this.EventTask.set(id, { +// mode: NTEventMode.Once, +// timeout: timeout, +// createtime: Date.now(), +// func: (...args: any[]) => { +// clearTimeout(Timeouter); +// complete = true; +// retData = args as R; +// databack(); +// } +// }); +// this.EventData.EventFunction(...args); +// }); +// } +// } + +export class ListenerClassBase { + [key: string]: string; } -export interface NTEventType any> { - EventName: string, - EventFunction: U, - ListenerName: string, - ListenerFunction: Function -} -interface Internal_MapKey { - mode: NTEventMode, - timeout: number, - createtime: number, - func: Function -} -export class NTEvent any, R = any> { - EventData: NTEventType; - EventTask: Map = new Map(); - constructor(params: NTEventType) { - params.ListenerFunction = this.DispatcherListener.bind(this); - this.EventData = params; - this.EventData.EventFunction = params.EventFunction.bind(this) as any; + +export class NTEventWrapper { + private ListenerMap: Map; + private WrapperSession: NodeIQQNTWrapperSession; + private ListenerManger: Map = new Map(); + constructor({ ListenerMap, WrapperSession }: { ListenerMap: Map, WrapperSession: NodeIQQNTWrapperSession }) { + this.ListenerMap = ListenerMap; + this.WrapperSession = WrapperSession; } - async DispatcherListener(...args: any[]) { - console.log(...args); - this.EventTask.forEach((task, uuid) => { - if (task.createtime + task.timeout > Date.now()) { - this.EventTask.delete(uuid); - return; + GetEvent any>(eventName: string) { + // 将 eventName 'NodeIKernelProfileLikeService/GetTest' => 转换成 this.WrapperSession.getProfileLikeService().getTest + let eventNameArr = eventName.split('/'); + type eventType = { + [key: string]: () => { [key: string]: (...params: Parameters) => Promise> } + } + if (eventNameArr.length > 1) { + let serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', ''); + let eventName = eventNameArr[1]; + let services = (this.WrapperSession as unknown as eventType)[serviceName](); + let event = services[eventName]; + //重新绑定this + event = event.bind(services); + if (event) { + return event; } - task.func(...args); - }) + return undefined; + + } + } - async CallTwiceEvent(timeout: number = 3000, ...args: Parameters) { - return new Promise((resolve, reject) => { - const id = randomUUID(); - let complete = 0; - let retData: R | undefined = undefined; - let databack = () => { - if (!complete) { - this.EventTask.delete(id); - reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout')); - } else { - resolve(retData as R); - } - } - - let Timeouter = setTimeout(databack, timeout); - - this.EventTask.set(id, { - mode: NTEventMode.Once, - timeout: timeout, - createtime: Date.now(), - func: (...args: any[]) => { - complete++; - retData = args as R; - if (complete == 2) { - clearTimeout(Timeouter); - databack(); - } - } - }); - this.EventData.EventFunction(...args); - }); + // 获取某个Listener + GetListener(listenerName: string, uniqueCode: string = "") { + let ListenerType = this.ListenerMap.get(listenerName); + let Listener = this.ListenerManger.get(listenerName + uniqueCode); + if (!Listener && ListenerType) { + Listener = new ListenerType(); + this.ListenerManger.set(listenerName + uniqueCode, Listener); + } + return Listener; } - - async CallOnceEvent(timeout: number = 3000, ...args: Parameters) { - return new Promise((resolve, reject) => { - const id = randomUUID(); - let complete = false; - let retData: R | undefined = undefined; - let databack = () => { - if (!complete) { - this.EventTask.delete(id); - reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout')); - } else { - resolve(retData as R); - } - } - let Timeouter = setTimeout(databack, timeout); - - this.EventTask.set(id, { - mode: NTEventMode.Once, - timeout: timeout, - createtime: Date.now(), - func: (...args: any[]) => { - clearTimeout(Timeouter); - complete = true; - retData = args as R; - databack(); - } - }); - this.EventData.EventFunction(...args); - }); - } -} - +} \ No newline at end of file