UNPKG

lambda-live-debugger

Version:

Debug Lambda functions locally like it is running in the cloud

92 lines (91 loc) 4 kB
import { NormalizedSchema } from "@smithy/core/schema"; import { dateToUtcString, generateIdempotencyToken, LazyJsonString, quoteHeader } from "@smithy/core/serde"; import { toBase64 } from "@smithy/util-base64"; import { SerdeContext } from "../SerdeContext"; import { determineTimestampFormat } from "./determineTimestampFormat"; export class ToStringShapeSerializer extends SerdeContext { settings; stringBuffer = ""; constructor(settings) { super(); this.settings = settings; } write(schema, value) { const ns = NormalizedSchema.of(schema); switch (typeof value) { case "object": if (value === null) { this.stringBuffer = "null"; return; } if (ns.isTimestampSchema()) { if (!(value instanceof Date)) { throw new Error(`@smithy/core/protocols - received non-Date value ${value} when schema expected Date in ${ns.getName(true)}`); } const format = determineTimestampFormat(ns, this.settings); switch (format) { case 5: this.stringBuffer = value.toISOString().replace(".000Z", "Z"); break; case 6: this.stringBuffer = dateToUtcString(value); break; case 7: this.stringBuffer = String(value.getTime() / 1000); break; default: console.warn("Missing timestamp format, using epoch seconds", value); this.stringBuffer = String(value.getTime() / 1000); } return; } if (ns.isBlobSchema() && "byteLength" in value) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(value); return; } if (ns.isListSchema() && Array.isArray(value)) { let buffer = ""; for (const item of value) { this.write([ns.getValueSchema(), ns.getMergedTraits()], item); const headerItem = this.flush(); const serialized = ns.getValueSchema().isTimestampSchema() ? headerItem : quoteHeader(headerItem); if (buffer !== "") { buffer += ", "; } buffer += serialized; } this.stringBuffer = buffer; return; } this.stringBuffer = JSON.stringify(value, null, 2); break; case "string": const mediaType = ns.getMergedTraits().mediaType; let intermediateValue = value; if (mediaType) { const isJson = mediaType === "application/json" || mediaType.endsWith("+json"); if (isJson) { intermediateValue = LazyJsonString.from(intermediateValue); } if (ns.getMergedTraits().httpHeader) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(intermediateValue.toString()); return; } } this.stringBuffer = value; break; default: if (ns.isIdempotencyToken()) { this.stringBuffer = generateIdempotencyToken(); } else { this.stringBuffer = String(value); } } } flush() { const buffer = this.stringBuffer; this.stringBuffer = ""; return buffer; } }