Skip to content

Commit

Permalink
Better handle unexpected conditions when deserializing
Browse files Browse the repository at this point in the history
For example, when deserialzing from corrupted storage.
  • Loading branch information
gorhill committed Nov 14, 2024
1 parent ff5fc61 commit 4c299bf
Showing 1 changed file with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions src/js/s14e-serializer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down

0 comments on commit 4c299bf

Please sign in to comment.