@geogirafe/lib-geoportal
Version:
GeoGirafe is a flexible application to build online geoportals.
50 lines (49 loc) • 2.1 kB
JavaScript
// SPDX-License-Identifier: Apache-2.0
import { isBrainSerializable, serializeSymbol } from './decorators.js';
export default class BrainSerializer {
registry = new Map();
addSerializer(type, serializerData) {
this.registry.set(type, serializerData);
}
getSerializer(obj) {
for (const [type, data] of this.registry.entries()) {
if (obj instanceof type) {
return data;
}
}
return undefined;
}
serialize(state) {
const serializedState = {};
const keys = Object.keys(state).filter((key) => !key.startsWith('_') && (state[serializeSymbol]?.includes(key) || isBrainSerializable(state[key])));
for (const key of keys) {
const serializer = this.getSerializer(state[key]);
if (serializer) {
console.debug(`Serializing ${key} with custom serializer`);
serializedState[key] = serializer.brainSerialize(state[key]);
}
else {
console.debug(`Serializing ${key} with default serializer`);
serializedState[key] = JSON.stringify(state[key]);
}
}
return JSON.stringify(serializedState);
}
deserialize(stringSerializedState, state) {
const serializedState = JSON.parse(stringSerializedState);
const keys = Object.keys(state).filter((key) => !key.startsWith('_') && (state[serializeSymbol]?.includes(key) || isBrainSerializable(state[key])));
for (const key of keys) {
if (Object.hasOwn(serializedState, key)) {
const serializer = this.getSerializer(state[key]);
if (serializer) {
console.debug(`Deserializing ${key} with custom serializer`);
serializer.brainDeserialize(serializedState[key], key);
}
else {
console.debug(`Deserializing ${key} with default serializer`);
state[key] = JSON.parse(serializedState[key]);
}
}
}
}
}