Skip to content

Commit 851e338

Browse files
authored
fix: enforce singular object custody in config resolver stack (#1550)
1 parent e917e61 commit 851e338

File tree

12 files changed

+36
-48
lines changed

12 files changed

+36
-48
lines changed

private/smithy-rpcv2-cbor/src/RpcV2ProtocolClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,12 @@ export class RpcV2ProtocolClient extends __Client<
247247

248248
constructor(...[configuration]: __CheckOptionalClientConfig<RpcV2ProtocolClientConfig>) {
249249
let _config_0 = __getRuntimeConfig(configuration || {});
250+
super(_config_0 as any);
251+
this.initConfig = _config_0;
250252
let _config_1 = resolveCustomEndpointsConfig(_config_0);
251253
let _config_2 = resolveRetryConfig(_config_1);
252254
let _config_3 = resolveHttpAuthSchemeConfig(_config_2);
253255
let _config_4 = resolveRuntimeExtensions(_config_3, configuration?.extensions || []);
254-
super(_config_4);
255256
this.config = _config_4;
256257
this.middlewareStack.use(getRetryPlugin(this.config));
257258
this.middlewareStack.use(getContentLengthPlugin(this.config));

private/smithy-rpcv2-cbor/src/auth/httpAuthSchemeProvider.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,5 @@ export interface HttpAuthSchemeResolvedConfig {
104104
export const resolveHttpAuthSchemeConfig = <T>(
105105
config: T & HttpAuthSchemeInputConfig
106106
): T & HttpAuthSchemeResolvedConfig => {
107-
return {
108-
...config,
109-
} as T & HttpAuthSchemeResolvedConfig;
107+
return Object.assign(config, {}) as T & HttpAuthSchemeResolvedConfig;
110108
};

private/smithy-rpcv2-cbor/src/runtimeExtensions.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,22 @@ export interface RuntimeExtensionsConfig {
1818
extensions: RuntimeExtension[];
1919
}
2020

21-
const asPartial = <T extends Partial<RpcV2ProtocolExtensionConfiguration>>(t: T) => t;
22-
2321
/**
2422
* @internal
2523
*/
2624
export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => {
27-
const extensionConfiguration: RpcV2ProtocolExtensionConfiguration = {
28-
...asPartial(getDefaultExtensionConfiguration(runtimeConfig)),
29-
...asPartial(getHttpHandlerExtensionConfiguration(runtimeConfig)),
30-
...asPartial(getHttpAuthExtensionConfiguration(runtimeConfig)),
31-
};
25+
const extensionConfiguration: RpcV2ProtocolExtensionConfiguration = Object.assign(
26+
getDefaultExtensionConfiguration(runtimeConfig),
27+
getHttpHandlerExtensionConfiguration(runtimeConfig),
28+
getHttpAuthExtensionConfiguration(runtimeConfig)
29+
);
3230

3331
extensions.forEach((extension) => extension.configure(extensionConfiguration));
3432

35-
return {
36-
...runtimeConfig,
37-
...resolveDefaultRuntimeConfig(extensionConfiguration),
38-
...resolveHttpHandlerRuntimeConfig(extensionConfiguration),
39-
...resolveHttpAuthRuntimeConfig(extensionConfiguration),
40-
};
33+
return Object.assign(
34+
runtimeConfig,
35+
resolveDefaultRuntimeConfig(extensionConfiguration),
36+
resolveHttpHandlerRuntimeConfig(extensionConfiguration),
37+
resolveHttpAuthRuntimeConfig(extensionConfiguration)
38+
);
4139
};

private/smithy-rpcv2-cbor/test/functional/rpcv2cbor.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ it.skip("RpcV2CborClientPopulatesDefaultValuesInInput:Request", async () => {
829829
expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor");
830830

831831
expect(r.body).toBeDefined();
832-
const bodyString = `v2hkZWZhdWx0c79tZGVmYXVsdFN0cmluZ2JoaW5kZWZhdWx0Qm9vbGVhbvVrZGVmYXVsdExpc3Sf/3BkZWZhdWx0VGltZXN0YW1wwQBrZGVmYXVsdEJsb2JjYWJja2RlZmF1bHRCeXRlAWxkZWZhdWx0U2hvcnQBbmRlZmF1bHRJbnRlZ2VyCmtkZWZhdWx0TG9uZxhkbGRlZmF1bHRGbG9hdPo/gAAAbWRlZmF1bHREb3VibGX6P4AAAGpkZWZhdWx0TWFwv/9rZGVmYXVsdEVudW1jRk9PbmRlZmF1bHRJbnRFbnVtAWtlbXB0eVN0cmluZ2BsZmFsc2VCb29sZWFu9GllbXB0eUJsb2JgaHplcm9CeXRlAGl6ZXJvU2hvcnQAa3plcm9JbnRlZ2VyAGh6ZXJvTG9uZwBpemVyb0Zsb2F0+gAAAABqemVyb0RvdWJsZfoAAAAA//8=`;
832+
const bodyString = `v2hkZWZhdWx0c79tZGVmYXVsdFN0cmluZ2JoaW5kZWZhdWx0Qm9vbGVhbvVrZGVmYXVsdExpc3Sf/3BkZWZhdWx0VGltZXN0YW1wwQBrZGVmYXVsdEJsb2JDYWJja2RlZmF1bHRCeXRlAWxkZWZhdWx0U2hvcnQBbmRlZmF1bHRJbnRlZ2VyCmtkZWZhdWx0TG9uZxhkbGRlZmF1bHRGbG9hdPo/gAAAbWRlZmF1bHREb3VibGX6P4AAAGpkZWZhdWx0TWFwv/9rZGVmYXVsdEVudW1jRk9PbmRlZmF1bHRJbnRFbnVtAWtlbXB0eVN0cmluZ2BsZmFsc2VCb29sZWFu9GllbXB0eUJsb2JAaHplcm9CeXRlAGl6ZXJvU2hvcnQAa3plcm9JbnRlZ2VyAGh6ZXJvTG9uZwBpemVyb0Zsb2F0+gAAAABqemVyb0RvdWJsZfoAAAAA//8`;
833833
const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body);
834834
expect(unequalParts).toBeUndefined();
835835
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void generate() {
8686
writer.indent().onSection("getPartialExtensionConfigurations", original -> {
8787
for (TypeScriptIntegration integration : integrations) {
8888
integration.getExtensionConfigurationInterfaces(model, settings).forEach(configurationInterface -> {
89-
writer.indent(2).write("...asPartial($L(runtimeConfig)),",
89+
writer.indent(2).write("$L(runtimeConfig),",
9090
configurationInterface.getExtensionConfigurationFn().left);
9191
writer.dedent(2);
9292
});
@@ -97,7 +97,7 @@ void generate() {
9797
writer.indent().onSection("resolvePartialRuntimeConfigs", original -> {
9898
for (TypeScriptIntegration integration : integrations) {
9999
integration.getExtensionConfigurationInterfaces(model, settings).forEach(configurationInterface -> {
100-
writer.indent(2).write("...$L(extensionConfiguration),",
100+
writer.indent(2).write("$L(extensionConfiguration),",
101101
configurationInterface.resolveRuntimeConfigFn().left);
102102
writer.dedent(2);
103103
});

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,11 @@ private void generateConstructor() {
375375
.build());
376376

377377
int configVariable = 0;
378+
String initialConfigVar = generateConfigVariable(configVariable);
378379
writer.write("let $L = __getRuntimeConfig(configuration || {});",
379-
generateConfigVariable(configVariable));
380+
initialConfigVar);
381+
writer.write("super($L as any);", initialConfigVar);
382+
writer.write("this.initConfig = $L;", initialConfigVar);
380383

381384
if (service.hasTrait(EndpointRuleSetTrait.class)) {
382385
configVariable++;
@@ -429,7 +432,6 @@ private void generateConstructor() {
429432
generateConfigVariable(configVariable),
430433
generateConfigVariable(configVariable - 1));
431434

432-
writer.write("super($L);", generateConfigVariable(configVariable));
433435
writer.write("this.config = $L;", generateConfigVariable(configVariable));
434436

435437
// Add runtime plugins that contain middleware to the middleware stack

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/AddHttpAuthSchemePlugin.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,6 @@ public List<RuntimeClientPlugin> getClientPlugins() {
8585
.namespace(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_MODULE, "/")
8686
.name("resolveHttpAuthSchemeConfig")
8787
.build())
88-
.additionalResolveFunctionParamsSupplier((m, s, o) -> Map.of(
89-
"client", Symbol.builder().name("() => this").build()
90-
))
9188
.build()
9289
);
9390
}
@@ -347,13 +344,12 @@ private void generateHttpAuthSchemeResolvedConfigInterface(
347344
const region = config.region ? normalizeProvider(config.region) : undefined;
348345
const apiKey = memoizeIdentityProvider(config.apiKey, isIdentityExpired, doesIdentityRequireRefresh);
349346
const token = memoizeIdentityProvider(config.token, isIdentityExpired, doesIdentityRequireRefresh);
350-
return {
351-
...config,
347+
return Object.assign(config, {
352348
credentials,
353349
region,
354350
apiKey,
355351
token,
356-
} as HttpAuthSchemeResolvedConfig;
352+
}) as HttpAuthSchemeResolvedConfig;
357353
};
358354
*/
359355
private void generateResolveHttpAuthSchemeConfigFunction(
@@ -368,7 +364,7 @@ private void generateResolveHttpAuthSchemeConfigFunction(
368364
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
369365
w.writeDocs("@internal");
370366
w.writeInline("""
371-
export const resolveHttpAuthSchemeConfig = <T, R extends object>(config: T & HttpAuthSchemeInputConfig""");
367+
export const resolveHttpAuthSchemeConfig = <T>(config: T & HttpAuthSchemeInputConfig""");
372368
if (!previousResolvedFunctions.isEmpty()) {
373369
w.writeInline(" & ");
374370
Iterator<ResolveConfigFunction> iter = previousResolvedFunctions.values().iterator();
@@ -381,7 +377,6 @@ private void generateResolveHttpAuthSchemeConfigFunction(
381377
}
382378
}
383379
w.write("""
384-
, { client }: { client: () => { config: R } }
385380
): T & HttpAuthSchemeResolvedConfig => {""");
386381
w.indent();
387382
w.pushState(ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection.builder()
@@ -423,16 +418,16 @@ private void generateResolveHttpAuthSchemeConfigFunction(
423418
configName = "config_" + i;
424419
i++;
425420
}
426-
w.write("return {");
421+
w.write("return Object.assign(");
427422
w.indent();
428-
w.write("...$L,", configName);
423+
w.write("$L, {", configName);
429424
for (ConfigField configField : configFields.values()) {
430425
if (configField.configFieldWriter().isPresent()) {
431426
w.write("$L,", configField.name());
432427
}
433428
}
434429
w.dedent();
435-
w.write("} as T & HttpAuthSchemeResolvedConfig;");
430+
w.write("}) as T & HttpAuthSchemeResolvedConfig;");
436431
w.popState();
437432
w.dedent();
438433
w.write("};");

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/EndpointsV2Generator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,7 @@ private void generateEndpointParameters() {
146146
+ "): T & ClientResolvedEndpointParameters => {",
147147
"}",
148148
() -> {
149-
writer.openBlock("return {", "}", () -> {
150-
writer.write("...options,");
149+
writer.openBlock("return Object.assign(options, {", "});", () -> {
151150
ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode();
152151
ruleSet.getObjectMember("parameters").ifPresent(parameters -> {
153152
parameters.accept(new RuleSetParametersVisitor(writer, true));

smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/resolveRuntimeExtensions1.template

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,15 @@ export interface RuntimeExtensionsConfig {
1414
extensions: RuntimeExtension[]
1515
}
1616

17-
const asPartial = <T extends Partial<${extensionConfigName}>>(t: T) => t;
18-
1917
/**
2018
* @internal
2119
*/
2220
export const resolveRuntimeExtensions = (
2321
runtimeConfig: any,
2422
extensions: RuntimeExtension[]
2523
) => {
26-
const extensionConfiguration: ${extensionConfigName} = {
24+
const extensionConfiguration: ${extensionConfigName} = Object.assign(
2725
${getPartialExtensionConfigurations}
28-
};
26+
);
2927

3028
extensions.forEach(extension => extension.configure(extensionConfiguration));
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
return {
2-
...runtimeConfig,
1+
return Object.assign(runtimeConfig,
32
${resolvePartialRuntimeConfigs}
4-
};
3+
);
54
}

0 commit comments

Comments
 (0)