Skip to content

Commit 22a286e

Browse files
authored
fix: add EndpointRequired config resolver to replace CustomEndpoint (#1628)
1 parent dec7fbb commit 22a286e

File tree

7 files changed

+115
-12
lines changed

7 files changed

+115
-12
lines changed

.changeset/wicked-squids-pretend.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/middleware-endpoint": patch
3+
---
4+
5+
add resolveEndpointRequiredConfig resolver

packages/middleware-endpoint/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export * from "./endpointMiddleware";
1111
*/
1212
export * from "./getEndpointPlugin";
1313
export * from "./resolveEndpointConfig";
14+
export * from "./resolveEndpointRequiredConfig";
1415
/**
1516
* @internal
1617
*/
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { describe, expect, test as it } from "vitest";
2+
3+
import { resolveEndpointRequiredConfig } from "./resolveEndpointRequiredConfig";
4+
5+
describe(resolveEndpointRequiredConfig.name, () => {
6+
it("creates a default endpoint resolver function", async () => {
7+
const config = resolveEndpointRequiredConfig({
8+
endpoint: undefined as any,
9+
});
10+
11+
expect(() => config.endpoint()).rejects.toThrow();
12+
});
13+
});
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { Endpoint, EndpointV2, Provider } from "@smithy/types";
2+
3+
/**
4+
* This is an additional config resolver layer for clients using the default
5+
* endpoints ruleset. It modifies the input and output config types to make
6+
* the endpoint configuration property required.
7+
*
8+
* It must be placed after the `resolveEndpointConfig`
9+
* resolver. This replaces the "CustomEndpoints" config resolver, which was used
10+
* prior to default endpoint rulesets.
11+
*
12+
* @public
13+
*/
14+
export interface EndpointRequiredInputConfig {
15+
endpoint: string | Endpoint | Provider<Endpoint> | EndpointV2 | Provider<EndpointV2>;
16+
}
17+
18+
/**
19+
* @internal
20+
*/
21+
interface PreviouslyResolved {
22+
endpoint?: Provider<Endpoint>;
23+
}
24+
25+
/**
26+
* @internal
27+
*/
28+
export interface EndpointRequiredResolvedConfig {
29+
endpoint: Provider<Endpoint>;
30+
}
31+
32+
/**
33+
* @internal
34+
*/
35+
export const resolveEndpointRequiredConfig = <T>(
36+
input: T & EndpointRequiredInputConfig & PreviouslyResolved
37+
): T & EndpointRequiredResolvedConfig => {
38+
const { endpoint } = input;
39+
if (endpoint === undefined) {
40+
input.endpoint = async () => {
41+
throw new Error(
42+
"@smithy/middleware-endpoint: (default endpointRuleSet) endpoint is not set - you must configure an endpoint."
43+
);
44+
};
45+
}
46+
return input as T & EndpointRequiredResolvedConfig;
47+
};

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,14 @@ import {
4848
} from "@smithy/core";
4949
import { getSchemaSerdePlugin } from "@smithy/core/schema";
5050
import { getContentLengthPlugin } from "@smithy/middleware-content-length";
51-
import { EndpointInputConfig, EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/middleware-endpoint";
51+
import {
52+
EndpointInputConfig,
53+
EndpointRequiredInputConfig,
54+
EndpointRequiredResolvedConfig,
55+
EndpointResolvedConfig,
56+
resolveEndpointConfig,
57+
resolveEndpointRequiredConfig,
58+
} from "@smithy/middleware-endpoint";
5259
import { RetryInputConfig, RetryResolvedConfig, getRetryPlugin, resolveRetryConfig } from "@smithy/middleware-retry";
5360
import { HttpHandlerUserInput as __HttpHandlerUserInput } from "@smithy/protocol-http";
5461
import {
@@ -227,6 +234,7 @@ export type RpcV2ProtocolClientConfigType = Partial<__SmithyConfiguration<__Http
227234
ClientDefaults &
228235
RetryInputConfig &
229236
EndpointInputConfig<EndpointParameters> &
237+
EndpointRequiredInputConfig &
230238
HttpAuthSchemeInputConfig &
231239
ClientInputEndpointParameters;
232240
/**
@@ -244,6 +252,7 @@ export type RpcV2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguratio
244252
RuntimeExtensionsConfig &
245253
RetryResolvedConfig &
246254
EndpointResolvedConfig<EndpointParameters> &
255+
EndpointRequiredResolvedConfig &
247256
HttpAuthSchemeResolvedConfig &
248257
ClientResolvedEndpointParameters;
249258
/**
@@ -274,9 +283,10 @@ export class RpcV2ProtocolClient extends __Client<
274283
let _config_1 = resolveClientEndpointParameters(_config_0);
275284
let _config_2 = resolveRetryConfig(_config_1);
276285
let _config_3 = resolveEndpointConfig(_config_2);
277-
let _config_4 = resolveHttpAuthSchemeConfig(_config_3);
278-
let _config_5 = resolveRuntimeExtensions(_config_4, configuration?.extensions || []);
279-
this.config = _config_5;
286+
let _config_4 = resolveEndpointRequiredConfig(_config_3);
287+
let _config_5 = resolveHttpAuthSchemeConfig(_config_4);
288+
let _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []);
289+
this.config = _config_6;
280290
this.middlewareStack.use(getSchemaSerdePlugin(this.config));
281291
this.middlewareStack.use(getRetryPlugin(this.config));
282292
this.middlewareStack.use(getContentLengthPlugin(this.config));

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ import {
4747
getHttpSigningPlugin,
4848
} from "@smithy/core";
4949
import { getContentLengthPlugin } from "@smithy/middleware-content-length";
50-
import { EndpointInputConfig, EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/middleware-endpoint";
50+
import {
51+
EndpointInputConfig,
52+
EndpointRequiredInputConfig,
53+
EndpointRequiredResolvedConfig,
54+
EndpointResolvedConfig,
55+
resolveEndpointConfig,
56+
resolveEndpointRequiredConfig,
57+
} from "@smithy/middleware-endpoint";
5158
import { RetryInputConfig, RetryResolvedConfig, getRetryPlugin, resolveRetryConfig } from "@smithy/middleware-retry";
5259
import { HttpHandlerUserInput as __HttpHandlerUserInput } from "@smithy/protocol-http";
5360
import {
@@ -213,6 +220,7 @@ export type RpcV2ProtocolClientConfigType = Partial<__SmithyConfiguration<__Http
213220
ClientDefaults &
214221
RetryInputConfig &
215222
EndpointInputConfig<EndpointParameters> &
223+
EndpointRequiredInputConfig &
216224
HttpAuthSchemeInputConfig &
217225
ClientInputEndpointParameters;
218226
/**
@@ -230,6 +238,7 @@ export type RpcV2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguratio
230238
RuntimeExtensionsConfig &
231239
RetryResolvedConfig &
232240
EndpointResolvedConfig<EndpointParameters> &
241+
EndpointRequiredResolvedConfig &
233242
HttpAuthSchemeResolvedConfig &
234243
ClientResolvedEndpointParameters;
235244
/**
@@ -260,9 +269,10 @@ export class RpcV2ProtocolClient extends __Client<
260269
let _config_1 = resolveClientEndpointParameters(_config_0);
261270
let _config_2 = resolveRetryConfig(_config_1);
262271
let _config_3 = resolveEndpointConfig(_config_2);
263-
let _config_4 = resolveHttpAuthSchemeConfig(_config_3);
264-
let _config_5 = resolveRuntimeExtensions(_config_4, configuration?.extensions || []);
265-
this.config = _config_5;
272+
let _config_4 = resolveEndpointRequiredConfig(_config_3);
273+
let _config_5 = resolveHttpAuthSchemeConfig(_config_4);
274+
let _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []);
275+
this.config = _config_6;
266276
this.middlewareStack.use(getRetryPlugin(this.config));
267277
this.middlewareStack.use(getContentLengthPlugin(this.config));
268278
this.middlewareStack.use(

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,34 @@ public class AddDefaultEndpointRuleSet implements TypeScriptIntegration {
7474
"""))
7575
.build();
7676

77+
private boolean usesDefaultEndpointRuleset = false;
78+
7779
@Override
7880
public List<String> runAfter() {
7981
return List.of(AddBuiltinPlugins.class.getCanonicalName());
8082
}
8183

8284
@Override
8385
public List<RuntimeClientPlugin> getClientPlugins() {
86+
RuntimeClientPlugin endpointConfigResolver = RuntimeClientPlugin.builder()
87+
.withConventions(
88+
TypeScriptDependency.MIDDLEWARE_ENDPOINTS_V2.dependency, "Endpoint", HAS_CONFIG)
89+
.build();
90+
91+
if (usesDefaultEndpointRuleset) {
92+
return List.of(
93+
endpointConfigResolver,
94+
RuntimeClientPlugin.builder()
95+
.withConventions(
96+
TypeScriptDependency.MIDDLEWARE_ENDPOINTS_V2.dependency,
97+
"EndpointRequired",
98+
HAS_CONFIG
99+
)
100+
.build()
101+
);
102+
}
84103
return List.of(
85-
RuntimeClientPlugin.builder()
86-
.withConventions(
87-
TypeScriptDependency.MIDDLEWARE_ENDPOINTS_V2.dependency, "Endpoint", HAS_CONFIG)
88-
.build()
104+
endpointConfigResolver
89105
);
90106
}
91107

@@ -95,6 +111,7 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
95111

96112
model.getServiceShapes().forEach(serviceShape -> {
97113
if (!serviceShape.hasTrait(EndpointRuleSetTrait.class)) {
114+
usesDefaultEndpointRuleset = true;
98115
modelBuilder.removeShape(serviceShape.toShapeId());
99116
modelBuilder.addShape(serviceShape.toBuilder()
100117
.addTrait(DEFAULT_RULESET)

0 commit comments

Comments
 (0)