Skip to content

Commit 05fbff6

Browse files
committed
fix non modular client generation
Also update operation deserializer to only parse body when for non streaming operation deserializer. This way we won't wait and collect the streaming response
1 parent 38e1f20 commit 05fbff6

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public Void serviceShape(ServiceShape shape) {
253253
String nonModularName = serviceSymbol.getName().replace("Client", "");
254254
String filename = serviceSymbol.getDefinitionFile().replace("Client", "");
255255
writers.useFileWriter(filename, writer -> new NonModularServiceGenerator(
256-
settings, model, symbolProvider, nonModularName, writer).run());
256+
settings, model, symbolProvider, nonModularName, writer, applicationProtocol).run());
257257

258258
// Generate each operation for the service.
259259
TopDownIndex topDownIndex = model.getKnowledge(TopDownIndex.class);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public void run() {
8585

8686
// Add required imports.
8787
writer.addImport(configType, configType, serviceSymbol.getNamespace());
88+
writer.addImport("ServiceInputTypes", "ServiceInputTypes", serviceSymbol.getNamespace());
89+
writer.addImport("ServiceOutputTypes", "ServiceOutputTypes", serviceSymbol.getNamespace());
8890
writer.addImport("Command", "$Command", "@aws-sdk/smithy-client");
8991
writer.addImport("FinalizeHandlerArguments", "FinalizeHandlerArguments", "@aws-sdk/types");
9092
writer.addImport("Handler", "Handler", "@aws-sdk/types");
@@ -133,7 +135,7 @@ private void generateCommandMiddlewareResolver(String configType) {
133135

134136
writer.write("resolveMiddleware(")
135137
.indent()
136-
.write("clientStack: MiddlewareStack<$T, $T>,", inputType, outputType)
138+
.write("clientStack: MiddlewareStack<$L, $L>,", "ServiceInputTypes", "ServiceOutputTypes")
137139
.write("configuration: $L,", configType)
138140
.write("options?: $T", applicationProtocol.getOptionsType())
139141
.dedent();

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,23 @@ final class NonModularServiceGenerator implements Runnable {
4040
private final TypeScriptWriter writer;
4141
private final String nonModularName;
4242
private final Symbol serviceSymbol;
43+
private final ApplicationProtocol applicationProtocol;
4344

4445
NonModularServiceGenerator(
4546
TypeScriptSettings settings,
4647
Model model,
4748
SymbolProvider symbolProvider,
4849
String nonModularName,
49-
TypeScriptWriter writer
50+
TypeScriptWriter writer,
51+
ApplicationProtocol applicationProtocol
5052
) {
5153
this.settings = settings;
5254
this.model = model;
5355
this.service = settings.getService(model);
5456
this.symbolProvider = symbolProvider;
5557
this.writer = writer;
5658
this.nonModularName = nonModularName;
59+
this.applicationProtocol = applicationProtocol;
5760
serviceSymbol = symbolProvider.toSymbol(service);
5861
}
5962

@@ -70,24 +73,44 @@ public void run() {
7073
Symbol output = operationSymbol.expectProperty("outputType", Symbol.class);
7174

7275
writer.addUseImports(operationSymbol);
73-
String methodName = StringUtils.uncapitalize(operationSymbol.getName());
76+
String methodName = StringUtils.uncapitalize(
77+
operationSymbol.getName().replaceAll("Command$", "")
78+
);
7479

7580
// Generate a multiple overloaded methods for each command.
7681
writer.writeShapeDocs(operation);
77-
writer.write("public $L(args: $T): Promise<$T>;", methodName, input, output);
82+
writer.write("public $L(\n"
83+
+ " args: $T,\n"
84+
+ " options?: $T,\n"
85+
+ "): Promise<$T>;", methodName, input, applicationProtocol.getOptionsType(), output);
7886
writer.write("public $L(\n"
7987
+ " args: $T,\n"
8088
+ " cb: (err: any, data?: $T) => void\n"
8189
+ "): void;", methodName, input, output);
90+
writer.write("public $L(\n"
91+
+ " args: $T,\n"
92+
+ " options: $T,\n"
93+
+ " cb: (err: any, data?: $T) => void\n"
94+
+ "): void;", methodName, input, applicationProtocol.getOptionsType(), output);
8295
writer.openBlock("public $1L(\n"
8396
+ " args: $2T,\n"
84-
+ " cb?: (err: any, data?: $3T) => void\n"
85-
+ "): Promise<$3T> | void { ", "}", methodName, input, output, () -> {
97+
+ " optionsOrCb?: $3T | ((err: any, data?: $4T) => void),\n"
98+
+ " cb?: (err: any, data?: $4T) => void\n"
99+
+ "): Promise<$4T> | void { ", "}",
100+
methodName,
101+
input,
102+
applicationProtocol.getOptionsType(),
103+
output,
104+
() -> {
86105
writer.write("const command = new $T(args);\n"
87-
+ "if (typeof cb === \"function\") {\n"
88-
+ " this.send(command, cb);\n"
106+
+ "if (typeof optionsOrCb === \"function\") {\n"
107+
+ " this.send(command, optionsOrCb)\n"
108+
+ "} else if (typeof cb === \"function\") {\n"
109+
+ " if (typeof optionsOrCb !== \"object\")\n"
110+
+ " throw new Error(`Expect http options but get $${typeof optionsOrCb}`)\n"
111+
+ " this.send(command, optionsOrCb || {}, cb)\n"
89112
+ "} else {\n"
90-
+ " return this.send(command);\n"
113+
+ " return this.send(command, optionsOrCb);\n"
91114
+ "}", operationSymbol);
92115
});
93116
writer.write("");

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import software.amazon.smithy.model.shapes.UnionShape;
4848
import software.amazon.smithy.model.traits.ErrorTrait;
4949
import software.amazon.smithy.model.traits.HttpTrait;
50+
import software.amazon.smithy.model.traits.StreamingTrait;
5051
import software.amazon.smithy.model.traits.TimestampFormatTrait.Format;
5152
import software.amazon.smithy.typescript.codegen.ApplicationProtocol;
5253
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
@@ -539,7 +540,6 @@ private void generateOperationDeserializer(
539540
});
540541

541542
// Start deserializing the response.
542-
writer.write("const data: any = await parseBody(output.body, context)");
543543
writer.openBlock("const contents: $T = {", "};", outputType, () -> {
544544
writer.write("$$metadata: deserializeMetadata(output),");
545545

@@ -582,7 +582,6 @@ private void generateErrorDeserializer(GenerationContext context, StructureShape
582582
+ " output: any,\n"
583583
+ " context: SerdeContext\n"
584584
+ "): $T => {", "};", errorDeserMethodName, errorSymbol, () -> {
585-
writer.write("const data: any = output.body;");
586585

587586
writer.openBlock("const contents: $T = {", "};", errorSymbol, () -> {
588587
writer.write("__type: $S,", error.getId().getName());
@@ -663,6 +662,13 @@ private List<HttpBinding> readResponseBody(
663662
documentBindings.sort(Comparator.comparing(HttpBinding::getMemberName));
664663
List<HttpBinding> payloadBindings = bindingIndex.getResponseBindings(operationOrError, Location.PAYLOAD);
665664

665+
if (operationOrError.isOperationShape() && !operationOrError.hasTrait(StreamingTrait.class)) {
666+
writer.write("const data: any = await parseBody(output.body, context)");
667+
} else {
668+
// Don't collect stream for errors and streaming responses
669+
writer.write("const data: any = output.body;");
670+
}
671+
666672
if (!documentBindings.isEmpty()) {
667673
deserializeOutputDocument(context, operationOrError, documentBindings);
668674
return documentBindings;

0 commit comments

Comments
 (0)