From 7c09efb6863964c5b7129ec6affd16f5013ba9ec Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 9 Oct 2025 12:34:11 -0400 Subject: [PATCH] add SerdeContext base class --- .changeset/popular-squids-lick.md | 5 ++++ packages/core/src/index.ts | 2 +- .../requestBuilder.ts | 0 .../core/src/submodules/cbor/CborCodec.ts | 26 ++++--------------- .../src/submodules/protocols/HttpProtocol.ts | 12 ++++++--- .../src/submodules/protocols/SerdeContext.ts | 12 +++++++++ .../core/src/submodules/protocols/index.ts | 1 + .../serde/FromStringShapeDeserializer.ts | 12 +++------ .../HttpInterceptingShapeDeserializer.ts | 7 ++++- .../serde/HttpInterceptingShapeSerializer.ts | 13 ++++++++-- .../serde/ToStringShapeSerializer.ts | 11 +++----- 11 files changed, 58 insertions(+), 43 deletions(-) create mode 100644 .changeset/popular-squids-lick.md rename packages/core/src/{protocols => request-builder}/requestBuilder.ts (100%) create mode 100644 packages/core/src/submodules/protocols/SerdeContext.ts diff --git a/.changeset/popular-squids-lick.md b/.changeset/popular-squids-lick.md new file mode 100644 index 00000000000..6459937b8ca --- /dev/null +++ b/.changeset/popular-squids-lick.md @@ -0,0 +1,5 @@ +--- +"@smithy/core": minor +--- + +implement SerdeContext base class diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1dcdba11994..82c90b929e3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,6 @@ export * from "./middleware-http-auth-scheme"; export * from "./middleware-http-signing"; export * from "./normalizeProvider"; export { createPaginator } from "./pagination/createPaginator"; -export * from "./protocols/requestBuilder"; +export * from "./request-builder/requestBuilder"; export * from "./setFeature"; export * from "./util-identity-and-auth"; diff --git a/packages/core/src/protocols/requestBuilder.ts b/packages/core/src/request-builder/requestBuilder.ts similarity index 100% rename from packages/core/src/protocols/requestBuilder.ts rename to packages/core/src/request-builder/requestBuilder.ts diff --git a/packages/core/src/submodules/cbor/CborCodec.ts b/packages/core/src/submodules/cbor/CborCodec.ts index 1331cf79738..3d1dad359d8 100644 --- a/packages/core/src/submodules/cbor/CborCodec.ts +++ b/packages/core/src/submodules/cbor/CborCodec.ts @@ -1,6 +1,7 @@ +import { SerdeContext } from "@smithy/core/protocols"; import { NormalizedSchema } from "@smithy/core/schema"; import { _parseEpochTimestamp, generateIdempotencyToken } from "@smithy/core/serde"; -import type { Codec, Schema, SerdeFunctions, ShapeDeserializer, ShapeSerializer } from "@smithy/types"; +import type { Codec, Schema, ShapeDeserializer, ShapeSerializer } from "@smithy/types"; import { fromBase64 } from "@smithy/util-base64"; import { cbor } from "./cbor"; @@ -9,9 +10,7 @@ import { dateToTag } from "./parseCborBody"; /** * @alpha */ -export class CborCodec implements Codec { - private serdeContext?: SerdeFunctions; - +export class CborCodec extends SerdeContext implements Codec { public createSerializer(): CborShapeSerializer { const serializer = new CborShapeSerializer(); serializer.setSerdeContext(this.serdeContext!); @@ -23,23 +22,14 @@ export class CborCodec implements Codec { deserializer.setSerdeContext(this.serdeContext!); return deserializer; } - - public setSerdeContext(serdeContext: SerdeFunctions): void { - this.serdeContext = serdeContext; - } } /** * @alpha */ -export class CborShapeSerializer implements ShapeSerializer { - private serdeContext?: SerdeFunctions; +export class CborShapeSerializer extends SerdeContext implements ShapeSerializer { private value: unknown; - public setSerdeContext(serdeContext: SerdeFunctions) { - this.serdeContext = serdeContext; - } - public write(schema: Schema, value: unknown): void { this.value = this.serialize(schema, value); } @@ -127,13 +117,7 @@ export class CborShapeSerializer implements ShapeSerializer { /** * @alpha */ -export class CborShapeDeserializer implements ShapeDeserializer { - private serdeContext?: SerdeFunctions; - - public setSerdeContext(serdeContext: SerdeFunctions) { - this.serdeContext = serdeContext; - } - +export class CborShapeDeserializer extends SerdeContext implements ShapeDeserializer { public read(schema: Schema, bytes: Uint8Array): any { const data: any = cbor.deserialize(bytes); return this.readValue(schema, data); diff --git a/packages/core/src/submodules/protocols/HttpProtocol.ts b/packages/core/src/submodules/protocols/HttpProtocol.ts index f178e84ceee..7d94e616d37 100644 --- a/packages/core/src/submodules/protocols/HttpProtocol.ts +++ b/packages/core/src/submodules/protocols/HttpProtocol.ts @@ -21,21 +21,24 @@ import type { ShapeSerializer, } from "@smithy/types"; +import { SerdeContext } from "./SerdeContext"; + /** * Abstract base for HTTP-based client protocols. * * @alpha */ -export abstract class HttpProtocol implements ClientProtocol { +export abstract class HttpProtocol extends SerdeContext implements ClientProtocol { protected abstract serializer: ShapeSerializer; protected abstract deserializer: ShapeDeserializer; - protected serdeContext?: SerdeFunctions; protected constructor( public readonly options: { defaultNamespace: string; } - ) {} + ) { + super(); + } public abstract getShapeId(): string; @@ -49,6 +52,9 @@ export abstract class HttpProtocol implements ClientProtocol { - private serdeContext: SerdeFunctions | undefined; - - public constructor(private settings: CodecSettings) {} - - public setSerdeContext(serdeContext: SerdeFunctions): void { - this.serdeContext = serdeContext; +export class FromStringShapeDeserializer extends SerdeContext implements ShapeDeserializer { + public constructor(private settings: CodecSettings) { + super(); } public read(_schema: Schema, data: string): any { diff --git a/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeDeserializer.ts b/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeDeserializer.ts index 7aa9feb4735..af72723cb5a 100644 --- a/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeDeserializer.ts +++ b/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeDeserializer.ts @@ -2,6 +2,7 @@ import { NormalizedSchema } from "@smithy/core/schema"; import type { CodecSettings, Schema, SerdeFunctions, ShapeDeserializer } from "@smithy/types"; import { fromUtf8, toUtf8 } from "@smithy/util-utf8"; +import { SerdeContext } from "../SerdeContext"; import { FromStringShapeDeserializer } from "./FromStringShapeDeserializer"; /** @@ -14,18 +15,22 @@ import { FromStringShapeDeserializer } from "./FromStringShapeDeserializer"; * @alpha */ export class HttpInterceptingShapeDeserializer> + extends SerdeContext implements ShapeDeserializer { private stringDeserializer: FromStringShapeDeserializer; - private serdeContext: SerdeFunctions | undefined; public constructor( private codecDeserializer: CodecShapeDeserializer, codecSettings: CodecSettings ) { + super(); this.stringDeserializer = new FromStringShapeDeserializer(codecSettings); } + /** + * @override + */ public setSerdeContext(serdeContext: SerdeFunctions): void { this.stringDeserializer.setSerdeContext(serdeContext); this.codecDeserializer.setSerdeContext(serdeContext); diff --git a/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeSerializer.ts b/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeSerializer.ts index dda09dd192c..f4a45150827 100644 --- a/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeSerializer.ts +++ b/packages/core/src/submodules/protocols/serde/HttpInterceptingShapeSerializer.ts @@ -1,5 +1,11 @@ import { NormalizedSchema } from "@smithy/core/schema"; -import type { CodecSettings, Schema as ISchema, SerdeFunctions, ShapeSerializer } from "@smithy/types"; +import type { + CodecSettings, + ConfigurableSerdeContext, + Schema as ISchema, + SerdeFunctions, + ShapeSerializer, +} from "@smithy/types"; import { ToStringShapeSerializer } from "./ToStringShapeSerializer"; @@ -13,7 +19,7 @@ import { ToStringShapeSerializer } from "./ToStringShapeSerializer"; * @alpha */ export class HttpInterceptingShapeSerializer> - implements ShapeSerializer + implements ShapeSerializer, ConfigurableSerdeContext { private buffer: string | undefined; @@ -23,6 +29,9 @@ export class HttpInterceptingShapeSerializer { +export class ToStringShapeSerializer extends SerdeContext implements ShapeSerializer { private stringBuffer = ""; - private serdeContext: SerdeFunctions | undefined = undefined; - public constructor(private settings: CodecSettings) {} - - public setSerdeContext(serdeContext: SerdeFunctions): void { - this.serdeContext = serdeContext; + public constructor(private settings: CodecSettings) { + super(); } public write(schema: Schema, value: unknown): void {