import { EventStreamCodec, MessageDecoderStream, MessageEncoderStream, SmithyMessageDecoderStream, SmithyMessageEncoderStream, } from "@smithy/eventstream-codec"; import { Decoder, Encoder, EventStreamMarshaller as IEventStreamMarshaller, Message } from "@smithy/types"; import { getChunkedStream } from "./getChunkedStream"; import { getMessageUnmarshaller } from "./getUnmarshalledStream"; /** * @internal */ export interface EventStreamMarshaller extends IEventStreamMarshaller {} /** * @internal */ export interface EventStreamMarshallerOptions { utf8Encoder: Encoder; utf8Decoder: Decoder; } /** * @internal */ export class EventStreamMarshaller { private readonly eventStreamCodec: EventStreamCodec; private readonly utfEncoder: Encoder; constructor({ utf8Encoder, utf8Decoder }: EventStreamMarshallerOptions) { this.eventStreamCodec = new EventStreamCodec(utf8Encoder, utf8Decoder); this.utfEncoder = utf8Encoder; } deserialize( body: AsyncIterable, deserializer: (input: Record) => Promise ): AsyncIterable { const inputStream = getChunkedStream(body); // @ts-expect-error Type 'SmithyMessageDecoderStream>' is not assignable to type 'AsyncIterable' return new SmithyMessageDecoderStream({ messageStream: new MessageDecoderStream({ inputStream, decoder: this.eventStreamCodec }), // @ts-expect-error Type 'T' is not assignable to type 'Record' deserializer: getMessageUnmarshaller(deserializer, this.utfEncoder), }); } serialize(inputStream: AsyncIterable, serializer: (event: T) => Message): AsyncIterable { return new MessageEncoderStream({ messageStream: new SmithyMessageEncoderStream({ inputStream, serializer }), encoder: this.eventStreamCodec, includeEndFrame: true, }); } }