Skip to content

Commit 53dc4e9

Browse files
committed
revert SdkStream type in SymbolVisitor, add to command generator
1 parent 0c25e0a commit 53dc4e9

File tree

5 files changed

+63
-18
lines changed

5 files changed

+63
-18
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenUtils.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,20 +117,22 @@ static List<MemberShape> getBlobStreamingMembers(Model model, StructureShape sha
117117
return shape.getAllMembers().values().stream()
118118
.filter(memberShape -> {
119119
// Streaming blobs need to have their types modified
120-
// See `writeStreamingMemberType`
120+
// See `writeStreamingCommandTypeToSer`
121121
Shape target = model.expectShape(memberShape.getTarget());
122122
return target.isBlobShape() && target.hasTrait(StreamingTrait.class);
123123
})
124124
.collect(Collectors.toList());
125125
}
126126

127127
/**
128-
* Ease the input streaming member restriction so that users don't need to construct a stream every time.
129-
* This type decoration is allowed in Smithy because it makes input type more permissive than output type
130-
* for the same member.
128+
* Generate the type of the command output of server sdk or the input of the client sdk given the streaming blob
129+
* member of the shape. The generated type eases the streaming member requirement so that users don't need to
130+
* construct a stream every time.
131+
* This type decoration is allowed in Smithy because it makes, for the same member, the type to be serialized is
132+
* more permissive than the type to be deserialized.
131133
* Refer here for more rationales: https://github.com/aws/aws-sdk-js-v3/issues/843
132134
*/
133-
static void writeStreamingMemberType(
135+
static void writeStreamingCommandTypeToSer(
134136
TypeScriptWriter writer,
135137
Symbol containerSymbol,
136138
String typeName,
@@ -148,6 +150,38 @@ static void writeStreamingMemberType(
148150
writer.write("export interface $1L extends $1LType {}", typeName);
149151
}
150152

153+
/**
154+
* Generate the type of the command input of server sdk or the output of the client sdk given the streaming blob
155+
* member of the shape. The type marks the streaming blob member to contain the utility methods to transform the
156+
* stream to string, buffer or WHATWG stream API.
157+
*/
158+
static void writeStreamingCommandTypeFromDeser(
159+
TypeScriptWriter writer,
160+
Symbol containerSymbol,
161+
String typeName,
162+
MemberShape streamingMember,
163+
TypeScriptSettings settings
164+
) {
165+
String memberName = streamingMember.getMemberName();
166+
String optionalSuffix = streamingMember.isRequired() ? "" : "?";
167+
boolean isClientSdk = settings.generateClient();
168+
if (isClientSdk) {
169+
writer.addImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.AWS_SDK_TYPES.packageName);
170+
}
171+
String metadataBearerType = isClientSdk ? "__MetadataBearer & " : "";
172+
writer.addImport("SdkStream", "__SdkStream", TypeScriptDependency.AWS_SDK_TYPES.packageName);
173+
writer.openBlock("type $LType = $LOmit<$T, $S> & {", "};",
174+
typeName, metadataBearerType, containerSymbol, memberName, () -> {
175+
writer.writeDocs(String.format("For *`%1$s[\"%2$s\"]`*, see {@link %1$s.%2$s}.",
176+
containerSymbol.getName(), memberName));
177+
writer.write("$1L$2L: __SdkStream<Required<$3T>[$1S]>;", memberName, optionalSuffix,
178+
containerSymbol);
179+
});
180+
writer.writeDocs(String.format("This interface extends from `%1$s` interface. There are more parameters than"
181+
+ " `%2$s` defined in {@link %1$s}", containerSymbol.getName(), memberName));
182+
writer.write("export interface $1L extends $1LType {}", typeName);
183+
}
184+
151185
/**
152186
* Returns the list of function parameter key-value pairs to be written for
153187
* provided parameters map.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
package software.amazon.smithy.typescript.codegen;
1717

1818
import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers;
19-
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingMemberType;
19+
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingCommandTypeFromDeser;
20+
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingCommandTypeToSer;
2021

2122
import java.nio.file.Paths;
2223
import java.util.List;
@@ -246,7 +247,8 @@ private void writeInputType(String typeName, Optional<StructureShape> inputShape
246247
if (blobStreamingMembers.isEmpty()) {
247248
writer.write("export interface $L extends $T {}", typeName, symbolProvider.toSymbol(input));
248249
} else {
249-
writeStreamingMemberType(writer, symbolProvider.toSymbol(input), typeName, blobStreamingMembers.get(0));
250+
writeStreamingCommandTypeToSer(writer, symbolProvider.toSymbol(input), typeName,
251+
blobStreamingMembers.get(0));
250252
}
251253
} else {
252254
// If the input is non-existent, then use an empty object.
@@ -259,8 +261,15 @@ private void writeOutputType(String typeName, Optional<StructureShape> outputSha
259261
// to a defined output shape.
260262
writer.addImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.AWS_SDK_TYPES.packageName);
261263
if (outputShape.isPresent()) {
262-
writer.write("export interface $L extends $T, __MetadataBearer {}",
263-
typeName, symbolProvider.toSymbol(outputShape.get()));
264+
StructureShape output = outputShape.get();
265+
List<MemberShape> blobStreamingMembers = getBlobStreamingMembers(model, output);
266+
if (blobStreamingMembers.isEmpty()) {
267+
writer.write("export interface $L extends $T, __MetadataBearer {}",
268+
typeName, symbolProvider.toSymbol(outputShape.get()));
269+
} else {
270+
writeStreamingCommandTypeFromDeser(writer, symbolProvider.toSymbol(output), typeName,
271+
blobStreamingMembers.get(0), settings);
272+
}
264273
} else {
265274
writer.write("export interface $L extends __MetadataBearer {}", typeName);
266275
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerCommandGenerator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package software.amazon.smithy.typescript.codegen;
1717

1818
import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers;
19-
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingMemberType;
19+
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingCommandTypeFromDeser;
2020

2121
import java.nio.file.Paths;
2222
import java.util.Collections;
@@ -98,15 +98,15 @@ private void addInputAndOutputTypes() {
9898
writer.write("");
9999
}
100100

101-
// TODO: Flip these so that metadata is attached to input and streaming customization is attached to output.
102101
private void writeInputType(String typeName, Optional<StructureShape> inputShape) {
103102
if (inputShape.isPresent()) {
104103
StructureShape input = inputShape.get();
105104
List<MemberShape> blobStreamingMembers = getBlobStreamingMembers(model, input);
106105
if (blobStreamingMembers.isEmpty()) {
107106
writer.write("export interface $L extends $T {}", typeName, symbolProvider.toSymbol(input));
108107
} else {
109-
writeStreamingMemberType(writer, symbolProvider.toSymbol(input), typeName, blobStreamingMembers.get(0));
108+
writeStreamingCommandTypeFromDeser(writer, symbolProvider.toSymbol(input), typeName,
109+
blobStreamingMembers.get(0), settings);
110110
}
111111
renderNamespace(typeName, input);
112112
} else {
@@ -134,6 +134,7 @@ private void renderNamespace(String typeName, StructureShape input) {
134134

135135
private void writeOutputType(String typeName, Optional<StructureShape> outputShape) {
136136
if (outputShape.isPresent()) {
137+
//TODO: refer to writeStreamingCommandTypeToSer when streaming is supported.
137138
writer.write("export interface $L extends $T {}",
138139
typeName, symbolProvider.toSymbol(outputShape.get()));
139140
} else {

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,9 @@ public String toMemberName(MemberShape shape) {
138138
@Override
139139
public Symbol blobShape(BlobShape shape) {
140140
if (shape.hasTrait(StreamingTrait.class)) {
141-
// Note: `Readable` and `SdkStream` needs an import and a dependency.
142-
return createSymbolBuilder(shape, "SdkStream<Readable | ReadableStream | Blob>", null)
141+
// Note: `Readable` needs an import and a dependency.
142+
return createSymbolBuilder(shape, "Readable | ReadableStream | Blob", null)
143143
.addReference(Symbol.builder().name("Readable").namespace("stream", "/").build())
144-
.addReference(Symbol.builder().name("SdkStream").namespace(
145-
TypeScriptDependency.AWS_SDK_TYPES.packageName, "/").build())
146144
.build();
147145
}
148146

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,8 +2301,11 @@ private HttpBinding readPayload(
23012301

23022302
// Handle streaming shapes differently.
23032303
if (target.hasTrait(StreamingTrait.class)) {
2304-
// If payload is streaming, return low-level stream with the stream utility functions mixin.
2305-
writer.write("const data: any = context.sdkStreamMixin(output.body);");
2304+
writer.write("const data: any = output.body;");
2305+
// If payload is streaming blob, return low-level stream with the stream utility functions mixin.
2306+
if (target instanceof BlobShape) {
2307+
writer.write("context.sdkStreamMixin(data);");
2308+
}
23062309
} else if (target instanceof BlobShape) {
23072310
// If payload is non-streaming Blob, only need to collect stream to binary data (Uint8Array).
23082311
writer.write("const data: any = await collectBody(output.body, context);");

0 commit comments

Comments
 (0)