From 18fe335ff35e31484e7a5d138e90f62e1bf24789 Mon Sep 17 00:00:00 2001 From: John Lwin Date: Wed, 26 Mar 2025 11:25:00 -0700 Subject: [PATCH 1/2] generate streamingBlobOutput type to code example --- .../smithy/typescript/codegen/CommandGenerator.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java index 38968e2fdd4..410e511786b 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java @@ -260,6 +260,7 @@ private String getCommandExample(String serviceName, String configName, String c model.getShape(operation.getInputShape()).get(), model, false, true)) + String.format("const command = new %s(input);%n", commandName) + "const response = await client.send(command);\n" + + getReadStreamExample() + String.format("%s%n", StructureExampleGenerator.generateStructuralHintDocumentation( model.getShape(operation.getOutputShape()).get(), model, true, false)) @@ -272,6 +273,15 @@ private String getCommandExample(String serviceName, String configName, String c + String.format("@see {@link %s | config} for %s's `config` shape.%n", configName, serviceName); } + private String getReadStreamExample() { + boolean hasStreamingBlobOutput = false; + if (hasStreamingBlobOutput) { + String memberName = ""; + return "const byte = await response[`%s`].transformToByteArray();".formatted(memberName); + } + return ""; + } + private String getThrownExceptions() { List errors = operation.getErrors(); StringBuilder buffer = new StringBuilder(); From 83e3a53ed6e8afaec3a287b3bdee80e80b5af7ab Mon Sep 17 00:00:00 2001 From: George Fu Date: Wed, 26 Mar 2025 14:31:41 -0400 Subject: [PATCH 2/2] find streaming blob output member name --- .../typescript/codegen/CommandGenerator.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java index 410e511786b..345b7022179 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java @@ -49,6 +49,7 @@ import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.InternalTrait; +import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.typescript.codegen.documentation.StructureExampleGenerator; import software.amazon.smithy.typescript.codegen.endpointsV2.RuleSetParameterFinder; @@ -274,10 +275,25 @@ private String getCommandExample(String serviceName, String configName, String c } private String getReadStreamExample() { - boolean hasStreamingBlobOutput = false; - if (hasStreamingBlobOutput) { - String memberName = ""; - return "const byte = await response[`%s`].transformToByteArray();".formatted(memberName); + String streamingBlobOutputMemberName = model.expectShape(operation.getOutputShape()) + .asStructureShape().get() + .getAllMembers() + .values() + .stream() + .filter(ms -> { + Shape target = model.expectShape(ms.getTarget()); + return target.isBlobShape() + && (ms.hasTrait(StreamingTrait.class) || target.hasTrait(StreamingTrait.class)); + }) + .findFirst() + .map(MemberShape::getMemberName) + .orElse(""); + + if (!streamingBlobOutputMemberName.isEmpty()) { + return """ + // Read the stream or discard it to free the socket. + const bytes = await response[`%s`].transformToByteArray();\n""" + .formatted(streamingBlobOutputMemberName); } return ""; }