Skip to content

Commit

Permalink
feat(client-eventbridge): codegen EventBridge with `experimentalIdent…
Browse files Browse the repository at this point in the history
…ityAndAuth`
  • Loading branch information
Steven Yuan committed Sep 25, 2023
1 parent e7c4d6f commit 69775fe
Show file tree
Hide file tree
Showing 9 changed files with 269 additions and 46 deletions.
64 changes: 31 additions & 33 deletions clients/client-eventbridge/src/EventBridgeClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,13 @@ import {
} from "@aws-sdk/middleware-host-header";
import { getLoggerPlugin } from "@aws-sdk/middleware-logger";
import { getRecursionDetectionPlugin } from "@aws-sdk/middleware-recursion-detection";
import {
AwsAuthInputConfig,
AwsAuthResolvedConfig,
getAwsAuthPlugin,
resolveAwsAuthConfig,
} from "@aws-sdk/middleware-signing";
import {
getUserAgentPlugin,
resolveUserAgentConfig,
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import { Credentials as __Credentials } from "@aws-sdk/types";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import { getHttpAuthSchemePlugin, getHttpSigningPlugin, HttpAuthScheme } from "@smithy/experimental-identity-and-auth";
import { getContentLengthPlugin } from "@smithy/middleware-content-length";
import { EndpointInputConfig, EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/middleware-endpoint";
import { getRetryPlugin, resolveRetryConfig, RetryInputConfig, RetryResolvedConfig } from "@smithy/middleware-retry";
Expand Down Expand Up @@ -50,6 +43,12 @@ import {
UserAgent as __UserAgent,
} from "@smithy/types";

import {
EventBridgeHttpAuthSchemeProvider,
HttpAuthSchemeInputConfig,
HttpAuthSchemeResolvedConfig,
resolveHttpAuthSchemeConfig,
} from "./auth/httpAuthSchemeProvider";
import {
ActivateEventSourceCommandInput,
ActivateEventSourceCommandOutput,
Expand Down Expand Up @@ -373,17 +372,6 @@ export interface ClientDefaults extends Partial<__SmithyResolvedConfiguration<__
*/
useFipsEndpoint?: boolean | __Provider<boolean>;

/**
* The AWS region to which this client will send requests
*/
region?: string | __Provider<string>;

/**
* Default credentials provider; Not available in browser runtime.
* @internal
*/
credentialDefaultProvider?: (input: any) => __Provider<__Credentials>;

/**
* The provider populating default tracking information to be sent with `user-agent`, `x-amz-user-agent` header
* @internal
Expand Down Expand Up @@ -414,19 +402,30 @@ export interface ClientDefaults extends Partial<__SmithyResolvedConfiguration<__
* The {@link @smithy/smithy-client#DefaultsMode} that will be used to determine how certain default configuration options are resolved in the SDK.
*/
defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>;

/**
* experimentalIdentityAndAuth: Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme.
* @internal
*/
httpAuthSchemes?: HttpAuthScheme[];

/**
* experimentalIdentityAndAuth: Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use.
* @internal
*/
httpAuthSchemeProvider?: EventBridgeHttpAuthSchemeProvider;
}

/**
* @public
*/
export type EventBridgeClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOptions>> &
ClientDefaults &
RegionInputConfig &
EndpointInputConfig<EndpointParameters> &
RetryInputConfig &
HostHeaderInputConfig &
AwsAuthInputConfig &
UserAgentInputConfig &
HttpAuthSchemeInputConfig &
ClientInputEndpointParameters;
/**
* @public
Expand All @@ -441,12 +440,11 @@ export interface EventBridgeClientConfig extends EventBridgeClientConfigType {}
export type EventBridgeClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHandlerOptions> &
Required<ClientDefaults> &
RuntimeExtensionsConfig &
RegionResolvedConfig &
EndpointResolvedConfig<EndpointParameters> &
RetryResolvedConfig &
HostHeaderResolvedConfig &
AwsAuthResolvedConfig &
UserAgentResolvedConfig &
HttpAuthSchemeResolvedConfig &
ClientResolvedEndpointParameters;
/**
* @public
Expand Down Expand Up @@ -493,22 +491,22 @@ export class EventBridgeClient extends __Client<
constructor(...[configuration]: __CheckOptionalClientConfig<EventBridgeClientConfig>) {
const _config_0 = __getRuntimeConfig(configuration || {});
const _config_1 = resolveClientEndpointParameters(_config_0);
const _config_2 = resolveRegionConfig(_config_1);
const _config_3 = resolveEndpointConfig(_config_2);
const _config_4 = resolveRetryConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveAwsAuthConfig(_config_5);
const _config_7 = resolveUserAgentConfig(_config_6);
const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);
super(_config_8);
this.config = _config_8;
const _config_2 = resolveEndpointConfig(_config_1);
const _config_3 = resolveRetryConfig(_config_2);
const _config_4 = resolveHostHeaderConfig(_config_3);
const _config_5 = resolveUserAgentConfig(_config_4);
const _config_6 = resolveHttpAuthSchemeConfig(_config_5);
const _config_7 = resolveRuntimeExtensions(_config_6, configuration?.extensions || []);
super(_config_7);
this.config = _config_7;
this.middlewareStack.use(getRetryPlugin(this.config));
this.middlewareStack.use(getContentLengthPlugin(this.config));
this.middlewareStack.use(getHostHeaderPlugin(this.config));
this.middlewareStack.use(getLoggerPlugin(this.config));
this.middlewareStack.use(getRecursionDetectionPlugin(this.config));
this.middlewareStack.use(getAwsAuthPlugin(this.config));
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(getHttpAuthSchemePlugin(this.config));
this.middlewareStack.use(getHttpSigningPlugin(this.config));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// smithy-typescript generated code
import { HttpAuthScheme } from "@smithy/experimental-identity-and-auth";
import { AwsCredentialIdentity, AwsCredentialIdentityProvider } from "@smithy/types";

import { EventBridgeHttpAuthSchemeProvider } from "./httpAuthSchemeProvider";

/**
* @internal
*/
export interface HttpAuthExtensionConfiguration {
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void;
httpAuthSchemes(): HttpAuthScheme[];
setHttpAuthSchemeProvider(httpAuthSchemeProvider: EventBridgeHttpAuthSchemeProvider): void;
httpAuthSchemeProvider(): EventBridgeHttpAuthSchemeProvider;
setCredentials(credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider): void;
credentials(): AwsCredentialIdentity | AwsCredentialIdentityProvider | undefined;
}

/**
* @internal
*/
export type HttpAuthRuntimeConfig = Partial<{
httpAuthSchemes: HttpAuthScheme[];
httpAuthSchemeProvider: EventBridgeHttpAuthSchemeProvider;
credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider;
}>;

/**
* @internal
*/
export const getHttpAuthExtensionConfiguration = (
runtimeConfig: HttpAuthRuntimeConfig
): HttpAuthExtensionConfiguration => {
const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!;
let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!;
let _credentials = runtimeConfig.credentials;
return {
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void {
_httpAuthSchemes.push(httpAuthScheme);
},
httpAuthSchemes(): HttpAuthScheme[] {
return _httpAuthSchemes;
},
setHttpAuthSchemeProvider(httpAuthSchemeProvider: EventBridgeHttpAuthSchemeProvider): void {
_httpAuthSchemeProvider = httpAuthSchemeProvider;
},
httpAuthSchemeProvider(): EventBridgeHttpAuthSchemeProvider {
return _httpAuthSchemeProvider;
},
setCredentials(credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider): void {
_credentials = credentials;
},
credentials(): AwsCredentialIdentity | AwsCredentialIdentityProvider | undefined {
return _credentials;
},
};
};

/**
* @internal
*/
export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => {
return {
httpAuthSchemes: config.httpAuthSchemes(),
httpAuthSchemeProvider: config.httpAuthSchemeProvider(),
credentials: config.credentials(),
};
};
131 changes: 131 additions & 0 deletions clients/client-eventbridge/src/auth/httpAuthSchemeProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// smithy-typescript generated code
import {
DefaultIdentityProviderConfig,
doesIdentityRequireRefresh,
HttpAuthOption,
HttpAuthSchemeParameters,
HttpAuthSchemeParametersProvider,
HttpAuthSchemeProvider,
IdentityProviderConfig,
isIdentityExpired,
memoizeIdentityProvider,
} from "@smithy/experimental-identity-and-auth";
import { AwsCredentialIdentity, AwsCredentialIdentityProvider, Provider as __Provider } from "@smithy/types";
import { getSmithyContext, normalizeProvider } from "@smithy/util-middleware";

import { EventBridgeClientResolvedConfig } from "../EventBridgeClient";

/**
* @internal
*/
export interface EventBridgeHttpAuthSchemeParameters extends HttpAuthSchemeParameters {
region?: string;
}

/**
* @internal
*/
export interface EventBridgeHttpAuthSchemeParametersProvider
extends HttpAuthSchemeParametersProvider<EventBridgeClientResolvedConfig, EventBridgeHttpAuthSchemeParameters> {}

/**
* @internal
*/
export const defaultEventBridgeHttpAuthSchemeParametersProvider: EventBridgeHttpAuthSchemeParametersProvider = async (
config,
context,
input
) => {
return {
operation: getSmithyContext(context).operation as string,
region:
(await normalizeProvider(config.region)()) ||
(() => {
throw new Error("expected `region` to be configured for `aws.auth#sigv4`");
})(),
};
};

function createAwsAuthSigv4HttpAuthOption(authParameters: EventBridgeHttpAuthSchemeParameters): HttpAuthOption {
return {
schemeId: "aws.auth#sigv4",
signingProperties: {
name: "events",
region: authParameters.region,
},
};
}

/**
* @internal
*/
export interface EventBridgeHttpAuthSchemeProvider
extends HttpAuthSchemeProvider<EventBridgeHttpAuthSchemeParameters> {}

/**
* @internal
*/
export const defaultEventBridgeHttpAuthSchemeProvider: EventBridgeHttpAuthSchemeProvider = (authParameters) => {
const options: HttpAuthOption[] = [];
switch (authParameters.operation) {
default: {
options.push(createAwsAuthSigv4HttpAuthOption(authParameters));
}
}
return options;
};

/**
* @internal
*/
export interface HttpAuthSchemeInputConfig {
/**
* The credentials used to sign requests.
*/
credentials?: AwsCredentialIdentity | AwsCredentialIdentityProvider;
/**
* The AWS region to which this client will send requests.
*/
region?: string | __Provider<string>;
}

/**
* @internal
*/
export interface HttpAuthSchemeResolvedConfig {
/**
* The credentials used to sign requests.
*/
readonly credentials?: AwsCredentialIdentityProvider;
/**
* The AWS region to which this client will send requests.
*/
readonly region?: __Provider<string>;
/**
* experimentalIdentityAndAuth: provides parameters for HttpAuthSchemeProvider.
* @internal
*/
readonly httpAuthSchemeParametersProvider: EventBridgeHttpAuthSchemeParametersProvider;
/**
* experimentalIdentityAndAuth: abstraction around identity configuration fields
* @internal
*/
readonly identityProviderConfig: IdentityProviderConfig;
}

/**
* @internal
*/
export const resolveHttpAuthSchemeConfig = (config: HttpAuthSchemeInputConfig): HttpAuthSchemeResolvedConfig => {
const credentials = memoizeIdentityProvider(config.credentials, isIdentityExpired, doesIdentityRequireRefresh);
const region = config.region ? normalizeProvider(config.region) : undefined;
return {
...config,
credentials,
region,
httpAuthSchemeParametersProvider: defaultEventBridgeHttpAuthSchemeParametersProvider,
identityProviderConfig: new DefaultIdentityProviderConfig({
"aws.auth#sigv4": credentials,
}),
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const resolveClientEndpointParameters = <T>(
...options,
useDualstackEndpoint: options.useDualstackEndpoint ?? false,
useFipsEndpoint: options.useFipsEndpoint ?? false,
defaultSigningName: "events",
defaultSigningName: "",
};
};

Expand Down
5 changes: 4 additions & 1 deletion clients/client-eventbridge/src/extensionConfiguration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ import { AwsRegionExtensionConfiguration } from "@aws-sdk/types";
import { HttpHandlerExtensionConfiguration } from "@smithy/protocol-http";
import { DefaultExtensionConfiguration } from "@smithy/types";

import { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration";

/**
* @internal
*/
export interface EventBridgeExtensionConfiguration
extends HttpHandlerExtensionConfiguration,
DefaultExtensionConfiguration,
AwsRegionExtensionConfiguration {}
AwsRegionExtensionConfiguration,
HttpAuthExtensionConfiguration {}
16 changes: 12 additions & 4 deletions clients/client-eventbridge/src/runtimeConfig.browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import packageInfo from "../package.json"; // eslint-disable-line
import { Sha256 } from "@aws-crypto/sha256-browser";
import { defaultUserAgent } from "@aws-sdk/util-user-agent-browser";
import { DEFAULT_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT } from "@smithy/config-resolver";
import { IdentityProviderConfig, SigV4Signer } from "@smithy/experimental-identity-and-auth";
import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler";
import { invalidProvider } from "@smithy/invalid-dependency";
import { calculateBodyLength } from "@smithy/util-body-length-browser";
import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/util-retry";
import { EventBridgeClientConfig } from "./EventBridgeClient";
Expand All @@ -27,13 +27,21 @@ export const getRuntimeConfig = (config: EventBridgeClientConfig) => {
runtime: "browser",
defaultsMode,
bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength,
credentialDefaultProvider:
config?.credentialDefaultProvider ?? ((_: unknown) => () => Promise.reject(new Error("Credential is missing"))),
defaultUserAgentProvider:
config?.defaultUserAgentProvider ??
defaultUserAgent({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),
httpAuthSchemes: config?.httpAuthSchemes ?? [
{
schemeId: "aws.auth#sigv4",
identityProvider: (config: IdentityProviderConfig) =>
config.getIdentityProvider("aws.auth#sigv4") ||
(async () => {
throw new Error("`credentials` is missing");
}),
signer: new SigV4Signer(),
},
],
maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
region: config?.region ?? invalidProvider("Region is missing"),
requestHandler: config?.requestHandler ?? new RequestHandler(defaultConfigProvider),
retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE),
sha256: config?.sha256 ?? Sha256,
Expand Down
Loading

0 comments on commit 69775fe

Please sign in to comment.