| import { |
| VOID, PRIMITIVE, |
| ARRAY, OBJECT, |
| DATE, REGEXP, MAP, SET, |
| ERROR, BIGINT |
| } from './types.js'; |
|
|
| const env = typeof self === 'object' ? self : globalThis; |
|
|
| const deserializer = ($, _) => { |
| const as = (out, index) => { |
| $.set(index, out); |
| return out; |
| }; |
|
|
| const unpair = index => { |
| if ($.has(index)) |
| return $.get(index); |
|
|
| const [type, value] = _[index]; |
| switch (type) { |
| case PRIMITIVE: |
| case VOID: |
| return as(value, index); |
| case ARRAY: { |
| const arr = as([], index); |
| for (const index of value) |
| arr.push(unpair(index)); |
| return arr; |
| } |
| case OBJECT: { |
| const object = as({}, index); |
| for (const [key, index] of value) |
| object[unpair(key)] = unpair(index); |
| return object; |
| } |
| case DATE: |
| return as(new Date(value), index); |
| case REGEXP: { |
| const {source, flags} = value; |
| return as(new RegExp(source, flags), index); |
| } |
| case MAP: { |
| const map = as(new Map, index); |
| for (const [key, index] of value) |
| map.set(unpair(key), unpair(index)); |
| return map; |
| } |
| case SET: { |
| const set = as(new Set, index); |
| for (const index of value) |
| set.add(unpair(index)); |
| return set; |
| } |
| case ERROR: { |
| const {name, message} = value; |
| return as(new env[name](message), index); |
| } |
| case BIGINT: |
| return as(BigInt(value), index); |
| case 'BigInt': |
| return as(Object(BigInt(value)), index); |
| case 'ArrayBuffer': |
| return as(new Uint8Array(value).buffer, value); |
| case 'DataView': { |
| const { buffer } = new Uint8Array(value); |
| return as(new DataView(buffer), value); |
| } |
| } |
| return as(new env[type](value), index); |
| }; |
|
|
| return unpair; |
| }; |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| export const deserialize = serialized => deserializer(new Map, serialized)(0); |
|
|