import { deflate, inflate } from 'https://fastly.jsdelivr.net/gh/nodeca/pako@master/dist/pako.esm.mjs'; import { toUint8Array, fromUint8Array, toBase64, fromBase64 } from 'https://cdn.jsdelivr.net/npm/js-base64@3.7.2/base64.mjs'; const base64Serde = { serialize: (state) => { return toBase64(state, true); }, deserialize: (state) => { return fromBase64(state); } }; const pakoSerde = { serialize: (state) => { const data = new TextEncoder().encode(state); const compressed = deflate(data, { level: 9 }); return fromUint8Array(compressed, true); }, deserialize: (state) => { const data = toUint8Array(state); return inflate(data, { to: 'string' }); } }; const serdes = { base64: base64Serde, pako: pakoSerde }; export const serializeState = (state, serde = 'pako') => { if (!(serde in serdes)) { throw new Error(`Unknown serde type: ${serde}`); } const json = JSON.stringify(state); const serialized = serdes[serde].serialize(json); return `${serde}:${serialized}`; }; const deserializeState = (state) => { let type, serialized; if (state.includes(':')) { let tempType; [tempType, serialized] = state.split(':'); if (tempType in serdes) { type = tempType; } else { throw new Error(`Unknown serde type: ${tempType}`); } } else { type = 'base64'; serialized = state; } const json = serdes[type].deserialize(serialized); return JSON.parse(json); };