Skip to content

Commit 117df34

Browse files
committed
chore(codegen): add sigv4a trait detection
1 parent af5215a commit 117df34

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package software.amazon.smithy.aws.typescript.codegen;
7+
8+
import java.util.Collection;
9+
import java.util.Collections;
10+
import java.util.Map;
11+
import java.util.Set;
12+
import java.util.function.Consumer;
13+
import software.amazon.smithy.codegen.core.SymbolProvider;
14+
import software.amazon.smithy.model.Model;
15+
import software.amazon.smithy.model.knowledge.ServiceIndex;
16+
import software.amazon.smithy.model.knowledge.TopDownIndex;
17+
import software.amazon.smithy.model.shapes.OperationShape;
18+
import software.amazon.smithy.model.shapes.ServiceShape;
19+
import software.amazon.smithy.model.shapes.ShapeId;
20+
import software.amazon.smithy.model.traits.Trait;
21+
import software.amazon.smithy.typescript.codegen.LanguageTarget;
22+
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
23+
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
24+
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
25+
import software.amazon.smithy.utils.MapUtils;
26+
import software.amazon.smithy.utils.SmithyInternalApi;
27+
28+
/**
29+
* Detects when to add sigv4a signer.
30+
*/
31+
@SmithyInternalApi
32+
public final class AddSigv4aPlugin implements TypeScriptIntegration {
33+
public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
34+
TypeScriptSettings settings,
35+
Model model,
36+
SymbolProvider symbolProvider,
37+
LanguageTarget target
38+
) {
39+
boolean useSigv4aCapableSigner = false;
40+
41+
ServiceIndex serviceIndex = ServiceIndex.of(model);
42+
Set<ServiceShape> services = model.getServiceShapes();
43+
for (ServiceShape service : services) {
44+
Map<ShapeId, Trait> authSchemes = serviceIndex.getAuthSchemes(service);
45+
useSigv4aCapableSigner = useSigv4aCapableSigner || usesSigv4a(authSchemes);
46+
if (useSigv4aCapableSigner) {
47+
break;
48+
}
49+
50+
TopDownIndex topDownIndex = TopDownIndex.of(model);
51+
for (OperationShape operationShape : topDownIndex.getContainedOperations(service)) {
52+
useSigv4aCapableSigner = usesSigv4a(operationShape.getAllTraits());
53+
if (useSigv4aCapableSigner) {
54+
break;
55+
}
56+
}
57+
}
58+
59+
if (!useSigv4aCapableSigner) {
60+
return Collections.emptyMap();
61+
}
62+
63+
switch (target) {
64+
case SHARED:
65+
return MapUtils.of("signerConstructor", writer -> {
66+
writer.addDependency(AwsDependency.SIGNATURE_V4_MULTIREGION)
67+
.addImport("SignatureV4MultiRegion", "SignatureV4MultiRegion",
68+
AwsDependency.SIGNATURE_V4_MULTIREGION)
69+
.write("SignatureV4MultiRegion");
70+
});
71+
default:
72+
return Collections.emptyMap();
73+
}
74+
}
75+
76+
private boolean usesSigv4a(Collection<Trait> traits) {
77+
return traits.stream()
78+
.anyMatch(trait -> trait.toString().equals("aws.auth#sigv4a"));
79+
}
80+
81+
private boolean usesSigv4a(Map<ShapeId, Trait> traits) {
82+
return usesSigv4a(traits.values());
83+
}
84+
}

codegen/smithy-aws-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ software.amazon.smithy.aws.typescript.codegen.AddDocumentClientPlugin
2424
software.amazon.smithy.aws.typescript.codegen.AddEndpointDiscoveryPlugin
2525
software.amazon.smithy.aws.typescript.codegen.AddHttpChecksumDependency
2626
software.amazon.smithy.aws.typescript.codegen.AddEventBridgePlugin
27+
software.amazon.smithy.aws.typescript.codegen.AddSigv4aPlugin
2728
software.amazon.smithy.aws.typescript.codegen.AddCloudFrontKeyValueStorePlugin
2829
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.AwsSdkCustomizeHttpBearerTokenAuth
2930
software.amazon.smithy.aws.typescript.codegen.auth.http.integration.SupportSigV4Auth

0 commit comments

Comments
 (0)