Spaces:
Running
Running
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/[email protected]/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); | |
}; |