Skip to content

Commit 418ec30

Browse files
AllanZhengYPkuhe
authored andcommitted
revert SdkStream type in SymbolVisitor, add to command generator
1 parent eb57630 commit 418ec30

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;
@@ -314,7 +315,8 @@ private void writeInputType(String typeName, Optional<StructureShape> inputShape
314315
if (blobStreamingMembers.isEmpty()) {
315316
writer.write("export interface $L extends $T {}", typeName, symbolProvider.toSymbol(input));
316317
} else {
317-
writeStreamingMemberType(writer, symbolProvider.toSymbol(input), typeName, blobStreamingMembers.get(0));
318+
writeStreamingCommandTypeToSer(writer, symbolProvider.toSymbol(input), typeName,
319+
blobStreamingMembers.get(0));
318320
}
319321
} else {
320322
// If the input is non-existent, then use an empty object.
@@ -327,8 +329,15 @@ private void writeOutputType(String typeName, Optional<StructureShape> outputSha
327329
// to a defined output shape.
328330
writer.addImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.AWS_SDK_TYPES.packageName);
329331
if (outputShape.isPresent()) {
330-
writer.write("export interface $L extends $T, __MetadataBearer {}",
331-
typeName, symbolProvider.toSymbol(outputShape.get()));
332+
StructureShape output = outputShape.get();
333+
List<MemberShape> blobStreamingMembers = getBlobStreamingMembers(model, output);
334+
if (blobStreamingMembers.isEmpty()) {
335+
writer.write("export interface $L extends $T, __MetadataBearer {}",
336+
typeName, symbolProvider.toSymbol(outputShape.get()));
337+
} else {
338+
writeStreamingCommandTypeFromDeser(writer, symbolProvider.toSymbol(output), typeName,
339+
blobStreamingMembers.get(0), settings);
340+
}
332341
} else {
333342
writer.write("export interface $L extends __MetadataBearer {}", typeName);
334343
}

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
@@ -2327,8 +2327,11 @@ private HttpBinding readPayload(
23272327

23282328
// Handle streaming shapes differently.
23292329
if (target.hasTrait(StreamingTrait.class)) {
2330-
// If payload is streaming, return low-level stream with the stream utility functions mixin.
2331-
writer.write("const data: any = context.sdkStreamMixin(output.body);");
2330+
writer.write("const data: any = output.body;");
2331+
// If payload is streaming blob, return low-level stream with the stream utility functions mixin.
2332+
if (target instanceof BlobShape) {
2333+
writer.write("context.sdkStreamMixin(data);");
2334+
}
23322335
} else if (target instanceof BlobShape) {
23332336
// If payload is non-streaming Blob, only need to collect stream to binary data (Uint8Array).
23342337
writer.write("const data: any = await collectBody(output.body, context);");

0 commit comments

Comments
 (0)