From 72880e41da93b5cd76fffa6bfabb250e957c1f1e Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 21 Apr 2021 15:54:46 -0700 Subject: [PATCH 1/2] chore(config-resolver): refactor EndpointsConfig for non AWS services This reverts an earlier change to EndpointsConfig.ts and instead provides the new functionality in separate CustomEndpointsConfig.ts. This will be used as a separate plugin for endpoint resolution in non AWS clients. --- .../src/CustomEndpointsConfig.ts | 45 +++++++++++++++++++ .../config-resolver/src/EndpointsConfig.ts | 8 +--- packages/config-resolver/src/index.ts | 1 + 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 packages/config-resolver/src/CustomEndpointsConfig.ts diff --git a/packages/config-resolver/src/CustomEndpointsConfig.ts b/packages/config-resolver/src/CustomEndpointsConfig.ts new file mode 100644 index 0000000000000..56be461185363 --- /dev/null +++ b/packages/config-resolver/src/CustomEndpointsConfig.ts @@ -0,0 +1,45 @@ +// TODO: Create a .spec.ts for this +import { Endpoint, Provider, UrlParser } from "@aws-sdk/types"; + +export interface CustomEndpointsInputConfig { + /** + * The fully qualified endpoint of the webservice. + */ + endpoint: string | Endpoint | Provider; + + /** + * Whether TLS is enabled for requests. + */ + tls?: boolean; +} + +interface PreviouslyResolved { + urlParser: UrlParser; +} + +export interface CustomEndpointsResolvedConfig extends Required { + endpoint: Provider; + isCustomEndpoint: true; // TODO: Can this be removed or some other logic depends on this? +} + +export const resolveCustomEndpointsConfig = ( + input: T & CustomEndpointsInputConfig & PreviouslyResolved +): T & CustomEndpointsResolvedConfig => ({ + ...input, + tls: input.tls ?? true, + endpoint: normalizeEndpoint(input), + isCustomEndpoint: true, +}); + +// TODO: can this be shared with EndpointsConfig.ts +const normalizeEndpoint = (input: CustomEndpointsInputConfig & PreviouslyResolved): Provider => { + const { endpoint, urlParser } = input; + if (typeof endpoint === "string") { + const promisified = Promise.resolve(urlParser(endpoint)); + return () => promisified; + } else if (typeof endpoint === "object") { + const promisified = Promise.resolve(endpoint); + return () => promisified; + } + return endpoint; +}; diff --git a/packages/config-resolver/src/EndpointsConfig.ts b/packages/config-resolver/src/EndpointsConfig.ts index 579850c4bb5e4..640d90bb54b64 100644 --- a/packages/config-resolver/src/EndpointsConfig.ts +++ b/packages/config-resolver/src/EndpointsConfig.ts @@ -13,9 +13,9 @@ export interface EndpointsInputConfig { } interface PreviouslyResolved { - regionInfoProvider?: RegionInfoProvider; + regionInfoProvider: RegionInfoProvider; urlParser: UrlParser; - region?: Provider; + region: Provider; } export interface EndpointsResolvedConfig extends Required { @@ -45,10 +45,6 @@ const normalizeEndpoint = (input: EndpointsInputConfig & PreviouslyResolved): Pr }; const getEndPointFromRegion = async (input: EndpointsInputConfig & PreviouslyResolved) => { - if (input.region === undefined || input.regionInfoProvider === undefined) { - throw new Error("No endpoint specified and region is not defined"); - } - const { tls = true } = input; const region = await input.region(); diff --git a/packages/config-resolver/src/index.ts b/packages/config-resolver/src/index.ts index fcf9542bc29ff..47d04a39807c9 100644 --- a/packages/config-resolver/src/index.ts +++ b/packages/config-resolver/src/index.ts @@ -1,2 +1,3 @@ +export * from "./CustomEndpointsConfig"; export * from "./EndpointsConfig"; export * from "./RegionConfig"; From 9b040c6a3553269d1a9db960222dfceffd892e2a Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Wed, 21 Apr 2021 15:58:35 -0700 Subject: [PATCH 2/2] feat(codegen): Use separate CustomEndpointsConfig for non-AWS clients This depends on newly added CustomEndpointsConfig in @aws-sdk/config-resolver package. --- .../smithy/aws/typescript/codegen/AddBuiltinPlugins.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java index 17a06fdce74d8..f9561dda282c4 100644 --- a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java +++ b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddBuiltinPlugins.java @@ -47,8 +47,14 @@ public List getClientPlugins() { .withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "Region", HAS_CONFIG) .servicePredicate((m, s) -> isAwsService(s)) .build(), + // Only one of Endpoints or CustomEndpoints should be used RuntimeClientPlugin.builder() .withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "Endpoints", HAS_CONFIG) + .servicePredicate((m, s) -> isAwsService(s)) + .build(), + RuntimeClientPlugin.builder() + .withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "CustomEndpoints", HAS_CONFIG) + .servicePredicate((m, s) -> !isAwsService(s)) .build(), RuntimeClientPlugin.builder() .withConventions(TypeScriptDependency.MIDDLEWARE_RETRY.dependency, "Retry")