@geogirafe/lib-geoportal
Version:
GeoGirafe is a flexible application to build online geoportals.
72 lines (71 loc) • 3.71 kB
JavaScript
// 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;