diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java index 9edab34d0a1..cbfbece087c 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java @@ -409,8 +409,16 @@ void writeValidateMethodContents(TypeScriptWriter writer, String param) { // the object optionalSuffix = "?.toString()"; } - writer.write("...getMemberValidator($1S).validate($2L.$1L$4L, `$${path}/$3L`),", + Shape memberTarget = model.expectShape(member.getTarget()); + if (memberTarget.isUnionShape() && memberTarget.hasTrait(StreamingTrait.class)) { + // todo: validating event streams in unsupported. + writer.write("// unsupported event stream validation"); + writer.write("// ...getMemberValidator($1S).validate($2L.$1L$4L, `$${path}/$3L`),", getSanitizedMemberName(member), param, member.getMemberName(), optionalSuffix); + } else { + writer.write("...getMemberValidator($1S).validate($2L.$1L$4L, `$${path}/$3L`),", + getSanitizedMemberName(member), param, member.getMemberName(), optionalSuffix); + } } }); } @@ -458,7 +466,14 @@ private void writeMemberValidator(TypeScriptWriter writer, getValidatorValueType(shape), () -> { writeShapeValidator(writer, shape, constraintTraits, ","); - writer.write("$T.validate", symbolProvider.toSymbol(shape)); + if (!shape.hasTrait(ErrorTrait.class)) { + writer.write("$T.validate", symbolProvider.toSymbol(shape)); + } else { + // todo: unsupported + // Error classes have no static validator. + writer.write(""" + () => [/*Error validator unsupported*/]"""); + } }); } else if (shape.isListShape() || shape.isSetShape()) { writer.addImport("CompositeCollectionValidator", diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDependency.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDependency.java index b92c872119b..6331ad7e9a7 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDependency.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDependency.java @@ -103,6 +103,7 @@ public enum TypeScriptDependency implements Dependency { false), AWS_SDK_EVENTSTREAM_SERDE_NODE("dependencies", "@smithy/eventstream-serde-node", false), AWS_SDK_EVENTSTREAM_SERDE_BROWSER("dependencies", "@smithy/eventstream-serde-browser", false), + AWS_SDK_EVENTSTREAM_CODEC("dependencies", "@smithy/eventstream-codec", false), // Conditionally added if a requestCompression shape is found on any model operation. MIDDLEWARE_COMPRESSION("dependencies", "@smithy/middleware-compression", false), diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGenerator.java index 587a7c76e22..2ab54d5427d 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGenerator.java @@ -334,8 +334,16 @@ private void writeEventHeaders(GenerationContext context, StructureShape event) String memberName = headerMember.getMemberName(); Shape target = model.expectShape(headerMember.getTarget()); writer.openBlock("if (input.$L != null) {", "}", memberName, () -> { - writer.write("headers[$1S] = { type: $2S, value: input.$1L }", memberName, + if (target.isLongShape()) { + writer.addImport("Int64", "__Int64", TypeScriptDependency.AWS_SDK_EVENTSTREAM_CODEC); + writer.write("headers[$1S] = { type: $2S, value: __Int64.fromNumber(input.$1L) }", + memberName, + getEventHeaderType(target) + ); + } else { + writer.write("headers[$1S] = { type: $2S, value: input.$1L }", memberName, getEventHeaderType(target)); + } }); } } diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java index edf9506d025..4a9b2fb75cc 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java @@ -559,7 +559,7 @@ private void generateOperationResponseSerializer( + " input: $T,\n" + " ctx: ServerSerdeContext\n" + "): Promise<$T> => {", "}", methodName, outputType, responseType, () -> { - writeEmptyEndpoint(context); + writeEmptyEndpoint(context, operation); writeOperationStatusCode(context, operation, bindingIndex, trait); writeResponseHeaders(context, operation, bindingIndex, () -> writeDefaultOutputHeaders(context, operation)); @@ -646,14 +646,36 @@ private void generateErrorSerializationImplementation(GenerationContext context, } private void writeEmptyEndpoint(GenerationContext context) { - context.getWriter().write("const context: __SerdeContext = {\n" - + " ...ctx,\n" - + " endpoint: () => Promise.resolve({\n" - + " protocol: '',\n" - + " hostname: '',\n" - + " path: '',\n" - + " }),\n" - + "}"); + context.getWriter().write(""" + const context: __SerdeContext = { + ...ctx, + endpoint: () => Promise.resolve({ + protocol: '', + hostname: '', + path: '', + }), + };""" + ); + } + + private void writeEmptyEndpoint(GenerationContext context, OperationShape operation) { + String contextType = "__SerdeContext"; + boolean hasEventStreamResponse = EventStreamGenerator.hasEventStreamOutput(context, operation); + if (hasEventStreamResponse) { + // todo: unsupported SSDK feature. + contextType += "& any /*event stream context unsupported in ssdk*/"; + } + context.getWriter().write(""" + const context: $L = { + ...ctx, + endpoint: () => Promise.resolve({ + protocol: '', + hostname: '', + path: '', + }), + };""", + contextType + ); } private void generateOperationRequestSerializer( @@ -2205,10 +2227,18 @@ private void generateErrorDeserializer(GenerationContext context, StructureShape Shape target = model.expectShape(binding.getMember().getTarget()); deserializingDocumentShapes.add(target); }); - writer.openBlock("const exception = new $T({", "});", errorSymbol, () -> { - writer.write("$$metadata: deserializeMetadata($L),", outputName); - writer.write("...contents"); - }); + // todo: unsupported ssdk feature. + String serverSdkInfix = context.getSettings().generateServerSdk() + ? ": any /* $metadata unsupported on ssdk error */" + : ""; + writer.openBlock("const exception$L = new $T({", "});", + serverSdkInfix, + errorSymbol, + () -> { + writer.write("$$metadata: deserializeMetadata($L),", outputName); + writer.write("...contents"); + } + ); String errorLocation = this.getErrorBodyLocation(context, outputName + ".body"); writer.addImport("decorateServiceException", "__decorateServiceException", TypeScriptDependency.AWS_SMITHY_CLIENT);