refactor: 加载系统重构

This commit is contained in:
AncTe committed 2026-09-20 20:53:46 +08:00
1 parent d12790280a
commit cc434a6c66
27 files changed
+409 -266

No files matched your search

@@ -1,3 +0,0 @@
export * from './loader';
export * from './processor';
export * from './types';
@@ -1,63 +0,0 @@
import {
ILoadManager,
LoadDataType,
ILoadTask,
ILoadTaskProcessor
} from '@motajs/loader';
import { CustomLoadFunc, IMotaDataLoader } from './types';
import { LoadJSONProcessor } from './processor';
interface LoadTaskStore<T extends LoadDataType = LoadDataType, R = any> {
/** 加载任务对象 */
readonly task: ILoadTask<T, R>;
/** 当 `onLoaded` 兑现后兑现的 `Promise` */
readonly loadPromise: Promise<R>;
/** 兑现 `loadPromise` */
readonly loadResolve: (data: R) => void;
/** 当加载任务完成时执行的函数 */
readonly onLoaded: CustomLoadFunc<R>;
}
export class MotaDataLoader implements IMotaDataLoader {
/** 当前已添加的加载任务 */
private readonly tasks: Set<LoadTaskStore> = new Set();
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
constructor(readonly progress: ILoadManager) {
this.jsonProcessor = new LoadJSONProcessor();
}
//#region 对外接口
initSystemLoadTask(): void {}
addCustomLoadTask<R>(
task: ILoadTask<LoadDataType, R>,
onLoaded: CustomLoadFunc<R>
): Promise<R> {
this.progress.addTask(task);
const { promise, resolve } = Promise.withResolvers<R>();
const store: LoadTaskStore<LoadDataType, R> = {
task,
onLoaded,
loadPromise: promise,
loadResolve: resolve
};
this.tasks.add(store);
return promise;
}
async load(): Promise<void> {
const tasks = [...this.tasks].map(async task => {
task.task.start();
const data = await task.task.loaded();
await task.onLoaded(data);
task.loadResolve(data);
return data;
});
await Promise.all(tasks);
}
//#endregion
}
@@ -1,66 +0,0 @@
import { IMotaAudioContext } from '@motajs/audio';
import { ILoadTask, ILoadTaskProcessor, LoadDataType } from '@motajs/loader';
import JSZip from 'jszip';
export class LoadImageProcessor implements ILoadTaskProcessor<
LoadDataType.Blob,
ImageBitmap
> {
process(response: Blob): Promise<ImageBitmap> {
return createImageBitmap(response);
}
}
export class LoadAudioProcessor implements ILoadTaskProcessor<
LoadDataType.Uint8Array,
AudioBuffer | null
> {
constructor(private readonly ac: IMotaAudioContext) {}
process(response: Uint8Array<ArrayBuffer>): Promise<AudioBuffer | null> {
return this.ac.decodeToAudioBuffer(response);
}
}
export class LoadFontProcessor implements ILoadTaskProcessor<
LoadDataType.ArrayBuffer,
FontFace
> {
process(
response: ArrayBuffer,
task: ILoadTask<LoadDataType.ArrayBuffer, FontFace>
): Promise<FontFace> {
const font = new FontFace(task.identifier, response);
if (font.status === 'loaded') return Promise.resolve(font);
else return font.load();
}
}
export class LoadZipProcessor implements ILoadTaskProcessor<
LoadDataType.ArrayBuffer,
JSZip
> {
async process(response: ArrayBuffer): Promise<JSZip> {
const zip = new JSZip();
await zip.loadAsync(response);
return zip;
}
}
export class LoadTextProcessor implements ILoadTaskProcessor<
LoadDataType.Text,
string
> {
process(response: string): Promise<string> {
return Promise.resolve(response);
}
}
export class LoadJSONProcessor<T> implements ILoadTaskProcessor<
LoadDataType.JSON,
T
> {
process(response: any): Promise<T> {
return Promise.resolve(response);
}
}
-38
View File
@@ -1,38 +0,0 @@
import {
ILoadManager,
ILoadTask,
ILoadTaskProcessor,
LoadDataType
} from '@motajs/loader';
export type CustomLoadFunc<R> = (data: R) => Promise<void>;
export interface IMotaDataLoader {
/** 加载进度对象 */
readonly progress: ILoadManager;
/** json 处理器 */
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
/**
* 初始化系统加载任务
*/
initSystemLoadTask(): void;
/**
* 添加自定义加载任务
* @param task 自定义加载任务
* @param onLoad 当任务加载完成时执行
* @returns 一个 `Promise`,当添加的任务加载完毕,且 `onLoad` 返回的 `Promise` 兑现后兑现
*/
addCustomLoadTask<R>(
task: ILoadTask<LoadDataType, R>,
onLoad: CustomLoadFunc<R>
): Promise<R>;
/**
* 开始所有加载任务的加载工作
* @returns 一个 `Promise`,当所有加载任务加载完成后兑现
*/
load(): Promise<void>;
}