import { NodeIKernelMsgListener } from "@/core"; import { NodeIQQNTWrapperSession } from "@/core/wrapper"; import { randomUUID } from "crypto"; // 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 class NTEventWrapper { private ListenerMap: Map | undefined; private WrapperSession: NodeIQQNTWrapperSession | undefined; private ListenerManger: Map = new Map(); constructor() { } init({ ListenerMap, WrapperSession }: { ListenerMap: Map, WrapperSession: NodeIQQNTWrapperSession }) { this.ListenerMap = ListenerMap; this.WrapperSession = WrapperSession; } CreatEventFunction any>(eventName: string): T | undefined { // 将 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 as T; } return undefined; } } // 获取某个Listener CreatListenerFunction(listenerName: string, uniqueCode: string = ""): T { 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 as T; } } // 示例代码 快速创建事件 // let NTEvent = new NTEventWrapper(); // let TestEvent = NTEvent.CreatEventFunction<(force: boolean) => Promise>('NodeIKernelProfileLikeService/GetTest'); // if (TestEvent) { // TestEvent(true); // } // 示例代码 快速创建监听Listener类 // let NTEvent = new NTEventWrapper(); // NTEvent.CreatListenerFunction('NodeIKernelMsgListener', 'core') // 初步构想 // NTEventDispatch NTEvent NTEventWrapper // 示例 // 调用接口 // NTEventDispatch.CallSerice('NodeIKernelProfileLikeService/GetTest', true); // 注册监听 解除监听 // NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb); // NTEventDispatch.UnRigisterListener('NodeIKernelMsgListener/onAddSendMsg','core'); // let GetTest = NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode); // GetTest('test'); // always模式 // NTEventDispatch.CreatEvent('NodeIKernelProfileLikeService/GetTest','NodeIKernelMsgListener/onAddSendMsg',Mode,(...args:any[])=>{ console.log(args) });