openreplay/tracker/tracker-redux/src/syncod-v2/decoder.ts
Delirium edc068ce09
fix tracker speed up redux plugin hashing (#2027)
* feat tracker update redux plugin to speed up state hashing

* feat tracker update redux plugin to speed up state hashing
2024-04-03 11:07:29 +02:00

79 lines
1.6 KiB
TypeScript

import _ from "./chars.js";
export default class Decoder {
_dict: Map<any, any>;
constructor() {
this._dict = new Map();
}
set(ref, enc) {
this._dict.set(ref, enc);
}
assign(dict) {
for (let ref in dict) {
this._dict.set(ref, dict[ref]);
}
}
clear() {
this._dict.clear();
}
_unref_str(str) {
let s = this._dict.get(str);
if (s !== undefined) {
return s;
}
return str;
}
decode(enc) {
const p = enc[0],
b = enc.slice(1);
switch (p) {
case _.UNDEF:
return undefined;
case _.TRUE:
return true;
case _.FALSE:
return false;
case _.FUNCTION:
return Function.prototype;
case _.NUMBER:
return parseFloat(b);
case _.BIGINT:
return BigInt(b);
case _.STRING:
return this._unref_str(b);
case _.SYMBOL:
return Symbol(this._unref_str(b));
case _.NULL:
return null;
}
const unref = this._dict.get(b);
if (unref === undefined) {
throw "index missing code";
}
if (typeof unref === "object") {
return unref;
}
const args = unref.length === 0 ? [] : unref.split(_.DEL);
switch (p) {
case _.ARRAY:
this._dict.set(b, args);
for (let i = 0; i < args.length; i++) {
args[i] = this.decode(args[i]);
}
return args;
case _.OBJECT:
const obj = {};
this._dict.set(b, obj);
for (let i = 0; i < args.length; i += 2) {
obj[this._unref_str(args[i])] = this.decode(args[i + 1]);
}
return obj;
}
throw "unrecognized prefix";
}
}