Skip to content

Commit 830d139

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

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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.Map;
9+
import java.util.Set;
10+
import java.util.function.Consumer;
11+
import software.amazon.smithy.codegen.core.SymbolProvider;
12+
import software.amazon.smithy.model.Model;
13+
import software.amazon.smithy.model.knowledge.ServiceIndex;
14+
import software.amazon.smithy.model.shapes.ServiceShape;
15+
import software.amazon.smithy.model.shapes.ShapeId;
16+
import software.amazon.smithy.model.traits.Trait;
17+
import software.amazon.smithy.typescript.codegen.LanguageTarget;
18+
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
19+
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
20+
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
21+
import software.amazon.smithy.utils.SmithyInternalApi;
22+
23+
/**
24+
* Detects when to add sigv4a signer.
25+
*/
26+
@SmithyInternalApi
27+
public final class AddSigv4aPlugin implements TypeScriptIntegration {
28+
public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
29+
TypeScriptSettings settings,
30+
Model model,
31+
SymbolProvider symbolProvider,
32+
LanguageTarget target
33+
) {
34+
boolean useSigv4aSigner = false;
35+
36+
ServiceIndex serviceIndex = ServiceIndex.of(model);
37+
Set<ServiceShape> services = model.getServiceShapes();
38+
for (ServiceShape service of services) {
39+
Map<ShapeId, Trait> authSchemes = serviceIndex.getAuthSchemes(service);
40+
useSigv4aSigner = useSigv4aSigner || authSchemes.values().stream()
41+
.anyMatch(trait -> trait.toString().equals("aws.auth#sigv4a"));
42+
43+
TopDownIndex topDownIndex = TopDownIndex.of(service.getModel());
44+
for (OperationShape operationShape : topDownIndex.getContainedOperations(service)) {
45+
useSigv4aSigner = useSigv4aSigner || operationShape.getAllTraits()
46+
.values().stream()
47+
.anyMatch(trait -> trait.toString().equals("aws.auth#sigv4a"));
48+
}
49+
}
50+
51+
if (!useSigv4aSigner) {
52+
return Collections.emptyMap();
53+
}
54+
55+
switch (target) {
56+
case SHARED:
57+
return MapUtils.of("signerConstructor", writer -> {
58+
writer.addDependency(AwsDependency.SIGNATURE_V4_MULTIREGION)
59+
.addImport("SignatureV4MultiRegion", "SignatureV4MultiRegion",
60+
AwsDependency.SIGNATURE_V4_MULTIREGION)
61+
.write("SignatureV4MultiRegion");
62+
});
63+
default:
64+
return Collections.emptyMap();
65+
}
66+
}
67+
}

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)