UNPKG

@geogirafe/lib-geoportal

Version:

GeoGirafe is a flexible application to build online geoportals.

72 lines (71 loc) 3.71 kB
// SPDX-License-Identifier: Apache-2.0 import LZString from 'lz-string'; import MapPositionSerializer from './serializers/mappositionserializer.js'; import MapPosition from '../state/mapposition.js'; import GlobeState from '../state/globe.js'; import LayersConfig from '../state/layersConfig.js'; import LayersConfigSerializer from './serializers/layerconfigserializer.js'; import ActiveBasemapsSerializer from './serializers/activebasemapsserializer.js'; import GirafeSingleton from '../../base/GirafeSingleton.js'; import BrainSerializer from '../state/brain/serialize.js'; import SelectionSerializer from './serializers/selectionserializer.js'; import ObjectSelection from '../state/objectselection.js'; import GraphicalInterface from '../state/graphicalInterface.js'; import InterfaceSerializer from './serializers/interfaceserializer.js'; import GlobeSerializer from './serializers/globeserializer.js'; class StateSerializer extends GirafeSingleton { brainSerializer = new BrainSerializer(); initializeSingleton() { this.addSerializer((Array), new ActiveBasemapsSerializer(this.context)); this.addSerializer(MapPosition, new MapPositionSerializer(this.context)); this.addSerializer(LayersConfig, new LayersConfigSerializer(this.context)); this.addSerializer(ObjectSelection, new SelectionSerializer(this.context)); this.addSerializer(GraphicalInterface, new InterfaceSerializer(this.context)); this.addSerializer(GlobeState, new GlobeSerializer(this.context)); } addSerializer(type, serializerData) { this.brainSerializer.addSerializer(type, serializerData); } getSerializedState() { const stringState = this.serialize(); const compressedState = LZString.compressToBase64(stringState); return compressedState; } deserializeAndSetState(compressedState) { try { const stringState = LZString.decompressFromBase64(compressedState); this.deserialize(stringState); return true; } catch (e) { console.warn(e); console.warn('Cannot deserialized state. The default configuration will be used.'); return false; } } serialize() { const currentState = this.context.stateManager.state; const serializedState = this.brainSerializer.serialize(currentState); const serializedExtendedState = this.brainSerializer.serialize(this.context.stateManager.state.extendedState); const compressedState = LZString.compressToBase64(serializedState); const compressedExtendedState = LZString.compressToBase64(serializedExtendedState); return `${compressedState}-${compressedExtendedState}`; } deserialize(compressedStateWithExtended) { const compressed = compressedStateWithExtended.split('-'); if (compressed.length > 2) { throw new Error('There should only be 2 parts in the compressed state: state and extended-state. It should never be longer than that.'); } const compressedState = compressed[0]; const compressedExtendedState = compressed[1]; const serializedState = LZString.decompressFromBase64(compressedState); const serializedExtendedState = LZString.decompressFromBase64(compressedExtendedState); this.context.stateManager.batchChanges(() => { this.brainSerializer.deserialize(serializedState, this.context.stateManager.state); if (serializedExtendedState) { this.brainSerializer.deserialize(serializedExtendedState, this.context.stateManager.state.extendedState); } }); } } export default StateSerializer;