refactor: turn createEmitter into a class

This commit is contained in:
amsyarasyiq 2024-07-09 15:59:17 +08:00
parent aaecce6cd4
commit 7e3c8b81d2
4 changed files with 29 additions and 36 deletions

View file

@ -162,7 +162,7 @@ export const initVendettaObject = (): any => {
},
assets: {
all: assets.assetsMap,
find: (filter: (a: any) => void) => assets.findAsset(filter),
find: (filter: (a: any) => boolean) => assets.findAsset(filter),
getAssetByName: (name: string) => assets.findAsset(name),
getAssetByID: (id: number) => assets.findAsset(id),
getAssetIDByName: (name: string) => assets.findAssetId(name)

View file

@ -1,11 +1,11 @@
import { StorageBackend } from "@lib/api/storage/backends";
import { createEmitter, Emitter } from "@lib/utils/emitter";
import { Emitter } from "@lib/utils/emitter";
const emitterSymbol = Symbol.for("vendetta.storage.emitter");
const syncAwaitSymbol = Symbol.for("vendetta.storage.accessor");
export function createProxy(target: any = {}): { proxy: any; emitter: Emitter; } {
const emitter = createEmitter();
const emitter = new Emitter();
function createProxy(target: any, path: string[]): any {
return new Proxy(target, {

View file

@ -18,36 +18,29 @@ export type EmitterListener = (
export type EmitterListeners = Record<string, Set<EmitterListener>>
export interface Emitter {
listeners: EmitterListeners;
on: (event: EmitterEvent, listener: EmitterListener) => void;
off: (event: EmitterEvent, listener: EmitterListener) => void;
once: (event: EmitterEvent, listener: EmitterListener) => void;
emit: (event: EmitterEvent, data: EmitterListenerData) => void;
}
export function createEmitter(): Emitter {
return {
listeners: Object.values(Events).reduce<EmitterListeners>((acc, val: string) => ((acc[val] = new Set<EmitterListener>()), acc), {}) as EmitterListeners,
on(event: EmitterEvent, listener: EmitterListener) {
if (!this.listeners[event].has(listener)) this.listeners[event].add(listener);
},
off(event: EmitterEvent, listener: EmitterListener) {
this.listeners[event].delete(listener);
},
once(event: EmitterEvent, listener: EmitterListener) {
const once = (event: EmitterEvent, data: EmitterListenerData) => {
this.off(event, once);
listener(event, data);
};
this.on(event, once);
},
emit(event: EmitterEvent, data: EmitterListenerData) {
for (const listener of this.listeners[event]) listener(event, data);
},
};
export class Emitter {
listeners = Object.values(Events).reduce<EmitterListeners>(
(acc, val: string) => ((acc[val] = new Set<EmitterListener>()), acc),
{}
) as EmitterListeners;
on(event: EmitterEvent, listener: EmitterListener) {
if (!this.listeners[event].has(listener)) this.listeners[event].add(listener);
}
off(event: EmitterEvent, listener: EmitterListener) {
this.listeners[event].delete(listener);
}
once(event: EmitterEvent, listener: EmitterListener) {
const once = (event: EmitterEvent, data: EmitterListenerData) => {
this.off(event, once);
listener(event, data);
};
this.on(event, once);
}
emit(event: EmitterEvent, data: EmitterListenerData) {
for (const listener of this.listeners[event]) listener(event, data);
}
}

View file

@ -1,7 +1,7 @@
// Makes mass-importing utils cleaner, chosen over moving utils to one file
export * as constants from "@lib/utils/constants";
export { createEmitter } from "@lib/utils/emitter";
export { Emitter } from "@lib/utils/emitter";
export { findInReactTree } from "@lib/utils/findInReactTree";
export { findInTree } from "@lib/utils/findInTree";
export * as logger from "@lib/utils/logger";