refactor: turn createEmitter into a class
This commit is contained in:
parent
aaecce6cd4
commit
7e3c8b81d2
4 changed files with 29 additions and 36 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue