Skip to content

Commit 24b8e58

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

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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 : 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+
if (useSigv4aSigner) {
43+
break;
44+
}
45+
46+
TopDownIndex topDownIndex = TopDownIndex.of(service.getModel());
47+
for (OperationShape operationShape : topDownIndex.getContainedOperations(service)) {
48+
useSigv4aSigner = useSigv4aSigner || operationShape.getAllTraits()
49+
.values().stream()
50+
.anyMatch(trait -> trait.toString().equals("aws.auth#sigv4a"));
51+
if (useSigv4aSigner) {
52+
break;
53+
}
54+
}
55+
}
56+
57+
if (!useSigv4aSigner) {
58+
return Collections.emptyMap();
59+
}
60+
61+
switch (target) {
62+
case SHARED:
63+
return MapUtils.of("signerConstructor", writer -> {
64+
writer.addDependency(AwsDependency.SIGNATURE_V4_MULTIREGION)
65+
.addImport("SignatureV4MultiRegion", "SignatureV4MultiRegion",
66+
AwsDependency.SIGNATURE_V4_MULTIREGION)
67+
.write("SignatureV4MultiRegion");
68+
});
69+
default:
70+
return Collections.emptyMap();
71+
}
72+
}
73+
}

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)