Better handle unexpected conditions when deserializing

For example, when deserialzing from corrupted storage.
This commit is contained in:
Raymond Hill 2024-11-14 10:32:15 -05:00
parent ff5fc61753
commit 4c299bfca9
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
1 changed files with 20 additions and 16 deletions

View File

@ -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));