refactor: src/core/common/resource.ts 移入 monorepo

This commit is contained in:
unanmed 2025-03-04 23:25:06 +08:00
parent dc502ddd64
commit 4aa894a204
4 changed files with 4 additions and 213 deletions

View File

@ -1,3 +1,4 @@
export * from './patch';
export * from './disposable';
export * from './eventEmitter';
export * from './resource';

View File

@ -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';

View File

@ -1,211 +0,0 @@
function has<T>(value: T): value is NonNullable<T> {
return value !== null && value !== undefined;
}
export type Callable = (...params: any) => any;
export interface Listener<T extends (...params: any) => any> {
fn: T;
once?: boolean;
immediate?: boolean;
}
export interface ListenerOptions {
once: boolean;
immediate: boolean;
}
type EmitFn<F extends (...params: any) => any> = (
events: Listener<F>[],
...params: Parameters<F>
) => any;
type Key = number | string | symbol;
export class EventEmitter<T extends Record<keyof T, Callable> = {}> {
protected events: {
[x: Key]: Listener<Callable>[];
} = {};
private emitted: Set<string> = new Set();
protected emitter: {
[x: Key]: EmitFn<Callable> | undefined;
} = {};
/**
*
* @param event
* @param fn
* @param options
*/
on<K extends keyof T>(
event: K,
fn: T[K],
options?: Partial<ListenerOptions>
): void;
on(event: string, fn: Callable, options?: Partial<ListenerOptions>): void;
on(event: string, fn: Callable, options?: Partial<ListenerOptions>): 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<K extends keyof T>(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<K extends keyof T>(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<K extends keyof T>(
event: K,
...params: Parameters<T[K]>
): ReturnType<T[K]>[];
emit(event: string, ...params: any[]): any[];
emit<K extends keyof T, R>(event: K, ...params: Parameters<T[K]>): R;
emit<R>(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<Callable>[] = [];
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<K extends keyof T>(event: K, fn?: EmitFn<T[K]>): void;
setEmitter(event: string, fn?: EmitFn<Callable>): void;
setEmitter(event: string, fn?: EmitFn<Callable>): 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<keyof T, Callable>
> extends EventEmitter<T> {
private fnMap: {
[P in keyof T]?: Map<IndexedSymbol, T[P]>;
} = {};
/**
*
* @param event
* @param symbol
* @param fn
* @param options
*/
onIndex<K extends keyof T>(
event: K,
symbol: IndexedSymbol,
fn: T[K],
options: Partial<ListenerOptions>
) {
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<K extends keyof T>(event: K, symbol: IndexedSymbol, fn: T[K]) {
this.onIndex(event, symbol, fn, { once: true });
}
/**
*
* @param event
* @param symbol
*/
offIndex<K extends keyof T>(event: K, symbol: IndexedSymbol) {
const map = this.ensureMap(event);
const fn = map.get(symbol);
if (!fn) return;
this.off(event, fn);
}
private ensureMap<K extends keyof T>(event: K) {
return this.fnMap[event] ?? new Map<IndexedSymbol, T[K]>();
}
}

View File

@ -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';