refactor: NTEvent

This commit is contained in:
手瓜一十雪 2024-05-31 20:38:31 +08:00
parent 7f2d57ef62
commit 6248991b01

View File

@ -2,13 +2,8 @@ import { NodeIKernelMsgListener } from "@/core";
import { NodeIQQNTWrapperSession } from "@/core/wrapper"; import { NodeIQQNTWrapperSession } from "@/core/wrapper";
import { randomUUID } from "crypto"; import { randomUUID } from "crypto";
export enum NTEventMode {
Once = 1,
Twice = 2
}
interface Internal_MapKey { interface Internal_MapKey {
mode: NTEventMode,
timeout: number, timeout: number,
createtime: number, createtime: number,
func: Function func: Function
@ -78,50 +73,30 @@ export class NTEventWrapper {
this.EventTask.delete(uuid); this.EventTask.delete(uuid);
return; return;
} }
if (task.mode == NTEventMode.Once) {
this.EventTask.delete(uuid);
}
task.func(...args); task.func(...args);
}) })
} }
async CallOnceEvent<EventType extends (...args: any[]) => any, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', timeout: number = 3000, ...args: Parameters<EventType>) { async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ArrayLike<Parameters<ListenerType>>>((resolve, reject) => { return new Promise<ReturnType<EventType>>((resolve, reject) => {
const id = randomUUID();
let complete = false;
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
let databack = () => {
if (!complete) {
this.EventTask.delete(id);
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
} else {
resolve(retData as ArrayLike<Parameters<ListenerType>>);
}
}
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 ArrayLike<Parameters<ListenerType>>;
databack();
}
});
let EventFunc = this.CreatEventFunction<EventType>(EventName); let EventFunc = this.CreatEventFunction<EventType>(EventName);
EventFunc!(...args); let complete = false;
}); let Timeouter = setTimeout(() => {
if (!complete) {
reject(new Error('NTEvent EventName:' + EventName + ' timeout'));
}
}, timeout);
let retData = await EventFunc!(...args);
complete = true;
resolve(retData);
}
} }
async CallTwiceEvent<EventType extends (...args: any[]) => any, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', timeout: number = 3000, ...args: Parameters<EventType>) { async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ArrayLike<Parameters<ListenerType>>>((resolve, reject) => { return new Promise<ArrayLike<Parameters<ListenerType>>>((resolve, reject) => {
const id = randomUUID(); const id = randomUUID();
let complete = 0; let complete = 0;
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined; let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
let databack = () => { let databack = () => {
if (complete < 2) { if (complete < waitTimes) {
this.EventTask.delete(id);
reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout')); reject(new Error('NTEvent EventName:' + EventName + ' ListenerName:' + ListenerName + ' timeout'));
} else { } else {
resolve(retData as ArrayLike<Parameters<ListenerType>>); resolve(retData as ArrayLike<Parameters<ListenerType>>);
@ -130,20 +105,19 @@ export class NTEventWrapper {
let Timeouter = setTimeout(databack, timeout); let Timeouter = setTimeout(databack, timeout);
this.EventTask.set(id, { this.EventTask.set(id, {
mode: NTEventMode.Once,
timeout: timeout, timeout: timeout,
createtime: Date.now(), createtime: Date.now(),
func: (...args: any[]) => { func: (...args: any[]) => {
complete++; complete++;
retData = args as ArrayLike<Parameters<ListenerType>>; retData = args as ArrayLike<Parameters<ListenerType>>;
if (complete == 2) { if (complete == waitTimes) {
clearTimeout(Timeouter); clearTimeout(Timeouter);
databack(); databack();
} }
} }
}); });
let EventFunc = this.CreatEventFunction<EventType>(EventName); let EventFunc = this.CreatEventFunction<EventType>(EventName);
EventFunc!(...args); await EventFunc!(...args);
}); });
} }