From 4c299bfca91c85bce73b7a17672050594d0b3d29 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:32:15 -0500 Subject: [PATCH] Better handle unexpected conditions when deserializing For example, when deserialzing from corrupted storage. --- src/js/s14e-serializer.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/js/s14e-serializer.js b/src/js/s14e-serializer.js index 98f0d9cc2..8b1850f13 100644 --- a/src/js/s14e-serializer.js +++ b/src/js/s14e-serializer.js @@ -1097,32 +1097,36 @@ export const serialize = (data, options = {}) => { return ratio <= 0.85 ? t : s; }; -export const deserialize = s => { - if ( s.startsWith(MAGICLZ4PREFIX) ) { - refCounter = 1; - readStr = s; - readEnd = s.length; - readPtr = MAGICLZ4PREFIX.length; - const lz4 = _deserialize(); - readRefs.clear(); - readStr = ''; - const lz4Util = new LZ4BlockJS(); - const uint8ArrayAfter = lz4Util.decode(lz4.data, 0, lz4.size); - s = textCodec.decode(new Uint8Array(uint8ArrayAfter)); - } - if ( s.startsWith(MAGICPREFIX) === false ) { return; } +const deserializeById = (blockid, s) => { refCounter = 1; readStr = s; readEnd = s.length; - readPtr = MAGICPREFIX.length; + readPtr = blockid.length; const data = _deserialize(); readRefs.clear(); readStr = ''; - uint8Input = null; if ( readPtr === FAILMARK ) { return; } return data; }; +export const deserialize = s => { + if ( s.startsWith(MAGICLZ4PREFIX) ) { + const lz4 = deserializeById(MAGICLZ4PREFIX, s); + if ( lz4 ) { + const lz4Util = new LZ4BlockJS(); + const uint8ArrayAfter = lz4Util.decode(lz4.data, 0, lz4.size); + if ( uint8ArrayAfter ) { + s = textCodec.decode(new Uint8Array(uint8ArrayAfter)); + } + } + } + const data = s.startsWith(MAGICPREFIX) + ? deserializeById(MAGICPREFIX, s) + : undefined; + uint8Input = null; + return data; +}; + export const isSerialized = s => typeof s === 'string' && (s.startsWith(MAGICLZ4PREFIX) || s.startsWith(MAGICPREFIX));