UNPKG

@datastax/astra-db-ts

Version:
130 lines (129 loc) 5.3 kB
"use strict"; // Copyright Datastax, Inc // SPDX-License-Identifier: Apache-2.0 Object.defineProperty(exports, "__esModule", { value: true }); exports.CollSerDes = void 0; const ser_des_js_1 = require("../../../lib/api/ser-des/ser-des.js"); const ctx_js_1 = require("../../../lib/api/ser-des/ctx.js"); const codecs_js_1 = require("../../../documents/collections/ser-des/codecs.js"); const constants_js_1 = require("../../../documents/collections/ser-des/constants.js"); const utils_js_1 = require("../../../lib/utils.js"); const big_nums_js_1 = require("../../../documents/collections/ser-des/big-nums.js"); const cfg_handler_js_1 = require("../../../documents/collections/ser-des/cfg-handler.js"); const utils_js_2 = require("../../../lib/api/ser-des/utils.js"); class CollSerDes extends ser_des_js_1.SerDes { constructor(cfg) { super(CollSerDes.cfg.concat([codecs, cfg]), serialize, deserialize); Object.defineProperty(this, "_getNumCoercionForPath", { enumerable: true, configurable: true, writable: true, value: void 0 }); this._getNumCoercionForPath = (0, big_nums_js_1.buildGetNumCoercionForPathFn)(cfg); } adaptSerCtx(ctx) { ctx.bigNumsEnabled = !!this._getNumCoercionForPath; return ctx; } adaptDesCtx(ctx) { ctx.getNumCoercionForPath = this._getNumCoercionForPath; if (ctx.getNumCoercionForPath) { ctx.rootObj = (0, big_nums_js_1.coerceNums)(ctx.rootObj, ctx.getNumCoercionForPath); } return ctx; } bigNumsPresent() { return !!this._cfg?.enableBigNumbers; } } exports.CollSerDes = CollSerDes; Object.defineProperty(CollSerDes, "cfg", { enumerable: true, configurable: true, writable: true, value: cfg_handler_js_1.CollSerDesCfgHandler }); const serialize = (value, ctx) => { let resp = null; // Path-based serializers for (const pathSer of ctx.serializers.forPath[ctx.path.length] ?? []) { if ((0, utils_js_2.pathMatches)(pathSer.path, ctx.path) && pathSer.fns.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } } // Name-based serializers const key = ctx.path[ctx.path.length - 1] ?? ''; const nameSer = ctx.serializers.forName[key]; if (nameSer?.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } // Type-based & custom serializers for (const guardSer of ctx.serializers.forGuard) { if (guardSer.guard(value, ctx) && (resp = guardSer.fn(value, ctx))[0] !== ctx_js_1.NEVERMIND) { return resp; } } if (typeof value === 'object' && value !== null) { // Delegate serializer if (value[constants_js_1.$SerializeForCollection] && (resp = value[constants_js_1.$SerializeForCollection](ctx))[0] !== ctx_js_1.NEVERMIND) { return resp; } // Class-based serializers const classSer = ctx.serializers.forClass.find((c) => value instanceof c.class); if (classSer?.fns.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } // Readable err messages for big numbers if not enabled if ((0, utils_js_1.isBigNumber)(value)) { if (!ctx.bigNumsEnabled) { throw new Error('BigNumber serialization must be enabled through serdes.enableBigNumbers in CollectionSerDesConfig'); } return ctx.done(); } } else if (typeof value === 'bigint') { if (!ctx.bigNumsEnabled) { throw new Error('BigInt serialization must be enabled through serdes.enableBigNumbers in CollectionSerDesConfig'); } return ctx.done(); } return ctx.recurse(); }; const deserialize = (value, ctx) => { let resp = null; // Path-based deserializers for (const pathDes of ctx.deserializers.forPath[ctx.path.length] ?? []) { if ((0, utils_js_2.pathMatches)(pathDes.path, ctx.path) && pathDes.fns.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } } // Name-based deserializers const key = ctx.path[ctx.path.length - 1] ?? ''; const nameDes = ctx.deserializers.forName[key]; if (nameDes?.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } // Custom deserializers for (const guardDes of ctx.deserializers.forGuard) { if (guardDes.guard(value, ctx) && (resp = guardDes.fn(value, ctx))[0] !== ctx_js_1.NEVERMIND) { return resp; } } if (typeof value === 'object' && value !== null) { // Type-based deserializers const keys = Object.keys(value); if (keys.length === 1) { const typeDes = ctx.deserializers.forType[keys[0]]; if (typeDes?.find((fns) => (resp = fns(value, ctx))[0] !== ctx_js_1.NEVERMIND)) { return resp; } } // Insurance if ((0, utils_js_1.isBigNumber)(value)) { return ctx.done(value); } } return ctx.recurse(value); }; const codecs = CollSerDes.cfg.parse({ codecs: Object.values(codecs_js_1.CollectionCodecs.Defaults) });