Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
import software.amazon.smithy.typescript.codegen.endpointsV2.AddDefaultEndpointRuleSet;
import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin;
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;


/**
* This replaces behavior from {@link EndpointGenerator}.
*/
public class AddDefaultAwsEndpointRuleSet implements TypeScriptIntegration {
private boolean usesDefaultAwsRegionalEndpoints = false;

/**
* Running before the smithy-typescript default endpoint integration
* will prevent it from applying its non-AWS default ruleset and
Expand All @@ -31,6 +34,39 @@ public List<String> runBefore() {
return List.of(AddDefaultEndpointRuleSet.class.getCanonicalName());
}

/**
* Inserts this resolver after the `resolveEndpointConfig` function.
*/
@Override
public void mutateClientPlugins(List<RuntimeClientPlugin> plugins) {
if (!usesDefaultAwsRegionalEndpoints) {
return;
}

/*
This resolver supports the behavior of endpoints.json-based endpoint provider
for default regional services: it makes client.config.endpoint optional on the input side,
but guaranteed on the resolved side.
*/
RuntimeClientPlugin defaultAwsRegionalEndpoints = RuntimeClientPlugin.builder()
.withConventions(
AwsDependency.UTIL_ENDPOINTS.dependency,
"DefaultAwsRegionalEndpoints",
RuntimeClientPlugin.Convention.HAS_CONFIG
)
.build();

RuntimeClientPlugin endpointPlugin = plugins.stream()
.filter(p -> p.getResolveFunction()
.map(r -> r.getAlias().equals("resolveEndpointConfig"))
.orElse(false))
.findAny()
.orElseThrow(() -> new IllegalStateException("Expected resolveEndpointConfig function in plugins."));

int index = plugins.indexOf(endpointPlugin);
plugins.add(index + 1, defaultAwsRegionalEndpoints);
}

@Override
public Model preprocessModel(Model model, TypeScriptSettings settings) {
Model.Builder modelBuilder = model.toBuilder();
Expand All @@ -40,7 +76,7 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
&& AwsTraitsUtils.isAwsService(serviceShape)) {
// this branch is for models that identify as AWS services
// but do not include an endpoint ruleset.

usesDefaultAwsRegionalEndpoints = true;
modelBuilder.removeShape(serviceShape.toShapeId());
modelBuilder.addShape(
serviceShape.toBuilder()
Expand All @@ -49,6 +85,8 @@ public Model preprocessModel(Model model, TypeScriptSettings settings) {
))
.build()
);
} else {
usesDefaultAwsRegionalEndpoints = false;
}

return modelBuilder.build();
Expand Down
1 change: 1 addition & 0 deletions packages/util-endpoints/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"dependencies": {
"@aws-sdk/types": "*",
"@smithy/types": "^4.3.1",
"@smithy/url-parser": "^4.0.4",
"@smithy/util-endpoints": "^3.0.6",
"tslib": "^2.6.2"
},
Expand Down
1 change: 1 addition & 0 deletions packages/util-endpoints/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from "./aws";
export * from "./lib/aws/partition";
export * from "./lib/isIpAddress";
export * from "./resolveDefaultAwsRegionalEndpointsConfig";
export * from "./resolveEndpoint";
export * from "./types";
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import type { Endpoint, EndpointParameters, EndpointV2, Logger, Provider } from "@smithy/types";
import { parseUrl } from "@smithy/url-parser";

/**
* This is an additional config resolver layer for clients using the default
* AWS regional endpoints ruleset. It makes the *resolved* config guarantee the presence of an
* endpoint provider function. This differs from the base behavior of the Endpoint
* config resolver, which only normalizes config.endpoint IFF one is provided by the caller.
*
* This is not used by AWS SDK clients, but rather
* generated clients that have the aws.api#service trait. This includes protocol tests
* and other customers.
*
* This resolver is MUTUALLY EXCLUSIVE with the EndpointRequired config resolver from
* |@smithy/middleware-endpoint.
*
* It must be placed after the `resolveEndpointConfig`
* resolver. This replaces the endpoints.json-based default endpoint provider.
*
* @public
*/
export type DefaultAwsRegionalEndpointsInputConfig = {
endpoint?: unknown;
};

type PreviouslyResolved = {
logger?: Logger;
region?: undefined | string | Provider<string | undefined>;
useFipsEndpoint?: undefined | boolean | Provider<string | boolean>;
useDualstackEndpoint?: undefined | boolean | Provider<string | boolean>;
endpointProvider: (
endpointParams: EndpointParameters | DefaultRegionalEndpointParameters,
context?: { logger?: Logger }
) => EndpointV2;
};

/**
* @internal
*/
type DefaultRegionalEndpointParameters = {
Region?: string | undefined;
UseDualStack?: boolean | undefined;
UseFIPS?: boolean | undefined;
};

/**
* @internal
*/
export interface DefaultAwsRegionalEndpointsResolvedConfig {
endpoint: Provider<Endpoint>;
}

/**
* MUST resolve after `\@smithy/middleware-endpoint`::`resolveEndpointConfig`.
*
* @internal
*/
export const resolveDefaultAwsRegionalEndpointsConfig = <T>(
input: T & DefaultAwsRegionalEndpointsInputConfig & PreviouslyResolved
): T & DefaultAwsRegionalEndpointsResolvedConfig => {
if (typeof input.endpointProvider !== "function") {
throw new Error("@aws-sdk/util-endpoint - endpointProvider and endpoint missing in config for this client.");
}

const { endpoint } = input;
if (endpoint === undefined) {
input.endpoint = async () => {
return toEndpointV1(
input.endpointProvider(
{
Region: typeof input.region === "function" ? await input.region() : input.region,
UseDualStack:
typeof input.useDualstackEndpoint === "function"
? await input.useDualstackEndpoint()
: input.useDualstackEndpoint,
UseFIPS:
typeof input.useFipsEndpoint === "function" ? await input.useFipsEndpoint() : input.useFipsEndpoint,
Endpoint: undefined,
},
{ logger: input.logger }
)
);
};
}
return input as T & DefaultAwsRegionalEndpointsResolvedConfig;
};

/**
* @internal
*/
export const toEndpointV1 = (endpoint: EndpointV2): Endpoint => parseUrl(endpoint.url);
16 changes: 12 additions & 4 deletions private/aws-protocoltests-ec2-schema/src/EC2ProtocolClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import {
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import {
DefaultAwsRegionalEndpointsInputConfig,
DefaultAwsRegionalEndpointsResolvedConfig,
resolveDefaultAwsRegionalEndpointsConfig,
} from "@aws-sdk/util-endpoints";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import {
DefaultIdentityProviderConfig,
Expand Down Expand Up @@ -350,6 +355,7 @@ export type EC2ProtocolClientConfigType = Partial<__SmithyConfiguration<__HttpHa
RegionInputConfig &
HostHeaderInputConfig &
EndpointInputConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsInputConfig &
HttpAuthSchemeInputConfig &
CompressionInputConfig &
ClientInputEndpointParameters;
Expand All @@ -371,6 +377,7 @@ export type EC2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguration<
RegionResolvedConfig &
HostHeaderResolvedConfig &
EndpointResolvedConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsResolvedConfig &
HttpAuthSchemeResolvedConfig &
CompressionResolvedConfig &
ClientResolvedEndpointParameters;
Expand Down Expand Up @@ -406,10 +413,11 @@ export class EC2ProtocolClient extends __Client<
const _config_4 = resolveRegionConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveEndpointConfig(_config_5);
const _config_7 = resolveHttpAuthSchemeConfig(_config_6);
const _config_8 = resolveCompressionConfig(_config_7);
const _config_9 = resolveRuntimeExtensions(_config_8, configuration?.extensions || []);
this.config = _config_9;
const _config_7 = resolveDefaultAwsRegionalEndpointsConfig(_config_6);
const _config_8 = resolveHttpAuthSchemeConfig(_config_7);
const _config_9 = resolveCompressionConfig(_config_8);
const _config_10 = resolveRuntimeExtensions(_config_9, configuration?.extensions || []);
this.config = _config_10;
this.middlewareStack.use(getSchemaSerdePlugin(this.config));
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(getRetryPlugin(this.config));
Expand Down
24 changes: 16 additions & 8 deletions private/aws-protocoltests-ec2/src/EC2ProtocolClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import {
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import {
DefaultAwsRegionalEndpointsInputConfig,
DefaultAwsRegionalEndpointsResolvedConfig,
resolveDefaultAwsRegionalEndpointsConfig,
} from "@aws-sdk/util-endpoints";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import {
DefaultIdentityProviderConfig,
Expand All @@ -26,7 +31,7 @@ import {
} from "@smithy/middleware-compression";
import { getContentLengthPlugin } from "@smithy/middleware-content-length";
import { EndpointInputConfig, EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/middleware-endpoint";
import { getRetryPlugin, resolveRetryConfig, RetryInputConfig, RetryResolvedConfig } from "@smithy/middleware-retry";
import { getRetryPlugin, RetryInputConfig, RetryResolvedConfig, resolveRetryConfig } from "@smithy/middleware-retry";
import { HttpHandlerUserInput as __HttpHandlerUserInput } from "@smithy/protocol-http";
import {
Client as __Client,
Expand All @@ -35,7 +40,6 @@ import {
SmithyResolvedConfiguration as __SmithyResolvedConfiguration,
} from "@smithy/smithy-client";
import {
AwsCredentialIdentityProvider,
BodyLengthCalculator as __BodyLengthCalculator,
CheckOptionalClientConfig as __CheckOptionalClientConfig,
ChecksumConstructor as __ChecksumConstructor,
Expand All @@ -46,10 +50,11 @@ import {
HttpHandlerOptions as __HttpHandlerOptions,
Logger as __Logger,
Provider as __Provider,
Provider,
StreamCollector as __StreamCollector,
UrlParser as __UrlParser,
UserAgent as __UserAgent,
AwsCredentialIdentityProvider,
Provider,
} from "@smithy/types";

import {
Expand Down Expand Up @@ -111,7 +116,7 @@ import {
resolveClientEndpointParameters,
} from "./endpoint/EndpointParameters";
import { getRuntimeConfig as __getRuntimeConfig } from "./runtimeConfig";
import { resolveRuntimeExtensions, RuntimeExtension, RuntimeExtensionsConfig } from "./runtimeExtensions";
import { RuntimeExtension, RuntimeExtensionsConfig, resolveRuntimeExtensions } from "./runtimeExtensions";

export { __Client };

Expand Down Expand Up @@ -336,6 +341,7 @@ export type EC2ProtocolClientConfigType = Partial<__SmithyConfiguration<__HttpHa
RegionInputConfig &
HostHeaderInputConfig &
EndpointInputConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsInputConfig &
HttpAuthSchemeInputConfig &
CompressionInputConfig &
ClientInputEndpointParameters;
Expand All @@ -357,6 +363,7 @@ export type EC2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguration<
RegionResolvedConfig &
HostHeaderResolvedConfig &
EndpointResolvedConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsResolvedConfig &
HttpAuthSchemeResolvedConfig &
CompressionResolvedConfig &
ClientResolvedEndpointParameters;
Expand Down Expand Up @@ -392,10 +399,11 @@ export class EC2ProtocolClient extends __Client<
const _config_4 = resolveRegionConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveEndpointConfig(_config_5);
const _config_7 = resolveHttpAuthSchemeConfig(_config_6);
const _config_8 = resolveCompressionConfig(_config_7);
const _config_9 = resolveRuntimeExtensions(_config_8, configuration?.extensions || []);
this.config = _config_9;
const _config_7 = resolveDefaultAwsRegionalEndpointsConfig(_config_6);
const _config_8 = resolveHttpAuthSchemeConfig(_config_7);
const _config_9 = resolveCompressionConfig(_config_8);
const _config_10 = resolveRuntimeExtensions(_config_9, configuration?.extensions || []);
this.config = _config_10;
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(getRetryPlugin(this.config));
this.middlewareStack.use(getContentLengthPlugin(this.config));
Expand Down
16 changes: 12 additions & 4 deletions private/aws-protocoltests-json-10-schema/src/JSONRPC10Client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import {
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import {
DefaultAwsRegionalEndpointsInputConfig,
DefaultAwsRegionalEndpointsResolvedConfig,
resolveDefaultAwsRegionalEndpointsConfig,
} from "@aws-sdk/util-endpoints";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import {
DefaultIdentityProviderConfig,
Expand Down Expand Up @@ -335,6 +340,7 @@ export type JSONRPC10ClientConfigType = Partial<__SmithyConfiguration<__HttpHand
RegionInputConfig &
HostHeaderInputConfig &
EndpointInputConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsInputConfig &
HttpAuthSchemeInputConfig &
CompressionInputConfig &
ClientInputEndpointParameters;
Expand All @@ -356,6 +362,7 @@ export type JSONRPC10ClientResolvedConfigType = __SmithyResolvedConfiguration<__
RegionResolvedConfig &
HostHeaderResolvedConfig &
EndpointResolvedConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsResolvedConfig &
HttpAuthSchemeResolvedConfig &
CompressionResolvedConfig &
ClientResolvedEndpointParameters;
Expand Down Expand Up @@ -390,10 +397,11 @@ export class JSONRPC10Client extends __Client<
const _config_4 = resolveRegionConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveEndpointConfig(_config_5);
const _config_7 = resolveHttpAuthSchemeConfig(_config_6);
const _config_8 = resolveCompressionConfig(_config_7);
const _config_9 = resolveRuntimeExtensions(_config_8, configuration?.extensions || []);
this.config = _config_9;
const _config_7 = resolveDefaultAwsRegionalEndpointsConfig(_config_6);
const _config_8 = resolveHttpAuthSchemeConfig(_config_7);
const _config_9 = resolveCompressionConfig(_config_8);
const _config_10 = resolveRuntimeExtensions(_config_9, configuration?.extensions || []);
this.config = _config_10;
this.middlewareStack.use(getSchemaSerdePlugin(this.config));
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(getRetryPlugin(this.config));
Expand Down
16 changes: 12 additions & 4 deletions private/aws-protocoltests-json-10/src/JSONRPC10Client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import {
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import {
DefaultAwsRegionalEndpointsInputConfig,
DefaultAwsRegionalEndpointsResolvedConfig,
resolveDefaultAwsRegionalEndpointsConfig,
} from "@aws-sdk/util-endpoints";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import {
DefaultIdentityProviderConfig,
Expand Down Expand Up @@ -321,6 +326,7 @@ export type JSONRPC10ClientConfigType = Partial<__SmithyConfiguration<__HttpHand
RegionInputConfig &
HostHeaderInputConfig &
EndpointInputConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsInputConfig &
HttpAuthSchemeInputConfig &
CompressionInputConfig &
ClientInputEndpointParameters;
Expand All @@ -342,6 +348,7 @@ export type JSONRPC10ClientResolvedConfigType = __SmithyResolvedConfiguration<__
RegionResolvedConfig &
HostHeaderResolvedConfig &
EndpointResolvedConfig<EndpointParameters> &
DefaultAwsRegionalEndpointsResolvedConfig &
HttpAuthSchemeResolvedConfig &
CompressionResolvedConfig &
ClientResolvedEndpointParameters;
Expand Down Expand Up @@ -376,10 +383,11 @@ export class JSONRPC10Client extends __Client<
const _config_4 = resolveRegionConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveEndpointConfig(_config_5);
const _config_7 = resolveHttpAuthSchemeConfig(_config_6);
const _config_8 = resolveCompressionConfig(_config_7);
const _config_9 = resolveRuntimeExtensions(_config_8, configuration?.extensions || []);
this.config = _config_9;
const _config_7 = resolveDefaultAwsRegionalEndpointsConfig(_config_6);
const _config_8 = resolveHttpAuthSchemeConfig(_config_7);
const _config_9 = resolveCompressionConfig(_config_8);
const _config_10 = resolveRuntimeExtensions(_config_9, configuration?.extensions || []);
this.config = _config_10;
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(getRetryPlugin(this.config));
this.middlewareStack.use(getContentLengthPlugin(this.config));
Expand Down
Loading
Loading