optional assume role

This commit is contained in:
nicktrn
2025-07-01 13:26:21 +01:00
parent e9fc7afcdd
commit 14cbc22c19
4 changed files with 501 additions and 8 deletions
@@ -7,9 +7,91 @@ import {
RepositoryNotFoundException,
GetAuthorizationTokenCommand,
} from "@aws-sdk/client-ecr";
import { STSClient, AssumeRoleCommand } from "@aws-sdk/client-sts";
import { tryCatch } from "@trigger.dev/core";
import { logger } from "~/services/logger.server";
// Optional configuration for cross-account access
export type CrossAccountConfig = {
assumeRole: boolean;
roleName: string;
};
const DEFAULT_CROSS_ACCOUNT_CONFIG: CrossAccountConfig = {
assumeRole: false,
roleName: "OrganizationAccountAccessRole",
};
async function getAssumedRoleCredentials(
region: string,
accountId: string,
config: CrossAccountConfig
): Promise<{
accessKeyId: string;
secretAccessKey: string;
sessionToken: string;
}> {
const sts = new STSClient({ region });
const roleArn = `arn:aws:iam::${accountId}:role/${config.roleName}`;
// Generate a unique session name using timestamp and random string
// This helps with debugging but doesn't affect concurrent sessions
const timestamp = Date.now();
const randomSuffix = Math.random().toString(36).substring(2, 8);
const sessionName = `TriggerWebappECRAccess_${timestamp}_${randomSuffix}`;
try {
const response = await sts.send(
new AssumeRoleCommand({
RoleArn: roleArn,
RoleSessionName: sessionName,
// Sessions automatically expire after 1 hour
// AWS allows 5000 concurrent sessions by default
DurationSeconds: 3600,
})
);
if (!response.Credentials) {
throw new Error("STS: No credentials returned from assumed role");
}
if (
!response.Credentials.AccessKeyId ||
!response.Credentials.SecretAccessKey ||
!response.Credentials.SessionToken
) {
throw new Error("STS: Invalid credentials returned from assumed role");
}
return {
accessKeyId: response.Credentials.AccessKeyId,
secretAccessKey: response.Credentials.SecretAccessKey,
sessionToken: response.Credentials.SessionToken,
};
} catch (error) {
logger.error("Failed to assume role", { roleArn, sessionName, error });
throw error;
}
}
async function createEcrClient(
region: string,
registryId?: string,
crossAccountConfig: CrossAccountConfig = DEFAULT_CROSS_ACCOUNT_CONFIG
) {
// If no registryId or role assumption is disabled, use default credentials
if (!registryId || !crossAccountConfig.assumeRole) {
return new ECRClient({ region });
}
// Get credentials for cross-account access
const credentials = await getAssumedRoleCredentials(region, registryId, crossAccountConfig);
return new ECRClient({
region,
credentials,
});
}
export async function getDeploymentImageRef({
host,
namespace,
@@ -18,6 +100,7 @@ export async function getDeploymentImageRef({
environmentSlug,
registryId,
registryTags,
crossAccountConfig,
}: {
host: string;
namespace: string;
@@ -26,6 +109,7 @@ export async function getDeploymentImageRef({
environmentSlug: string;
registryId?: string;
registryTags?: string;
crossAccountConfig?: CrossAccountConfig;
}): Promise<{
imageRef: string;
isEcr: boolean;
@@ -41,7 +125,13 @@ export async function getDeploymentImageRef({
}
const [ecrRepoError] = await tryCatch(
ensureEcrRepositoryExists({ repositoryName, registryHost: host, registryId, registryTags })
ensureEcrRepositoryExists({
repositoryName,
registryHost: host,
registryId,
registryTags,
crossAccountConfig,
})
);
if (ecrRepoError) {
@@ -75,13 +165,15 @@ async function createEcrRepository({
region,
registryId,
registryTags,
crossAccountConfig,
}: {
repositoryName: string;
region: string;
registryId?: string;
registryTags?: string;
crossAccountConfig?: CrossAccountConfig;
}): Promise<Repository> {
const ecr = new ECRClient({ region });
const ecr = await createEcrClient(region, registryId, crossAccountConfig);
const result = await ecr.send(
new CreateRepositoryCommand({
@@ -107,12 +199,14 @@ async function getEcrRepository({
repositoryName,
region,
registryId,
crossAccountConfig,
}: {
repositoryName: string;
region: string;
registryId?: string;
crossAccountConfig?: CrossAccountConfig;
}): Promise<Repository | undefined> {
const ecr = new ECRClient({ region });
const ecr = await createEcrClient(region, registryId, crossAccountConfig);
try {
const result = await ecr.send(
@@ -153,11 +247,13 @@ async function ensureEcrRepositoryExists({
registryHost,
registryId,
registryTags,
crossAccountConfig,
}: {
repositoryName: string;
registryHost: string;
registryId?: string;
registryTags?: string;
crossAccountConfig?: CrossAccountConfig;
}): Promise<Repository> {
const region = getEcrRegion(registryHost);
@@ -166,7 +262,7 @@ async function ensureEcrRepositoryExists({
}
const [getRepoError, existingRepo] = await tryCatch(
getEcrRepository({ repositoryName, region, registryId })
getEcrRepository({ repositoryName, region, registryId, crossAccountConfig })
);
if (getRepoError) {
@@ -180,7 +276,7 @@ async function ensureEcrRepositoryExists({
}
const [createRepoError, newRepo] = await tryCatch(
createEcrRepository({ repositoryName, region, registryId, registryTags })
createEcrRepository({ repositoryName, region, registryId, registryTags, crossAccountConfig })
);
if (createRepoError) {
@@ -201,9 +297,11 @@ async function ensureEcrRepositoryExists({
export async function getEcrAuthToken({
registryHost,
registryId,
crossAccountConfig,
}: {
registryHost: string;
registryId?: string;
crossAccountConfig?: CrossAccountConfig;
}): Promise<{ username: string; password: string }> {
const region = getEcrRegion(registryHost);
if (!region) {
@@ -211,7 +309,7 @@ export async function getEcrAuthToken({
throw new Error("Invalid ECR registry host");
}
const ecr = new ECRClient({ region });
const ecr = await createEcrClient(region, registryId, crossAccountConfig);
const response = await ecr.send(
new GetAuthorizationTokenCommand({
registryIds: registryId ? [registryId] : undefined,
+1
View File
@@ -35,6 +35,7 @@
"@ariakit/react-core": "^0.4.6",
"@aws-sdk/client-ecr": "^3.839.0",
"@aws-sdk/client-sqs": "^3.445.0",
"@aws-sdk/client-sts": "^3.840.0",
"@codemirror/autocomplete": "^6.3.1",
"@codemirror/commands": "^6.1.2",
"@codemirror/lang-javascript": "^6.1.1",
@@ -14,6 +14,13 @@ describe.skipIf(process.env.RUN_REGISTRY_TESTS !== "1")("getDeploymentImageRef",
const registryId = process.env.DEPLOY_REGISTRY_ID;
const registryTags = "test=test,test2=test2";
const assumeRole = process.env.ASSUME_ROLE === "1";
const crossAccountConfig = {
assumeRole,
roleName: "OrganizationAccountAccessRole",
};
// Clean up test repository after tests
afterAll(async () => {
if (!registryId) {
@@ -65,6 +72,7 @@ describe.skipIf(process.env.RUN_REGISTRY_TESTS !== "1")("getDeploymentImageRef",
environmentSlug: "test",
registryId,
registryTags,
crossAccountConfig,
});
expect(imageRef.imageRef).toBe(
@@ -83,6 +91,7 @@ describe.skipIf(process.env.RUN_REGISTRY_TESTS !== "1")("getDeploymentImageRef",
environmentSlug: "prod",
registryId,
registryTags,
crossAccountConfig,
});
expect(imageRef.imageRef).toBe(
+387 -2
View File
@@ -200,6 +200,9 @@ importers:
'@aws-sdk/client-sqs':
specifier: ^3.445.0
version: 3.454.0
'@aws-sdk/client-sts':
specifier: ^3.840.0
version: 3.840.0
'@codemirror/autocomplete':
specifier: ^6.3.1
version: 6.4.0(@codemirror/language@6.3.2)(@codemirror/state@6.2.0)(@codemirror/view@6.7.2)(@lezer/common@1.2.3)
@@ -2953,7 +2956,7 @@ packages:
'@aws-crypto/sha256-js': 5.2.0
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.821.0
'@aws-sdk/types': 3.840.0
'@aws-sdk/util-locate-window': 3.310.0
'@smithy/util-utf8': 2.0.2
tslib: 2.8.1
@@ -2972,7 +2975,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.821.0
'@aws-sdk/types': 3.840.0
tslib: 2.8.1
dev: false
@@ -3337,6 +3340,52 @@ packages:
- aws-crt
dev: false
/@aws-sdk/client-sso@3.840.0:
resolution: {integrity: sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.840.0
'@aws-sdk/middleware-host-header': 3.840.0
'@aws-sdk/middleware-logger': 3.840.0
'@aws-sdk/middleware-recursion-detection': 3.840.0
'@aws-sdk/middleware-user-agent': 3.840.0
'@aws-sdk/region-config-resolver': 3.840.0
'@aws-sdk/types': 3.840.0
'@aws-sdk/util-endpoints': 3.840.0
'@aws-sdk/util-user-agent-browser': 3.840.0
'@aws-sdk/util-user-agent-node': 3.840.0
'@smithy/config-resolver': 4.1.4
'@smithy/core': 3.6.0
'@smithy/fetch-http-handler': 5.0.4
'@smithy/hash-node': 4.0.4
'@smithy/invalid-dependency': 4.0.4
'@smithy/middleware-content-length': 4.0.4
'@smithy/middleware-endpoint': 4.1.13
'@smithy/middleware-retry': 4.1.14
'@smithy/middleware-serde': 4.0.8
'@smithy/middleware-stack': 4.0.4
'@smithy/node-config-provider': 4.1.3
'@smithy/node-http-handler': 4.0.6
'@smithy/protocol-http': 5.1.2
'@smithy/smithy-client': 4.4.5
'@smithy/types': 4.3.1
'@smithy/url-parser': 4.0.4
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-body-length-node': 4.0.0
'@smithy/util-defaults-mode-browser': 4.0.21
'@smithy/util-defaults-mode-node': 4.0.21
'@smithy/util-endpoints': 3.0.6
'@smithy/util-middleware': 4.0.4
'@smithy/util-retry': 4.0.6
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/client-sts@3.454.0:
resolution: {integrity: sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==}
engines: {node: '>=14.0.0'}
@@ -3433,6 +3482,53 @@ packages:
- aws-crt
dev: false
/@aws-sdk/client-sts@3.840.0:
resolution: {integrity: sha512-h+mu89Wk81Ne+B624GT/pBM5VjuAZueSeQNixhgtQ1QHi6bZzrpz8+lvMSibKO+kXFyQsTLzkyibbxnhLpWQZA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.840.0
'@aws-sdk/credential-provider-node': 3.840.0
'@aws-sdk/middleware-host-header': 3.840.0
'@aws-sdk/middleware-logger': 3.840.0
'@aws-sdk/middleware-recursion-detection': 3.840.0
'@aws-sdk/middleware-user-agent': 3.840.0
'@aws-sdk/region-config-resolver': 3.840.0
'@aws-sdk/types': 3.840.0
'@aws-sdk/util-endpoints': 3.840.0
'@aws-sdk/util-user-agent-browser': 3.840.0
'@aws-sdk/util-user-agent-node': 3.840.0
'@smithy/config-resolver': 4.1.4
'@smithy/core': 3.6.0
'@smithy/fetch-http-handler': 5.0.4
'@smithy/hash-node': 4.0.4
'@smithy/invalid-dependency': 4.0.4
'@smithy/middleware-content-length': 4.0.4
'@smithy/middleware-endpoint': 4.1.13
'@smithy/middleware-retry': 4.1.14
'@smithy/middleware-serde': 4.0.8
'@smithy/middleware-stack': 4.0.4
'@smithy/node-config-provider': 4.1.3
'@smithy/node-http-handler': 4.0.6
'@smithy/protocol-http': 5.1.2
'@smithy/smithy-client': 4.4.5
'@smithy/types': 4.3.1
'@smithy/url-parser': 4.0.4
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-body-length-node': 4.0.0
'@smithy/util-defaults-mode-browser': 4.0.21
'@smithy/util-defaults-mode-node': 4.0.21
'@smithy/util-endpoints': 3.0.6
'@smithy/util-middleware': 4.0.4
'@smithy/util-retry': 4.0.6
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/core@3.451.0:
resolution: {integrity: sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==}
engines: {node: '>=14.0.0'}
@@ -3479,6 +3575,27 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/core@3.840.0:
resolution: {integrity: sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@aws-sdk/xml-builder': 3.821.0
'@smithy/core': 3.6.0
'@smithy/node-config-provider': 4.1.3
'@smithy/property-provider': 4.0.4
'@smithy/protocol-http': 5.1.2
'@smithy/signature-v4': 5.1.2
'@smithy/smithy-client': 4.4.5
'@smithy/types': 4.3.1
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-middleware': 4.0.4
'@smithy/util-utf8': 4.0.0
fast-xml-parser: 4.4.1
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-env@3.451.0:
resolution: {integrity: sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==}
engines: {node: '>=14.0.0'}
@@ -3511,6 +3628,17 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-env@3.840.0:
resolution: {integrity: sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/property-provider': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-http@3.716.0:
resolution: {integrity: sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==}
engines: {node: '>=16.0.0'}
@@ -3543,6 +3671,22 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-http@3.840.0:
resolution: {integrity: sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/fetch-http-handler': 5.0.4
'@smithy/node-http-handler': 4.0.6
'@smithy/property-provider': 4.0.4
'@smithy/protocol-http': 5.1.2
'@smithy/smithy-client': 4.4.5
'@smithy/types': 4.3.1
'@smithy/util-stream': 4.2.2
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-ini@3.451.0:
resolution: {integrity: sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==}
engines: {node: '>=14.0.0'}
@@ -3606,6 +3750,27 @@ packages:
- aws-crt
dev: false
/@aws-sdk/credential-provider-ini@3.840.0:
resolution: {integrity: sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/credential-provider-env': 3.840.0
'@aws-sdk/credential-provider-http': 3.840.0
'@aws-sdk/credential-provider-process': 3.840.0
'@aws-sdk/credential-provider-sso': 3.840.0
'@aws-sdk/credential-provider-web-identity': 3.840.0
'@aws-sdk/nested-clients': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/credential-provider-imds': 4.0.6
'@smithy/property-provider': 4.0.4
'@smithy/shared-ini-file-loader': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/credential-provider-node@3.451.0:
resolution: {integrity: sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==}
engines: {node: '>=14.0.0'}
@@ -3667,6 +3832,26 @@ packages:
- aws-crt
dev: false
/@aws-sdk/credential-provider-node@3.840.0:
resolution: {integrity: sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/credential-provider-env': 3.840.0
'@aws-sdk/credential-provider-http': 3.840.0
'@aws-sdk/credential-provider-ini': 3.840.0
'@aws-sdk/credential-provider-process': 3.840.0
'@aws-sdk/credential-provider-sso': 3.840.0
'@aws-sdk/credential-provider-web-identity': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/credential-provider-imds': 4.0.6
'@smithy/property-provider': 4.0.4
'@smithy/shared-ini-file-loader': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/credential-provider-process@3.451.0:
resolution: {integrity: sha512-HQywSdKeD5PErcLLnZfSyCJO+6T+ZyzF+Lm/QgscSC+CbSUSIPi//s15qhBRVely/3KBV6AywxwNH+5eYgt4lQ==}
engines: {node: '>=14.0.0'}
@@ -3702,6 +3887,18 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-process@3.840.0:
resolution: {integrity: sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/property-provider': 4.0.4
'@smithy/shared-ini-file-loader': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-sso@3.451.0:
resolution: {integrity: sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==}
engines: {node: '>=14.0.0'}
@@ -3750,6 +3947,22 @@ packages:
- aws-crt
dev: false
/@aws-sdk/credential-provider-sso@3.840.0:
resolution: {integrity: sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/client-sso': 3.840.0
'@aws-sdk/core': 3.840.0
'@aws-sdk/token-providers': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/property-provider': 4.0.4
'@smithy/shared-ini-file-loader': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/credential-provider-web-identity@3.451.0:
resolution: {integrity: sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==}
engines: {node: '>=14.0.0'}
@@ -3788,6 +4001,20 @@ packages:
- aws-crt
dev: false
/@aws-sdk/credential-provider-web-identity@3.840.0:
resolution: {integrity: sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/nested-clients': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/property-provider': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/middleware-host-header@3.451.0:
resolution: {integrity: sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==}
engines: {node: '>=14.0.0'}
@@ -3818,6 +4045,16 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-host-header@3.840.0:
resolution: {integrity: sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/protocol-http': 5.1.2
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-logger@3.451.0:
resolution: {integrity: sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==}
engines: {node: '>=14.0.0'}
@@ -3845,6 +4082,15 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-logger@3.840.0:
resolution: {integrity: sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-recursion-detection@3.451.0:
resolution: {integrity: sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==}
engines: {node: '>=14.0.0'}
@@ -3875,6 +4121,16 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-recursion-detection@3.840.0:
resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/protocol-http': 5.1.2
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-sdk-sqs@3.451.0:
resolution: {integrity: sha512-GXpFSc9Ji4IAT/OaTkmnDrxzZrrAsJctUAC9vihpgGDof79A1Oz4R+r2uBMTKGxCIFkqyYW5Se7y2ijjTNa3ZA==}
engines: {node: '>=14.0.0'}
@@ -3946,6 +4202,19 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-user-agent@3.840.0:
resolution: {integrity: sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/types': 3.840.0
'@aws-sdk/util-endpoints': 3.840.0
'@smithy/core': 3.6.0
'@smithy/protocol-http': 5.1.2
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/nested-clients@3.839.0:
resolution: {integrity: sha512-Glic0pg2THYP3aRhJORwJJBe1JLtJoEdWV/MFZNyzCklfMwEzpWtZAyxy+tQyFmMeW50uBAnh2R0jhMMcf257w==}
engines: {node: '>=18.0.0'}
@@ -3992,6 +4261,52 @@ packages:
- aws-crt
dev: false
/@aws-sdk/nested-clients@3.840.0:
resolution: {integrity: sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.840.0
'@aws-sdk/middleware-host-header': 3.840.0
'@aws-sdk/middleware-logger': 3.840.0
'@aws-sdk/middleware-recursion-detection': 3.840.0
'@aws-sdk/middleware-user-agent': 3.840.0
'@aws-sdk/region-config-resolver': 3.840.0
'@aws-sdk/types': 3.840.0
'@aws-sdk/util-endpoints': 3.840.0
'@aws-sdk/util-user-agent-browser': 3.840.0
'@aws-sdk/util-user-agent-node': 3.840.0
'@smithy/config-resolver': 4.1.4
'@smithy/core': 3.6.0
'@smithy/fetch-http-handler': 5.0.4
'@smithy/hash-node': 4.0.4
'@smithy/invalid-dependency': 4.0.4
'@smithy/middleware-content-length': 4.0.4
'@smithy/middleware-endpoint': 4.1.13
'@smithy/middleware-retry': 4.1.14
'@smithy/middleware-serde': 4.0.8
'@smithy/middleware-stack': 4.0.4
'@smithy/node-config-provider': 4.1.3
'@smithy/node-http-handler': 4.0.6
'@smithy/protocol-http': 5.1.2
'@smithy/smithy-client': 4.4.5
'@smithy/types': 4.3.1
'@smithy/url-parser': 4.0.4
'@smithy/util-base64': 4.0.0
'@smithy/util-body-length-browser': 4.0.0
'@smithy/util-body-length-node': 4.0.0
'@smithy/util-defaults-mode-browser': 4.0.21
'@smithy/util-defaults-mode-node': 4.0.21
'@smithy/util-endpoints': 3.0.6
'@smithy/util-middleware': 4.0.4
'@smithy/util-retry': 4.0.6
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/region-config-resolver@3.451.0:
resolution: {integrity: sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==}
engines: {node: '>=14.0.0'}
@@ -4027,6 +4342,18 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/region-config-resolver@3.840.0:
resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/node-config-provider': 4.1.3
'@smithy/types': 4.3.1
'@smithy/util-config-provider': 4.0.0
'@smithy/util-middleware': 4.0.4
tslib: 2.8.1
dev: false
/@aws-sdk/token-providers@3.451.0:
resolution: {integrity: sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==}
engines: {node: '>=14.0.0'}
@@ -4101,6 +4428,21 @@ packages:
- aws-crt
dev: false
/@aws-sdk/token-providers@3.840.0:
resolution: {integrity: sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/core': 3.840.0
'@aws-sdk/nested-clients': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/property-provider': 4.0.4
'@smithy/shared-ini-file-loader': 4.0.4
'@smithy/types': 4.3.1
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
/@aws-sdk/types@3.451.0:
resolution: {integrity: sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==}
engines: {node: '>=14.0.0'}
@@ -4125,6 +4467,14 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/types@3.840.0:
resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==}
engines: {node: '>=18.0.0'}
dependencies:
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/util-endpoints@3.451.0:
resolution: {integrity: sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==}
engines: {node: '>=14.0.0'}
@@ -4154,6 +4504,16 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/util-endpoints@3.840.0:
resolution: {integrity: sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==}
engines: {node: '>=18.0.0'}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/types': 4.3.1
'@smithy/util-endpoints': 3.0.6
tslib: 2.8.1
dev: false
/@aws-sdk/util-locate-window@3.310.0:
resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==}
engines: {node: '>=14.0.0'}
@@ -4188,6 +4548,15 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-browser@3.840.0:
resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==}
dependencies:
'@aws-sdk/types': 3.840.0
'@smithy/types': 4.3.1
bowser: 2.11.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-node@3.451.0:
resolution: {integrity: sha512-TBzm6P+ql4mkGFAjPlO1CI+w3yUT+NulaiALjl/jNX/nnUp6HsJsVxJf4nVFQTG5KRV0iqMypcs7I3KIhH+LmA==}
engines: {node: '>=14.0.0'}
@@ -4235,6 +4604,22 @@ packages:
tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-node@3.840.0:
resolution: {integrity: sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
aws-crt: '>=1.0.0'
peerDependenciesMeta:
aws-crt:
optional: true
dependencies:
'@aws-sdk/middleware-user-agent': 3.840.0
'@aws-sdk/types': 3.840.0
'@smithy/node-config-provider': 4.1.3
'@smithy/types': 4.3.1
tslib: 2.8.1
dev: false
/@aws-sdk/util-utf8-browser@3.259.0:
resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
dependencies: