diff --git a/packages/legacy-common/src/index.ts b/packages/legacy-common/src/index.ts index 24afaec..3d17abd 100644 --- a/packages/legacy-common/src/index.ts +++ b/packages/legacy-common/src/index.ts @@ -1,3 +1,4 @@ export * from './patch'; export * from './disposable'; export * from './eventEmitter'; +export * from './resource'; diff --git a/src/core/common/resource.ts b/packages/legacy-common/src/resource.ts similarity index 99% rename from src/core/common/resource.ts rename to packages/legacy-common/src/resource.ts index e43d8a5..fac3c4b 100644 --- a/src/core/common/resource.ts +++ b/packages/legacy-common/src/resource.ts @@ -1,5 +1,6 @@ import axios, { AxiosRequestConfig, ResponseType } from 'axios'; -import { Disposable, EventEmitter } from '@motajs/legacy-common'; +import { EventEmitter } from './eventEmitter'; +import { Disposable } from './disposable'; import { logger } from '@motajs/common'; import JSZip from 'jszip'; diff --git a/src/core/common/eventEmitter.ts b/src/core/common/eventEmitter.ts deleted file mode 100644 index cfca038..0000000 --- a/src/core/common/eventEmitter.ts +++ /dev/null @@ -1,211 +0,0 @@ -function has(value: T): value is NonNullable { - return value !== null && value !== undefined; -} - -export type Callable = (...params: any) => any; - -export interface Listener any> { - fn: T; - once?: boolean; - immediate?: boolean; -} - -export interface ListenerOptions { - once: boolean; - immediate: boolean; -} - -type EmitFn any> = ( - events: Listener[], - ...params: Parameters -) => any; - -type Key = number | string | symbol; - -export class EventEmitter = {}> { - protected events: { - [x: Key]: Listener[]; - } = {}; - private emitted: Set = new Set(); - - protected emitter: { - [x: Key]: EmitFn | undefined; - } = {}; - - /** - * 监听某个事件 - * @param event 要监听的事件类型 - * @param fn 触发事件时执行的函数 - * @param options 监听选项 - */ - on( - event: K, - fn: T[K], - options?: Partial - ): void; - on(event: string, fn: Callable, options?: Partial): void; - on(event: string, fn: Callable, options?: Partial): void { - if (options?.immediate && this.emitted.has(event)) { - fn(); - if (!options.once) { - this.events[event] ??= []; - this.events[event]?.push({ - fn - }); - } - return; - } - this.events[event] ??= []; - this.events[event]?.push({ - fn, - once: options?.once - }); - } - - /** - * 取消监听某个事件 - * @param event 要取消监听的事件类型 - * @param fn 要取消监听的函数 - */ - off(event: K, fn: T[K]): void; - off(event: string, fn: Callable): void; - off(event: string, fn: Callable): void { - const index = this.events[event]?.findIndex(v => v.fn === fn); - if (index === -1 || index === void 0) return; - this.events[event]?.splice(index, 1); - } - - /** - * 监听事件,并只触发一次 - * @param event 要监听的事件 - * @param fn 监听函数 - */ - once(event: K, fn: T[K]): void; - once(event: string, fn: Callable): void; - once(event: string, fn: Callable): void { - this.on(event, fn, { once: true }); - } - - /** - * 触发某个事件 - * @param event 要触发的事件类型 - * @param params 传入的参数 - */ - emit( - event: K, - ...params: Parameters - ): ReturnType[]; - emit(event: string, ...params: any[]): any[]; - emit(event: K, ...params: Parameters): R; - emit(event: string, ...params: any[]): R; - emit(event: string, ...params: any[]): any[] { - this.emitted.add(event); - const events = (this.events[event] ??= []); - if (this.emitter[event]) { - const returns = this.emitter[event]!(events, ...params); - this.events[event] = events.filter(v => !v.once); - return returns; - } else { - const returns: ReturnType[] = []; - for (let i = 0; i < events.length; i++) { - const e = events[i]; - returns.push(e.fn(...(params as any))); - } - this.events[event] = events.filter(v => !v.once); - return returns; - } - } - - /** - * 设置一个事件的执行器(emitter) - * @param event 要设置的事件 - * @param fn 事件执行器,留空以清除触发器 - */ - // @ts-expect-error 无法推导 - setEmitter(event: K, fn?: EmitFn): void; - setEmitter(event: string, fn?: EmitFn): void; - setEmitter(event: string, fn?: EmitFn): void { - this.emitter[event] = fn; - } - - /** - * 取消监听所有的事件,删除所有监听函数 - */ - removeAllListeners(): void; - /** - * 取消监听一个事件的所有函数 - * @param event 要取消监听的事件 - */ - removeAllListeners(event: keyof T): void; - /** - * 取消监听一个事件的所有函数 - * @param event 要取消监听的事件 - */ - removeAllListeners(event: string): void; - removeAllListeners(event?: string | keyof T) { - if (has(event)) this.events[event] = []; - else this.events = {}; - } -} - -type IndexedSymbol = number | string | symbol; - -export class IndexedEventEmitter< - T extends Record -> extends EventEmitter { - private fnMap: { - [P in keyof T]?: Map; - } = {}; - - /** - * 监听事件,并将函数与唯一标识符绑定 - * @param event 事件类型 - * @param symbol 监听函数的唯一标识符 - * @param fn 监听函数 - * @param options 监听配置 - */ - onIndex( - event: K, - symbol: IndexedSymbol, - fn: T[K], - options: Partial - ) { - const map = this.ensureMap(event); - if (map.has(symbol)) { - console.warn( - `监听${String(event)}出错:已存在标识符为${String( - symbol - )}的监听函数,已将其覆盖` - ); - this.offIndex(event, symbol); - } - map.set(symbol, fn); - this.on(event, fn, options); - } - - /** - * 监听事件,绑定唯一标识符,但监听函数只会执行一次 - * @param event 要监听的事件 - * @param symbol 监听函数的唯一标识符 - * @param fn 监听函数 - */ - onceIndex(event: K, symbol: IndexedSymbol, fn: T[K]) { - this.onIndex(event, symbol, fn, { once: true }); - } - - /** - * 取消监听一个事件 - * @param event 要取消监听的事件 - * @param symbol 取消监听的函数的唯一标识符 - */ - offIndex(event: K, symbol: IndexedSymbol) { - const map = this.ensureMap(event); - const fn = map.get(symbol); - if (!fn) return; - this.off(event, fn); - } - - private ensureMap(event: K) { - return this.fnMap[event] ?? new Map(); - } -} diff --git a/src/ui/load.vue b/src/ui/load.vue index c5fcfcb..d3a9cef 100644 --- a/src/ui/load.vue +++ b/src/ui/load.vue @@ -30,7 +30,7 @@ import { loadCompressedResource, loadDefaultResource, LoadTask -} from '@/core/common/resource'; +} from '@motajs/legacy-common'; import { GameUi } from '@/core/main/custom/ui'; import { formatSize } from '@/plugin/utils'; import { logger } from '@motajs/common';