"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerDeserialize = exports.registerSerialize = exports.GlobalRegistry = exports.Registry = void 0; exports.getSerialize = getSerialize; exports.getDeserialize = getDeserialize; const utils_1 = require("./utils"); class Registry { constructor() { Object.defineProperty(this, "serializers", { enumerable: true, configurable: true, writable: true, value: new Map() }); Object.defineProperty(this, "deserializers", { enumerable: true, configurable: true, writable: true, value: new Map() }); } registerSerialize(ctor, serialize) { this.serializers.set(ctor, serialize); } registerDeserialize(ctor, deserialize) { this.deserializers.set(ctor, deserialize); } } exports.Registry = Registry; exports.GlobalRegistry = new Registry(); exports.registerSerialize = exports.GlobalRegistry.registerSerialize.bind(exports.GlobalRegistry); exports.registerDeserialize = exports.GlobalRegistry.registerDeserialize.bind(exports.GlobalRegistry); function getFrom(map, value) { return map.get((0, utils_1.type)(value)); } function getSerialize(value, fallback, registry) { return getFrom(registry.serializers, value) || fallback; } function getDeserialize(value, fallback, registry) { return getFrom(registry.deserializers, value) || fallback; } (0, exports.registerSerialize)(Boolean, (ser, value) => ser.serializeBoolean(value)); (0, exports.registerSerialize)(String, (ser, value) => ser.serializeString(value)); (0, exports.registerSerialize)(Number, (ser, value) => ser.serializeNumber(value)); (0, exports.registerSerialize)(BigInt, (ser, value) => ser.serializeBigInt(value)); (0, exports.registerSerialize)(Symbol, (ser, value) => ser.serializeSymbol(value)); (0, exports.registerSerialize)(utils_1.Null, (ser, _value) => ser.serializeNull()); (0, exports.registerSerialize)(Object, (ser, value) => { const obj = Object.entries(value); const serObj = ser.serializeObject(obj.length); obj.forEach(([key, value]) => serObj.serializeEntry(key, value)); return serObj.end(); }); (0, exports.registerSerialize)(Array, (ser, value) => { const arr = value; const iter = ser.serializeIterable(arr.length); arr.forEach((value) => iter.serializeElement(value)); return iter.end(); }); (0, exports.registerDeserialize)(Boolean, (de) => de.deserializeBoolean({ visitBoolean(value) { return value; } })); (0, exports.registerDeserialize)(String, (de) => de.deserializeString({ visitString(value) { return value; } })); (0, exports.registerDeserialize)(Number, (de) => de.deserializeNumber({ visitNumber(value) { return value; } })); (0, exports.registerDeserialize)(BigInt, (de) => de.deserializeBigInt({ visitBigInt(value) { return value; } })); (0, exports.registerDeserialize)(Symbol, (de) => de.deserializeSymbol({ visitSymbol(value) { return value; } })); (0, exports.registerDeserialize)(Object, (de) => de.deserializeObject({ visitObject(access) { let result = {}; for (const [key, value] of access) { result[key] = value; } return result; } })); (0, exports.registerDeserialize)(Array, (de) => de.deserializeIterable({ visitIterable(access) { let result = []; for (const value of access) { result.push(value); } return result; } }));