function reviver()

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