Skip to content

Commit 07a70fb

Browse files
author
Steven Yuan
authored
feat(experimentalIdentityAndAuth): add experimentalIdentityAndAuth flag (#5065)
As part of feature development of `experimentalIdentityAndAuth`, add control branches for existing behavior in existing integrations, particularly `@aws.auth#sigv4` and `@httpBearerTokenAuth`: - `AddAwsAuthPlugin` - `AddAwsRuntimeConfig` - `AddBuiltinPlugins` - `AddEventBridgePlugin` - `AddS3Config` - `AddS3ControlDependency` - `AddTokenAuthPlugin` - `AddEventStreamHandlingDependency` Also, add a section in `CONTRIBUTING.md` about experimental features in `smithy-typescript` used in `aws-sdk-js-v3`.
1 parent edf49b3 commit 07a70fb

File tree

9 files changed

+71
-4
lines changed

9 files changed

+71
-4
lines changed

CONTRIBUTING.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,17 @@ smithy=/Volumes/workplace/smithy
142142
smithy-typescript=/Volumes/workplace/smithy-typescript
143143
```
144144

145+
## Experimental Features
146+
147+
`aws-sdk-js-v3 ` uses `smithy-typescript` to generate code. `smithy-typescript` is under heavy development and has
148+
experimental features that can affect `aws-sdk-js-v3`. These features are enabled via opt-in settings in `sdk-codegen`.
149+
Note that any contributions related to these features MUST be reviewed carefully for opt-in behavior via feature flags
150+
as to not break any existing customers. Here are the experimental features that are currently under development:
151+
152+
| Experimental Feature | Flag | Description |
153+
| -------------------- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
154+
| Identity & Auth | `experimentalIdentityAndAuth` | Standardize identity and auth integrations to match the Smithy specification (see [Authentication Traits](https://smithy.io/2.0/spec/authentication-traits.html)). Newer capabilities include support for multiple auth schemes, `@optionalAuth`, and standardized identity interfaces for authentication schemes both in code generation and TypeScript packages. In `smithy-typescript`, `@httpApiKeyAuth` will be updated to use the new standardized interfaces. In `aws-sdk-js-v3` (`smithy-typescript`'s largest customer), this will affect `@aws.auth#sigv4` and `@httpBearerAuth` implementations, but is planned to be completely backwards-compatible. |
155+
145156
## Build caching
146157

147158
Build caching is optionally available via Turborepo. See `turbo.json`.

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddAwsAuthPlugin.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public void addConfigInterfaceFields(
7272
SymbolProvider symbolProvider,
7373
TypeScriptWriter writer
7474
) {
75+
if (settings.getExperimentalIdentityAndAuth()) {
76+
return;
77+
}
78+
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
7579
ServiceShape service = settings.getService(model);
7680
if (!isSigV4Service(service) && isAwsService(service)) {
7781
ServiceTrait serviceTrait = service.getTrait(ServiceTrait.class).get();
@@ -120,12 +124,14 @@ public List<RuntimeClientPlugin> getClientPlugins() {
120124
&& isAwsService(s)
121125
&& !testServiceId(s, "STS")
122126
&& !areAllOptionalAuthOperations(m, s))
127+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
123128
.build(),
124129
RuntimeClientPlugin.builder()
125130
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_CONFIG)
126131
.servicePredicate((m, s) -> isSigV4Service(s)
127132
&& !isAwsService(s)
128133
&& !areAllOptionalAuthOperations(m, s))
134+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
129135
.build(),
130136
RuntimeClientPlugin.builder()
131137
.withConventions(AwsDependency.STS_MIDDLEWARE.dependency,
@@ -134,33 +140,38 @@ && isAwsService(s)
134140
put("stsClientCtor", Symbol.builder().name("STSClient").build());
135141
}})
136142
.servicePredicate((m, s) -> testServiceId(s, "STS"))
143+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
137144
.build(),
138145
RuntimeClientPlugin.builder()
139146
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
140147
// See operationUsesAwsAuth() below for AwsAuth Middleware customizations.
141148
.servicePredicate((m, s) -> isSigV4Service(s)
142149
&& isAwsService(s)
143150
&& !testServiceId(s, "STS")
144-
&& !hasOptionalAuthOperation(m, s)
145-
).build(),
151+
&& !hasOptionalAuthOperation(m, s))
152+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
153+
.build(),
146154
RuntimeClientPlugin.builder()
147155
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_MIDDLEWARE)
148156
// See operationUsesAwsAuth() below for AwsAuth Middleware customizations.
149157
.servicePredicate((m, s) -> isSigV4Service(s)
150158
&& !isAwsService(s)
151-
&& !hasOptionalAuthOperation(m, s)
152-
).build(),
159+
&& !hasOptionalAuthOperation(m, s))
160+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
161+
.build(),
153162
RuntimeClientPlugin.builder()
154163
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
155164
.operationPredicate((m, s, o) -> isSigV4Service(s)
156165
&& isAwsService(s)
157166
&& operationUsesAwsAuth(m, s, o))
167+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
158168
.build(),
159169
RuntimeClientPlugin.builder()
160170
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "SigV4Auth", HAS_MIDDLEWARE)
161171
.operationPredicate((m, s, o) -> isSigV4Service(s)
162172
&& !isAwsService(s)
163173
&& operationUsesAwsAuth(m, s, o))
174+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
164175
.build()
165176

166177
);
@@ -173,6 +184,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
173184
SymbolProvider symbolProvider,
174185
LanguageTarget target
175186
) {
187+
if (settings.getExperimentalIdentityAndAuth()) {
188+
return Collections.emptyMap();
189+
}
190+
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
176191
ServiceShape service = settings.getService(model);
177192
if (!isSigV4Service(service) || areAllOptionalAuthOperations(model, service)) {
178193
return Collections.emptyMap();
@@ -219,6 +234,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
219234

220235
@Override
221236
public void customize(TypeScriptCodegenContext codegenContext) {
237+
if (codegenContext.settings().getExperimentalIdentityAndAuth()) {
238+
return;
239+
}
240+
// feat(experimentalIdentityAndAuth): control branch for @aws.auth#sigv4
222241
TypeScriptSettings settings = codegenContext.settings();
223242
Model model = codegenContext.model();
224243
BiConsumer<String, Consumer<TypeScriptWriter>> writerFactory = codegenContext.writerDelegator()::useFileWriter;

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddAwsRuntimeConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ public void addConfigInterfaceFields(
9191
writer.writeDocs("Enables FIPS compatible endpoints.")
9292
.write("useFipsEndpoint?: boolean | __Provider<boolean>;\n");
9393
}
94+
if (settings.getExperimentalIdentityAndAuth()) {
95+
return;
96+
}
97+
// feat(experimentalIdentityAndAuth): control branch for AWS config interface fields
9498
if (isSigV4Service(settings, model)) {
9599
writer.writeDocs(isAwsService(settings, model)
96100
? "The AWS region to which this client will send requests"
@@ -134,6 +138,10 @@ private Map<String, Consumer<TypeScriptWriter>> getDefaultConfig(
134138
if (!isSigV4Service(settings, model)) {
135139
return Collections.emptyMap();
136140
}
141+
if (settings.getExperimentalIdentityAndAuth()) {
142+
return Collections.emptyMap();
143+
}
144+
// feat(experimentalIdentityAndAuth): control branch for AWS runtime config
137145
switch (target) {
138146
case BROWSER:
139147
return MapUtils.of("region", writer -> {

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public List<RuntimeClientPlugin> getClientPlugins() {
5050
RuntimeClientPlugin.builder()
5151
.withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "Region", HAS_CONFIG)
5252
.servicePredicate((m, s) -> isAwsService(s) || isSigV4Service(s))
53+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
5354
.build(),
5455
// Only one of Endpoints or CustomEndpoints should be used
5556
RuntimeClientPlugin.builder()

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddEventBridgePlugin.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(TypeScrip
3939
if (!testServiceId(settings.getService(model))) {
4040
return Collections.emptyMap();
4141
}
42+
if (settings.getExperimentalIdentityAndAuth()) {
43+
return Collections.emptyMap();
44+
}
45+
// feat(experimentalIdentityAndAuth): control branch for EventBridge runtime config
4246
switch (target) {
4347
case SHARED:
4448
return MapUtils.of("signerConstructor", writer -> {

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddEventStreamHandlingDependency.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ public List<RuntimeClientPlugin> getClientPlugins() {
5252
.withConventions(AwsDependency.MIDDLEWARE_EVENTSTREAM.dependency,
5353
"EventStream", HAS_CONFIG)
5454
.servicePredicate(AddEventStreamHandlingDependency::hasEventStreamInput)
55+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
5556
.build(),
5657
RuntimeClientPlugin.builder()
5758
.withConventions(AwsDependency.MIDDLEWARE_EVENTSTREAM.dependency,
5859
"EventStream", HAS_MIDDLEWARE)
5960
.operationPredicate(AddEventStreamHandlingDependency::hasEventStreamInput)
61+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
6062
.build()
6163
);
6264
}
@@ -68,6 +70,10 @@ public void addConfigInterfaceFields(
6870
SymbolProvider symbolProvider,
6971
TypeScriptWriter writer
7072
) {
73+
if (settings.getExperimentalIdentityAndAuth()) {
74+
return;
75+
}
76+
// feat(experimentalIdentityAndAuth): control branch for event stream handler interface fields
7177
if (hasEventStreamInput(model, settings.getService(model))) {
7278
writer.addImport("EventStreamPayloadHandlerProvider", "__EventStreamPayloadHandlerProvider",
7379
TypeScriptDependency.AWS_SDK_TYPES);
@@ -89,6 +95,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8995
return Collections.emptyMap();
9096
}
9197

98+
if (settings.getExperimentalIdentityAndAuth()) {
99+
return Collections.emptyMap();
100+
}
101+
// feat(experimentalIdentityAndAuth): control branch for event stream handler runtime config
92102
switch (target) {
93103
case NODE:
94104
return MapUtils.of("eventStreamPayloadHandlerProvider", writer -> {

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3Config.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public void addConfigInterfaceFields(
117117
if (!isS3(service)) {
118118
return;
119119
}
120+
if (settings.getExperimentalIdentityAndAuth()) {
121+
return;
122+
}
123+
// feat(experimentalIdentityAndAuth): control branch for S3 Config interface fields
120124
writer.writeDocs("Whether to escape request path when signing the request.")
121125
.write("signingEscapePath?: boolean;\n");
122126
writer.writeDocs(
@@ -134,6 +138,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
134138
if (!isS3(settings.getService(model))) {
135139
return Collections.emptyMap();
136140
}
141+
if (settings.getExperimentalIdentityAndAuth()) {
142+
return Collections.emptyMap();
143+
}
144+
// feat(experimentalIdentityAndAuth): control branch for S3 Config runtime config
137145
switch (target) {
138146
case SHARED:
139147
return MapUtils.of("signingEscapePath", writer -> {

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddS3ControlDependency.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
101101
if (!isS3Control(settings.getService(model))) {
102102
return Collections.emptyMap();
103103
}
104+
if (settings.getExperimentalIdentityAndAuth()) {
105+
return Collections.emptyMap();
106+
}
107+
// feat(experimentalIdentityAndAuth): control branch for S3 Control signingEscapePath
104108
switch (target) {
105109
case SHARED:
106110
return MapUtils.of("signingEscapePath", writer -> {

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddTokenAuthPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public List<RuntimeClientPlugin> getClientPlugins() {
3636
RuntimeClientPlugin.builder()
3737
.withConventions(AwsDependency.MIDDLEWARE_TOKEN.dependency, "Token", HAS_CONFIG)
3838
.servicePredicate((m, s) -> isHttpBearerAuthService(s))
39+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
3940
.build(),
4041
RuntimeClientPlugin.builder()
4142
.withConventions(AwsDependency.MIDDLEWARE_TOKEN.dependency, "Token", HAS_MIDDLEWARE)
4243
.servicePredicate((m, s) -> isHttpBearerAuthService(s))
44+
.settingsPredicate((m, s, settings) -> !settings.getExperimentalIdentityAndAuth())
4345
.build()
4446
);
4547
}

0 commit comments

Comments
 (0)