@datastax/astra-db-ts
Version:
Data API TypeScript client
130 lines (129 loc) • 5.3 kB
JavaScript
;
// 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) });