UNPKG

awscdk-construct-scte-scheduler

Version:

AWS CDK Construct for scheduling SCTE-35 events using the MediaLive schedule API

106 lines (105 loc) 4.39 kB
import { NormalizedSchema, SCHEMA } from "@smithy/core/schema"; import { LazyJsonString, NumericValue, parseEpochTimestamp, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, } from "@smithy/core/serde"; import { fromBase64 } from "@smithy/util-base64"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; import { jsonReviver } from "./jsonReviver"; import { parseJsonBody } from "./parseJsonBody"; export class JsonShapeDeserializer extends SerdeContextConfig { settings; constructor(settings) { super(); this.settings = settings; } async read(schema, data) { return this._read(schema, typeof data === "string" ? JSON.parse(data, jsonReviver) : await parseJsonBody(data, this.serdeContext)); } readObject(schema, data) { return this._read(schema, data); } _read(schema, value) { const isObject = value !== null && typeof value === "object"; const ns = NormalizedSchema.of(schema); if (ns.isListSchema() && Array.isArray(value)) { const listMember = ns.getValueSchema(); const out = []; const sparse = !!ns.getMergedTraits().sparse; for (const item of value) { if (sparse || item != null) { out.push(this._read(listMember, item)); } } return out; } else if (ns.isMapSchema() && isObject) { const mapMember = ns.getValueSchema(); const out = {}; const sparse = !!ns.getMergedTraits().sparse; for (const [_k, _v] of Object.entries(value)) { if (sparse || _v != null) { out[_k] = this._read(mapMember, _v); } } return out; } else if (ns.isStructSchema() && isObject) { const out = {}; for (const [memberName, memberSchema] of ns.structIterator()) { const fromKey = this.settings.jsonName ? memberSchema.getMergedTraits().jsonName ?? memberName : memberName; const deserializedValue = this._read(memberSchema, value[fromKey]); if (deserializedValue != null) { out[memberName] = deserializedValue; } } return out; } if (ns.isBlobSchema() && typeof value === "string") { return fromBase64(value); } const mediaType = ns.getMergedTraits().mediaType; if (ns.isStringSchema() && typeof value === "string" && mediaType) { const isJson = mediaType === "application/json" || mediaType.endsWith("+json"); if (isJson) { return LazyJsonString.from(value); } } if (ns.isTimestampSchema()) { const options = this.settings.timestampFormat; const format = options.useTrait ? ns.getSchema() === SCHEMA.TIMESTAMP_DEFAULT ? options.default : ns.getSchema() ?? options.default : options.default; switch (format) { case SCHEMA.TIMESTAMP_DATE_TIME: return parseRfc3339DateTimeWithOffset(value); case SCHEMA.TIMESTAMP_HTTP_DATE: return parseRfc7231DateTime(value); case SCHEMA.TIMESTAMP_EPOCH_SECONDS: return parseEpochTimestamp(value); default: console.warn("Missing timestamp format, parsing value with Date constructor:", value); return new Date(value); } } if (ns.isBigIntegerSchema() && (typeof value === "number" || typeof value === "string")) { return BigInt(value); } if (ns.isBigDecimalSchema() && value != undefined) { if (value instanceof NumericValue) { return value; } return new NumericValue(String(value), "bigDecimal"); } if (ns.isNumericSchema() && typeof value === "string") { switch (value) { case "Infinity": return Infinity; case "-Infinity": return -Infinity; case "NaN": return NaN; } } return value; } }