UNPKG

@geogirafe/lib-geoportal

Version:

GeoGirafe is a flexible application to build online geoportals.

50 lines (49 loc) 2.1 kB
// 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]); } } } } }