From 7e3c8b81d2887a474ebab65bdcad410bc6f8f9cd Mon Sep 17 00:00:00 2001 From: amsyarasyiq <82711525+amsyarasyiq@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:59:17 +0800 Subject: [PATCH] refactor: turn createEmitter into a class --- src/core/polyfills/vendettaObject.tsx | 2 +- src/lib/api/storage/index.ts | 4 +- src/lib/utils/emitter.ts | 57 ++++++++++++--------------- src/lib/utils/index.ts | 2 +- 4 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/core/polyfills/vendettaObject.tsx b/src/core/polyfills/vendettaObject.tsx index 30c9c9b..ca32d0a 100644 --- a/src/core/polyfills/vendettaObject.tsx +++ b/src/core/polyfills/vendettaObject.tsx @@ -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) diff --git a/src/lib/api/storage/index.ts b/src/lib/api/storage/index.ts index 21640ad..62cea96 100644 --- a/src/lib/api/storage/index.ts +++ b/src/lib/api/storage/index.ts @@ -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, { diff --git a/src/lib/utils/emitter.ts b/src/lib/utils/emitter.ts index a4cfa9b..ee57c28 100644 --- a/src/lib/utils/emitter.ts +++ b/src/lib/utils/emitter.ts @@ -18,36 +18,29 @@ export type EmitterListener = ( export type EmitterListeners = Record> -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((acc, val: string) => ((acc[val] = new Set()), 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( + (acc, val: string) => ((acc[val] = new Set()), 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); + } } diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 6b7931a..a457fea 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -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";