Files
esengine/packages/editor-core/src/Services/SerializerRegistry.ts

182 lines
4.9 KiB
TypeScript
Raw Normal View History

2025-10-14 22:33:55 +08:00
import type { IService } from '@esengine/ecs-framework';
import { Injectable } from '@esengine/ecs-framework';
import { createLogger } from '@esengine/ecs-framework';
import type { ISerializer } from '../Plugins/IEditorPlugin';
const logger = createLogger('SerializerRegistry');
/**
*
*
*
*/
@Injectable()
export class SerializerRegistry implements IService {
private serializers: Map<string, ISerializer> = new Map();
/**
*
*
* @param pluginName -
* @param serializer -
*/
public register(pluginName: string, serializer: ISerializer): void {
const type = serializer.getSupportedType();
const key = `${pluginName}:${type}`;
if (this.serializers.has(key)) {
logger.warn(`Serializer for ${key} is already registered`);
return;
}
this.serializers.set(key, serializer);
logger.info(`Registered serializer: ${key}`);
}
/**
*
*
* @param pluginName -
* @param serializers -
*/
public registerMultiple(pluginName: string, serializers: ISerializer[]): void {
for (const serializer of serializers) {
this.register(pluginName, serializer);
}
}
/**
*
*
* @param pluginName -
* @param type -
* @returns
*/
public unregister(pluginName: string, type: string): boolean {
const key = `${pluginName}:${type}`;
const result = this.serializers.delete(key);
if (result) {
logger.info(`Unregistered serializer: ${key}`);
}
return result;
}
/**
*
*
* @param pluginName -
*/
public unregisterAll(pluginName: string): void {
const prefix = `${pluginName}:`;
const keysToDelete: string[] = [];
for (const key of this.serializers.keys()) {
if (key.startsWith(prefix)) {
keysToDelete.push(key);
}
}
for (const key of keysToDelete) {
this.serializers.delete(key);
logger.info(`Unregistered serializer: ${key}`);
}
}
/**
*
*
* @param pluginName -
* @param type -
* @returns undefined
*/
public get(pluginName: string, type: string): ISerializer | undefined {
const key = `${pluginName}:${type}`;
return this.serializers.get(key);
}
/**
*
*
* @param type -
* @returns
*/
public findByType(type: string): ISerializer[] {
const result: ISerializer[] = [];
for (const [key, serializer] of this.serializers) {
if (key.endsWith(`:${type}`)) {
result.push(serializer);
}
}
return result;
}
/**
*
*
* @returns
*/
public getAll(): Map<string, ISerializer> {
return new Map(this.serializers);
}
/**
*
*
* @param pluginName -
* @param type -
* @returns
*/
public has(pluginName: string, type: string): boolean {
const key = `${pluginName}:${type}`;
return this.serializers.has(key);
}
/**
*
*
* @param pluginName -
* @param type -
* @param data -
* @returns
* @throws
*/
public serialize<T = any>(pluginName: string, type: string, data: T): Uint8Array {
const serializer = this.get(pluginName, type);
if (!serializer) {
throw new Error(`Serializer not found: ${pluginName}:${type}`);
}
return serializer.serialize(data);
}
/**
*
*
* @param pluginName -
* @param type -
* @param data -
* @returns
* @throws
*/
public deserialize<T = any>(pluginName: string, type: string, data: Uint8Array): T {
const serializer = this.get(pluginName, type);
if (!serializer) {
throw new Error(`Serializer not found: ${pluginName}:${type}`);
}
return serializer.deserialize(data);
}
/**
*
*/
public dispose(): void {
this.serializers.clear();
logger.info('SerializerRegistry disposed');
}
}