Skip to content

Commit d0b6fa3

Browse files
smilkurikuhe
authored andcommitted
cliv2 compatible provider
1 parent 0c60e1c commit d0b6fa3

File tree

6 files changed

+133
-5
lines changed

6 files changed

+133
-5
lines changed

clients/client-accessanalyzer/package.json

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
"description": "AWS SDK for JavaScript Accessanalyzer Client for Node.js, Browser and React Native",
44
"version": "3.758.0",
55
"scripts": {
6-
"build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'",
6+
"build": "concurrently 'yarn generate:version' 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types' ",
7+
"build:webpack": "webpack",
78
"build:cjs": "node ../../scripts/compilation/inline client-accessanalyzer",
89
"build:es": "tsc -p tsconfig.es.json",
910
"build:include:deps": "lerna run --scope $npm_package_name --include-dependencies build",
1011
"build:types": "tsc -p tsconfig.types.json",
1112
"build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4",
1213
"clean": "rimraf ./dist-* && rimraf *.tsbuildinfo",
1314
"extract:docs": "api-extractor run --local",
14-
"generate:client": "node ../../scripts/generate-clients/single-service --solo accessanalyzer"
15+
"generate:client": "node ../../scripts/generate-clients/single-service --solo accessanalyzer",
16+
"generate:version": "node src/scripts/generate-version.js"
1517
},
1618
"main": "./dist-cjs/index.js",
1719
"types": "./dist-types/index.d.ts",
@@ -63,10 +65,23 @@
6365
"devDependencies": {
6466
"@tsconfig/node18": "18.2.4",
6567
"@types/node": "^18.19.69",
68+
"@types/path-browserify": "^1",
69+
"@types/webpack-bundle-analyzer": "^4",
70+
"assert": "^2.1.0",
71+
"browserify-zlib": "^0.2.0",
6672
"concurrently": "7.0.0",
6773
"downlevel-dts": "0.10.1",
74+
"http2-wrapper": "^2.2.1",
75+
"https-browserify": "^1.0.0",
76+
"os-browserify": "^0.3.0",
77+
"path-browserify": "^1.0.1",
6878
"rimraf": "3.0.2",
69-
"typescript": "~5.2.2"
79+
"stream-http": "^3.2.0",
80+
"typescript": "~5.2.2",
81+
"url": "^0.11.4",
82+
"webpack": "^5.97.1",
83+
"webpack-bundle-analyzer": "^4.10.2",
84+
"webpack-cli": "^6.0.1"
7085
},
7186
"engines": {
7287
"node": ">=18.0.0"

clients/client-accessanalyzer/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// smithy-typescript generated code
22
/* eslint-disable */
3+
import { version } from "../version.json";
34
/**
45
* <p>Identity and Access Management Access Analyzer helps you to set, verify, and refine your IAM policies by providing
56
* a suite of capabilities. Its features include findings for external and unused access,
@@ -28,6 +29,8 @@
2829
*
2930
* @packageDocumentation
3031
*/
32+
33+
export const VERSION = version;
3134
export * from "./AccessAnalyzerClient";
3235
export * from "./AccessAnalyzer";
3336
export { ClientInputEndpointParameters } from "./endpoint/EndpointParameters";

clients/client-accessanalyzer/src/runtimeConfig.browser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// smithy-typescript generated code
22
// @ts-ignore: package.json will be imported from dist folders
3-
import packageInfo from "../package.json"; // eslint-disable-line
3+
import packageInfo from "../version.json"; // eslint-disable-line
44

55
import { Sha256 } from "@aws-crypto/sha256-browser";
66
import { createDefaultUserAgentProvider } from "@aws-sdk/util-user-agent-browser";

clients/client-accessanalyzer/src/runtimeConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// smithy-typescript generated code
22
// @ts-ignore: package.json will be imported from dist folders
3-
import packageInfo from "../package.json"; // eslint-disable-line
3+
import packageInfo from "../version.json"; // eslint-disable-line
44

55
import { emitWarningIfUnsupportedVersion as awsCheckVersion } from "@aws-sdk/core";
66
import { defaultProvider as credentialDefaultProvider } from "@aws-sdk/credential-provider-node";
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { fromEnv } from "@aws-sdk/credential-provider-env";
2+
import { fromIni } from "@aws-sdk/credential-provider-ini";
3+
import { defaultProvider } from "@aws-sdk/credential-provider-node";
4+
import type { CredentialProviderOptions, Provider } from "@aws-sdk/types";
5+
import { chain, memoize } from "@smithy/property-provider";
6+
import type { AwsCredentialIdentity } from "@smithy/types";
7+
8+
interface AwsCliV2CompatibleProviderOptions extends CredentialProviderOptions {
9+
profile?: string;
10+
accessKeyId?: string;
11+
secretAccessKey?: string;
12+
sessionToken?: string;
13+
}
14+
15+
/**
16+
* AWS CLI V2 Compatible Credential Provider Chain
17+
* If profile is explicitly provided, uses fromIni with that profile.
18+
* Otherwise, uses a chain of fromEnv and fromNodeProviderChain.
19+
*/
20+
export const fromAwsCliV2CompatibleProviderChain = (
21+
options: AwsCliV2CompatibleProviderOptions = {}
22+
): Provider<AwsCredentialIdentity> => {
23+
const { profile, accessKeyId, secretAccessKey, sessionToken } = options;
24+
25+
return memoize(
26+
async (): Promise<AwsCredentialIdentity> => {
27+
// If explicit credentials are provided in the constructor, use them.
28+
if (accessKeyId && secretAccessKey) {
29+
return {
30+
accessKeyId,
31+
secretAccessKey,
32+
sessionToken, // Optional
33+
};
34+
}
35+
// If profile is explicitly provided, use fromIni directly
36+
if (profile) {
37+
return fromIni({ profile })();
38+
}
39+
40+
// Otherwise, use the chain of providers
41+
const credentials = await chain(fromEnv(), async () => {
42+
return defaultProvider()();
43+
})();
44+
45+
if (!credentials) {
46+
throw new Error("Failed to retrieve valid AWS credentials");
47+
}
48+
49+
return credentials;
50+
},
51+
credentialsTreatedAsExpired,
52+
credentialsWillNeedRefresh
53+
);
54+
};
55+
56+
export const credentialsTreatedAsExpired = (credentials: AwsCredentialIdentity) =>
57+
credentials?.expiration !== undefined && credentials.expiration.getTime() - Date.now() < 300000;
58+
59+
export const credentialsWillNeedRefresh = (credentials: AwsCredentialIdentity) => credentials?.expiration !== undefined;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { MetadataService } from "@aws-sdk/ec2-metadata-service";
2+
import { logger } from "@aws-sdk/smithy-client/dist-types";
3+
import { loadSharedConfigFiles } from "@smithy/shared-ini-file-loader";
4+
5+
/**
6+
* Resolves the AWS region following AWS CLI V2 precedence order.
7+
*/
8+
export const resolveAwsCliV2Region = async (defaultRegion?: string, maybeProfile?: string): Promise<string> => {
9+
const profile = maybeProfile ?? process.env.AWS_PROFILE ?? process.env.AWS_DEFAULT_PROFILE ?? "default";
10+
11+
const region =
12+
process.env.AWS_REGION ||
13+
process.env.AWS_DEFAULT_REGION ||
14+
(await getRegionFromIni(profile)) ||
15+
(await regionFromMetadataService());
16+
17+
if (!region) {
18+
const usedProfile = !profile ? "" : ` (profile: "${profile}")`;
19+
if (defaultRegion) {
20+
logger.warn(
21+
`Unable to determine AWS region from environment or AWS configuration${usedProfile}, defaulting to '${defaultRegion}'`
22+
);
23+
return defaultRegion;
24+
}
25+
throw new Error(
26+
`Unable to determine AWS region from environment or AWS configuration${usedProfile}. Please specify a region.`
27+
);
28+
}
29+
return region;
30+
};
31+
32+
/**
33+
* Fetches the region from the AWS shared config files.
34+
*/
35+
export async function getRegionFromIni(profile: string): Promise<string | undefined> {
36+
const sharedFiles = await loadSharedConfigFiles({ ignoreCache: true });
37+
return sharedFiles.configFile?.[profile]?.region || sharedFiles.credentialsFile?.[profile]?.region;
38+
}
39+
40+
/**
41+
* Retrieves the AWS region from the EC2 Instance Metadata Service (IMDS).
42+
*/
43+
export async function regionFromMetadataService(): Promise<string | undefined> {
44+
try {
45+
const metadataService = new MetadataService();
46+
const document = await metadataService.request("/latest/dynamic/instance-identity/document", {});
47+
return JSON.parse(document).region;
48+
} catch (e) {
49+
return undefined;
50+
}
51+
}

0 commit comments

Comments
 (0)