Refactor event system to support returnable events

Added support for validating and managing return values in events. Implemented `validate` and `clone` methods in the event base class for event mutation and return handling. Additionally, enhanced error handling, introduced "once" listeners, and improved async execution management in the `EventManager`.
This commit is contained in:
dswbx
2025-01-15 17:21:28 +01:00
parent 7b0a41b297
commit 6625c9bc48
6 changed files with 227 additions and 185 deletions
+22 -2
View File
@@ -1,17 +1,31 @@
export abstract class Event<Params = any> {
export abstract class Event<Params = any, Returning = void> {
_returning!: Returning;
/**
* Unique event slug
* Must be static, because registering events is done by class
*/
static slug: string = "untitled-event";
params: Params;
returned: boolean = false;
validate(value: Returning): Event<Params, Returning> | void {}
protected clone<This extends Event<Params, Returning> = Event<Params, Returning>>(
this: This,
params: Params
): This {
const cloned = new (this.constructor as any)(params);
cloned.returned = true;
return cloned as This;
}
constructor(params: Params) {
this.params = params;
}
}
// @todo: current workaround: potentially there is none and that's the way
// @todo: current workaround: potentially there is "none" and that's the way
export class NoParamEvent extends Event<null> {
static override slug: string = "noparam-event";
@@ -19,3 +33,9 @@ export class NoParamEvent extends Event<null> {
super(null);
}
}
export class InvalidEventReturn extends Error {
constructor(expected: string, given: string) {
super(`Expected "${expected}", got "${given}"`);
}
}