in Clients/AmbrosiaJS/Ambrosia-Node/src/Utils/Serialization.ts [262:340]
function reviver(key: string, value: any): any
{
let isString = (o: any): o is string => ((typeof value === "string") || (value instanceof String)); // Local 'type guard' function
if (isString(value) && /^##[A-Za-z0-9]+Array##\[?/.test(value)) // Note: 'value' can be a complex type string that includes, for example, "Int8Array[" at a location other than the start
{
if (value.indexOf("##Int8Array##[") === 0) { return (Int8Array.from(JSON.parse(value.substring(13)))) } else
if (value.indexOf("##Uint8Array##") === 0) { return (Utils.Uint8ArrayFromHexString(value.substring(14))) } else // Note: No square brackets around the value
if (value.indexOf("##Uint8ClampedArray##[") === 0) { return (Uint8ClampedArray.from(JSON.parse(value.substring(21)))) } else
if (value.indexOf("##Int16Array##[") === 0) { return (Int16Array.from(JSON.parse(value.substring(14)))) } else
if (value.indexOf("##Uint16Array##[") === 0) { return (Uint16Array.from(JSON.parse(value.substring(15)))) } else
if (value.indexOf("##Int32Array##[") === 0) { return (Int32Array.from(JSON.parse(value.substring(14)))) } else
if (value.indexOf("##Uint32Array##[") === 0) { return (Uint32Array.from(JSON.parse(value.substring(15)))) } else
if (value.indexOf("##Float32Array##[") === 0) { return (Float32Array.from(JSON.parse(value.substring(16)))) } else
if (value.indexOf("##Float64Array##[") === 0) { return (Float64Array.from(JSON.parse(value.substring(16)))) } else
if (value.indexOf("##BigInt64Array##[") === 0) { return (BigInt64Array.from(value.substring(18, value.length - 1).split(",").map(BigInt))) } else
if (value.indexOf("##BigUint64Array##[") === 0) { return (BigUint64Array.from(value.substring(19, value.length - 1).split(",").map(BigInt))) }
return (value);
}
else
{
if (isString(value))
{
if ((value[value.length - 1] === "n") && /^-?\d+n$/.test(value))
{
return (BigInt(value.substring(0, value.length - 1)));
}
if (value.startsWith("##"))
{
switch (value)
{
case "##NaN##":
return (NaN);
case "##Infinity##":
return (Infinity);
case "##-Infinity##":
return (-Infinity);
}
if (value.startsWith("##Date##") && (value.length > 8))
{
return (new Date(value.substring(8, value.length)));
}
if (value.startsWith("##Set##") && (value.length > 7))
{
const elementArray: string = value.substring(7, value.length);
return (new Set(jsonParse(elementArray)));
}
if (value.startsWith("##Map##") && (value.length > 7))
{
const kvElementsArray: string = value.substring(7, value.length);
return (new Map(jsonParse(kvElementsArray)));
}
if (value.startsWith("##RegExp##") && (value.length > 10))
{
const re: string = value.substring(10, value.length);
const matchResults: RegExpMatchArray | null = re.match(/\/(.*)\/(.*)?/);
if (!matchResults)
{
throw new Error(`Malformed serialized RegExp ("${re}")`);
}
const body: string = matchResults[1];
const flags: string = matchResults[2] || "";
return (new RegExp(body, flags));
}
if (value.startsWith("##Error##") && (value.length > 9))
{
const error: Error = jsonParse(value.substring(9, value.length));
const newError = new Error(error.message);
newError.name = error.name;
newError.stack = error.stack;
return (newError);
}
}
}
return (value);
}
}