From 98724d66a3e9bfe9f163e5341458db1fdbf72319 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:01:30 +1100 Subject: [PATCH 01/22] Huge number of changes for error messages And thawing --- dev/test.ts | 26 ++++++ ...an-write-lambda.js => can-write-lambda.ts} | 0 .../construct/can-write-lambda/errors.ts | 0 .../.dockerignore | 0 .../.gitignore | 0 .../Dockerfile | 8 ++ .../rclone-go-batch-copy-docker-image/go.mod | 0 .../rclone-go-batch-copy-docker-image/main.go | 0 .../test-docker-direct.sh | 0 .../test-go-direct.sh | 0 .../testfile1.txt | 1 + .../thaw-objects-lambda-step-construct.ts | 82 +++++++++++++++++++ .../construct/thaw-objects-lambda/.gitignore | 3 + .../thaw-objects-lambda/package.json | 8 ++ .../thaw-objects-lambda.js | 52 ++++++++++++ 15 files changed, 180 insertions(+) create mode 100644 dev/test.ts rename packages/aws-copy-out-sharer/construct/can-write-lambda/{can-write-lambda.js => can-write-lambda.ts} (100%) create mode 100644 packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt create mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts create mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore create mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json create mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js diff --git a/dev/test.ts b/dev/test.ts new file mode 100644 index 0000000..97fe028 --- /dev/null +++ b/dev/test.ts @@ -0,0 +1,26 @@ +import { CopyOutStack } from "aws-copy-out-sharer"; +import { SubnetType } from "aws-cdk-lib/aws-ec2"; +import { App } from "aws-cdk-lib"; + +const app = new App(); + +const description = + "Bulk copy-out service for Elsa Data - an application for controlled genomic data sharing"; + +const devId = "ElsaDataDevCopyOutStack"; + +new CopyOutStack(app, devId, { + // the stack can only be deployed to 'dev' + env: { + account: "843407916570", + region: "ap-southeast-2", + }, + tags: { + "umccr-org:Product": "ElsaData", + "umccr-org:Stack": devId, + }, + description: description, + isDevelopment: true, + infrastructureStackName: "ElsaDataDevInfrastructureStack", + infrastructureSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, +}); diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.js b/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts similarity index 100% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.js rename to packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts b/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile new file mode 100644 index 0000000..8b29bee --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile @@ -0,0 +1,8 @@ +FROM rclone/rclone:1.64.2 + +RUN apk add --no-cache aws-cli tini + +# a shell script that allows us to take more batch like input to rclone +COPY rclone-batch-copy.sh /app/ + +ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh new file mode 100644 index 0000000..e69de29 diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt new file mode 100644 index 0000000..f638667 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt @@ -0,0 +1 @@ +This is test file 1 diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts new file mode 100644 index 0000000..6430ad5 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts @@ -0,0 +1,82 @@ +import { Construct } from "constructs"; +import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { Duration, Stack } from "aws-cdk-lib"; +import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; +import { Runtime } from "aws-cdk-lib/aws-lambda"; +import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; +import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; +import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; +import { join } from "path"; + +type CanWriteLambdaStepProps = { + vpc: IVpc; + vpcSubnetSelection: SubnetType; + + requiredRegion: string; + + /** + * If true, will allow this CanWrite lambda to test a bucket that is + * in the same account. Otherwise, and by default, the CanWrite lambda + * is set up to not be able to test a bucket in the same account as it + * is installed. This is a security mechanism as writes to buckets in the + * same account is allowed implictly but is dangerous. This should only + * be set to true for development/testing. + */ + allowWriteToThisAccount?: boolean; +}; + +/** + * A construct for a Steps function that tests whether an S3 + * bucket exists, is in the correct region, and is writeable + * by us. Throws an exception if any of these conditions is not met. + */ +export class CanWriteLambdaStepConstruct extends Construct { + public readonly invocableLambda; + + constructor(scope: Construct, id: string, props: CanWriteLambdaStepProps) { + super(scope, id); + + const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { + vpc: props.vpc, + entry: join(__dirname, "can-write-lambda", "can-write-lambda.js"), + // by specifying the precise runtime - the bundler knows exactly what packages are already in + // the base image - and for us can skip bundling @aws-sdk + // if we need to move this forward beyond node 18 - then we may need to revisit this + runtime: Runtime.NODEJS_18_X, + handler: "handler", + vpcSubnets: { + subnetType: props.vpcSubnetSelection, + }, + // this seems like plenty of seconds to do a few API calls to S3 + timeout: Duration.seconds(30), + }); + + canWriteLambda.addToRolePolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["s3:PutObject"], + resources: ["*"], + // yes - that's right - we want to give this lambda the ability to attempt the writes anywhere + // EXCEPT where we are deployed + // (under the assumption that buckets outside our account must be giving us explicit write permission, + // whilst within our account we get implicit access - in this case we don't want that ability) + conditions: props.allowWriteToThisAccount + ? undefined + : { + StringNotEquals: { + "s3:ResourceAccount": [Stack.of(this).account], + }, + }, + }), + ); + + this.invocableLambda = new LambdaInvoke( + this, + `Can Write To Destination Bucket?`, + { + lambdaFunction: canWriteLambda, + resultPath: JsonPath.DISCARD, + }, + ); + } +} diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore new file mode 100644 index 0000000..dc19133 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore @@ -0,0 +1,3 @@ + +# this lambda is a straight JS - no typescript so we need to include the JS +!*.js diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json new file mode 100644 index 0000000..6c62bf2 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json @@ -0,0 +1,8 @@ +{ + "name": "can-write-lambda", + "version": "1.0.0", + "main": "can-write-lambda.js", + "dependencies": { + "@aws-sdk/client-s3": "^3.405.0" + } +} diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js new file mode 100644 index 0000000..e4646e6 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js @@ -0,0 +1,52 @@ +const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3"); + +export const handler = async (event) => { + function WrongRegionError(message) { + this.name = "WrongRegionError"; + this.message = message; + } + WrongRegionError.prototype = new Error(); + + function AccessDeniedError(message) { + this.name = "AccessDeniedError"; + this.message = message; + } + AccessDeniedError.prototype = new Error(); + + console.log(event.requiredRegion); + console.log(event.destinationBucket); + + // we are being super specific here - the required region is where we are going + // to make our client - in order to ensure we get 301 Redirects for buckets outside our location + const client = new S3Client({ region: event.requiredRegion }); + + try { + const putCommand = new PutObjectCommand({ + Bucket: event.destinationBucket, + Key: "ELSA_DATA_STARTED_TRANSFER.txt", + Body: "A file created by Elsa Data copy out to ensure correct permissions", + }); + + const response = await client.send(putCommand); + } catch (e) { + if (e.Code === "PermanentRedirect") + throw new WrongRegionError( + "S3 Put failed because bucket was in the wrong region", + ); + + if (e.Code === "AccessDenied") + throw new AccessDeniedError("S3 Put failed with access denied error"); + + throw e; + } +}; + +/*handler({ + requiredRegion: "ap-southeast-2", + //destinationBucket: "elsa-data-tmp" + //destinationBucket: "cdk-hnb659fds-assets-843407916570-us-east-1" + //destinationBucket: "elsa-data-replication-target-foo" + destinationBucket: "elsa-data-replication-target" + // destinationBucket: "elsa-data-copy-target-sydney" + // destinationBucket: "elsa-data-copy-target-tokyo" +}) */ From c80cda5d9d396d06c4e7be567ca3e7800ceda69a Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:04:30 +1100 Subject: [PATCH 02/22] Added a Go application to wrap the rclone process --- README.md | 40 + dev/package.json | 13 +- dev/test.ts | 148 +- .../can-write-lambda-step-construct.ts | 38 +- .../can-write-lambda/can-write-lambda.ts | 26 +- .../construct/can-write-lambda/errors.ts | 15 + .../can-write-lambda/package-lock.json | 1438 +++++++++++ .../construct/can-write-lambda/package.json | 5 +- .../copy-out-state-machine-construct.ts | 58 +- .../distributed-map-step-construct.ts | 17 +- .../construct/fargate-run-task-construct.ts | 39 +- .../rclone-batch-copy-docker-image/Dockerfile | 6 +- .../rclone-batch-copy.sh | 9 + .../.dockerignore | 3 + .../.gitignore | 3 + .../Dockerfile | 28 +- .../rclone-go-batch-copy-docker-image/go.mod | 21 + .../rclone-go-batch-copy-docker-image/go.sum | 30 + .../rclone-go-batch-copy-docker-image/main.go | 157 ++ .../test-assert.sh | 186 ++ .../test-docker-direct.sh | 8 + .../test-go-direct.sh | 86 + .../testfile2.txt | 1 + .../thaw-objects-lambda-step-construct.ts | 6 +- .../thaw-objects-lambda/package.json | 2 +- .../aws-copy-out-sharer/copy-out-stack.ts | 12 +- packages/aws-copy-out-sharer/package.json | 17 +- pnpm-lock.yaml | 2113 ++++++++++++----- 28 files changed, 3802 insertions(+), 723 deletions(-) create mode 100644 packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum create mode 100755 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh mode change 100644 => 100755 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh mode change 100644 => 100755 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh create mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt diff --git a/README.md b/README.md index ead4b6f..98cbc98 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,46 @@ A service that can be installed into an Elsa Data environment and which enables parallel file copying out into a destination bucket in the same region. +NOTE: this is a general purpose "S3 file copy" tool - so might +be useful outside of Elsa Data. It can certainly be invoked +directly as a Steps function independent of Elsa Data (all +the Elsa Data does is sets up the input CSVs and then invokes +the Steps function itself). + +## Development + +On check-out (once only) (note that `pre-commit` is presumed installed externally) + +```shell +pre-commit install +``` + +For package installation (note that `pnpm` is presumed installed externally) + +```shell +pnpm install +``` + +Edit the packages and deploy to dev + +```shell +(in the dev folder) +pnpm run deploy +``` + +## Testing + +Because this service is very dependent on the behaviour of AWS Steps +(using distributed maps) - it was too complex to set up a "local" test +that would actually test much of the pieces likely to fail. + +Instead, development is done and the CDK project is deployed to a "dev" account (noting +that this sets the minimum dev cadence for trying changes +to minutes rather than seconds). + +There is then a test script - that creates samples objects - and launches +test invocations. + ## Input ```json diff --git a/dev/package.json b/dev/package.json index fb8a0c7..db2c929 100644 --- a/dev/package.json +++ b/dev/package.json @@ -3,9 +3,18 @@ "private": true, "version": "0.0.0", "description": "Manual CDK deployment for development", + "scripts": { + "deploy": "pnpm -w run build && cdk deploy", + "destroy": "pnpm -w run build && cdk destroy", + "test": "ts-node --prefer-ts-exts test.ts", + "test-quick": "ts-node --prefer-ts-exts test.ts" + }, "dependencies": { - "aws-cdk": "2.93.0", - "aws-cdk-lib": "2.93.0", + "@aws-sdk/client-s3": "3.450.0", + "@aws-sdk/client-servicediscovery": "3.450.0", + "@aws-sdk/client-sfn": "3.450.0", + "aws-cdk": "2.108.1", + "aws-cdk-lib": "2.108.1", "aws-copy-out-sharer": "link:../packages/aws-copy-out-sharer" }, "devDependencies": {} diff --git a/dev/test.ts b/dev/test.ts index 97fe028..02bce22 100644 --- a/dev/test.ts +++ b/dev/test.ts @@ -1,26 +1,122 @@ -import { CopyOutStack } from "aws-copy-out-sharer"; -import { SubnetType } from "aws-cdk-lib/aws-ec2"; -import { App } from "aws-cdk-lib"; - -const app = new App(); - -const description = - "Bulk copy-out service for Elsa Data - an application for controlled genomic data sharing"; - -const devId = "ElsaDataDevCopyOutStack"; - -new CopyOutStack(app, devId, { - // the stack can only be deployed to 'dev' - env: { - account: "843407916570", - region: "ap-southeast-2", - }, - tags: { - "umccr-org:Product": "ElsaData", - "umccr-org:Stack": devId, - }, - description: description, - isDevelopment: true, - infrastructureStackName: "ElsaDataDevInfrastructureStack", - infrastructureSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, -}); +import { randomBytes } from "crypto"; +import { S3Client, PutObjectCommand, StorageClass } from "@aws-sdk/client-s3"; +import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; +import { + DiscoverInstancesCommand, + ServiceDiscoveryClient, +} from "@aws-sdk/client-servicediscovery"; + +/** + * The only configurable item needed for the test cases - set this to a bucket you have + * full access to. Ideally the bucket should have a lifecycle that auto expires objects after 1 day. + */ +const TEST_BUCKET = "elsa-data-tmp"; + +const discoveryClient = new ServiceDiscoveryClient({}); +const s3Client = new S3Client({}); +const sfnClient = new SFNClient({}); + +const testFolder = randomBytes(16).toString("hex"); +const testFolderSrc = testFolder + "-src"; +const testFolderDest = testFolder + "-dest"; + +async function makeObjectListCsv(key: string, keys: string[]) { + let content = ""; + for (const k of keys) { + content += `${TEST_BUCKET},"${k}"\n`; + } + const response = await s3Client.send( + new PutObjectCommand({ + Bucket: TEST_BUCKET, + Key: key, + Body: content, + }), + ); +} + +async function makeTestObject( + key: string, + sizeInBytes: number, + storageClass: StorageClass = "STANDARD", +) { + const response = await s3Client.send( + new PutObjectCommand({ + Bucket: TEST_BUCKET, + Key: key, + Body: "Hello S3!", + StorageClass: storageClass, + }), + ); +} + +async function createTestData() { + const sourceObjects = { + [`${testFolderSrc}/1.bin`]: StorageClass.STANDARD, + [`${testFolderSrc}/2.bin`]: StorageClass.STANDARD, + [`${testFolderSrc}/3.bin`]: StorageClass.GLACIER, + }; + + for (const [n, stor] of Object.entries(sourceObjects)) { + await makeTestObject(n, 1000, stor); + } + + await makeObjectListCsv( + `${testFolderSrc}/objects-to-copy.tsv`, + Object.keys(sourceObjects), + ); +} + +(async () => { + console.log(`Src objects = ${TEST_BUCKET}:${testFolderSrc}`); + console.log(`Dest objects = ${TEST_BUCKET}:${testFolderDest}`); + + const stepsDiscover = await discoveryClient.send( + new DiscoverInstancesCommand({ + NamespaceName: "elsa-data", + ServiceName: "CopyOut", + }), + ); + + if ( + !stepsDiscover || + !stepsDiscover.Instances || + stepsDiscover.Instances.length != 1 + ) + throw new Error( + "Did not discover the expected number of CopyOut instances in the Elsa Data CloudMap", + ); + + const stateMachineDiscovered = stepsDiscover?.Instances[0]; + + if (!stateMachineDiscovered.Attributes) + throw new Error( + "Did not discover state machine settings in CopyOut CloudMap", + ); + + const stateMachineArn = stateMachineDiscovered.Attributes["stateMachineArn"]; + + await createTestData(); + + /*await sfnClient.send(new StartExecutionCommand({ + stateMachineArn: stateMachineArn, + input: JSON.stringify({ + sourceFilesCsvBucket: TEST_BUCKET, + sourceFilesCsvKey: `${testFolderSrc}/objects-to-copy.tsv`, + destinationBucket: TEST_BUCKET, + maxItemsPerBatch: 1 + }) + }));*/ + + await sfnClient.send( + new StartExecutionCommand({ + stateMachineArn: stateMachineArn, + input: JSON.stringify({ + sourceFilesCsvBucket: TEST_BUCKET, + sourceFilesCsvKey: `${testFolderSrc}/objects-to-copy.tsv`, + destinationBucket: TEST_BUCKET, + destinationKey: testFolderDest, + maxItemsPerBatch: 1, + }), + }), + ); +})(); diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts b/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts index a8fd2be..da2b011 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts @@ -13,6 +13,16 @@ type CanWriteLambdaStepProps = { vpcSubnetSelection: SubnetType; requiredRegion: string; + + /** + * If true, will allow this CanWrite lambda to test a bucket that is + * in the same account. Otherwise, and by default, the CanWrite lambda + * is set up to not be able to test a bucket in the same account as it + * is installed. This is a security mechanism as writes to buckets in the + * same account is allowed implicitly but is dangerous. This should only + * be set to true for development/testing. + */ + allowWriteToThisAccount?: boolean; }; /** @@ -28,12 +38,16 @@ export class CanWriteLambdaStepConstruct extends Construct { const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { vpc: props.vpc, - entry: join(__dirname, "can-write-lambda", "can-write-lambda.js"), + entry: join(__dirname, "can-write-lambda", "can-write-lambda.ts"), // by specifying the precise runtime - the bundler knows exactly what packages are already in // the base image - and for us can skip bundling @aws-sdk - // if we need to move this forward to node 18+ - then we may need to revisit this + // if we need to move this forward beyond node 18 - then we may need to revisit this runtime: Runtime.NODEJS_18_X, handler: "handler", + bundling: { + externalModules: ["aws-sdk"], + minify: false, + }, vpcSubnets: { subnetType: props.vpcSubnetSelection, }, @@ -46,15 +60,17 @@ export class CanWriteLambdaStepConstruct extends Construct { effect: Effect.ALLOW, actions: ["s3:PutObject"], resources: ["*"], - conditions: { - // yes - that's right - we want to give this lambda the ability to attempt the writes anywhere - // EXCEPT where we are deployed - // (under the assumption that buckets outside our account must be giving us explicit write permission, - // whilst within our account we get implicit access - in this case we don't want that ability) - StringNotEquals: { - "s3:ResourceAccount": [Stack.of(this).account], - }, - }, + // yes - that's right - we want to give this lambda the ability to attempt the writes anywhere + // EXCEPT where we are deployed + // (under the assumption that buckets outside our account must be giving us explicit write permission, + // whilst within our account we get implicit access - in this case we don't want that ability) + conditions: props.allowWriteToThisAccount + ? undefined + : { + StringNotEquals: { + "s3:ResourceAccount": [Stack.of(this).account], + }, + }, }), ); diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts b/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts index e4646e6..c3e3836 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts +++ b/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts @@ -1,18 +1,12 @@ -const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3"); +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { AccessDeniedError, WrongRegionError } from "./errors"; -export const handler = async (event) => { - function WrongRegionError(message) { - this.name = "WrongRegionError"; - this.message = message; - } - WrongRegionError.prototype = new Error(); - - function AccessDeniedError(message) { - this.name = "AccessDeniedError"; - this.message = message; - } - AccessDeniedError.prototype = new Error(); +interface InvokeEvent { + requiredRegion: string; + destinationBucket: string; +} +export async function handler(event: InvokeEvent) { console.log(event.requiredRegion); console.log(event.destinationBucket); @@ -27,8 +21,8 @@ export const handler = async (event) => { Body: "A file created by Elsa Data copy out to ensure correct permissions", }); - const response = await client.send(putCommand); - } catch (e) { + await client.send(putCommand); + } catch (e: any) { if (e.Code === "PermanentRedirect") throw new WrongRegionError( "S3 Put failed because bucket was in the wrong region", @@ -39,7 +33,7 @@ export const handler = async (event) => { throw e; } -}; +} /*handler({ requiredRegion: "ap-southeast-2", diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts b/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts index e69de29..d693553 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts +++ b/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts @@ -0,0 +1,15 @@ +export class WrongRegionError extends Error { + constructor(message: string) { + super(); + this.name = "WrongRegionError"; + this.message = message; + } +} + +export class AccessDeniedError extends Error { + constructor(message: string) { + super(); + this.name = "AccessDeniedError"; + this.message = message; + } +} diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json b/packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json new file mode 100644 index 0000000..e84c5e8 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json @@ -0,0 +1,1438 @@ +{ + "name": "can-write-lambda", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "can-write-lambda", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.405.0.tgz", + "integrity": "sha512-+LK6OCbKplR51zBZAtK/+RxaPsXcEklsA1+mmUA3M1h4KHl6GMiK5r/D9dlKht5DRntmmjCn3SI99QbfckqKXg==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-bucket-endpoint": "3.405.0", + "@aws-sdk/middleware-expect-continue": "3.398.0", + "@aws-sdk/middleware-flexible-checksums": "3.400.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-location-constraint": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-s3": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-ssec": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/signature-v4-multi-region": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/eventstream-serde-browser": "^2.0.5", + "@smithy/eventstream-serde-config-resolver": "^2.0.5", + "@smithy/eventstream-serde-node": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-blob-browser": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/hash-stream-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/md5-js": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-stream": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.5", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", + "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", + "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-sts": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", + "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", + "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", + "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", + "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", + "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", + "dependencies": { + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/token-providers": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", + "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.405.0.tgz", + "integrity": "sha512-wKmHZi44NkbaGXXbMwassUm06/wDtSYucPbM4paU2cMbBUOnwFpndHWlrRYCNmj5Ty5A2HjdkGlhgla8nifHzQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.398.0.tgz", + "integrity": "sha512-d6he+Qqwh1yqml9duXSv5iKJ2lS0PVrF2UEsVew2GFxfUif0E/davTZJjvWtnelbuIGcTP+wDKVVjLwBN2sN/g==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.400.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.400.0.tgz", + "integrity": "sha512-lpsumd5/G+eAMTr61h/cJQZ8+i+xzC6OG3bvUcbRHqcjN49XgeNLcPfYcr6Rzf0QHxmuCN4te/4XGU3Fif2YVA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.398.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", + "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.398.0.tgz", + "integrity": "sha512-it+olJf1Lf2bmH8OL/N1jMOFB0zEVYs4rIzgFrluTRCuPatRuDi4LsXS8zqYxkBa05JE8JmqwW5gCzAmWyLLqw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", + "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", + "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.398.0.tgz", + "integrity": "sha512-yweSMc/TyiFtqc52hFMKQJvTm3i1KCoW5mB3o/Sla6zsHBh+nS6TTaBmo+2kcDIR7AKODwW+FLCTHWiazb7J3Q==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", + "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", + "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.398.0.tgz", + "integrity": "sha512-QtKr/hPcRugKSIZAH4+7hbUfdW7Lg+OQvD25nJn7ic1JHRZ+eDctEFxdsmnt68lE6aZxOcHCWHAW6/umcA93Dw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", + "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.398.0.tgz", + "integrity": "sha512-8fTqTxRDWE03T7ClaWlCfbwuSae//01XMNVy2a9g5QgaelQh7ZZyU3ZIJiV8gIj8v6ZM0NGn9Bz1liI/vmNmcw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", + "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", + "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", + "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", + "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.13.tgz", + "integrity": "sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", + "dependencies": { + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.18.tgz", + "integrity": "sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/types": "^2.5.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.6", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.1.tgz", + "integrity": "sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/property-provider": "^2.0.14", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.13.tgz", + "integrity": "sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.5.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.13.tgz", + "integrity": "sha512-OJ/2g/VxkzA+mYZxV102oX3CsiE+igTSmqq/ir3oEVG2kSIdRC00ryttj/lmL14W06ExNi0ysmfLxQkL8XrAZQ==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.13.tgz", + "integrity": "sha512-2BI1CbnYuEvAYoWSeWJtPNygbIKiWeSLxCmDLnyM6wQV32Of7VptiQlaFXPxXp4zqn/rs3ocZ/T29rxE4s4Gsg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.13.tgz", + "integrity": "sha512-7NbFwPafb924elFxCBDvm48jy/DeSrpFbFQN0uN2ThuY5HrEeubikS0t7WMva4Z4EnRoivpbuT0scb9vUIJKoA==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.13.tgz", + "integrity": "sha512-j0yFd5UfftM+ia9dxLRbheJDCkCZBHpcEzCsPO8BxVOTbdcX/auVJCv6ov/yvpCKsf4Hv3mOqi0Is1YogM2g3Q==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.6.tgz", + "integrity": "sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==", + "dependencies": { + "@smithy/protocol-http": "^3.0.9", + "@smithy/querystring-builder": "^2.0.13", + "@smithy/types": "^2.5.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.14.tgz", + "integrity": "sha512-yWdghyPJIEqLYsaE7YVgd3YhM7jN4Pv6eJQvTomnMsz5K2qRBlpjUx3T9fKlElp1qdeQ7DNc3sAat4i9CUBO7Q==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.15.tgz", + "integrity": "sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.15.tgz", + "integrity": "sha512-ZZ6kC/pHt5Dc2goXIIyC8uA7A4GUMSzdCynAabnZ3CSSaV6ctP8mlvVkqjPph0O3XzHlx/80gdLrNqi1GDPUsA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.13.tgz", + "integrity": "sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.15.tgz", + "integrity": "sha512-pAZaokib56XvhU0t/R9vAcr3L3bMhIakhF25X7EMSQ7LAURiLfce/tgON8I3x/dIbnZUyeRi8f2cx2azu6ATew==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.15.tgz", + "integrity": "sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==", + "dependencies": { + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.0.tgz", + "integrity": "sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.13", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/shared-ini-file-loader": "^2.2.4", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-middleware": "^2.0.6", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.20.tgz", + "integrity": "sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/protocol-http": "^3.0.9", + "@smithy/service-error-classification": "^2.0.6", + "@smithy/types": "^2.5.0", + "@smithy/util-middleware": "^2.0.6", + "@smithy/util-retry": "^2.0.6", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.13.tgz", + "integrity": "sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.7.tgz", + "integrity": "sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.5.tgz", + "integrity": "sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==", + "dependencies": { + "@smithy/property-provider": "^2.0.14", + "@smithy/shared-ini-file-loader": "^2.2.4", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.9.tgz", + "integrity": "sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.13", + "@smithy/protocol-http": "^3.0.9", + "@smithy/querystring-builder": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.14.tgz", + "integrity": "sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.13.tgz", + "integrity": "sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.13.tgz", + "integrity": "sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.6.tgz", + "integrity": "sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==", + "dependencies": { + "@smithy/types": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.4.tgz", + "integrity": "sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.15.tgz", + "integrity": "sha512-SRTEJSEhQYVlBKIIdZ9SZpqW+KFqxqcNnEcBX+8xkDdWx+DItme9VcCDkdN32yTIrICC+irUufnUdV7mmHPjoA==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.13", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.5.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.6", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.15.tgz", + "integrity": "sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.7", + "@smithy/types": "^2.5.0", + "@smithy/util-stream": "^2.0.20", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.5.0.tgz", + "integrity": "sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.13.tgz", + "integrity": "sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.19.tgz", + "integrity": "sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==", + "dependencies": { + "@smithy/property-provider": "^2.0.14", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.25.tgz", + "integrity": "sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.18", + "@smithy/credential-provider-imds": "^2.1.1", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/property-provider": "^2.0.14", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.6.tgz", + "integrity": "sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.6.tgz", + "integrity": "sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.6", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.20.tgz", + "integrity": "sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/node-http-handler": "^2.1.9", + "@smithy/types": "^2.5.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.13.tgz", + "integrity": "sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg==", + "dependencies": { + "@smithy/abort-controller": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.93", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.93.tgz", + "integrity": "sha512-Vsyi9ogDAY3REZDjYnXMRJJa62SDvxHXxJI5nGDQdZW058dDE+av/anynN2rLKbCKXDRNw3D/sQmqxVflZFi4A==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + } + } +} diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/package.json b/packages/aws-copy-out-sharer/construct/can-write-lambda/package.json index 6c62bf2..c52f4b9 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda/package.json +++ b/packages/aws-copy-out-sharer/construct/can-write-lambda/package.json @@ -1,8 +1,9 @@ { "name": "can-write-lambda", "version": "1.0.0", - "main": "can-write-lambda.js", + "main": "can-write-lambda.ts", "dependencies": { - "@aws-sdk/client-s3": "^3.405.0" + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" } } diff --git a/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts index e66ae22..ba23e97 100644 --- a/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts @@ -11,7 +11,6 @@ import { } from "aws-cdk-lib/aws-stepfunctions"; import { Arn, ArnFormat, Duration, Stack } from "aws-cdk-lib"; import { ICluster } from "aws-cdk-lib/aws-ecs"; -import { Service } from "aws-cdk-lib/aws-servicediscovery"; import { CanWriteLambdaStepConstruct } from "./can-write-lambda-step-construct"; import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { DistributedMapStepConstruct } from "./distributed-map-step-construct"; @@ -24,18 +23,22 @@ export type CopyOutStateMachineProps = { fargateCluster: ICluster; - namespaceService: Service; - /** * Whether the stack should use duration/timeouts that are more suited * to demonstration/development. i.e. minutes rather than hours for wait times, - * hours rather than days for copy time outs. + * hours rather than days for copy time-outs. */ aggressiveTimes?: boolean; + + allowWriteToThisAccount?: boolean; + + // WIP workingBucket workingPrefix + // should make it that if specified this is a bucket that exclusively + // holds the source CSVs and result CSVs (so we can lock down the S3 perms) }; export class CopyOutStateMachineConstruct extends Construct { - private readonly stateMachine: StateMachine; + private readonly _stateMachine: StateMachine; constructor(scope: Construct, id: string, props: CopyOutStateMachineProps) { super(scope, id); @@ -46,6 +49,7 @@ export class CopyOutStateMachineConstruct extends Construct { vpc: props.vpc, vpcSubnetSelection: props.vpcSubnetSelection, requiredRegion: Stack.of(this).region, + allowWriteToThisAccount: props.allowWriteToThisAccount, }, ); @@ -84,6 +88,8 @@ export class CopyOutStateMachineConstruct extends Construct { const defineDefaults = new Pass(this, "Define Defaults", { parameters: { maxItemsPerBatch: 1, + requiredRegion: Stack.of(this).region, + destinationKey: "", }, resultPath: "$.inputDefaults", }); @@ -118,7 +124,7 @@ export class CopyOutStateMachineConstruct extends Construct { // NOTE: we use a technique here to allow optional input parameters to the state machine // by defining defaults and then JsonMerging them with the actual input params - this.stateMachine = new StateMachine(this, "StateMachine", { + this._stateMachine = new StateMachine(this, "StateMachine", { // we give people a window of time in which to create the destination bucket - so this // could run a long time timeout: props.aggressiveTimes ? Duration.hours(24) : Duration.days(30), @@ -126,7 +132,7 @@ export class CopyOutStateMachineConstruct extends Construct { }); // this is needed to support distributed map - once there is a native CDK for this I presume this goes - this.stateMachine.addToRolePolicy( + this._stateMachine.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ["states:StartExecution"], @@ -145,7 +151,7 @@ export class CopyOutStateMachineConstruct extends Construct { ); // this is needed to support distributed map - once there is a native CDK for this I presume this goes - this.stateMachine.addToRolePolicy( + this._stateMachine.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ["states:DescribeExecution", "states:StopExecution"], @@ -165,7 +171,7 @@ export class CopyOutStateMachineConstruct extends Construct { // this is too broad - but once the CFN native Distributed Map is created - it will handle this for us // (I think it isn't doing it because of our DummyMap) - this.stateMachine.addToRolePolicy( + this._stateMachine.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ["lambda:InvokeFunction"], @@ -173,7 +179,7 @@ export class CopyOutStateMachineConstruct extends Construct { }), ); - this.stateMachine.addToRolePolicy( + this._stateMachine.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ["ecs:*", "iam:PassRole"], @@ -182,18 +188,36 @@ export class CopyOutStateMachineConstruct extends Construct { ); // TODO tighten this - this.stateMachine.role.addManagedPolicy( + this._stateMachine.role.addManagedPolicy( ManagedPolicy.fromAwsManagedPolicyName("AmazonS3FullAccess"), ); - this.stateMachine.role.addManagedPolicy( + // i.e perms needed for result writing from distributed map (from AWS docs) + // https://docs.aws.amazon.com/step-functions/latest/dg/input-output-resultwriter.html#resultwriter-iam-policies + // { + // "Version": "2012-10-17", + // "Statement": [ + // { + // "Effect": "Allow", + // "Action": [ + // "s3:PutObject", + // "s3:GetObject", + // "s3:ListMultipartUploadParts", + // "s3:AbortMultipartUpload" + // ], + // "Resource": [ + // "arn:aws:s3:::resultBucket/csvJobs/*" + // ] + // } + // ] + // } + + this._stateMachine.role.addManagedPolicy( ManagedPolicy.fromAwsManagedPolicyName("CloudWatchEventsFullAccess"), ); + } - props.namespaceService.registerNonIpInstance("StateMachine", { - customAttributes: { - stateMachineArn: this.stateMachine.stateMachineArn, - }, - }); + public get stateMachine() { + return this._stateMachine; } } diff --git a/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts b/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts index 0e6e2d0..0cb473b 100644 --- a/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts +++ b/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts @@ -55,7 +55,7 @@ export class DistributedMapStepConstruct extends Construct { ItemReader: { ReaderConfig: { InputType: "CSV", - // note we are providing the nominal column names.. there is no header row in the CSV + // note we are providing the nominal column names... there is no header row in the CSV CSVHeaderLocation: "GIVEN", CSVHeaders: [bucketColumnName, keyColumnName], }, @@ -68,9 +68,10 @@ export class DistributedMapStepConstruct extends Construct { ItemBatcher: { MaxItemsPerBatchPath: JsonPath.stringAt("$.maxItemsPerBatch"), BatchInput: { - "destinationBucketForRclone.$": JsonPath.format( - "s3:{}", + "destinationForRclone.$": JsonPath.format( + "s3:{}/{}", JsonPath.stringAt("$.destinationBucket"), + JsonPath.stringAt("$.destinationKey"), ), }, }, @@ -89,6 +90,16 @@ export class DistributedMapStepConstruct extends Construct { JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), ), }, + ResultWriter: { + Resource: "arn:aws:states:::s3:putObject", + Parameters: { + "Bucket.$": "$.sourceFilesCsvBucket", + "Prefix.$": JsonPath.format( + "{}-results", + JsonPath.stringAt("$.sourceFilesCsvKey"), + ), + }, + }, }, }); } diff --git a/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts b/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts index 98628b7..808aac4 100644 --- a/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts +++ b/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts @@ -1,5 +1,5 @@ import { Construct } from "constructs"; -import { ManagedPolicy } from "aws-cdk-lib/aws-iam"; +import { ManagedPolicy, PolicyStatement } from "aws-cdk-lib/aws-iam"; import { IntegrationPattern, JsonPath } from "aws-cdk-lib/aws-stepfunctions"; import { Duration, Stack, Tags } from "aws-cdk-lib"; import { @@ -25,6 +25,16 @@ import { SubnetType } from "aws-cdk-lib/aws-ec2"; type Props = { fargateCluster: ICluster; vpcSubnetSelection: SubnetType; + + /** + * If true, will allow the run task to copy to a bucket that is + * in the same account. Otherwise, and by default, the copy task + * is set up to not be able to copy to a bucket in the same account as it + * is installed. This is a security mechanism as writes to buckets in the + * same account is allowed implicitly but is dangerous. This should only + * be set to true for development/testing. + */ + //allowWriteToThisAccount?: boolean; WIP NEED TO IMPLEMENT }; export class FargateRunTaskConstruct extends Construct { @@ -40,7 +50,7 @@ export class FargateRunTaskConstruct extends Construct { }, cpu: 256, // there is a warning in the rclone documentation about problems with mem < 1GB - but I think that - // is mainly for large syncs.. we do individual file copies so 512 should be fine + // is mainly for large syncs... we do individual/small file copies so 512 should be fine memoryLimitMiB: 512, }); @@ -52,6 +62,17 @@ export class FargateRunTaskConstruct extends Construct { ManagedPolicy.fromAwsManagedPolicyName("AmazonS3FullAccess"), ); + taskDefinition.taskRole.addToPrincipalPolicy( + new PolicyStatement({ + resources: ["*"], + actions: [ + "states:SendTaskSuccess", + "states:SendTaskFailure", + "states:SendTaskHeartbeat", + ], + }), + ); + const containerDefinition = taskDefinition.addContainer("RcloneContainer", { // set the stop timeout to the maximum allowed under Fargate - as potentially this will let us finish // our rclone operation @@ -78,7 +99,8 @@ export class FargateRunTaskConstruct extends Construct { // https://github.com/aws/aws-cdk/issues/20013 this.ecsRunTask = new EcsRunTask(this, "Copy File with Rclone", { - integrationPattern: IntegrationPattern.RUN_JOB, + integrationPattern: IntegrationPattern.WAIT_FOR_TASK_TOKEN, + // .RUN_JOB, cluster: props.fargateCluster, taskDefinition: taskDefinition, launchTarget: new EcsFargateSpotOnlyLaunchTarget({ @@ -102,9 +124,14 @@ export class FargateRunTaskConstruct extends Construct { environment: [ { name: "destination", - value: JsonPath.stringAt( - "$.BatchInput.destinationBucketForRclone", - ), + // note this might be just a bucket name, or a bucket name with path + // (that decision is made higher in the stack) + // as far as rclone binary itself is concerned, it does not matter + value: JsonPath.stringAt("$.BatchInput.destinationForRclone"), + }, + { + name: "tasktoken", + value: JsonPath.stringAt("$$.Task.Token"), }, ], }, diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile index b36abe0..8b29bee 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile @@ -1,6 +1,8 @@ -FROM rclone/rclone:1.63.1 +FROM rclone/rclone:1.64.2 + +RUN apk add --no-cache aws-cli tini # a shell script that allows us to take more batch like input to rclone COPY rclone-batch-copy.sh /app/ -ENTRYPOINT ["/bin/sh", "/app/rclone-batch-copy.sh"] +ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh index a299157..f499461 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh @@ -1,6 +1,15 @@ + +# If you are familiar with rsync, rclone always works +# as if you had written a trailing / - meaning "copy the +# contents of this directory". This applies to all commands +# and whether you are talking about the source or destination. + echo "Destination = $destination" +echo "Task token = $tasktoken" for src in "$@"; do echo "Source arg = $src" /usr/local/bin/rclone copy --stats-log-level NOTICE --checksum "$src" "$destination" done + +aws stepfunctions send-task-success --task-token "$tasktoken" --task-output '{ "0": "OK", "1": "OK" }' diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore index e69de29..adab58a 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore @@ -0,0 +1,3 @@ +test/* +test-*.sh +rclone-batch diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore index e69de29..f0382e3 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore @@ -0,0 +1,3 @@ + +# ignore the binary we build in testing +rclone-batch diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile index 8b29bee..9121c34 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile @@ -1,8 +1,28 @@ +FROM golang:1.21-alpine as builder + +RUN apk add --no-cache git + +WORKDIR /build + +RUN go env -w GOPROXY=direct + +ADD go.mod go.sum ./ + +RUN go mod download + +ADD main.go ./ + +RUN env GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build + + FROM rclone/rclone:1.64.2 -RUN apk add --no-cache aws-cli tini +# if we want signals to propogate through to the app we need a lightweight initd +RUN apk add --no-cache tini + +# this is where rclone binary ends up by default so we will do our work there +WORKDIR /data -# a shell script that allows us to take more batch like input to rclone -COPY rclone-batch-copy.sh /app/ +COPY --from=builder /build/rclone-batch ./ -ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] +ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/rclone-batch"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod index e69de29..3b87e27 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod @@ -0,0 +1,21 @@ +module rclone-batch + +go 1.21.2 + +require ( + github.com/aws/aws-sdk-go-v2 v1.23.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.25.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sfn v1.22.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.2 // indirect + github.com/aws/smithy-go v1.17.0 // indirect + gonum.org/v1/gonum v0.14.0 // indirect +) diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum new file mode 100644 index 0000000..8d6e9db --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum @@ -0,0 +1,30 @@ +github.com/aws/aws-sdk-go-v2 v1.23.0 h1:PiHAzmiQQr6JULBUdvR8fKlA+UPKLT/8KbiqpFBWiAo= +github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2/config v1.25.1 h1:YsjngBOl2mx4l3egkVWndr6/6TqtkdsWJFZIsQ924Ek= +github.com/aws/aws-sdk-go-v2/config v1.25.1/go.mod h1:yV6h7TRVzhdIFmUk9WWDRpWwYGg1woEzKr0k1IYz2Tk= +github.com/aws/aws-sdk-go-v2/credentials v1.16.1 h1:WessyrdgyFN5TB+eLQdrFSlN/3oMnqukIFhDxK6z8h0= +github.com/aws/aws-sdk-go-v2/credentials v1.16.1/go.mod h1:RQJyPxKcr+m4ArlIG1LUhMOrjposVfzbX6H8oR6oCgE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 h1:9wKDWEjwSnXZre0/O3+ZwbBl1SmlgWYBbrTV10X/H1s= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3 h1:DUwbD79T8gyQ23qVXFUthjzVMTviSHi3y4z58KvghhM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3 h1:AplLJCtIaUZDCbr6+gLYdsYNxne4iuaboJhVt9d+WXI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0 h1:usgqiJtamuGIBj+OvYmMq89+Z1hIKkMJToz1WpoeNUY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.0/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3 h1:kJOolE8xBAD13xTCgOakByZkyP4D/owNmvEiioeUNAg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= +github.com/aws/aws-sdk-go-v2/service/sfn v1.22.1 h1:kT2DEMbibZlhGbGiM3p34tNOI8bh82x9Fe7HLCrnjho= +github.com/aws/aws-sdk-go-v2/service/sfn v1.22.1/go.mod h1:AM0scrWjoTK5MJ4++nLnqkdJfwAy9b0jV7EcANYn59M= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 h1:V47N5eKgVZoRSvx2+RQ0EpAEit/pqOhqeSQFiS4OFEQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2 h1:sMAcO7VHVw28HTAdZpTULDzFirHOsVm/x25CxhUH0jA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.2/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.2 h1:vwyiRTnXLqsak/6WAQ+uTRhVqKI6vxUQ0HJXjKij0zM= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.2/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= +github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go index e69de29..d41fc16 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go @@ -0,0 +1,157 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/sfn" + "log" + "os" + "os/exec" + "os/signal" + "strings" + "syscall" +) + +// retryError:false serverSideCopies:0 serverSideCopyBytes:0 serverSideMoveBytes:0 serverSideMoves:0 speed:0 totalChecks:0 totalTransfers:1 transferTime:0.000586292 transfers:1 +type RcloneStats struct { + Bytes int `json:"bytes"` + Checks int `json:"checks"` + ElapsedTime float64 `json:"elapsedTime"` + Errors int `json:"errors"` + LastError string `json:"lastError"` + FatalError bool `json:"fatalError"` + TotalBytes int `json:"totalBytes"` +} + +func If[T any](cond bool, vtrue, vfalse T) T { + if cond { + return vtrue + } + return vfalse +} + +func main() { + cfg, err := config.LoadDefaultConfig(context.TODO()) + + if err != nil { + log.Fatalf("unable to load AWS config, %v", err) + } + + // NOTE: if this was a traditional command line tool we would take these in as command + // line parameters. However, we are invoking this as an ECS Task and it turns out easier + // to pass these down via environment variables - saving the command line *only* for the list + // of files we want to copy + destination, destinationOk := os.LookupEnv("DESTINATION") + + if !destinationOk { + log.Fatalf("No environment variable DESTINATION telling us where to copy the objects", err) + } + + taskToken, taskTokenOk := os.LookupEnv("TASK_TOKEN") + + // special environment variables that we can use for some debug/testing + debugBandwidth, debugBandwidthOk := os.LookupEnv("DEBUG_BANDWIDTH") + + results := make(map[int]any) + + signalChannel := make(chan os.Signal) + + // set as soon as we receive a SIGTERM - so that we will then just quickly skip the rest of the files + interrupted := false + + for i := 2; i < len(os.Args); i++ { + if !interrupted { + // setup an rclone copy with capture stats (noting that stats are sent to stderr) + cmd := exec.Command(os.Args[1], + "--use-json-log", + "--stats-log-level", "NOTICE", + "--stats-one-line", + // only display stats at the end (after 10000 hours) + "--stats", "10000h", + // normally no bandwidth limiting ("0") - but can institute bandwidth limit if asked + "--bwlimit", If(debugBandwidthOk, debugBandwidth, "0"), + "copy", os.Args[i], destination) + + // we are only interested in stderr + stderrStringBuilder := new(strings.Builder) + cmd.Stderr = stderrStringBuilder + + // we need to be able handling getting a SIGTERM when AWS wants to reclaim our SPOT instance + signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM) + go func() { + sig := <-signalChannel + switch sig { + case syscall.SIGTERM: + // terminate the currently running rclone + cmd.Process.Signal(syscall.SIGTERM) + // indicate we don't want future rclones to run + interrupted = true + } + }() + + err := cmd.Run() + + if err != nil { + results[i-2] = map[string]any{"lastError": "Interrupted by SIGTERM", "systemError": err} + } + + // each line of stderr output is stats in JSON format or possibly other random messages + stderrStringLines := strings.Split(strings.TrimSuffix(stderrStringBuilder.String(), "\n"), "\n") + + // attempt to process each line of log output to stderr as JSON (if not then ignore) + for _, line := range stderrStringLines { + var logLineJson map[string]any + + logLineJsonErr := json.Unmarshal([]byte(line), &logLineJson) + + if logLineJsonErr == nil { + + statsValue, statsOk := logLineJson["stats"].(map[string]any) + + if statsOk { + results[i-2] = statsValue + } + } + } + } else { + results[i-2] = map[string]any{"lastError": "Skipped due to SIGTERM received"} + } + + // if asked we sleep for delay after seconds (this gives the outer environment + // time to send us a SIGINT etc) + /*if debugDelayAfterOk { + debugDelayAfterFloat, err := strconv.ParseFloat(debugDelayAfter, 64) + if err == nil { + time.Sleep(time.Duration(debugDelayAfterFloat) * time.Second) + } + } */ + + } + + resultsJson, err := json.MarshalIndent(results, "", " ") + + if err != nil { + log.Fatalf("Could not marshall the rclone outputs to JSON", err) + } + + resultsString := string(resultsJson) + + // the normal mechanism by which we will send back results to our caller is + // Steps SendTask - which sends back JSON + if taskTokenOk { + sfnSvc := sfn.NewFromConfig(cfg) + + sfnSvc.SendTaskSuccess(context.TODO(), &sfn.SendTaskSuccessInput{ + Output: aws.String(resultsString), + TaskToken: aws.String(taskToken), + }) + + fmt.Println(taskToken) + } else { + // if no task token was given then we just print the results + fmt.Println(resultsString) + } +} diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh new file mode 100755 index 0000000..a0c8723 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh @@ -0,0 +1,186 @@ +#!/bin/bash +# assert.sh 1.1 - bash unit testing framework +# Copyright (C) 2009-2015 Robert Lehmann +# +# http://github.com/lehmannro/assert.sh +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +export DISCOVERONLY=${DISCOVERONLY:-} +export DEBUG=${DEBUG:-} +export STOP=${STOP:-} +export INVARIANT=${INVARIANT:-} +export CONTINUE=${CONTINUE:-} + +args="$(getopt -n "$0" -l \ + verbose,help,stop,discover,invariant,continue vhxdic $*)" \ +|| exit -1 +for arg in $args; do + case "$arg" in + -h) + echo "$0 [-vxidc]" \ + "[--verbose] [--stop] [--invariant] [--discover] [--continue]" + echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]" + exit 0;; + --help) + cat < [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + expected=$(echo -ne "${2:-}") + result="$(eval 2>/dev/null $1 <<< ${3:-})" || true + if [[ "$result" == "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")" + [[ -z "$result" ]] && result="nothing" || result="\"$result\"" + [[ -z "$2" ]] && expected="nothing" || expected="\"$2\"" + _assert_fail "expected $expected${_indent}got $result" "$1" "$3" +} + +assert_raises() { + # assert_raises [stdin] + (( tests_ran++ )) || : + [[ -z "$DISCOVERONLY" ]] || return + status=0 + (eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$? + expected=${2:-0} + if [[ "$status" -eq "$expected" ]]; then + [[ -z "$DEBUG" ]] || echo -n . + return + fi + _assert_fail "program terminated with code $status instead of $expected" "$1" "$3" +} + +_assert_fail() { + # _assert_fail + [[ -n "$DEBUG" ]] && echo -n X + report="test #$tests_ran \"$2${3:+ <<< $3}\" failed:${_indent}$1" + if [[ -n "$STOP" ]]; then + [[ -n "$DEBUG" ]] && echo + echo "$report" + exit 1 + fi + tests_errors[$tests_failed]="$report" + (( tests_failed++ )) || : +} + +skip_if() { + # skip_if + (eval $@) > /dev/null 2>&1 && status=0 || status=$? + [[ "$status" -eq 0 ]] || return + skip +} + +skip() { + # skip (no arguments) + shopt -q extdebug && tests_extdebug=0 || tests_extdebug=1 + shopt -q -o errexit && tests_errexit=0 || tests_errexit=1 + # enable extdebug so returning 1 in a DEBUG trap handler skips next command + shopt -s extdebug + # disable errexit (set -e) so we can safely return 1 without causing exit + set +o errexit + tests_trapped=0 + trap _skip DEBUG +} +_skip() { + if [[ $tests_trapped -eq 0 ]]; then + # DEBUG trap for command we want to skip. Do not remove the handler + # yet because *after* the command we need to reset extdebug/errexit (in + # another DEBUG trap.) + tests_trapped=1 + [[ -z "$DEBUG" ]] || echo -n s + return 1 + else + trap - DEBUG + [[ $tests_extdebug -eq 0 ]] || shopt -u extdebug + [[ $tests_errexit -eq 1 ]] || set -o errexit + return 0 + fi +} + + +_assert_reset +: ${tests_suite_status:=0} # remember if any of the tests failed so far +_assert_cleanup() { + local status=$? + # modify exit code if it's not already non-zero + [[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status +} +trap _assert_cleanup EXIT diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh old mode 100644 new mode 100755 index e69de29..25b51f2 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# we want to exit immediately on error (especially for Go/Docker build errors) +set -e + +docker build . -t rclone-batch + +docker run rclone-batch -e DESTINATION=/tmp diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh old mode 100644 new mode 100755 index e69de29..8c0ede4 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +# this is a setting which is system dependent - feel free to change to the location of your +# dev system rclone binary (this one is brew installed on a Mac M1) +RCLONE_BINARY=$(which rclone) + +# we want to exit immediately on error (especially for Go compile errors) +set -e + +# bring in some helpful bash assertions +. test-assert.sh + +# build our rclone batch executable +go build + +# make a temporary directory for the copy destination +TEMPD=$(mktemp -d) +if [ ! -e "$TEMPD" ]; then + >&2 echo "Failed to create temp directory" + exit 1 +fi + +trap 'rm -rf "$TEMPD"' EXIT + +# +# test 1 (main case of just copying files) +# + +DESTINATION="$TEMPD/test1" ./rclone-batch $RCLONE_BINARY ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" + +# Uncomment to debug invalid result +# cat "$TEMPD/result.json" + +assert " find $TEMPD/test1 -type f | awk 'END{print NR}' " "2" +assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "20" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "21" + +rm "$TEMPD/result.json" + +# +# test 2 (error cases with one file to fail) +# + +DESTINATION="$TEMPD/test2" ./rclone-batch $RCLONE_BINARY ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" + +# Uncomment to debug invalid result +# cat "$TEMPD/result.json" + +assert "find $TEMPD/test2 -type f | awk 'END{print NR}'" "1" +assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "directory not found" +assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "0" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "null" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "21" + +rm "$TEMPD/result.json" + +# +# test 3 (signal intercept) +# +# this is a test that app will intercept a SIGTERM, pass it to any running rclone process, +# and return sensible results +# + +# we set the bandwidth to 1B so that it is slow enough that our TERM signal will come mid-process +# we start this execution in the background +DESTINATION="$TEMPD/test3" DEBUG_BANDWIDTH="1B" ./rclone-batch $RCLONE_BINARY ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & + +# wait a small amount +sleep 1 + +# now send a SIGTERM to the launched job +kill %1 + +# Uncomment to debug invalid result +# cat "$TEMPD/result.json" + +assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "Interrupted by SIGTERM" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "Skipped due to SIGTERM received" + +rm "$TEMPD/result.json" + +# +# end overall testing and set return code +# + +assert_end examples diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt new file mode 100644 index 0000000..79dfee6 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt @@ -0,0 +1 @@ +This is test file 2 diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts index 6430ad5..15add7c 100644 --- a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts @@ -8,7 +8,7 @@ import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; import { join } from "path"; -type CanWriteLambdaStepProps = { +type ThawObjectsLambdaStepProps = { vpc: IVpc; vpcSubnetSelection: SubnetType; @@ -30,10 +30,10 @@ type CanWriteLambdaStepProps = { * bucket exists, is in the correct region, and is writeable * by us. Throws an exception if any of these conditions is not met. */ -export class CanWriteLambdaStepConstruct extends Construct { +export class ThawObjectsLambdaStepConstruct extends Construct { public readonly invocableLambda; - constructor(scope: Construct, id: string, props: CanWriteLambdaStepProps) { + constructor(scope: Construct, id: string, props: ThawObjectsLambdaStepProps) { super(scope, id); const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json index 6c62bf2..c97b73b 100644 --- a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json +++ b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json @@ -1,7 +1,7 @@ { "name": "can-write-lambda", "version": "1.0.0", - "main": "can-write-lambda.js", + "main": "thaw-objects-lambda.js", "dependencies": { "@aws-sdk/client-s3": "^3.405.0" } diff --git a/packages/aws-copy-out-sharer/copy-out-stack.ts b/packages/aws-copy-out-sharer/copy-out-stack.ts index 18767da..aecc5f5 100644 --- a/packages/aws-copy-out-sharer/copy-out-stack.ts +++ b/packages/aws-copy-out-sharer/copy-out-stack.ts @@ -4,7 +4,7 @@ import { CopyOutStackProps } from "./copy-out-stack-props"; import { Cluster } from "aws-cdk-lib/aws-ecs"; import { CopyOutStateMachineConstruct } from "./construct/copy-out-state-machine-construct"; import { Service } from "aws-cdk-lib/aws-servicediscovery"; -import { InfrastructureClient } from "@elsa-data/aws-infrastructure-client"; +import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; export { CopyOutStackProps, SubnetType } from "./copy-out-stack-props"; @@ -31,12 +31,18 @@ export class CopyOutStack extends Stack { description: "Parallel file copying service", }); - new CopyOutStateMachineConstruct(this, "CopyOut", { + const copyOut = new CopyOutStateMachineConstruct(this, "CopyOut", { vpc: vpc, vpcSubnetSelection: props.infrastructureSubnetSelection, fargateCluster: cluster, - namespaceService: service, aggressiveTimes: props.isDevelopment, + allowWriteToThisAccount: props.isDevelopment, + }); + + service.registerNonIpInstance("StateMachine", { + customAttributes: { + stateMachineArn: copyOut.stateMachine.stateMachineArn, + }, }); } } diff --git a/packages/aws-copy-out-sharer/package.json b/packages/aws-copy-out-sharer/package.json index ae2cb29..8a2c7ed 100644 --- a/packages/aws-copy-out-sharer/package.json +++ b/packages/aws-copy-out-sharer/package.json @@ -28,18 +28,17 @@ "targets": {} }, "dependencies": { - "@elsa-data/aws-infrastructure-client": "1.3.4" + "@elsa-data/aws-infrastructure": "^1.5.1" }, "peerDependencies": { - "aws-cdk-lib": "^2.93.0", - "constructs": "^10.2.70", - "@elsa-data/aws-infrastructure-client": "^1.3.4" + "aws-cdk-lib": "^2.108.1", + "constructs": "^10.3.0" }, "devDependencies": { - "aws-cdk-lib": "2.93.0", - "constructs": "10.2.70", - "jsii": "5.2.2", - "jsii-pacmak": "1.88.0", - "publib": "0.2.737" + "aws-cdk-lib": "2.108.1", + "constructs": "10.3.0", + "jsii": "5.2.29", + "jsii-pacmak": "1.91.0", + "publib": "0.2.745" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14a5e34..41908af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,43 +28,52 @@ importers: dev: dependencies: + "@aws-sdk/client-s3": + specifier: 3.450.0 + version: 3.450.0 + "@aws-sdk/client-servicediscovery": + specifier: 3.450.0 + version: 3.450.0 + "@aws-sdk/client-sfn": + specifier: 3.450.0 + version: 3.450.0 aws-cdk: - specifier: 2.93.0 - version: 2.93.0 + specifier: 2.108.1 + version: 2.108.1 aws-cdk-lib: - specifier: 2.93.0 - version: 2.93.0(constructs@10.2.70) + specifier: 2.108.1 + version: 2.108.1(constructs@10.3.0) aws-copy-out-sharer: specifier: link:../packages/aws-copy-out-sharer version: link:../packages/aws-copy-out-sharer packages/aws-copy-out-sharer: dependencies: - "@elsa-data/aws-infrastructure-client": - specifier: 1.3.4 - version: 1.3.4(aws-cdk-lib@2.93.0)(constructs@10.2.70) + "@elsa-data/aws-infrastructure": + specifier: ^1.5.1 + version: 1.5.1(aws-cdk-lib@2.108.1)(constructs@10.3.0) devDependencies: aws-cdk-lib: - specifier: 2.93.0 - version: 2.93.0(constructs@10.2.70) + specifier: 2.108.1 + version: 2.108.1(constructs@10.3.0) constructs: - specifier: 10.2.70 - version: 10.2.70 + specifier: 10.3.0 + version: 10.3.0 jsii: - specifier: 5.2.2 - version: 5.2.2 + specifier: 5.2.29 + version: 5.2.29 jsii-pacmak: - specifier: 1.88.0 - version: 1.88.0 + specifier: 1.91.0 + version: 1.91.0 publib: - specifier: 0.2.737 - version: 0.2.737 + specifier: 0.2.745 + version: 0.2.745 packages: - /@aws-cdk/asset-awscli-v1@2.2.200: + /@aws-cdk/asset-awscli-v1@2.2.201: resolution: { - integrity: sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==, + integrity: sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==, } /@aws-cdk/asset-kubectl-v20@2.1.2: @@ -88,7 +97,17 @@ packages: "@aws-crypto/util": 3.0.0 "@aws-sdk/types": 3.398.0 tslib: 1.14.1 - dev: true + + /@aws-crypto/crc32c@3.0.0: + resolution: + { + integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==, + } + dependencies: + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.449.0 + tslib: 1.14.1 + dev: false /@aws-crypto/ie11-detection@3.0.0: resolution: @@ -97,7 +116,21 @@ packages: } dependencies: tslib: 1.14.1 - dev: true + + /@aws-crypto/sha1-browser@3.0.0: + resolution: + { + integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==, + } + dependencies: + "@aws-crypto/ie11-detection": 3.0.0 + "@aws-crypto/supports-web-crypto": 3.0.0 + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-locate-window": 3.310.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false /@aws-crypto/sha256-browser@3.0.0: resolution: @@ -109,11 +142,10 @@ packages: "@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/supports-web-crypto": 3.0.0 "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.398.0 + "@aws-sdk/types": 3.451.0 "@aws-sdk/util-locate-window": 3.310.0 "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 - dev: true /@aws-crypto/sha256-js@3.0.0: resolution: @@ -122,9 +154,8 @@ packages: } dependencies: "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.398.0 + "@aws-sdk/types": 3.451.0 tslib: 1.14.1 - dev: true /@aws-crypto/supports-web-crypto@3.0.0: resolution: @@ -133,7 +164,6 @@ packages: } dependencies: tslib: 1.14.1 - dev: true /@aws-crypto/util@3.0.0: resolution: @@ -144,460 +174,1138 @@ packages: "@aws-sdk/types": 3.398.0 "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 - dev: true - /@aws-sdk/client-codeartifact@3.405.0: + /@aws-sdk/client-codeartifact@3.451.0: resolution: { - integrity: sha512-eucE3/7+L11MrBNmp5kDz9YcwIwYA0aoDQlmE0Nte1QuEW0nOykfyA/UnWnoCHjScZfMXpY1mgH7MbqYvQ0o6A==, + integrity: sha512-uM9/zPdP3xAi2sXFNa2/uzMVak0/pk7zcybFxUKuzG3mzUS05lbnbm5rz4l3ePoBidEE1Zqy070S6Uhl4SMl2g==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.405.0 - "@aws-sdk/credential-provider-node": 3.405.0 - "@aws-sdk/middleware-host-header": 3.398.0 - "@aws-sdk/middleware-logger": 3.398.0 - "@aws-sdk/middleware-recursion-detection": 3.398.0 - "@aws-sdk/middleware-signing": 3.398.0 - "@aws-sdk/middleware-user-agent": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@aws-sdk/util-user-agent-browser": 3.398.0 - "@aws-sdk/util-user-agent-node": 3.405.0 - "@smithy/config-resolver": 2.0.5 - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/hash-node": 2.0.5 - "@smithy/invalid-dependency": 2.0.5 - "@smithy/middleware-content-length": 2.0.5 - "@smithy/middleware-endpoint": 2.0.5 - "@smithy/middleware-retry": 2.0.5 - "@smithy/middleware-serde": 2.0.5 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/node-http-handler": 2.0.5 - "@smithy/protocol-http": 2.0.5 - "@smithy/smithy-client": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 - "@smithy/util-base64": 2.0.0 + "@aws-sdk/client-sts": 3.451.0 + "@aws-sdk/core": 3.451.0 + "@aws-sdk/credential-provider-node": 3.451.0 + "@aws-sdk/middleware-host-header": 3.451.0 + "@aws-sdk/middleware-logger": 3.451.0 + "@aws-sdk/middleware-recursion-detection": 3.451.0 + "@aws-sdk/middleware-signing": 3.451.0 + "@aws-sdk/middleware-user-agent": 3.451.0 + "@aws-sdk/region-config-resolver": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/util-user-agent-browser": 3.451.0 + "@aws-sdk/util-user-agent-node": 3.451.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.6 - "@smithy/util-defaults-mode-node": 2.0.7 - "@smithy/util-retry": 2.0.0 - "@smithy/util-stream": 2.0.5 - "@smithy/util-utf8": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-stream": 2.0.20 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/client-cognito-identity@3.405.0: + /@aws-sdk/client-cognito-identity@3.451.0: resolution: { - integrity: sha512-kvmNAREFQbhaZoEMQzBOYTaN7cFIOLgk2DZYYlHh2ErUYXSbvbVOBUriMRW9hRDtKLooe3ZFBLO3sWKvQE/AfA==, + integrity: sha512-xoImUiGoaXJZpOCgbWcdrU4vHJ8HG5KluaCkc32kuFobM277sjQimaUIHOGHL24M5vyo4QxcJD9CT/IhX63Vlg==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.405.0 - "@aws-sdk/credential-provider-node": 3.405.0 - "@aws-sdk/middleware-host-header": 3.398.0 - "@aws-sdk/middleware-logger": 3.398.0 - "@aws-sdk/middleware-recursion-detection": 3.398.0 - "@aws-sdk/middleware-signing": 3.398.0 - "@aws-sdk/middleware-user-agent": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@aws-sdk/util-user-agent-browser": 3.398.0 - "@aws-sdk/util-user-agent-node": 3.405.0 - "@smithy/config-resolver": 2.0.5 - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/hash-node": 2.0.5 - "@smithy/invalid-dependency": 2.0.5 - "@smithy/middleware-content-length": 2.0.5 - "@smithy/middleware-endpoint": 2.0.5 - "@smithy/middleware-retry": 2.0.5 - "@smithy/middleware-serde": 2.0.5 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/node-http-handler": 2.0.5 - "@smithy/protocol-http": 2.0.5 - "@smithy/smithy-client": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 - "@smithy/util-base64": 2.0.0 + "@aws-sdk/client-sts": 3.451.0 + "@aws-sdk/core": 3.451.0 + "@aws-sdk/credential-provider-node": 3.451.0 + "@aws-sdk/middleware-host-header": 3.451.0 + "@aws-sdk/middleware-logger": 3.451.0 + "@aws-sdk/middleware-recursion-detection": 3.451.0 + "@aws-sdk/middleware-signing": 3.451.0 + "@aws-sdk/middleware-user-agent": 3.451.0 + "@aws-sdk/region-config-resolver": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/util-user-agent-browser": 3.451.0 + "@aws-sdk/util-user-agent-node": 3.451.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.6 - "@smithy/util-defaults-mode-node": 2.0.7 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/client-sso@3.405.0: + /@aws-sdk/client-s3@3.450.0: resolution: { - integrity: sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==, + integrity: sha512-mw+zNVOXqsNjGrKjykcqxsiTMHTomcFEYODa5CEE6CeJQ2COwjNN9urzFO/uocA9z/2K3t1dG/q+2mvP0EcC2A==, } engines: { node: ">=14.0.0" } dependencies: + "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.398.0 - "@aws-sdk/middleware-logger": 3.398.0 - "@aws-sdk/middleware-recursion-detection": 3.398.0 - "@aws-sdk/middleware-user-agent": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@aws-sdk/util-user-agent-browser": 3.398.0 - "@aws-sdk/util-user-agent-node": 3.405.0 - "@smithy/config-resolver": 2.0.5 - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/hash-node": 2.0.5 - "@smithy/invalid-dependency": 2.0.5 - "@smithy/middleware-content-length": 2.0.5 - "@smithy/middleware-endpoint": 2.0.5 - "@smithy/middleware-retry": 2.0.5 - "@smithy/middleware-serde": 2.0.5 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/node-http-handler": 2.0.5 - "@smithy/protocol-http": 2.0.5 - "@smithy/smithy-client": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 + "@aws-sdk/client-sts": 3.450.0 + "@aws-sdk/core": 3.445.0 + "@aws-sdk/credential-provider-node": 3.450.0 + "@aws-sdk/middleware-bucket-endpoint": 3.449.0 + "@aws-sdk/middleware-expect-continue": 3.449.0 + "@aws-sdk/middleware-flexible-checksums": 3.449.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-location-constraint": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-sdk-s3": 3.449.0 + "@aws-sdk/middleware-signing": 3.449.0 + "@aws-sdk/middleware-ssec": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/signature-v4-multi-region": 3.449.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@aws-sdk/xml-builder": 3.310.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/eventstream-serde-browser": 2.0.13 + "@smithy/eventstream-serde-config-resolver": 2.0.13 + "@smithy/eventstream-serde-node": 2.0.13 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-blob-browser": 2.0.14 + "@smithy/hash-node": 2.0.15 + "@smithy/hash-stream-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/md5-js": 2.0.15 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 "@smithy/util-base64": 2.0.0 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.6 - "@smithy/util-defaults-mode-node": 2.0.7 - "@smithy/util-retry": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-stream": 2.0.20 "@smithy/util-utf8": 2.0.0 + "@smithy/util-waiter": 2.0.13 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-servicediscovery@3.450.0: + resolution: + { + integrity: sha512-TM4KvHrw+Fq9yPQhzRINQ79jP24lS8JfiGb7mEKPZbRIMu0bW+26zgELD9BftfPa/vtubFwBA0qcwpk/g3J5SA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.450.0 + "@aws-sdk/core": 3.445.0 + "@aws-sdk/credential-provider-node": 3.450.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-signing": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 + tslib: 2.6.2 + uuid: 8.3.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sfn@3.450.0: + resolution: + { + integrity: sha512-z0SyE6fUpJ3IEbaHruw4oCqszxAt97507/KZBv89DLFz2WBuZCmq4hr0rp4/rQuMzi6X9Tvd6MZP4GeuNWDm8g==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.450.0 + "@aws-sdk/core": 3.445.0 + "@aws-sdk/credential-provider-node": 3.450.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-signing": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.450.0: + resolution: + { + integrity: sha512-xutima6DhrTLMyBc1nmLhWXarvrqbH1zizrQpG7cLdwfqHEOi3thR3SWu+pUC4XN9kiXQUb2HUMcv/vdqmknkQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.445.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.451.0: + resolution: + { + integrity: sha512-KkYSke3Pdv3MfVH/5fT528+MKjMyPKlcLcd4zQb0x6/7Bl7EHrPh1JZYjzPLHelb+UY5X0qN8+cb8iSu1eiwIQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.451.0 + "@aws-sdk/middleware-host-header": 3.451.0 + "@aws-sdk/middleware-logger": 3.451.0 + "@aws-sdk/middleware-recursion-detection": 3.451.0 + "@aws-sdk/middleware-user-agent": 3.451.0 + "@aws-sdk/region-config-resolver": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/util-user-agent-browser": 3.451.0 + "@aws-sdk/util-user-agent-node": 3.451.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/client-sts@3.405.0: + /@aws-sdk/client-sts@3.450.0: resolution: { - integrity: sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==, + integrity: sha512-pHZ/3NHHtK5YbjYrh2jT8eePSYSunyvcIhdASMqYVg3Enw/BxA0IKL8bZ/slolhqR1sAQx4sKRAO7dZK418Q6w==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/credential-provider-node": 3.405.0 - "@aws-sdk/middleware-host-header": 3.398.0 - "@aws-sdk/middleware-logger": 3.398.0 - "@aws-sdk/middleware-recursion-detection": 3.398.0 - "@aws-sdk/middleware-sdk-sts": 3.398.0 - "@aws-sdk/middleware-signing": 3.398.0 - "@aws-sdk/middleware-user-agent": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@aws-sdk/util-user-agent-browser": 3.398.0 - "@aws-sdk/util-user-agent-node": 3.405.0 - "@smithy/config-resolver": 2.0.5 - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/hash-node": 2.0.5 - "@smithy/invalid-dependency": 2.0.5 - "@smithy/middleware-content-length": 2.0.5 - "@smithy/middleware-endpoint": 2.0.5 - "@smithy/middleware-retry": 2.0.5 - "@smithy/middleware-serde": 2.0.5 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/node-http-handler": 2.0.5 - "@smithy/protocol-http": 2.0.5 - "@smithy/smithy-client": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 - "@smithy/util-base64": 2.0.0 + "@aws-sdk/core": 3.445.0 + "@aws-sdk/credential-provider-node": 3.450.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-sdk-sts": 3.449.0 + "@aws-sdk/middleware-signing": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.6 - "@smithy/util-defaults-mode-node": 2.0.7 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.451.0: + resolution: + { + integrity: sha512-48NcIRxWBdP1fom6RSjwn2R2u7SE7eeV3p+c4s7ukEOfrHhBxJfn3EpqBVQMGzdiU55qFImy+Fe81iA2lXq3Jw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.451.0 + "@aws-sdk/credential-provider-node": 3.451.0 + "@aws-sdk/middleware-host-header": 3.451.0 + "@aws-sdk/middleware-logger": 3.451.0 + "@aws-sdk/middleware-recursion-detection": 3.451.0 + "@aws-sdk/middleware-sdk-sts": 3.451.0 + "@aws-sdk/middleware-signing": 3.451.0 + "@aws-sdk/middleware-user-agent": 3.451.0 + "@aws-sdk/region-config-resolver": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/util-user-agent-browser": 3.451.0 + "@aws-sdk/util-user-agent-node": 3.451.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 fast-xml-parser: 4.2.5 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-cognito-identity@3.405.0: + /@aws-sdk/core@3.445.0: resolution: { - integrity: sha512-tmu8r0kB3qHHIitQAwiziWzxoaGCv/vCh00EcabuW3x3UsKQUF71ZLuNcMOv5wqTsQw0Fmv3dKy2tzVmRm3Z5g==, + integrity: sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.405.0 - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@smithy/smithy-client": 2.1.15 + tslib: 2.6.2 + dev: false + + /@aws-sdk/core@3.451.0: + resolution: + { + integrity: sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/smithy-client": 2.1.15 + tslib: 2.6.2 + dev: true + + /@aws-sdk/credential-provider-cognito-identity@3.451.0: + resolution: + { + integrity: sha512-g1ZT46NuYfou00d94rJZ59N4TLI1T+v46lbHTtF9jwohiUsi7/vHkPIOdrgtrThGzGUVl01w62N0a2mpMydaBA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/client-cognito-identity": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-env@3.398.0: + /@aws-sdk/credential-provider-env@3.449.0: resolution: { - integrity: sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==, + integrity: sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.451.0: + resolution: + { + integrity: sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/credential-provider-ini@3.405.0: + /@aws-sdk/credential-provider-http@3.451.0: resolution: { - integrity: sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==, + integrity: sha512-q82kEzymqimkJ2dHmuN2RGpi9HTFSxwwoXALnzPRaRcvR/v+YY8FMgSTfwXzPkHUDf/q8J+aDz6lPcYlnsP3sQ==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.398.0 - "@aws-sdk/credential-provider-process": 3.405.0 - "@aws-sdk/credential-provider-sso": 3.405.0 - "@aws-sdk/credential-provider-web-identity": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@smithy/credential-provider-imds": 2.0.7 - "@smithy/property-provider": 2.0.6 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.451.0 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/node-http-handler": 2.1.9 + "@smithy/property-provider": 2.0.14 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/util-stream": 2.0.20 + tslib: 2.6.2 + dev: true + + /@aws-sdk/credential-provider-ini@3.450.0: + resolution: + { + integrity: sha512-quil0bUH43irhEtHBBpnleVQd1ZBX9kDVf8HziK/LIhujTmHDAoDODnjhUczdJU6srMJgAJi1oVTaVek5emh9Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.449.0 + "@aws-sdk/credential-provider-process": 3.449.0 + "@aws-sdk/credential-provider-sso": 3.450.0 + "@aws-sdk/credential-provider-web-identity": 3.449.0 + "@aws-sdk/types": 3.449.0 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-ini@3.451.0: + resolution: + { + integrity: sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.451.0 + "@aws-sdk/credential-provider-process": 3.451.0 + "@aws-sdk/credential-provider-sso": 3.451.0 + "@aws-sdk/credential-provider-web-identity": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-node@3.405.0: + /@aws-sdk/credential-provider-node@3.450.0: resolution: { - integrity: sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==, + integrity: sha512-d4tQklhvsydNCer5Axd2sNptqqdalE78esDk0zA/cYaj56GniKqk3HLJLgb/wdv2/Ho6/4DhWeM5W4LaJNRivA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.398.0 - "@aws-sdk/credential-provider-ini": 3.405.0 - "@aws-sdk/credential-provider-process": 3.405.0 - "@aws-sdk/credential-provider-sso": 3.405.0 - "@aws-sdk/credential-provider-web-identity": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@smithy/credential-provider-imds": 2.0.7 - "@smithy/property-provider": 2.0.6 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/credential-provider-env": 3.449.0 + "@aws-sdk/credential-provider-ini": 3.450.0 + "@aws-sdk/credential-provider-process": 3.449.0 + "@aws-sdk/credential-provider-sso": 3.450.0 + "@aws-sdk/credential-provider-web-identity": 3.449.0 + "@aws-sdk/types": 3.449.0 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.451.0: + resolution: + { + integrity: sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.451.0 + "@aws-sdk/credential-provider-ini": 3.451.0 + "@aws-sdk/credential-provider-process": 3.451.0 + "@aws-sdk/credential-provider-sso": 3.451.0 + "@aws-sdk/credential-provider-web-identity": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-process@3.405.0: + /@aws-sdk/credential-provider-process@3.449.0: resolution: { - integrity: sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==, + integrity: sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + 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" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/credential-provider-sso@3.405.0: + /@aws-sdk/credential-provider-sso@3.450.0: resolution: { - integrity: sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==, + integrity: sha512-zzr9s5bG38TRn82eJXzG1/AglDihrcINn9TBfwOL8OBl0J6MF7EPAS92VpOuYs09H70MOWSZkmzEftq1urwC0g==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-sso": 3.405.0 - "@aws-sdk/token-providers": 3.405.0 - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/client-sso": 3.450.0 + "@aws-sdk/token-providers": 3.449.0 + "@aws-sdk/types": 3.449.0 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-sso@3.451.0: + resolution: + { + integrity: sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/client-sso": 3.451.0 + "@aws-sdk/token-providers": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-web-identity@3.398.0: + /@aws-sdk/credential-provider-web-identity@3.449.0: resolution: { - integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==, + integrity: sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-web-identity@3.451.0: + resolution: + { + integrity: sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/credential-providers@3.405.0: + /@aws-sdk/credential-providers@3.451.0: resolution: { - integrity: sha512-332QZ2Wrr5gfFUGPLwITcjhxnBD4y94fxKg7qerSBq7fjjIkl/OjnchZf5ReePrjpglxs6hgLdGrPYIYPC4Hhw==, + integrity: sha512-ihbYZrI/tSVsZFDGLfJoCx3sg1s9EQqWA+xbLoquK+RjMqTnaeshYntFJmQA5yqCIbcAkyw63OwOIBRrVb7tMA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.405.0 - "@aws-sdk/client-sso": 3.405.0 - "@aws-sdk/client-sts": 3.405.0 - "@aws-sdk/credential-provider-cognito-identity": 3.405.0 - "@aws-sdk/credential-provider-env": 3.398.0 - "@aws-sdk/credential-provider-ini": 3.405.0 - "@aws-sdk/credential-provider-node": 3.405.0 - "@aws-sdk/credential-provider-process": 3.405.0 - "@aws-sdk/credential-provider-sso": 3.405.0 - "@aws-sdk/credential-provider-web-identity": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@smithy/credential-provider-imds": 2.0.7 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@aws-sdk/client-cognito-identity": 3.451.0 + "@aws-sdk/client-sso": 3.451.0 + "@aws-sdk/client-sts": 3.451.0 + "@aws-sdk/credential-provider-cognito-identity": 3.451.0 + "@aws-sdk/credential-provider-env": 3.451.0 + "@aws-sdk/credential-provider-http": 3.451.0 + "@aws-sdk/credential-provider-ini": 3.451.0 + "@aws-sdk/credential-provider-node": 3.451.0 + "@aws-sdk/credential-provider-process": 3.451.0 + "@aws-sdk/credential-provider-sso": 3.451.0 + "@aws-sdk/credential-provider-web-identity": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/middleware-host-header@3.398.0: + /@aws-sdk/middleware-bucket-endpoint@3.449.0: resolution: { - integrity: sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==, + integrity: sha512-gH+IEdDfhzTmQLdWwfc23A40EhvvAhk8taXUu3DX/lXl+2lBqd4qCoGk8vfUtwh9y1kbRDnhLq04XM2DPvvj2w==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/protocol-http": 2.0.5 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-arn-parser": 3.310.0 + "@smithy/node-config-provider": 2.1.5 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + "@smithy/util-config-provider": 2.0.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-expect-continue@3.449.0: + resolution: + { + integrity: sha512-OOR78JoTbCo/42HViuA+F2Uy/cNWo31mN0YZJRbnY5oAMgLRrY7d2+NlJpvHlS4XPdUZ6UHeUecJ9BAWuVuWAQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.449.0: + resolution: + { + integrity: sha512-pKBgmwqA6jdiWZrYX0uaPOGdRldRiG2ArA7ufS5B7iz9X1JJP8ESZcO2wD+AbrLBtkZtVG31974qpqfNU6n4dQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@aws-crypto/crc32c": 3.0.0 + "@aws-sdk/types": 3.449.0 + "@smithy/is-array-buffer": 2.0.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.449.0: + resolution: + { + integrity: sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.451.0: + resolution: + { + integrity: sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-logger@3.398.0: + /@aws-sdk/middleware-location-constraint@3.449.0: resolution: { - integrity: sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==, + integrity: sha512-MPCFKOpgke/ZV6WSxZZ/y9X4mn0ywLC2HVcaPJvDSKA0gsRtJLEQjWs2+I2QYTzEM0iwgoW9UOSgbFZYXF0Pow==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.449.0: + resolution: + { + integrity: sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.451.0: + resolution: + { + integrity: sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-recursion-detection@3.398.0: + /@aws-sdk/middleware-recursion-detection@3.449.0: resolution: { - integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==, + integrity: sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/protocol-http": 2.0.5 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.451.0: + resolution: + { + integrity: sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-sdk-sts@3.398.0: + /@aws-sdk/middleware-sdk-s3@3.449.0: resolution: { - integrity: sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==, + integrity: sha512-HbgWdv0txBdV9+9aJSGtGWXnQlVvpIXS6gqmJ5ESHKwZMiRHXswwptccZkvSrLjCQr5uuN37yIz3219MRrvrmw==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/middleware-signing": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-arn-parser": 3.310.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-sts@3.449.0: + resolution: + { + integrity: sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/middleware-signing": 3.449.0 + "@aws-sdk/types": 3.449.0 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-sts@3.451.0: + resolution: + { + integrity: sha512-UJ6UfVUEgp0KIztxpAeelPXI5MLj9wUtUCqYeIMP7C1ZhoEMNm3G39VLkGN43dNhBf1LqjsV9jkKMZbVfYXuwg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/middleware-signing": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-signing@3.398.0: + /@aws-sdk/middleware-signing@3.449.0: resolution: { - integrity: sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==, + integrity: sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/property-provider": 2.0.6 - "@smithy/protocol-http": 2.0.5 + "@aws-sdk/types": 3.449.0 + "@smithy/property-provider": 2.0.14 + "@smithy/protocol-http": 3.0.9 "@smithy/signature-v4": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/util-middleware": 2.0.0 + "@smithy/types": 2.5.0 + "@smithy/util-middleware": 2.0.6 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.451.0: + resolution: + { + integrity: sha512-s5ZlcIoLNg1Huj4Qp06iKniE8nJt/Pj1B/fjhWc6cCPCM7XJYUCejCnRh6C5ZJoBEYodjuwZBejPc1Wh3j+znA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/property-provider": 2.0.14 + "@smithy/protocol-http": 3.0.9 + "@smithy/signature-v4": 2.0.5 + "@smithy/types": 2.5.0 + "@smithy/util-middleware": 2.0.6 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-user-agent@3.398.0: + /@aws-sdk/middleware-ssec@3.449.0: resolution: { - integrity: sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==, + integrity: sha512-NY7jt1/ukqXCUqnaK2rlm5yGFyj9sOJBqK6X8Gpu5qQaYAvIP892U1UMj6VTPC7yBLPYhW2/YCfDvxOClbqKEg==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@smithy/protocol-http": 2.0.5 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.449.0: + resolution: + { + integrity: sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.451.0: + resolution: + { + integrity: sha512-8NM/0JiKLNvT9wtAQVl1DFW0cEO7OvZyLSUBLNLTHqyvOZxKaZ8YFk7d8PL6l76LeUKRxq4NMxfZQlUIRe0eSA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: true + + /@aws-sdk/region-config-resolver@3.433.0: + resolution: + { + integrity: sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 + "@smithy/util-config-provider": 2.0.0 + "@smithy/util-middleware": 2.0.6 + tslib: 2.6.2 + dev: false + + /@aws-sdk/region-config-resolver@3.451.0: + resolution: + { + integrity: sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 + "@smithy/util-config-provider": 2.0.0 + "@smithy/util-middleware": 2.0.6 tslib: 2.6.2 dev: true - /@aws-sdk/token-providers@3.405.0: + /@aws-sdk/signature-v4-multi-region@3.449.0: resolution: { - integrity: sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==, + integrity: sha512-Ne8dF3R2Cj6JJBw0Utm7INtoJ2PdqGNgDpeTOFTnFGSGWnsumACbcVp4ikcZzgABTCQgKx88wPdXUHUZtaBqcg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@smithy/protocol-http": 3.0.9 + "@smithy/signature-v4": 2.0.5 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/token-providers@3.449.0: + resolution: + { + integrity: sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.398.0 - "@aws-sdk/middleware-logger": 3.398.0 - "@aws-sdk/middleware-recursion-detection": 3.398.0 - "@aws-sdk/middleware-user-agent": 3.398.0 - "@aws-sdk/types": 3.398.0 - "@aws-sdk/util-endpoints": 3.398.0 - "@aws-sdk/util-user-agent-browser": 3.398.0 - "@aws-sdk/util-user-agent-node": 3.405.0 - "@smithy/config-resolver": 2.0.5 - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/hash-node": 2.0.5 - "@smithy/invalid-dependency": 2.0.5 - "@smithy/middleware-content-length": 2.0.5 - "@smithy/middleware-endpoint": 2.0.5 - "@smithy/middleware-retry": 2.0.5 - "@smithy/middleware-serde": 2.0.5 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/node-http-handler": 2.0.5 - "@smithy/property-provider": 2.0.6 - "@smithy/protocol-http": 2.0.5 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/smithy-client": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 - "@smithy/util-base64": 2.0.0 + "@aws-sdk/middleware-host-header": 3.449.0 + "@aws-sdk/middleware-logger": 3.449.0 + "@aws-sdk/middleware-recursion-detection": 3.449.0 + "@aws-sdk/middleware-user-agent": 3.449.0 + "@aws-sdk/region-config-resolver": 3.433.0 + "@aws-sdk/types": 3.449.0 + "@aws-sdk/util-endpoints": 3.449.0 + "@aws-sdk/util-user-agent-browser": 3.449.0 + "@aws-sdk/util-user-agent-node": 3.449.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/property-provider": 2.0.14 + "@smithy/protocol-http": 3.0.9 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.6 - "@smithy/util-defaults-mode-node": 2.0.7 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/token-providers@3.451.0: + resolution: + { + integrity: sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.451.0 + "@aws-sdk/middleware-logger": 3.451.0 + "@aws-sdk/middleware-recursion-detection": 3.451.0 + "@aws-sdk/middleware-user-agent": 3.451.0 + "@aws-sdk/region-config-resolver": 3.451.0 + "@aws-sdk/types": 3.451.0 + "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/util-user-agent-browser": 3.451.0 + "@aws-sdk/util-user-agent-node": 3.451.0 + "@smithy/config-resolver": 2.0.18 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/hash-node": 2.0.15 + "@smithy/invalid-dependency": 2.0.13 + "@smithy/middleware-content-length": 2.0.15 + "@smithy/middleware-endpoint": 2.2.0 + "@smithy/middleware-retry": 2.0.20 + "@smithy/middleware-serde": 2.0.13 + "@smithy/middleware-stack": 2.0.7 + "@smithy/node-config-provider": 2.1.5 + "@smithy/node-http-handler": 2.1.9 + "@smithy/property-provider": 2.0.14 + "@smithy/protocol-http": 3.0.9 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-base64": 2.0.1 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.1.0 + "@smithy/util-defaults-mode-browser": 2.0.19 + "@smithy/util-defaults-mode-node": 2.0.25 + "@smithy/util-endpoints": 1.0.4 + "@smithy/util-retry": 2.0.6 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 transitivePeerDependencies: - aws-crt @@ -612,16 +1320,58 @@ packages: dependencies: "@smithy/types": 2.2.2 tslib: 2.6.2 - dev: true - /@aws-sdk/util-endpoints@3.398.0: + /@aws-sdk/types@3.449.0: resolution: { - integrity: sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==, + integrity: sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.398.0 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + + /@aws-sdk/types@3.451.0: + resolution: + { + integrity: sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.5.0 + tslib: 2.6.2 + + /@aws-sdk/util-arn-parser@3.310.0: + resolution: + { + integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.449.0: + resolution: + { + integrity: sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.449.0 + "@smithy/util-endpoints": 1.0.4 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.451.0: + resolution: + { + integrity: sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/util-endpoints": 1.0.4 tslib: 2.6.2 dev: true @@ -633,24 +1383,35 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true - /@aws-sdk/util-user-agent-browser@3.398.0: + /@aws-sdk/util-user-agent-browser@3.449.0: resolution: { - integrity: sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==, + integrity: sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==, } dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/types": 2.5.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.451.0: + resolution: + { + integrity: sha512-Ws5mG3J0TQifH7OTcMrCTexo7HeSAc3cBgjfhS/ofzPUzVCtsyg0G7I6T7wl7vJJETix2Kst2cpOsxygPgPD9w==, + } + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/types": 2.5.0 bowser: 2.11.0 tslib: 2.6.2 dev: true - /@aws-sdk/util-user-agent-node@3.405.0: + /@aws-sdk/util-user-agent-node@3.449.0: resolution: { - integrity: sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==, + integrity: sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==, } engines: { node: ">=14.0.0" } peerDependencies: @@ -659,9 +1420,27 @@ packages: aws-crt: optional: true dependencies: - "@aws-sdk/types": 3.398.0 - "@smithy/node-config-provider": 2.0.7 - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.449.0 + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + 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" } + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + "@aws-sdk/types": 3.451.0 + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true @@ -672,13 +1451,16 @@ packages: } dependencies: tslib: 2.6.2 - dev: true - /@balena/dockerignore@1.0.2: + /@aws-sdk/xml-builder@3.310.0: resolution: { - integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==, + integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==, } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false /@cspotcode/source-map-support@0.8.1: resolution: @@ -690,20 +1472,18 @@ packages: "@jridgewell/trace-mapping": 0.3.9 dev: true - /@elsa-data/aws-infrastructure-client@1.3.4(aws-cdk-lib@2.93.0)(constructs@10.2.70): + /@elsa-data/aws-infrastructure@1.5.1(aws-cdk-lib@2.108.1)(constructs@10.3.0): resolution: { - integrity: sha512-qgqBiwdLd4MFb4yLjBpIv2TbIKXlRsYeECohDARXX06LOLgEEP2OuqAXofGkCANZ5HD2gC0LQh9cu7o3OaffDw==, + integrity: sha512-foP1LgYFWP2sR9R4FrpQyE/I+Vwh4NCMIt/8MwliNMwtAYYzCSHZduwyo9EekcHvCotfSC/hYexTL8uer+P37g==, } peerDependencies: - aws-cdk-lib: ^2.93.0 - constructs: ^10.2.70 + aws-cdk-lib: ^2.108.1 + constructs: ^10.3.0 dependencies: - aws-cdk-lib: 2.93.0(constructs@10.2.70) - constructs: 10.2.70 + aws-cdk-lib: 2.108.1(constructs@10.3.0) + constructs: 10.3.0 dev: false - bundledDependencies: - - shared /@esbuild/android-arm64@0.19.2: resolution: @@ -994,10 +1774,10 @@ packages: "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@jsii/check-node@1.88.0: + /@jsii/check-node@1.91.0: resolution: { - integrity: sha512-AveFyqkJIb8qZvGk5nZal/8mEJB6lWhwqvAQLodHmqE3WzpmZD5+h+aspBVt0El5cEFRJ1k1mrQqhAnJCVpvxg==, + integrity: sha512-K9UFkRe4uJNVp1O2o4OBM/3usba6Vw3XF1Mq3TVBAYl1EzpAiA62DojGp30+3zwFlb1lkavVj1hKlCrIWIuJhw==, } engines: { node: ">= 14.17.0" } dependencies: @@ -1005,131 +1785,227 @@ packages: semver: 7.5.4 dev: true - /@jsii/spec@1.88.0: + /@jsii/spec@1.91.0: resolution: { - integrity: sha512-Q6xirxPM06TRW0GcsHa+tzPZLwe9I+mFYx5BaNMimcv21u6bQnxfynZMgNhHqvLYCmP37HWg0SboUYTa5JROzw==, + integrity: sha512-Ir01bk5CwIFAApRJjRC+JG/f9db5dACEYFSxsHyvXRMu+J/LIANdwD4OPSelWrhbRiQdY6U16BKsRO63uaNRqg==, } engines: { node: ">= 14.17.0" } dependencies: ajv: 8.12.0 dev: true - /@nodelib/fs.scandir@2.1.5: + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + dev: true + + /@smithy/abort-controller@2.0.13: + resolution: + { + integrity: sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.5.0 + tslib: 2.6.2 + + /@smithy/chunked-blob-reader-native@2.0.1: + resolution: + { + integrity: sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==, + } + dependencies: + "@smithy/util-base64": 2.0.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader@2.0.0: + resolution: + { + integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==, + } + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.0.18: + resolution: + { + integrity: sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 + "@smithy/util-config-provider": 2.0.0 + "@smithy/util-middleware": 2.0.6 + tslib: 2.6.2 + + /@smithy/credential-provider-imds@2.1.1: + resolution: + { + integrity: sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.1.5 + "@smithy/property-provider": 2.0.14 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + tslib: 2.6.2 + + /@smithy/eventstream-codec@2.0.13: + resolution: + { + integrity: sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==, + } + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": 2.5.0 + "@smithy/util-hex-encoding": 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.0.5: resolution: { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + integrity: sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==, } - engines: { node: ">= 8" } dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - dev: true + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": 2.2.2 + "@smithy/util-hex-encoding": 2.0.0 + tslib: 2.6.2 - /@nodelib/fs.stat@2.0.5: + /@smithy/eventstream-serde-browser@2.0.13: resolution: { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + integrity: sha512-OJ/2g/VxkzA+mYZxV102oX3CsiE+igTSmqq/ir3oEVG2kSIdRC00ryttj/lmL14W06ExNi0ysmfLxQkL8XrAZQ==, } - engines: { node: ">= 8" } - dev: true + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/eventstream-serde-universal": 2.0.13 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false - /@nodelib/fs.walk@1.2.8: + /@smithy/eventstream-serde-config-resolver@2.0.13: resolution: { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + integrity: sha512-2BI1CbnYuEvAYoWSeWJtPNygbIKiWeSLxCmDLnyM6wQV32Of7VptiQlaFXPxXp4zqn/rs3ocZ/T29rxE4s4Gsg==, } - engines: { node: ">= 8" } + engines: { node: ">=14.0.0" } dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - dev: true + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false - /@smithy/abort-controller@2.0.5: + /@smithy/eventstream-serde-node@2.0.13: resolution: { - integrity: sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==, + integrity: sha512-7NbFwPafb924elFxCBDvm48jy/DeSrpFbFQN0uN2ThuY5HrEeubikS0t7WMva4Z4EnRoivpbuT0scb9vUIJKoA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/eventstream-serde-universal": 2.0.13 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true + dev: false - /@smithy/config-resolver@2.0.5: + /@smithy/eventstream-serde-universal@2.0.13: resolution: { - integrity: sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==, + integrity: sha512-j0yFd5UfftM+ia9dxLRbheJDCkCZBHpcEzCsPO8BxVOTbdcX/auVJCv6ov/yvpCKsf4Hv3mOqi0Is1YogM2g3Q==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 - "@smithy/util-config-provider": 2.0.0 - "@smithy/util-middleware": 2.0.0 + "@smithy/eventstream-codec": 2.0.13 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true + dev: false - /@smithy/credential-provider-imds@2.0.7: + /@smithy/fetch-http-handler@2.2.6: resolution: { - integrity: sha512-XivkZj/pipzpQPxgleE1odwJQ6oDsVViB4VUO/HRDI4EdEfZjud44USupOUOa/xOjS39/75DYB4zgTbyV+totw==, + integrity: sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==, } - engines: { node: ">=14.0.0" } dependencies: - "@smithy/node-config-provider": 2.0.7 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 + "@smithy/protocol-http": 3.0.9 + "@smithy/querystring-builder": 2.0.13 + "@smithy/types": 2.5.0 + "@smithy/util-base64": 2.0.1 tslib: 2.6.2 - dev: true - /@smithy/eventstream-codec@2.0.5: + /@smithy/hash-blob-browser@2.0.14: resolution: { - integrity: sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==, + integrity: sha512-yWdghyPJIEqLYsaE7YVgd3YhM7jN4Pv6eJQvTomnMsz5K2qRBlpjUx3T9fKlElp1qdeQ7DNc3sAat4i9CUBO7Q==, } dependencies: - "@aws-crypto/crc32": 3.0.0 - "@smithy/types": 2.2.2 - "@smithy/util-hex-encoding": 2.0.0 + "@smithy/chunked-blob-reader": 2.0.0 + "@smithy/chunked-blob-reader-native": 2.0.1 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true + dev: false - /@smithy/fetch-http-handler@2.0.5: + /@smithy/hash-node@2.0.15: resolution: { - integrity: sha512-EzFoMowdBNy1VqtvkiXgPFEdosIAt4/4bgZ8uiDiUyfhmNXq/3bV+CagPFFBsgFOR/X2XK4zFZHRsoa7PNHVVg==, + integrity: sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==, } + engines: { node: ">=14.0.0" } dependencies: - "@smithy/protocol-http": 2.0.5 - "@smithy/querystring-builder": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/util-base64": 2.0.0 + "@smithy/types": 2.5.0 + "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 - dev: true - /@smithy/hash-node@2.0.5: + /@smithy/hash-stream-node@2.0.15: resolution: { - integrity: sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==, + integrity: sha512-ZZ6kC/pHt5Dc2goXIIyC8uA7A4GUMSzdCynAabnZ3CSSaV6ctP8mlvVkqjPph0O3XzHlx/80gdLrNqi1GDPUsA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 - "@smithy/util-buffer-from": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/types": 2.5.0 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 - dev: true + dev: false - /@smithy/invalid-dependency@2.0.5: + /@smithy/invalid-dependency@2.0.13: resolution: { - integrity: sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==, + integrity: sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==, } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true /@smithy/is-array-buffer@2.0.0: resolution: @@ -1139,161 +2015,164 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true - /@smithy/middleware-content-length@2.0.5: + /@smithy/md5-js@2.0.15: + resolution: + { + integrity: sha512-pAZaokib56XvhU0t/R9vAcr3L3bMhIakhF25X7EMSQ7LAURiLfce/tgON8I3x/dIbnZUyeRi8f2cx2azu6ATew==, + } + dependencies: + "@smithy/types": 2.5.0 + "@smithy/util-utf8": 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.0.15: resolution: { - integrity: sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==, + integrity: sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/protocol-http": 2.0.5 - "@smithy/types": 2.2.2 + "@smithy/protocol-http": 3.0.9 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/middleware-endpoint@2.0.5: + /@smithy/middleware-endpoint@2.2.0: resolution: { - integrity: sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==, + integrity: sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/middleware-serde": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/url-parser": 2.0.5 - "@smithy/util-middleware": 2.0.0 + "@smithy/middleware-serde": 2.0.13 + "@smithy/node-config-provider": 2.1.5 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 + "@smithy/url-parser": 2.0.13 + "@smithy/util-middleware": 2.0.6 tslib: 2.6.2 - dev: true - /@smithy/middleware-retry@2.0.5: + /@smithy/middleware-retry@2.0.20: resolution: { - integrity: sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==, + integrity: sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/protocol-http": 2.0.5 - "@smithy/service-error-classification": 2.0.0 - "@smithy/types": 2.2.2 - "@smithy/util-middleware": 2.0.0 - "@smithy/util-retry": 2.0.0 + "@smithy/node-config-provider": 2.1.5 + "@smithy/protocol-http": 3.0.9 + "@smithy/service-error-classification": 2.0.6 + "@smithy/types": 2.5.0 + "@smithy/util-middleware": 2.0.6 + "@smithy/util-retry": 2.0.6 tslib: 2.6.2 uuid: 8.3.2 - dev: true - /@smithy/middleware-serde@2.0.5: + /@smithy/middleware-serde@2.0.13: resolution: { - integrity: sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==, + integrity: sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/middleware-stack@2.0.0: + /@smithy/middleware-stack@2.0.7: resolution: { - integrity: sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==, + integrity: sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==, } engines: { node: ">=14.0.0" } dependencies: + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/node-config-provider@2.0.7: + /@smithy/node-config-provider@2.1.5: resolution: { - integrity: sha512-GuLxhnf0aVQsfQp4ZWaM1TRCIndpQjAswyFcmDFRNf4yFqpxpLPDeV540+O0Z21Hmu3deoQm/dCPXbVn90PYzg==, + integrity: sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/property-provider": 2.0.6 - "@smithy/shared-ini-file-loader": 2.0.6 - "@smithy/types": 2.2.2 + "@smithy/property-provider": 2.0.14 + "@smithy/shared-ini-file-loader": 2.2.4 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/node-http-handler@2.0.5: + /@smithy/node-http-handler@2.1.9: resolution: { - integrity: sha512-lZm5DZf4b3V0saUw9WTC4/du887P6cy2fUyQgQQKRRV6OseButyD5yTzeMmXE53CaXJBMBsUvvIQ0hRVxIq56w==, + integrity: sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/abort-controller": 2.0.5 - "@smithy/protocol-http": 2.0.5 - "@smithy/querystring-builder": 2.0.5 - "@smithy/types": 2.2.2 + "@smithy/abort-controller": 2.0.13 + "@smithy/protocol-http": 3.0.9 + "@smithy/querystring-builder": 2.0.13 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/property-provider@2.0.6: + /@smithy/property-provider@2.0.14: resolution: { - integrity: sha512-CVem6ZkkWxbTnhjDLyLESY0oLA6IUZYtdqrCpGQKUXaFBOuc/izjm7fIFGBxEbjZ1EGcH9hHxrjqX36RWULNRg==, + integrity: sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/protocol-http@2.0.5: + /@smithy/protocol-http@3.0.9: resolution: { - integrity: sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==, + integrity: sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/querystring-builder@2.0.5: + /@smithy/querystring-builder@2.0.13: resolution: { - integrity: sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==, + integrity: sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 "@smithy/util-uri-escape": 2.0.0 tslib: 2.6.2 - dev: true - /@smithy/querystring-parser@2.0.5: + /@smithy/querystring-parser@2.0.13: resolution: { - integrity: sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==, + integrity: sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/service-error-classification@2.0.0: + /@smithy/service-error-classification@2.0.6: resolution: { - integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==, + integrity: sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==, } engines: { node: ">=14.0.0" } - dev: true + dependencies: + "@smithy/types": 2.5.0 - /@smithy/shared-ini-file-loader@2.0.6: + /@smithy/shared-ini-file-loader@2.2.4: resolution: { - integrity: sha512-NO6dHqho6APbVR0DxPtYoL4KXBqUeSM3Slsd103MOgL50YbzzsQmMLtDMZ87W8MlvvCN0tuiq+OrAO/rM7hTQg==, + integrity: sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true /@smithy/signature-v4@2.0.5: resolution: @@ -1310,20 +2189,18 @@ packages: "@smithy/util-uri-escape": 2.0.0 "@smithy/util-utf8": 2.0.0 tslib: 2.6.2 - dev: true - /@smithy/smithy-client@2.0.5: + /@smithy/smithy-client@2.1.15: resolution: { - integrity: sha512-kCTFr8wfOAWKDzGvfBElc6shHigWtHNhMQ1IbosjC4jOlayFyZMSs2PysKB+Ox/dhQ41KqOzgVjgiQ+PyWqHMQ==, + integrity: sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/middleware-stack": 2.0.0 - "@smithy/types": 2.2.2 - "@smithy/util-stream": 2.0.5 + "@smithy/middleware-stack": 2.0.7 + "@smithy/types": 2.5.0 + "@smithy/util-stream": 2.0.20 tslib: 2.6.2 - dev: true /@smithy/types@2.2.2: resolution: @@ -1333,18 +2210,25 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true - /@smithy/url-parser@2.0.5: + /@smithy/types@2.5.0: resolution: { - integrity: sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==, + integrity: sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==, } + engines: { node: ">=14.0.0" } dependencies: - "@smithy/querystring-parser": 2.0.5 - "@smithy/types": 2.2.2 tslib: 2.6.2 - dev: true + + /@smithy/url-parser@2.0.13: + resolution: + { + integrity: sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==, + } + dependencies: + "@smithy/querystring-parser": 2.0.13 + "@smithy/types": 2.5.0 + tslib: 2.6.2 /@smithy/util-base64@2.0.0: resolution: @@ -1355,7 +2239,17 @@ packages: dependencies: "@smithy/util-buffer-from": 2.0.0 tslib: 2.6.2 - dev: true + dev: false + + /@smithy/util-base64@2.0.1: + resolution: + { + integrity: sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.2 /@smithy/util-body-length-browser@2.0.0: resolution: @@ -1364,7 +2258,6 @@ packages: } dependencies: tslib: 2.6.2 - dev: true /@smithy/util-body-length-node@2.1.0: resolution: @@ -1374,7 +2267,6 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true /@smithy/util-buffer-from@2.0.0: resolution: @@ -1385,7 +2277,6 @@ packages: dependencies: "@smithy/is-array-buffer": 2.0.0 tslib: 2.6.2 - dev: true /@smithy/util-config-provider@2.0.0: resolution: @@ -1395,35 +2286,45 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true - /@smithy/util-defaults-mode-browser@2.0.6: + /@smithy/util-defaults-mode-browser@2.0.19: resolution: { - integrity: sha512-h8xyKTZIIom62DN4xbPUmL+RL1deZcK1qJGmCr4c2yXjOrs5/iZ1VtQQcl+xP78620ga/565AikZE1sktdg2yA==, + integrity: sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@smithy/property-provider": 2.0.14 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 bowser: 2.11.0 tslib: 2.6.2 - dev: true - /@smithy/util-defaults-mode-node@2.0.7: + /@smithy/util-defaults-mode-node@2.0.25: resolution: { - integrity: sha512-2C1YfmYJj9bpM/cRAgQppYNzPd8gDEXZ5XIVDuEQg3TmmIiinZaFf/HsHYo9NK/PMy5oawJVdIuR7SVriIo1AQ==, + integrity: sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/config-resolver": 2.0.5 - "@smithy/credential-provider-imds": 2.0.7 - "@smithy/node-config-provider": 2.0.7 - "@smithy/property-provider": 2.0.6 - "@smithy/types": 2.2.2 + "@smithy/config-resolver": 2.0.18 + "@smithy/credential-provider-imds": 2.1.1 + "@smithy/node-config-provider": 2.1.5 + "@smithy/property-provider": 2.0.14 + "@smithy/smithy-client": 2.1.15 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + + /@smithy/util-endpoints@1.0.4: + resolution: + { + integrity: sha512-FPry8j1xye5yzrdnf4xKUXVnkQErxdN7bUIaqC0OFoGsv2NfD9b2UUMuZSSt+pr9a8XWAqj0HoyVNUfPiZ/PvQ==, + } + engines: { node: ">= 14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.1.5 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true /@smithy/util-hex-encoding@2.0.0: resolution: @@ -1433,7 +2334,6 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true /@smithy/util-middleware@2.0.0: resolution: @@ -1443,35 +2343,43 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true - /@smithy/util-retry@2.0.0: + /@smithy/util-middleware@2.0.6: resolution: { - integrity: sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==, + integrity: sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.5.0 + tslib: 2.6.2 + + /@smithy/util-retry@2.0.6: + resolution: + { + integrity: sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==, } engines: { node: ">= 14.0.0" } dependencies: - "@smithy/service-error-classification": 2.0.0 + "@smithy/service-error-classification": 2.0.6 + "@smithy/types": 2.5.0 tslib: 2.6.2 - dev: true - /@smithy/util-stream@2.0.5: + /@smithy/util-stream@2.0.20: resolution: { - integrity: sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==, + integrity: sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/fetch-http-handler": 2.0.5 - "@smithy/node-http-handler": 2.0.5 - "@smithy/types": 2.2.2 - "@smithy/util-base64": 2.0.0 + "@smithy/fetch-http-handler": 2.2.6 + "@smithy/node-http-handler": 2.1.9 + "@smithy/types": 2.5.0 + "@smithy/util-base64": 2.0.1 "@smithy/util-buffer-from": 2.0.0 "@smithy/util-hex-encoding": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/util-utf8": 2.0.2 tslib: 2.6.2 - dev: true /@smithy/util-uri-escape@2.0.0: resolution: @@ -1481,7 +2389,6 @@ packages: engines: { node: ">=14.0.0" } dependencies: tslib: 2.6.2 - dev: true /@smithy/util-utf8@2.0.0: resolution: @@ -1492,7 +2399,28 @@ packages: dependencies: "@smithy/util-buffer-from": 2.0.0 tslib: 2.6.2 - dev: true + + /@smithy/util-utf8@2.0.2: + resolution: + { + integrity: sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.2 + + /@smithy/util-waiter@2.0.13: + resolution: + { + integrity: sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/abort-controller": 2.0.13 + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: false /@tsconfig/node10@1.0.9: resolution: @@ -1580,6 +2508,7 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: true /ansi-regex@5.0.1: resolution: @@ -1587,6 +2516,7 @@ packages: integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, } engines: { node: ">=8" } + dev: true /ansi-styles@4.3.0: resolution: @@ -1596,6 +2526,7 @@ packages: engines: { node: ">=8" } dependencies: color-convert: 2.0.1 + dev: true /arg@4.1.3: resolution: @@ -1604,36 +2535,19 @@ packages: } dev: true - /astral-regex@2.0.0: - resolution: - { - integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, - } - engines: { node: ">=8" } - - /aws-cdk-lib@2.93.0(constructs@10.2.70): + /aws-cdk-lib@2.108.1(constructs@10.3.0): resolution: { - integrity: sha512-kKbcKkts272Ju5xjGKI3pXTOpiJxW4OQbDF8Vmw/NIkkuJLo8GlRCFfeOfoN/hilvlYQgENA67GCgSWccbvu7w==, + integrity: sha512-rqBJIB8cVjF2BjO3kEUn1j0JVY0GqrQc7KzMez40ew6I/QzqJwy6j8lPAI+eibn1JBifNeMb8wU2DpwVxz4fhQ==, } engines: { node: ">= 14.15.0" } peerDependencies: constructs: ^10.0.0 dependencies: - "@aws-cdk/asset-awscli-v1": 2.2.200 + "@aws-cdk/asset-awscli-v1": 2.2.201 "@aws-cdk/asset-kubectl-v20": 2.1.2 "@aws-cdk/asset-node-proxy-agent-v6": 2.0.1 - "@balena/dockerignore": 1.0.2 - case: 1.6.3 - constructs: 10.2.70 - fs-extra: 11.1.1 - ignore: 5.2.4 - jsonschema: 1.4.1 - minimatch: 3.1.2 - punycode: 2.3.0 - semver: 7.5.4 - table: 6.8.1 - yaml: 1.10.2 + constructs: 10.3.0 bundledDependencies: - "@balena/dockerignore" - case @@ -1646,10 +2560,10 @@ packages: - table - yaml - /aws-cdk@2.93.0: + /aws-cdk@2.108.1: resolution: { - integrity: sha512-C0o7rzlXbQ3othvQ9uZamRwr741MSX/9eZ74zNJvpkX5Eitx/XoQYwUHeD+cbb4lKHMi7m2SwJfx3yOEkpu9OQ==, + integrity: sha512-VSu1KYLT1VzJdZqKPgVFQGfEBxaWmWCp0USfT4Xqk7drOmMzZK1PmXhSDpWr1mq1jn0m+4rwaifUi1Tt/0eFNQ==, } engines: { node: ">= 14.15.0" } hasBin: true @@ -1662,13 +2576,13 @@ packages: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } + dev: true /bowser@2.11.0: resolution: { integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, } - dev: true /brace-expansion@1.1.11: resolution: @@ -1678,6 +2592,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /brace-expansion@2.0.1: resolution: @@ -1712,6 +2627,7 @@ packages: integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==, } engines: { node: ">= 0.8.0" } + dev: true /chalk@4.1.2: resolution: @@ -1755,10 +2671,10 @@ packages: engines: { node: ">=0.8" } dev: true - /codemaker@1.88.0: + /codemaker@1.91.0: resolution: { - integrity: sha512-/7+1mPQCEFmBm9zhf5blMiqirCcXNwulb8dozu2LVsDLgnafPt1h2eg/OwvyrqSMWUnsIFetAssKVP2gE66MPQ==, + integrity: sha512-yI9ibYUBdJDI8n5Vffd4kfg7mSy6Fes2FHq3/TrZtqhL5CJcXvI8Lltl6iTWM5f1JkeIeAMQOC45PjscBhWyZg==, } engines: { node: ">= 14.17.0" } dependencies: @@ -1775,12 +2691,14 @@ packages: engines: { node: ">=7.0.0" } dependencies: color-name: 1.1.4 + dev: true /color-name@1.1.4: resolution: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } + dev: true /commonmark@0.30.0: resolution: @@ -1800,11 +2718,12 @@ packages: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } + dev: true - /constructs@10.2.70: + /constructs@10.3.0: resolution: { - integrity: sha512-z6zr1E8K/9tzJbCQzY0UGX0/oVKPFKu9C/mzEnghCG6TAJINnvlq0CMKm63XqqeMleadZYm5T3sZGJKcxJS/Pg==, + integrity: sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==, } engines: { node: ">= 16.14.0" } @@ -1879,7 +2798,7 @@ packages: dependencies: semver: 7.5.4 shelljs: 0.8.5 - typescript: 5.3.0-dev.20230907 + typescript: 5.4.0-dev.20231114 dev: true /emoji-regex@8.0.0: @@ -1887,6 +2806,7 @@ packages: { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, } + dev: true /entities@2.0.3: resolution: @@ -1956,6 +2876,7 @@ packages: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } + dev: true /fast-glob@3.3.1: resolution: @@ -1979,7 +2900,6 @@ packages: hasBin: true dependencies: strnum: 1.0.5 - dev: true /fastq@1.15.0: resolution: @@ -2019,17 +2939,6 @@ packages: universalify: 2.0.0 dev: true - /fs-extra@11.1.1: - resolution: - { - integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, - } - engines: { node: ">=14.14" } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - /fs-extra@8.1.0: resolution: { @@ -2117,6 +3026,7 @@ packages: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, } + dev: true /has-flag@4.0.0: resolution: @@ -2136,13 +3046,6 @@ packages: function-bind: 1.1.1 dev: true - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: ">= 4" } - /inflight@1.0.6: resolution: { @@ -2191,6 +3094,7 @@ packages: integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, } engines: { node: ">=8" } + dev: true /is-glob@4.0.3: resolution: @@ -2210,23 +3114,23 @@ packages: engines: { node: ">=0.12.0" } dev: true - /jsii-pacmak@1.88.0: + /jsii-pacmak@1.91.0: resolution: { - integrity: sha512-nanfSaYpe2lgOzvosup4iObQ76tCs47+rERUUGFyrCq7sruQ7VMYgRdAuGWh8PqF9fGNwq6Do1eR+EMC+d4WUg==, + integrity: sha512-k3Mc8v2nS7OTZxbwXczjSl5/RzGXHPq/BzZ+MRQhP5Z0Ai7QDF++aJxx6GZT9JXOD8zpHpv74QOr6eLPRVRIEQ==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.88.0 - "@jsii/spec": 1.88.0 + "@jsii/check-node": 1.91.0 + "@jsii/spec": 1.91.0 clone: 2.1.2 - codemaker: 1.88.0 + codemaker: 1.91.0 commonmark: 0.30.0 escape-string-regexp: 4.0.0 fs-extra: 10.1.0 - jsii-reflect: 1.88.0 - jsii-rosetta: 1.88.0 + jsii-reflect: 1.91.0 + jsii-rosetta: 1.91.0 semver: 7.5.4 spdx-license-list: 6.7.0 xmlbuilder: 15.1.1 @@ -2235,56 +3139,56 @@ packages: - supports-color dev: true - /jsii-reflect@1.88.0: + /jsii-reflect@1.91.0: resolution: { - integrity: sha512-YYZTEQpayvwMDtRMCjgNraTFUqsj4/KEOE8ChvDCkpxv6aH89vpZSsAJM5ymhNLDHj4XZ2OW3XE0sNOz31NbvA==, + integrity: sha512-RRFmvscXiBHUOP9ew71gPQ2IptiHYoRaihKoLg5+SQSeCvynaJrBWhNcBy26LHd28HEN2atdzYems0+HgeQNRg==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.88.0 - "@jsii/spec": 1.88.0 + "@jsii/check-node": 1.91.0 + "@jsii/spec": 1.91.0 chalk: 4.1.2 fs-extra: 10.1.0 - oo-ascii-tree: 1.88.0 + oo-ascii-tree: 1.91.0 yargs: 16.2.0 dev: true - /jsii-rosetta@1.88.0: + /jsii-rosetta@1.91.0: resolution: { - integrity: sha512-6xRRkwWUKFqDTnjgCXkB6v9dxA51KUD4Cd7InLB4qirMBDuMtyYhYVNc1yJbHPYs9gkN5/ao0dFk+1CQxt7T7g==, + integrity: sha512-v8eW/XiJHklnkmTtCIbyAeDPUVfovU/ZNh1ixvGri/ps5H3iRRpLEmqGJGMm2IEIjNCSmnmIsDMQLw20/7Nu+Q==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.88.0 - "@jsii/spec": 1.88.0 + "@jsii/check-node": 1.91.0 + "@jsii/spec": 1.91.0 "@xmldom/xmldom": 0.8.10 commonmark: 0.30.0 fast-glob: 3.3.1 - jsii: 1.88.0 + jsii: 1.91.0 semver: 7.5.4 semver-intersect: 1.4.0 stream-json: 1.8.0 typescript: 3.9.10 - workerpool: 6.4.2 + workerpool: 6.5.1 yargs: 16.2.0 transitivePeerDependencies: - supports-color dev: true - /jsii@1.88.0: + /jsii@1.91.0: resolution: { - integrity: sha512-WKfwHbcEI/j5OYDPexvkH8KKDcTZR7tIBFNTxu8h1Nh3G8xFT4hh3pObUUSMRCa6rsSF9EHGjS+AKC+TfpFGrQ==, + integrity: sha512-dJ2FbnUfX5Eg9BdZx6Cz2JhDsvzGi2DoQeomzdjO9ltvVUouAFPWkpcUtJdLXaNmHQtPM4/I+AzelUX7w2mWVw==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.88.0 - "@jsii/spec": 1.88.0 + "@jsii/check-node": 1.91.0 + "@jsii/spec": 1.91.0 case: 1.6.3 chalk: 4.1.2 fast-deep-equal: 3.1.3 @@ -2300,16 +3204,16 @@ packages: - supports-color dev: true - /jsii@5.2.2: + /jsii@5.2.29: resolution: { - integrity: sha512-0GufgQqaSSt/cLoMeNSP/Xw7xYIGis5KP8nfGRVP04zVJQ/BUXChxwCfG4LaYN2roxixIPAzdO4fj6W8lv7v3g==, + integrity: sha512-2ApVgH/6473cyyVIxDtYGCm2yozJn0yhXYM+KYBxXsTjVXaXtkzSfD2PbPvzJ1phlR3FKAXSphFv8HIheRc/BA==, } engines: { node: ">= 16.14.0" } hasBin: true dependencies: - "@jsii/check-node": 1.88.0 - "@jsii/spec": 1.88.0 + "@jsii/check-node": 1.91.0 + "@jsii/spec": 1.91.0 case: 1.6.3 chalk: 4.1.2 downlevel-dts: 0.11.0 @@ -2318,7 +3222,7 @@ packages: semver: 7.5.4 semver-intersect: 1.4.0 sort-json: 2.0.1 - spdx-license-list: 6.7.0 + spdx-license-list: 6.8.0 typescript: 5.2.2 yargs: 17.7.2 transitivePeerDependencies: @@ -2330,6 +3234,7 @@ packages: { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, } + dev: true /jsonfile@4.0.0: resolution: @@ -2349,18 +3254,7 @@ packages: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - - /jsonschema@1.4.1: - resolution: - { - integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==, - } - - /lodash.truncate@4.4.2: - resolution: - { - integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, - } + dev: true /log4js@6.9.1: resolution: @@ -2394,6 +3288,7 @@ packages: engines: { node: ">=10" } dependencies: yallist: 4.0.0 + dev: true /make-error@1.3.6: resolution: @@ -2435,6 +3330,7 @@ packages: } dependencies: brace-expansion: 1.1.11 + dev: true /minimatch@9.0.3: resolution: @@ -2477,10 +3373,10 @@ packages: wrappy: 1.0.2 dev: true - /oo-ascii-tree@1.88.0: + /oo-ascii-tree@1.91.0: resolution: { - integrity: sha512-A7m3z7XlUD3DnXSYxWmAdKQTIY6+1JzWS0lhaqgPGhj6g7a/odCsV1ctaRnjJljCB3zQBrbp2QHdYTUsD9AXcQ==, + integrity: sha512-pH4FFNLTO8VG+vNUm4AHmhLNjoSfQlO1UKIrzBGdeScppY785D93GVMH1XkCwbuO7pd9rrh6El5WF3a5QNvaww==, } engines: { node: ">= 14.17.0" } dev: true @@ -2557,16 +3453,16 @@ packages: hasBin: true dev: true - /publib@0.2.737: + /publib@0.2.745: resolution: { - integrity: sha512-wGNz2o5wZgMqes2qIH6AjnKLG6jEA3O/mqJ6fO3TULSREUY2Xm5jwijUbwEHJuYaNeFK8TEab2y8ybW1oNhqTw==, + integrity: sha512-/HzsNkJAC15znzXF0xmY9Vsdz8ET2w5hPsl7B3ZMW3SrAT8P5dz5ucoqhKtnt6/3Odp/R6T0xqT4LdnGA9snUQ==, } hasBin: true dependencies: - "@aws-sdk/client-codeartifact": 3.405.0 - "@aws-sdk/credential-providers": 3.405.0 - "@aws-sdk/types": 3.398.0 + "@aws-sdk/client-codeartifact": 3.451.0 + "@aws-sdk/credential-providers": 3.451.0 + "@aws-sdk/types": 3.449.0 "@types/fs-extra": 8.1.2 fs-extra: 8.1.0 glob: 10.0.0 @@ -2583,6 +3479,7 @@ packages: integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, } engines: { node: ">=6" } + dev: true /queue-microtask@1.2.3: resolution: @@ -2615,6 +3512,7 @@ packages: integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, } engines: { node: ">=0.10.0" } + dev: true /resolve@1.22.4: resolution: @@ -2678,6 +3576,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true /shelljs@0.8.5: resolution: @@ -2699,17 +3598,6 @@ packages: } dev: true - /slice-ansi@4.0.0: - resolution: - { - integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - /sort-json@2.0.1: resolution: { @@ -2730,6 +3618,14 @@ packages: engines: { node: ">=8" } dev: true + /spdx-license-list@6.8.0: + resolution: + { + integrity: sha512-5UdM7r9yJ1EvsPQZWfa41AZjLQngl9iMMysm9XBW7Lqhq7aF8cllfqjS+rFCHB8FFMGSM0yFWue2LUV9mR0QzQ==, + } + engines: { node: ">=8" } + dev: true + /stream-chain@2.2.5: resolution: { @@ -2770,6 +3666,7 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + dev: true /string.prototype.repeat@0.2.0: resolution: @@ -2786,13 +3683,13 @@ packages: engines: { node: ">=8" } dependencies: ansi-regex: 5.0.1 + dev: true /strnum@1.0.5: resolution: { integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, } - dev: true /supports-color@7.2.0: resolution: @@ -2812,19 +3709,6 @@ packages: engines: { node: ">= 0.4" } dev: true - /table@6.8.1: - resolution: - { - integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, - } - engines: { node: ">=10.0.0" } - dependencies: - ajv: 8.12.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - /to-regex-range@5.0.1: resolution: { @@ -2874,14 +3758,12 @@ packages: { integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, } - dev: true /tslib@2.6.2: resolution: { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - dev: true /typescript@3.9.10: resolution: @@ -2910,10 +3792,10 @@ packages: hasBin: true dev: true - /typescript@5.3.0-dev.20230907: + /typescript@5.4.0-dev.20231114: resolution: { - integrity: sha512-8yegC0GyY5ug9184BxLq8fLDt08+g8jRfut0QSraLFoT13c39Z6fVoviDEeqJgbnIGVxzAEiNQLUslpKYCyUsg==, + integrity: sha512-z7rH8Vy4KWJyzNUaFt1HMzwYNRUmy2HMN98eufjvqbhmS3WPoQF89/UgonRmYf1vAP/69z0PytuV9hBMHNkaDg==, } engines: { node: ">=14.17" } hasBin: true @@ -2933,6 +3815,7 @@ packages: integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, } engines: { node: ">= 10.0.0" } + dev: true /uri-js@4.4.1: resolution: @@ -2941,6 +3824,7 @@ packages: } dependencies: punycode: 2.3.0 + dev: true /uuid@8.3.2: resolution: @@ -2948,7 +3832,6 @@ packages: integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, } hasBin: true - dev: true /v8-compile-cache-lib@3.0.1: resolution: @@ -2957,10 +3840,10 @@ packages: } dev: true - /workerpool@6.4.2: + /workerpool@6.5.1: resolution: { - integrity: sha512-MrDWwemtC4xNV22kbbZDQQQmxNX+yLm790sgYl2wVD3CWnK7LJY1youI/11wHorAjHjK+GEjUxUh74XoPU71uQ==, + integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==, } dev: true @@ -3004,13 +3887,7 @@ packages: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, } - - /yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: ">= 6" } + dev: true /yargs-parser@20.2.9: resolution: From 32c4ab5e4b46f5d19866fec605fc7f44424d98c1 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:06:19 +1100 Subject: [PATCH 03/22] Try test run --- .github/workflows/build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94dc825..2fc7368 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,7 @@ jobs: - run: pnpm install - - run: pnpm run build - - - run: pnpm run package + - run: ./test-go-direct.sh + working-directory: packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image +# - run: pnpm run build +# - run: pnpm run package From e27a08b4607c0fc6618c0e211a5fd2d840ac35ab Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:08:56 +1100 Subject: [PATCH 04/22] Set Go version --- .../construct/rclone-go-batch-copy-docker-image/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod index 3b87e27..2025277 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod @@ -1,6 +1,6 @@ module rclone-batch -go 1.21.2 +go 1.21 require ( github.com/aws/aws-sdk-go-v2 v1.23.0 // indirect From 5a41bda7d98dbe6c3fc231de355975e2192f4e5d Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:14:17 +1100 Subject: [PATCH 05/22] install rclone --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2fc7368..7868f28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,9 @@ jobs: - run: pnpm install + - name: Setup Rclone + uses: AnimMouse/setup-rclone@v1 + - run: ./test-go-direct.sh working-directory: packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image # - run: pnpm run build From 6af514ec7f599cd1d2fc81bda441541660f4563f Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:17:04 +1100 Subject: [PATCH 06/22] explicit bash --- .github/workflows/build.yml | 2 +- .../rclone-go-batch-copy-docker-image/test-go-direct.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7868f28..5c37db1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Rclone uses: AnimMouse/setup-rclone@v1 - - run: ./test-go-direct.sh + - run: bash test-go-direct.sh working-directory: packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image # - run: pnpm run build # - run: pnpm run package diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh index 8c0ede4..2d64437 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh @@ -69,7 +69,7 @@ DESTINATION="$TEMPD/test3" DEBUG_BANDWIDTH="1B" ./rclone-batch $RCLONE_BINARY ./ sleep 1 # now send a SIGTERM to the launched job -kill %1 +kill %1 # Uncomment to debug invalid result # cat "$TEMPD/result.json" From 1433b1315b49577ca59c6b6278eedd3628839415 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:19:24 +1100 Subject: [PATCH 07/22] Better line ends --- .../rclone-go-batch-copy-docker-image/test-go-direct.sh | 4 ++-- .../construct/rclone-go-batch-copy-docker-image/testfile2.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh index 2d64437..6474b13 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh @@ -33,7 +33,7 @@ DESTINATION="$TEMPD/test1" ./rclone-batch $RCLONE_BINARY ./testfile1.txt ./testf assert " find $TEMPD/test1 -type f | awk 'END{print NR}' " "2" assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "20" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "21" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "37" rm "$TEMPD/result.json" @@ -50,7 +50,7 @@ assert "find $TEMPD/test2 -type f | awk 'END{print NR}'" "1" assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "directory not found" assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "0" assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "null" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "21" +assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "37" rm "$TEMPD/result.json" diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt index 79dfee6..240e788 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt @@ -1 +1 @@ -This is test file 2 +This is test file 2 - it has content From dd16680096f5136ed4e42d9f6cdabc2f374b26f4 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:21:56 +1100 Subject: [PATCH 08/22] what going on --- .../rclone-go-batch-copy-docker-image/test-go-direct.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh index 6474b13..e540d5c 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh @@ -26,7 +26,7 @@ trap 'rm -rf "$TEMPD"' EXIT # test 1 (main case of just copying files) # -DESTINATION="$TEMPD/test1" ./rclone-batch $RCLONE_BINARY ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" +DESTINATION="$TEMPD/test1" ./rclone-batch "$RCLONE_BINARY" ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" # Uncomment to debug invalid result # cat "$TEMPD/result.json" @@ -41,7 +41,7 @@ rm "$TEMPD/result.json" # test 2 (error cases with one file to fail) # -DESTINATION="$TEMPD/test2" ./rclone-batch $RCLONE_BINARY ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" +DESTINATION="$TEMPD/test2" ./rclone-batch "$RCLONE_BINARY" ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" # Uncomment to debug invalid result # cat "$TEMPD/result.json" @@ -63,7 +63,7 @@ rm "$TEMPD/result.json" # we set the bandwidth to 1B so that it is slow enough that our TERM signal will come mid-process # we start this execution in the background -DESTINATION="$TEMPD/test3" DEBUG_BANDWIDTH="1B" ./rclone-batch $RCLONE_BINARY ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & +DESTINATION="$TEMPD/test3" DEBUG_BANDWIDTH="1B" ./rclone-batch "$RCLONE_BINARY" ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & # wait a small amount sleep 1 @@ -72,7 +72,7 @@ sleep 1 kill %1 # Uncomment to debug invalid result -# cat "$TEMPD/result.json" +cat "$TEMPD/result.json" assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "Interrupted by SIGTERM" assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "Skipped due to SIGTERM received" From ff35c188adfc371d740824cef830c63d1667f8ab Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 28 Nov 2023 18:28:18 +1100 Subject: [PATCH 09/22] run direct --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c37db1..7868f28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Rclone uses: AnimMouse/setup-rclone@v1 - - run: bash test-go-direct.sh + - run: ./test-go-direct.sh working-directory: packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image # - run: pnpm run build # - run: pnpm run package From 4299262ef0f99c3a280e4a8765553c9e3b7709da Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 29 Nov 2023 14:21:50 +1100 Subject: [PATCH 10/22] Changed folder Test that definitely fails --- .github/workflows/build.yml | 2 +- .../.dockerignore | 0 .../.gitignore | 0 .../rclone-batch-copy-docker-image/Dockerfile | 29 ++++++++++++++++--- .../rclone-batch-copy-docker-image/README.md | 8 +++++ .../go.mod | 0 .../go.sum | 0 .../rclone-batch.go} | 0 .../test-assert.sh | 0 .../test-docker-direct.sh | 0 .../test-go-direct.sh | 11 +++---- .../testfile1.txt | 0 .../testfile2.txt | 0 .../Dockerfile | 8 +++++ .../rclone-batch-copy.sh | 0 .../Dockerfile | 28 ------------------ 16 files changed, 48 insertions(+), 38 deletions(-) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/.dockerignore (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/.gitignore (100%) create mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/go.mod (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/go.sum (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image/main.go => rclone-batch-copy-docker-image/rclone-batch.go} (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/test-assert.sh (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/test-docker-direct.sh (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/test-go-direct.sh (92%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/testfile1.txt (100%) rename packages/aws-copy-out-sharer/construct/{rclone-go-batch-copy-docker-image => rclone-batch-copy-docker-image}/testfile2.txt (100%) create mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-shell-copy-docker-image}/rclone-batch-copy.sh (100%) delete mode 100644 packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7868f28..ee18cda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,6 @@ jobs: uses: AnimMouse/setup-rclone@v1 - run: ./test-go-direct.sh - working-directory: packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image + working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image # - run: pnpm run build # - run: pnpm run package diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.dockerignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.dockerignore rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.dockerignore diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.gitignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/.gitignore rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.gitignore diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile index 8b29bee..78753aa 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile @@ -1,8 +1,29 @@ +FROM golang:1.21-alpine as builder + +# git is needed for go mod download to work +RUN apk add --no-cache git + +WORKDIR /build + +RUN go env -w GOPROXY=direct + +ADD go.mod go.sum ./ + +RUN go mod download + +ADD *.go ./ + +RUN env GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build rclone-batch.go + + FROM rclone/rclone:1.64.2 -RUN apk add --no-cache aws-cli tini +# if we want signals to propogate through to the app we need a lightweight initd +RUN apk add --no-cache tini + +# this is where rclone binary ends up by default so we will do our work there +WORKDIR /data -# a shell script that allows us to take more batch like input to rclone -COPY rclone-batch-copy.sh /app/ +COPY --from=builder /build/rclone-batch ./ -ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] +ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/rclone-batch"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md new file mode 100644 index 0000000..38dced5 --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md @@ -0,0 +1,8 @@ +# rclone-batch + +`rclone-batch` is a Go wrapper around the invocation of `rclone`. Why do we need +a wrapper? Well we want to get the statistics output of `rclone` in a way +that we can standardise. Also, we want optionally to be able to send this info +back to the parent AWS ECS task. Furthermore, there are aspects of signal +handling that we want to support for AWS Spot that is not quite the same as +`rclone` out of the box. diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.mod similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.mod rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.mod diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.sum similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/go.sum rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.sum diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/main.go rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-assert.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-assert.sh rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-assert.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-docker-direct.sh rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh similarity index 92% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh index e540d5c..575314a 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh @@ -8,20 +8,19 @@ RCLONE_BINARY=$(which rclone) set -e # bring in some helpful bash assertions -. test-assert.sh +. test-assert.sh --invariant -# build our rclone batch executable -go build +# build our rclone-batch executable +go build rclone-batch.go # make a temporary directory for the copy destination +# NOTE: we do not remove this on a EXIT trap as that interferes with the assert.sh exit codes TEMPD=$(mktemp -d) if [ ! -e "$TEMPD" ]; then >&2 echo "Failed to create temp directory" exit 1 fi -trap 'rm -rf "$TEMPD"' EXIT - # # test 1 (main case of just copying files) # @@ -79,6 +78,8 @@ assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "Skipped due to rm "$TEMPD/result.json" +assert "5" "10" + # # end overall testing and set return code # diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile1.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile1.txt rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile1.txt diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile2.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/testfile2.txt rename to packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile2.txt diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile new file mode 100644 index 0000000..8b29bee --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile @@ -0,0 +1,8 @@ +FROM rclone/rclone:1.64.2 + +RUN apk add --no-cache aws-cli tini + +# a shell script that allows us to take more batch like input to rclone +COPY rclone-batch-copy.sh /app/ + +ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch-copy.sh rename to packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile deleted file mode 100644 index 9121c34..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-go-batch-copy-docker-image/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM golang:1.21-alpine as builder - -RUN apk add --no-cache git - -WORKDIR /build - -RUN go env -w GOPROXY=direct - -ADD go.mod go.sum ./ - -RUN go mod download - -ADD main.go ./ - -RUN env GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build - - -FROM rclone/rclone:1.64.2 - -# if we want signals to propogate through to the app we need a lightweight initd -RUN apk add --no-cache tini - -# this is where rclone binary ends up by default so we will do our work there -WORKDIR /data - -COPY --from=builder /build/rclone-batch ./ - -ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/rclone-batch"] From 85247fdd7c83445de8115cb3a14a6b8364a6a6db Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 29 Nov 2023 16:06:33 +1100 Subject: [PATCH 11/22] Finalising the new copy batcher --- .../rclone-batch.go | 157 -------------- .../test-docker-direct.sh | 8 - .../test-go-direct.sh | 87 -------- .../.dockerignore | 1 + .../.gitignore | 0 .../Dockerfile | 4 +- .../README.md | 0 .../go.mod | 0 .../go.sum | 0 .../rclone-batch-docker-image/rclone-batch.go | 197 ++++++++++++++++++ .../test-assert.sh | 0 .../test-docker-direct.sh | 26 +++ .../test-go-direct.sh | 89 ++++++++ .../testfile1.txt | 0 .../testfile2.txt | 0 .../Dockerfile | 8 - .../rclone-batch-copy.sh | 15 -- 17 files changed, 316 insertions(+), 276 deletions(-) delete mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go delete mode 100755 packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh delete mode 100755 packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/.dockerignore (73%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/.gitignore (100%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/Dockerfile (83%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/README.md (100%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/go.mod (100%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/go.sum (100%) create mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/test-assert.sh (100%) create mode 100755 packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh create mode 100755 packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/testfile1.txt (100%) rename packages/aws-copy-out-sharer/construct/{rclone-batch-copy-docker-image => rclone-batch-docker-image}/testfile2.txt (100%) delete mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile delete mode 100644 packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go deleted file mode 100644 index d41fc16..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/rclone-batch.go +++ /dev/null @@ -1,157 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "fmt" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/service/sfn" - "log" - "os" - "os/exec" - "os/signal" - "strings" - "syscall" -) - -// retryError:false serverSideCopies:0 serverSideCopyBytes:0 serverSideMoveBytes:0 serverSideMoves:0 speed:0 totalChecks:0 totalTransfers:1 transferTime:0.000586292 transfers:1 -type RcloneStats struct { - Bytes int `json:"bytes"` - Checks int `json:"checks"` - ElapsedTime float64 `json:"elapsedTime"` - Errors int `json:"errors"` - LastError string `json:"lastError"` - FatalError bool `json:"fatalError"` - TotalBytes int `json:"totalBytes"` -} - -func If[T any](cond bool, vtrue, vfalse T) T { - if cond { - return vtrue - } - return vfalse -} - -func main() { - cfg, err := config.LoadDefaultConfig(context.TODO()) - - if err != nil { - log.Fatalf("unable to load AWS config, %v", err) - } - - // NOTE: if this was a traditional command line tool we would take these in as command - // line parameters. However, we are invoking this as an ECS Task and it turns out easier - // to pass these down via environment variables - saving the command line *only* for the list - // of files we want to copy - destination, destinationOk := os.LookupEnv("DESTINATION") - - if !destinationOk { - log.Fatalf("No environment variable DESTINATION telling us where to copy the objects", err) - } - - taskToken, taskTokenOk := os.LookupEnv("TASK_TOKEN") - - // special environment variables that we can use for some debug/testing - debugBandwidth, debugBandwidthOk := os.LookupEnv("DEBUG_BANDWIDTH") - - results := make(map[int]any) - - signalChannel := make(chan os.Signal) - - // set as soon as we receive a SIGTERM - so that we will then just quickly skip the rest of the files - interrupted := false - - for i := 2; i < len(os.Args); i++ { - if !interrupted { - // setup an rclone copy with capture stats (noting that stats are sent to stderr) - cmd := exec.Command(os.Args[1], - "--use-json-log", - "--stats-log-level", "NOTICE", - "--stats-one-line", - // only display stats at the end (after 10000 hours) - "--stats", "10000h", - // normally no bandwidth limiting ("0") - but can institute bandwidth limit if asked - "--bwlimit", If(debugBandwidthOk, debugBandwidth, "0"), - "copy", os.Args[i], destination) - - // we are only interested in stderr - stderrStringBuilder := new(strings.Builder) - cmd.Stderr = stderrStringBuilder - - // we need to be able handling getting a SIGTERM when AWS wants to reclaim our SPOT instance - signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM) - go func() { - sig := <-signalChannel - switch sig { - case syscall.SIGTERM: - // terminate the currently running rclone - cmd.Process.Signal(syscall.SIGTERM) - // indicate we don't want future rclones to run - interrupted = true - } - }() - - err := cmd.Run() - - if err != nil { - results[i-2] = map[string]any{"lastError": "Interrupted by SIGTERM", "systemError": err} - } - - // each line of stderr output is stats in JSON format or possibly other random messages - stderrStringLines := strings.Split(strings.TrimSuffix(stderrStringBuilder.String(), "\n"), "\n") - - // attempt to process each line of log output to stderr as JSON (if not then ignore) - for _, line := range stderrStringLines { - var logLineJson map[string]any - - logLineJsonErr := json.Unmarshal([]byte(line), &logLineJson) - - if logLineJsonErr == nil { - - statsValue, statsOk := logLineJson["stats"].(map[string]any) - - if statsOk { - results[i-2] = statsValue - } - } - } - } else { - results[i-2] = map[string]any{"lastError": "Skipped due to SIGTERM received"} - } - - // if asked we sleep for delay after seconds (this gives the outer environment - // time to send us a SIGINT etc) - /*if debugDelayAfterOk { - debugDelayAfterFloat, err := strconv.ParseFloat(debugDelayAfter, 64) - if err == nil { - time.Sleep(time.Duration(debugDelayAfterFloat) * time.Second) - } - } */ - - } - - resultsJson, err := json.MarshalIndent(results, "", " ") - - if err != nil { - log.Fatalf("Could not marshall the rclone outputs to JSON", err) - } - - resultsString := string(resultsJson) - - // the normal mechanism by which we will send back results to our caller is - // Steps SendTask - which sends back JSON - if taskTokenOk { - sfnSvc := sfn.NewFromConfig(cfg) - - sfnSvc.SendTaskSuccess(context.TODO(), &sfn.SendTaskSuccessInput{ - Output: aws.String(resultsString), - TaskToken: aws.String(taskToken), - }) - - fmt.Println(taskToken) - } else { - // if no task token was given then we just print the results - fmt.Println(resultsString) - } -} diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh deleted file mode 100755 index 25b51f2..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-docker-direct.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# we want to exit immediately on error (especially for Go/Docker build errors) -set -e - -docker build . -t rclone-batch - -docker run rclone-batch -e DESTINATION=/tmp diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh deleted file mode 100755 index 575314a..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-go-direct.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -# this is a setting which is system dependent - feel free to change to the location of your -# dev system rclone binary (this one is brew installed on a Mac M1) -RCLONE_BINARY=$(which rclone) - -# we want to exit immediately on error (especially for Go compile errors) -set -e - -# bring in some helpful bash assertions -. test-assert.sh --invariant - -# build our rclone-batch executable -go build rclone-batch.go - -# make a temporary directory for the copy destination -# NOTE: we do not remove this on a EXIT trap as that interferes with the assert.sh exit codes -TEMPD=$(mktemp -d) -if [ ! -e "$TEMPD" ]; then - >&2 echo "Failed to create temp directory" - exit 1 -fi - -# -# test 1 (main case of just copying files) -# - -DESTINATION="$TEMPD/test1" ./rclone-batch "$RCLONE_BINARY" ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" - -# Uncomment to debug invalid result -# cat "$TEMPD/result.json" - -assert " find $TEMPD/test1 -type f | awk 'END{print NR}' " "2" -assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "20" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "37" - -rm "$TEMPD/result.json" - -# -# test 2 (error cases with one file to fail) -# - -DESTINATION="$TEMPD/test2" ./rclone-batch "$RCLONE_BINARY" ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" - -# Uncomment to debug invalid result -# cat "$TEMPD/result.json" - -assert "find $TEMPD/test2 -type f | awk 'END{print NR}'" "1" -assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "directory not found" -assert " cat $TEMPD/result.json | jq -r '.\"0\" | .bytes' " "0" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "null" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .bytes' " "37" - -rm "$TEMPD/result.json" - -# -# test 3 (signal intercept) -# -# this is a test that app will intercept a SIGTERM, pass it to any running rclone process, -# and return sensible results -# - -# we set the bandwidth to 1B so that it is slow enough that our TERM signal will come mid-process -# we start this execution in the background -DESTINATION="$TEMPD/test3" DEBUG_BANDWIDTH="1B" ./rclone-batch "$RCLONE_BINARY" ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & - -# wait a small amount -sleep 1 - -# now send a SIGTERM to the launched job -kill %1 - -# Uncomment to debug invalid result -cat "$TEMPD/result.json" - -assert " cat $TEMPD/result.json | jq -r '.\"0\" | .lastError' " "Interrupted by SIGTERM" -assert " cat $TEMPD/result.json | jq -r '.\"1\" | .lastError' " "Skipped due to SIGTERM received" - -rm "$TEMPD/result.json" - -assert "5" "10" - -# -# end overall testing and set return code -# - -assert_end examples diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.dockerignore b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.dockerignore similarity index 73% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.dockerignore rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.dockerignore index adab58a..0c530a3 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.dockerignore +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.dockerignore @@ -1,3 +1,4 @@ +Dockerfile test/* test-*.sh rclone-batch diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.gitignore b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.gitignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/.gitignore rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.gitignore diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/Dockerfile similarity index 83% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/Dockerfile index 78753aa..38f0731 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/Dockerfile +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/Dockerfile @@ -26,4 +26,6 @@ WORKDIR /data COPY --from=builder /build/rclone-batch ./ -ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/rclone-batch"] +ENV RB_RCLONE_BINARY "/usr/local/bin/rclone" + +ENTRYPOINT ["/sbin/tini", "-vvv", "--", "/data/rclone-batch"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/README.md rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.mod b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.mod similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.mod rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.mod diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.sum b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.sum similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/go.sum rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.sum diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go new file mode 100644 index 0000000..9baee7a --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go @@ -0,0 +1,197 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/sfn" + "log" + "os" + "os/exec" + "os/signal" + "strings" + "syscall" +) + +// NOTE: we use a prefix of RB (rclone-batch) just so we don't accidentally clash with a real +// env variable that has meaning to rclone (for example) +const rcloneBinaryEnvName = "RB_RCLONE_BINARY" +const destinationEnvName = "RB_DESTINATION" + +/** + * A ternaryish operator + */ +func If[T any](cond bool, vtrue, vfalse T) T { + if cond { + return vtrue + } + return vfalse +} + +/** + * A command line wrapper for invoking rclone one by one and return stats/error messages + * to the parent caller. Finishes by sending the stats back to the AWS parent task if asked. + * + * Inputs + * os.Args the source object paths to copy (rclone syntax e.g s3:bucket:key) + * Env + * RB_RCLONE_BINARY the path to an rclone binary to use + * RB_DESTINATION the path to send the objects (rclone syntax e.g s3:bucket:key) + * RB_TASK_TOKEN if present, the task token to use to send the copy results back to the parent + * RB_DEBUG_BANDWIDTH if present, a rclone bandwidth setting (just for debug/testing) + * ...any other rclone settings needed... + * RCLONE_CONFIG_S3_PROVIDER... + */ +func main() { + // NOTE: if this was a traditional command line tool we would take these in as command + // line parameters. However, we are invoking this as an ECS Task and it turns out easier + // to pass these down via environment variables - saving the command line args *only* for the list + // of files we want to copy + + rcloneBinary, rcloneBinaryOk := os.LookupEnv(rcloneBinaryEnvName) + + if !rcloneBinaryOk { + log.Fatalf("No environment variable %s telling us the path to an rclone executable", rcloneBinaryEnvName) + } + + if !strings.Contains(rcloneBinary, "rclone") { + // given we are a program that executes another program - just a little sanity check that what we + // are invoking vaguely makes sense + // (feel free to remove this if you have a use case where the binary is named otherwise) + log.Fatalf("The environment variable %s should have the string rclone in it somewhere", rcloneBinaryEnvName) + } + + destination, destinationOk := os.LookupEnv(destinationEnvName) + + if !destinationOk { + log.Fatalf("No environment variable %s telling us where to copy the objects", destinationEnvName) + } + + // a task token that ECS/Steps can pass us so we can return data + taskToken, taskTokenOk := os.LookupEnv("RB_TASK_TOKEN") + + // now that we know whether we want to use the task token - we will definitely need AWS config to work + // - so no need starting copying if we will fail at the end + cfg, cfgErr := config.LoadDefaultConfig(context.TODO()) + + if taskTokenOk { + if cfgErr != nil { + log.Fatalf("Unable to load AWS config, %v", cfgErr) + } + } + + // special environment variables that we can use for some debug/testing + debugBandwidth, debugBandwidthOk := os.LookupEnv("RB_DEBUG_BANDWIDTH") + + // we end up with a result array entry for each object we have been asked to copy + results := make([]any, len(os.Args)-1) + + signalChannel := make(chan os.Signal) + + // set as soon as we receive a SIGTERM - so that we will then just quickly skip the rest of the files + interrupted := false + + for i := 1; i < len(os.Args); i++ { + + // what we are processing in this iteration + which := i - 1 + source := os.Args[i] + + log.Printf("Asked to copy %s as the %d object to copy", source, which) + + if !interrupted { + // setup an rclone copy with capture stats (noting that stats are sent to stderr) + cmd := exec.Command(rcloneBinary, + "--use-json-log", + "--stats-log-level", "NOTICE", + "--stats-one-line", + // only display stats at the end (after 10000 hours) + "--stats", "10000h", + // normally no bandwidth limiting ("0") - but can institute bandwidth limit if asked + "--bwlimit", If(debugBandwidthOk, debugBandwidth, "0"), + "copy", source, destination) + + // we are only interested in stderr + stderrStringBuilder := new(strings.Builder) + cmd.Stderr = stderrStringBuilder + + // we need to be able handling getting a SIGTERM when AWS wants to reclaim our SPOT instance + signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM) + go func() { + sig := <-signalChannel + switch sig { + case syscall.SIGTERM: + // terminate the currently running rclone + cmd.Process.Signal(syscall.SIGTERM) + // indicate we don't want future rclones to run + interrupted = true + } + }() + + err := cmd.Run() + + if err != nil { + log.Printf("rclone Run() failed with %v", err) + results[which] = map[string]any{ + "lastError": "Interrupted by SIGTERM", + "systemError": fmt.Sprintf("%v", err), + "source": source} + } else { + log.Printf("rclone Run() succeeded") + } + + // each line of stderr output is stats in JSON format or possibly other random messages + stderrStringLines := strings.Split(strings.TrimSuffix(stderrStringBuilder.String(), "\n"), "\n") + + // attempt to process each line of log output to stderr as JSON (if not then ignore) + for _, line := range stderrStringLines { + var logLineJson map[string]any + + logLineJsonErr := json.Unmarshal([]byte(line), &logLineJson) + + if logLineJsonErr == nil { + + statsValue, statsOk := logLineJson["stats"].(map[string]any) + + if statsOk { + // insert information about the file we were copying + statsValue["source"] = source + results[which] = statsValue + } + } + } + } else { + results[which] = map[string]any{ + "lastError": "Skipped due to SIGTERM received", + "source": source} + } + } + + resultsJson, err := json.MarshalIndent(results, "", " ") + + if err != nil { + log.Fatalf("Could not marshall the rclone outputs to JSON", err) + } + + resultsString := string(resultsJson) + + // the normal mechanism by which we will send back results to our caller is + // Steps SendTask - which sends back JSON + if taskTokenOk { + sfnSvc := sfn.NewFromConfig(cfg) + + // output + // The JSON output of the task. Length constraints apply to the payload size, and are expressed as bytes in UTF-8 encoding. + // Type: String + // Length Constraints: Maximum length of 262144. + sfnSvc.SendTaskSuccess(context.TODO(), &sfn.SendTaskSuccessInput{ + Output: aws.String(resultsString), + TaskToken: aws.String(taskToken), + }) + } else { + // if no task token was given then we just print the results + fmt.Println(resultsString) + } +} diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-assert.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-assert.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/test-assert.sh rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-assert.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh new file mode 100755 index 0000000..d94dabf --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# we want to exit immediately on error (especially for Go/Docker build errors) +set -e + +docker build . -t rclone-batch-image + +# make a temporary directory for the copy destination +# NOTE: we do not remove this on a EXIT trap as that interferes with the assert.sh exit codes +TEMPD=$(mktemp -d) +if [ ! -e "$TEMPD" ]; then + >&2 echo "Failed to create temp directory" + exit 1 +fi + +# note the /etc files here are not important! We are just using them as source files +# that happen to already exist in the docker image by default +docker run -ti --rm \ + --env RB_DESTINATION=/tmp \ + --mount "type=bind,source=$TEMPD,target=/tmp" \ + rclone-batch-image \ + /etc/alpine-release /etc/os-release /etc/services + +# need to write some assertions here (need to separate out various outputs) + +ls -al $TEMPD diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh new file mode 100755 index 0000000..bc6538b --- /dev/null +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +# we want to exit immediately on error (especially for Go compile errors) +set -e + +# bring in some helpful bash assertions +. test-assert.sh --invariant + +# build our rclone-batch executable +go build rclone-batch.go + +# make a temporary directory for the copy destination +# NOTE: we do not remove this on a EXIT trap as that interferes with the assert.sh exit codes +TEMPD=$(mktemp -d) +if [ ! -e "$TEMPD" ]; then + >&2 echo "Failed to create temp directory" + exit 1 +fi + +RB_RCLONE_BINARY="$(which rclone)" +if [ ! -e "$RB_RCLONE_BINARY" ]; then + >&2 echo "Failed to locate rclone binary to use" + exit 1 +fi + +export RB_RCLONE_BINARY + +# +# Test 1 +# +echo "Test 1 - copying two files" + +RB_DESTINATION="$TEMPD/test1" ./rclone-batch ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" + +cat "$TEMPD/result.json" + +assert " find $TEMPD/test1 -type f | awk 'END{print NR}' " "2" +assert " cat $TEMPD/result.json | jq -r '.[0] | .bytes' " "20" +assert " cat $TEMPD/result.json | jq -r '.[1] | .bytes' " "37" + +rm "$TEMPD/result.json" + +# +# Test 2 +# +echo "Test 2 - copying two files but one not present/fails" + +RB_DESTINATION="$TEMPD/test2" ./rclone-batch ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" + +cat "$TEMPD/result.json" + +assert "find $TEMPD/test2 -type f | awk 'END{print NR}'" "1" +assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "directory not found" +assert " cat $TEMPD/result.json | jq -r '.[0] | .bytes' " "0" +assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "null" +assert " cat $TEMPD/result.json | jq -r '.[1] | .bytes' " "37" + +rm "$TEMPD/result.json" + +# +# Test 3 +# +# this is a test that app will intercept a SIGTERM, pass it to any running rclone process, +# and return sensible results +# +echo "Test 3 - copying two files but signals tells us to stop" + +# we set the bandwidth to 1B so that it is slow enough that our TERM signal will come mid-process +# we start this execution in the background +RB_DESTINATION="$TEMPD/test3" RB_DEBUG_BANDWIDTH="1B" ./rclone-batch ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & + +# wait a small amount +sleep 1 + +# now send a SIGTERM to the launched job +kill %1 + +cat "$TEMPD/result.json" + +assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "Interrupted by SIGTERM" +assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "Skipped due to SIGTERM received" + +rm "$TEMPD/result.json" + +# +# end overall testing and set return code +# + +assert_end examples diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile1.txt b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile1.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile1.txt rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile1.txt diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile2.txt b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile2.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image/testfile2.txt rename to packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile2.txt diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile b/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile deleted file mode 100644 index 8b29bee..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM rclone/rclone:1.64.2 - -RUN apk add --no-cache aws-cli tini - -# a shell script that allows us to take more batch like input to rclone -COPY rclone-batch-copy.sh /app/ - -ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "/app/rclone-batch-copy.sh"] diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh deleted file mode 100644 index f499461..0000000 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-shell-copy-docker-image/rclone-batch-copy.sh +++ /dev/null @@ -1,15 +0,0 @@ - -# If you are familiar with rsync, rclone always works -# as if you had written a trailing / - meaning "copy the -# contents of this directory". This applies to all commands -# and whether you are talking about the source or destination. - -echo "Destination = $destination" -echo "Task token = $tasktoken" - -for src in "$@"; do - echo "Source arg = $src" - /usr/local/bin/rclone copy --stats-log-level NOTICE --checksum "$src" "$destination" -done - -aws stepfunctions send-task-success --task-token "$tasktoken" --task-output '{ "0": "OK", "1": "OK" }' From 991aadbcfe7ed06a24fcfb8bf60b5a81d8763968 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 29 Nov 2023 16:14:37 +1100 Subject: [PATCH 12/22] Fix build --- .github/workflows/build.yml | 7 +++- .../rclone-batch-docker-image/README.md | 41 +++++++++++++++++-- packages/aws-copy-out-sharer/package.json | 9 ++-- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ee18cda..ad24831 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,9 +20,12 @@ jobs: - run: pnpm install - name: Setup Rclone - uses: AnimMouse/setup-rclone@v1 + uses: animmouse/setup-rclone@v1 - run: ./test-go-direct.sh - working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-copy-docker-image + working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-docker-image + + - run: ./test-docker-direct.sh + working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-docker-image # - run: pnpm run build # - run: pnpm run package diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md index 38dced5..5c43111 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md @@ -2,7 +2,42 @@ `rclone-batch` is a Go wrapper around the invocation of `rclone`. Why do we need a wrapper? Well we want to get the statistics output of `rclone` in a way -that we can standardise. Also, we want optionally to be able to send this info -back to the parent AWS ECS task. Furthermore, there are aspects of signal -handling that we want to support for AWS Spot that is not quite the same as +that we can standardise and use in our Steps DistributedMap results. + +Also, we want optionally to be able to send this info +back to the parent AWS Steps via Task Tokens. + +Furthermore, there are aspects of signal +handling that we want to support for Fargate Spot that is not quite the same as `rclone` out of the box. + +## How to dev? + +A decent amount of development can be done without deploying anything +to AWS/CDK/Steps. + +```shell +./test-go-direct.sh +``` + +Will compile the application and attempt some test copies. This is a purely +local invocation of the app with local temporary directories, made up local +files, and a local rclone binary. + +This is good for + +- checking the Go program compiles +- basic program logic + +```shell +./test-docker-direct.sh +``` + +Will build the Docker image that is used by the parent AWS ECS, but then +invokes it directly, with a mount point to bind in a local temporary +directory. + +This is good for + +- checking the Docker configuration can build +- basic Docker sanity diff --git a/packages/aws-copy-out-sharer/package.json b/packages/aws-copy-out-sharer/package.json index 8a2c7ed..b6e7ef2 100644 --- a/packages/aws-copy-out-sharer/package.json +++ b/packages/aws-copy-out-sharer/package.json @@ -12,8 +12,8 @@ "type": "git", "url": "git+https://github.com/elsa-data/aws-copy-out-sharer.git" }, - "main": "copy-out-stack.js", - "types": "copy-out-stack.d.ts", + "main": "out/copy-out-stack.js", + "types": "out/copy-out-stack.d.ts", "scripts": { "build": "jsii -vvv", "build:watch": "jsii -w", @@ -25,7 +25,10 @@ ], "jsii": { "outdir": "dist", - "targets": {} + "targets": {}, + "tsc": { + "outDir": "out" + } }, "dependencies": { "@elsa-data/aws-infrastructure": "^1.5.1" From a7f4af0730a37b2e88e0ef180e8e6668508cc207 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 29 Nov 2023 16:19:56 +1100 Subject: [PATCH 13/22] don't try interactive --- .../construct/rclone-batch-docker-image/test-docker-direct.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh index d94dabf..babe68f 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh +++ b/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh @@ -15,7 +15,7 @@ fi # note the /etc files here are not important! We are just using them as source files # that happen to already exist in the docker image by default -docker run -ti --rm \ +docker run --rm \ --env RB_DESTINATION=/tmp \ --mount "type=bind,source=$TEMPD,target=/tmp" \ rclone-batch-image \ From 35af4c289450ecd0ae68d983726e369a5044e938 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Fri, 1 Dec 2023 09:55:31 +1100 Subject: [PATCH 14/22] Introduced thawing objects --- dev/test.ts | 2 +- .../thaw-objects-lambda-step-construct.ts | 82 - .../thaw-objects-lambda/package.json | 8 - .../thaw-objects-lambda.js | 52 - .../rclone-batch-docker-image/.dockerignore | 0 .../rclone-batch-docker-image/.gitignore | 0 .../rclone-batch-docker-image/Dockerfile | 0 .../rclone-batch-docker-image/README.md | 0 .../rclone-batch-docker-image/go.mod | 0 .../rclone-batch-docker-image/go.sum | 0 .../rclone-batch-docker-image/rclone-batch.go | 163 +- .../rclone-batch-docker-image/test-assert.sh | 0 .../test-docker-direct.sh | 0 .../test-go-direct.sh | 17 +- .../rclone-batch-docker-image/testfile1.txt | 0 .../rclone-batch-docker-image/testfile2.txt | 0 .../can-write-lambda/.gitignore | 0 .../can-write-lambda/can-write-lambda.ts | 6 +- .../can-write-lambda/errors.ts | 0 .../can-write-lambda/package-lock.json | 0 .../can-write-lambda/package.json | 0 .../thaw-objects-lambda/.gitignore | 0 .../lambda/thaw-objects-lambda/errors.ts | 7 + .../thaw-objects-lambda/package-lock.json | 1438 +++++++++++++++++ .../lambda/thaw-objects-lambda/package.json | 9 + .../thaw-objects-lambda.ts | 160 ++ packages/aws-copy-out-sharer/package.json | 3 +- .../can-write-lambda-step-construct.ts | 8 +- .../{ => src}/copy-out-stack-props.ts | 0 .../{ => src}/copy-out-stack.ts | 2 +- .../copy-out-state-machine-construct.ts | 22 +- .../distributed-map-step-construct.ts | 21 +- .../fargate-run-task-construct.ts | 42 +- .../src/thaw-objects-lambda-step-construct.ts | 65 + 34 files changed, 1900 insertions(+), 207 deletions(-) delete mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts delete mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json delete mode 100644 packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/.dockerignore (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/.gitignore (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/Dockerfile (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/README.md (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/go.mod (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/go.sum (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/rclone-batch.go (51%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/test-assert.sh (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/test-docker-direct.sh (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/test-go-direct.sh (81%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/testfile1.txt (100%) rename packages/aws-copy-out-sharer/{construct => docker}/rclone-batch-docker-image/testfile2.txt (100%) rename packages/aws-copy-out-sharer/{construct => lambda}/can-write-lambda/.gitignore (100%) rename packages/aws-copy-out-sharer/{construct => lambda}/can-write-lambda/can-write-lambda.ts (88%) rename packages/aws-copy-out-sharer/{construct => lambda}/can-write-lambda/errors.ts (100%) rename packages/aws-copy-out-sharer/{construct => lambda}/can-write-lambda/package-lock.json (100%) rename packages/aws-copy-out-sharer/{construct => lambda}/can-write-lambda/package.json (100%) rename packages/aws-copy-out-sharer/{construct => lambda}/thaw-objects-lambda/.gitignore (100%) create mode 100644 packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/errors.ts create mode 100644 packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package-lock.json create mode 100644 packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package.json create mode 100644 packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts rename packages/aws-copy-out-sharer/{construct => src}/can-write-lambda-step-construct.ts (95%) rename packages/aws-copy-out-sharer/{ => src}/copy-out-stack-props.ts (100%) rename packages/aws-copy-out-sharer/{ => src}/copy-out-stack.ts (94%) rename packages/aws-copy-out-sharer/{construct => src}/copy-out-state-machine-construct.ts (91%) rename packages/aws-copy-out-sharer/{construct => src}/distributed-map-step-construct.ts (80%) rename packages/aws-copy-out-sharer/{construct => src}/fargate-run-task-construct.ts (89%) create mode 100644 packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts diff --git a/dev/test.ts b/dev/test.ts index 02bce22..27b5009 100644 --- a/dev/test.ts +++ b/dev/test.ts @@ -51,7 +51,7 @@ async function makeTestObject( async function createTestData() { const sourceObjects = { - [`${testFolderSrc}/1.bin`]: StorageClass.STANDARD, + [`${testFolderSrc}/1.bin`]: StorageClass.DEEP_ARCHIVE, [`${testFolderSrc}/2.bin`]: StorageClass.STANDARD, [`${testFolderSrc}/3.bin`]: StorageClass.GLACIER, }; diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts deleted file mode 100644 index 15add7c..0000000 --- a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda-step-construct.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Construct } from "constructs"; -import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; -import { Duration, Stack } from "aws-cdk-lib"; -import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; -import { Runtime } from "aws-cdk-lib/aws-lambda"; -import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; -import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; -import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; -import { join } from "path"; - -type ThawObjectsLambdaStepProps = { - vpc: IVpc; - vpcSubnetSelection: SubnetType; - - requiredRegion: string; - - /** - * If true, will allow this CanWrite lambda to test a bucket that is - * in the same account. Otherwise, and by default, the CanWrite lambda - * is set up to not be able to test a bucket in the same account as it - * is installed. This is a security mechanism as writes to buckets in the - * same account is allowed implictly but is dangerous. This should only - * be set to true for development/testing. - */ - allowWriteToThisAccount?: boolean; -}; - -/** - * A construct for a Steps function that tests whether an S3 - * bucket exists, is in the correct region, and is writeable - * by us. Throws an exception if any of these conditions is not met. - */ -export class ThawObjectsLambdaStepConstruct extends Construct { - public readonly invocableLambda; - - constructor(scope: Construct, id: string, props: ThawObjectsLambdaStepProps) { - super(scope, id); - - const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { - vpc: props.vpc, - entry: join(__dirname, "can-write-lambda", "can-write-lambda.js"), - // by specifying the precise runtime - the bundler knows exactly what packages are already in - // the base image - and for us can skip bundling @aws-sdk - // if we need to move this forward beyond node 18 - then we may need to revisit this - runtime: Runtime.NODEJS_18_X, - handler: "handler", - vpcSubnets: { - subnetType: props.vpcSubnetSelection, - }, - // this seems like plenty of seconds to do a few API calls to S3 - timeout: Duration.seconds(30), - }); - - canWriteLambda.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["s3:PutObject"], - resources: ["*"], - // yes - that's right - we want to give this lambda the ability to attempt the writes anywhere - // EXCEPT where we are deployed - // (under the assumption that buckets outside our account must be giving us explicit write permission, - // whilst within our account we get implicit access - in this case we don't want that ability) - conditions: props.allowWriteToThisAccount - ? undefined - : { - StringNotEquals: { - "s3:ResourceAccount": [Stack.of(this).account], - }, - }, - }), - ); - - this.invocableLambda = new LambdaInvoke( - this, - `Can Write To Destination Bucket?`, - { - lambdaFunction: canWriteLambda, - resultPath: JsonPath.DISCARD, - }, - ); - } -} diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json deleted file mode 100644 index c97b73b..0000000 --- a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "can-write-lambda", - "version": "1.0.0", - "main": "thaw-objects-lambda.js", - "dependencies": { - "@aws-sdk/client-s3": "^3.405.0" - } -} diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js b/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js deleted file mode 100644 index e4646e6..0000000 --- a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/thaw-objects-lambda.js +++ /dev/null @@ -1,52 +0,0 @@ -const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3"); - -export const handler = async (event) => { - function WrongRegionError(message) { - this.name = "WrongRegionError"; - this.message = message; - } - WrongRegionError.prototype = new Error(); - - function AccessDeniedError(message) { - this.name = "AccessDeniedError"; - this.message = message; - } - AccessDeniedError.prototype = new Error(); - - console.log(event.requiredRegion); - console.log(event.destinationBucket); - - // we are being super specific here - the required region is where we are going - // to make our client - in order to ensure we get 301 Redirects for buckets outside our location - const client = new S3Client({ region: event.requiredRegion }); - - try { - const putCommand = new PutObjectCommand({ - Bucket: event.destinationBucket, - Key: "ELSA_DATA_STARTED_TRANSFER.txt", - Body: "A file created by Elsa Data copy out to ensure correct permissions", - }); - - const response = await client.send(putCommand); - } catch (e) { - if (e.Code === "PermanentRedirect") - throw new WrongRegionError( - "S3 Put failed because bucket was in the wrong region", - ); - - if (e.Code === "AccessDenied") - throw new AccessDeniedError("S3 Put failed with access denied error"); - - throw e; - } -}; - -/*handler({ - requiredRegion: "ap-southeast-2", - //destinationBucket: "elsa-data-tmp" - //destinationBucket: "cdk-hnb659fds-assets-843407916570-us-east-1" - //destinationBucket: "elsa-data-replication-target-foo" - destinationBucket: "elsa-data-replication-target" - // destinationBucket: "elsa-data-copy-target-sydney" - // destinationBucket: "elsa-data-copy-target-tokyo" -}) */ diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.dockerignore b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/.dockerignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.dockerignore rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/.dockerignore diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.gitignore b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/.gitignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/.gitignore rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/.gitignore diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/Dockerfile b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/Dockerfile similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/Dockerfile rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/Dockerfile diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/README.md similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/README.md rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/README.md diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.mod b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/go.mod similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.mod rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/go.mod diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.sum b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/go.sum similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/go.sum rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/go.sum diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go similarity index 51% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go index 9baee7a..198b03e 100644 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/rclone-batch.go +++ b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go @@ -11,15 +11,24 @@ import ( "os" "os/exec" "os/signal" + "strconv" "strings" "syscall" + "time" ) // NOTE: we use a prefix of RB (rclone-batch) just so we don't accidentally clash with a real // env variable that has meaning to rclone (for example) + const rcloneBinaryEnvName = "RB_RCLONE_BINARY" const destinationEnvName = "RB_DESTINATION" +// our parent ECS task (when a SPOT instance) can be sent a TERM signal - we then have a hard +// limit of 120 seconds before the process is hard killed +// this value here is the seconds to wait after receiving the TERM in the hope that our +// jobs might finish +const postTermCleanupSeconds = 90 + /** * A ternaryish operator */ @@ -72,21 +81,23 @@ func main() { // a task token that ECS/Steps can pass us so we can return data taskToken, taskTokenOk := os.LookupEnv("RB_TASK_TOKEN") - // now that we know whether we want to use the task token - we will definitely need AWS config to work - // - so no need starting copying if we will fail at the end - cfg, cfgErr := config.LoadDefaultConfig(context.TODO()) + // now that we know whether we want to use the task token - we will definitely need AWS config to work + // - so no need starting copying if we will fail at the end + cfg, err := config.LoadDefaultConfig(context.TODO()) - if taskTokenOk { - if cfgErr != nil { - log.Fatalf("Unable to load AWS config, %v", cfgErr) - } - } + if taskTokenOk { + if err != nil { + log.Fatalf("Unable to load AWS config, %v", err) + } + } // special environment variables that we can use for some debug/testing debugBandwidth, debugBandwidthOk := os.LookupEnv("RB_DEBUG_BANDWIDTH") + debugSignalWait, debugSignalWaitOk := os.LookupEnv("RB_DEBUG_SIGNAL_WAIT") // we end up with a result array entry for each object we have been asked to copy results := make([]any, len(os.Args)-1) + var resultErrorCount int64 = 0 signalChannel := make(chan os.Signal) @@ -123,52 +134,136 @@ func main() { sig := <-signalChannel switch sig { case syscall.SIGTERM: - // terminate the currently running rclone - cmd.Process.Signal(syscall.SIGTERM) // indicate we don't want future rclones to run interrupted = true + + // we do however have a 120 second (hard) window in which we might want + // to let the current rclone finish + // so lets sleep for a bit before we self-terminate + // (we have a little debug settable value here to make our tests run quicker) + if debugSignalWaitOk { + i, err := strconv.Atoi(debugSignalWait) + if err == nil { + time.Sleep(time.Duration(i) * time.Second) + } + } else { + time.Sleep(postTermCleanupSeconds * time.Second) + } + + // terminate the currently running rclone + // NOTE we ignore the error here - if the process has already gone away then the + // signal possibly fails (by which point we should be exiting the process anyhow) + cmd.Process.Signal(syscall.SIGTERM) } }() - err := cmd.Run() + runErr := cmd.Run() - if err != nil { - log.Printf("rclone Run() failed with %v", err) - results[which] = map[string]any{ - "lastError": "Interrupted by SIGTERM", - "systemError": fmt.Sprintf("%v", err), - "source": source} + if runErr != nil { + log.Printf("rclone Run() failed with %v", runErr) } else { log.Printf("rclone Run() succeeded") } + foundStats := false + + // no matter what the exit code/status of the run is - we are going to (safely!) trawl + // through the stderr // each line of stderr output is stats in JSON format or possibly other random messages stderrStringLines := strings.Split(strings.TrimSuffix(stderrStringBuilder.String(), "\n"), "\n") - // attempt to process each line of log output to stderr as JSON (if not then ignore) + // attempt to process each line of log output to stderr as JSON (if not then log it ourselves) for _, line := range stderrStringLines { var logLineJson map[string]any - logLineJsonErr := json.Unmarshal([]byte(line), &logLineJson) + decoder := json.NewDecoder(strings.NewReader(line)) + decoder.UseNumber() - if logLineJsonErr == nil { + decoderErr := decoder.Decode(&logLineJson) + if decoderErr == nil { statsValue, statsOk := logLineJson["stats"].(map[string]any) if statsOk { - // insert information about the file we were copying - statsValue["source"] = source - results[which] = statsValue + // an rclone stats block will definitely have a "errors" count + // so we test for this and then use it + errorsValue, errorsOk := statsValue["errors"].(json.Number) + + if errorsOk { + errorsIntValue, errorsIntOk := errorsValue.Int64() + + if errorsIntOk == nil { + resultErrorCount += errorsIntValue + + // insert information about the file we were copying into the rclone stats block + statsValue["source"] = source + + // record the stats block + results[which] = statsValue + + foundStats = true + } + } + } + } else { + // we couldn't parse the line as JSON so it is probably a stderr msg from rclone + log.Printf("rclone stderr -> %s", line) + } + } + + // if`no valid stats block was output by rclone we need to make our own "compatible" one + if !foundStats { + // if we get a well structured runtime error result we can work out some + // specific error messages + + // keep in mind we *only* get here if rclone itself didn't provide JSON stats + // (which is itself a bug - as rclone does provide stats on every copy) + if runErr != nil { + if runExitErr, runExitOk := runErr.(*exec.ExitError); runExitOk { + // https://rclone.org/docs/#list-of-exit-codes + switch runExitErr.ExitCode() { + case 143: + results[which] = map[string]any{ + "errors": 1, + "lastError": "Interrupted by SIGTERM", + "source": source} + resultErrorCount++ + default: + results[which] = map[string]any{ + "errors": 1, + "lastError": fmt.Sprintf("Exit of rclone with code %v but no JSON statistics block generated", runExitErr.ExitCode()), + "systemError": fmt.Sprintf("%#v", runExitErr), + "source": source} + resultErrorCount++ + } } } } + } else { + // if we have previously received a SIGTERM - then for the rest we have been asked to copy we just need to skip + // create a fake "compatible" stats block results[which] = map[string]any{ - "lastError": "Skipped due to SIGTERM received", + "errors": 1, + "lastError": "Skipped due to previous SIGTERM received", + "source": source} + resultErrorCount++ + } + + // if we have fallen through all the way to here without any details then we put in + // something generic - but we want to make sure every copy operation has a "result" block + if results[which] == nil { + results[which] = map[string]any{ + "errors": 1, + "lastError": "Exit of rclone but no JSON statistics block generated or reason detected", "source": source} + resultErrorCount++ } } + // we have now attempted to copy every file and generated a stats dictionary in results[] + + // we need to report this back as JSON though resultsJson, err := json.MarshalIndent(results, "", " ") if err != nil { @@ -186,12 +281,24 @@ func main() { // The JSON output of the task. Length constraints apply to the payload size, and are expressed as bytes in UTF-8 encoding. // Type: String // Length Constraints: Maximum length of 262144. - sfnSvc.SendTaskSuccess(context.TODO(), &sfn.SendTaskSuccessInput{ - Output: aws.String(resultsString), - TaskToken: aws.String(taskToken), - }) + + // if we got any errors - we want to signal that up to the steps + //if resultErrorCount > 0 { + // sfnSvc.SendTaskFailure(context.TODO(), &sfn.SendTaskFailureInput{ + // Output: aws.String(resultsString), + // TaskToken: aws.String(taskToken), + // }) + //} else { + sfnSvc.SendTaskSuccess(context.TODO(), &sfn.SendTaskSuccessInput{ + Output: aws.String(resultsString), + TaskToken: aws.String(taskToken), + }) + //} + } else { // if no task token was given then we just print the results fmt.Println(resultsString) } + + os.Exit(int(resultErrorCount)) } diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-assert.sh b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-assert.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-assert.sh rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-assert.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-docker-direct.sh similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-docker-direct.sh rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-docker-direct.sh diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh similarity index 81% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh index bc6538b..c91a67a 100755 --- a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh @@ -25,6 +25,9 @@ fi export RB_RCLONE_BINARY +# our tests do return exit codes so we need to *not* fail on error +set +e + # # Test 1 # @@ -32,8 +35,11 @@ echo "Test 1 - copying two files" RB_DESTINATION="$TEMPD/test1" ./rclone-batch ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" +test1_exit=$? + cat "$TEMPD/result.json" +assert " echo $test1_exit " "0" assert " find $TEMPD/test1 -type f | awk 'END{print NR}' " "2" assert " cat $TEMPD/result.json | jq -r '.[0] | .bytes' " "20" assert " cat $TEMPD/result.json | jq -r '.[1] | .bytes' " "37" @@ -47,8 +53,11 @@ echo "Test 2 - copying two files but one not present/fails" RB_DESTINATION="$TEMPD/test2" ./rclone-batch ./afilethatdoesnotexist.txt ./testfile2.txt > "$TEMPD/result.json" +test2_exit=$? + cat "$TEMPD/result.json" +assert " echo $test2_exit " "1" assert "find $TEMPD/test2 -type f | awk 'END{print NR}'" "1" assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "directory not found" assert " cat $TEMPD/result.json | jq -r '.[0] | .bytes' " "0" @@ -66,8 +75,9 @@ rm "$TEMPD/result.json" echo "Test 3 - copying two files but signals tells us to stop" # we set the bandwidth to 1B so that it is slow enough that our TERM signal will come mid-process +# we set the signal wait because otherwise the test will run for more than a minute # we start this execution in the background -RB_DESTINATION="$TEMPD/test3" RB_DEBUG_BANDWIDTH="1B" ./rclone-batch ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & +RB_DESTINATION="$TEMPD/test3" RB_DEBUG_BANDWIDTH="1B" RB_DEBUG_SIGNAL_WAIT="5" ./rclone-batch ./testfile1.txt ./testfile2.txt > "$TEMPD/result.json" & # wait a small amount sleep 1 @@ -75,10 +85,13 @@ sleep 1 # now send a SIGTERM to the launched job kill %1 +# but still wait for it to finish as it intercepts the SIGTERM +wait %1 + cat "$TEMPD/result.json" assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "Interrupted by SIGTERM" -assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "Skipped due to SIGTERM received" +assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "Skipped due to previous SIGTERM received" rm "$TEMPD/result.json" diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile1.txt b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/testfile1.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile1.txt rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/testfile1.txt diff --git a/packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile2.txt b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/testfile2.txt similarity index 100% rename from packages/aws-copy-out-sharer/construct/rclone-batch-docker-image/testfile2.txt rename to packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/testfile2.txt diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/.gitignore b/packages/aws-copy-out-sharer/lambda/can-write-lambda/.gitignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/.gitignore rename to packages/aws-copy-out-sharer/lambda/can-write-lambda/.gitignore diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts b/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts similarity index 88% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts rename to packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts index c3e3836..85efc55 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda/can-write-lambda.ts +++ b/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts @@ -7,10 +7,10 @@ interface InvokeEvent { } export async function handler(event: InvokeEvent) { - console.log(event.requiredRegion); - console.log(event.destinationBucket); + console.log(JSON.stringify(event, null, 2)); - // we are being super specific here - the required region is where we are going + // we are being super specific here - more so than our normal client creation + // the "required region" is where we are going // to make our client - in order to ensure we get 301 Redirects for buckets outside our location const client = new S3Client({ region: event.requiredRegion }); diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts b/packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts similarity index 100% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/errors.ts rename to packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json b/packages/aws-copy-out-sharer/lambda/can-write-lambda/package-lock.json similarity index 100% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/package-lock.json rename to packages/aws-copy-out-sharer/lambda/can-write-lambda/package-lock.json diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda/package.json b/packages/aws-copy-out-sharer/lambda/can-write-lambda/package.json similarity index 100% rename from packages/aws-copy-out-sharer/construct/can-write-lambda/package.json rename to packages/aws-copy-out-sharer/lambda/can-write-lambda/package.json diff --git a/packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/.gitignore similarity index 100% rename from packages/aws-copy-out-sharer/construct/thaw-objects-lambda/.gitignore rename to packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/.gitignore diff --git a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/errors.ts b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/errors.ts new file mode 100644 index 0000000..87ed69b --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/errors.ts @@ -0,0 +1,7 @@ +export class IsThawingError extends Error { + constructor(message: string) { + super(); + this.name = "IsThawingError"; + this.message = message; + } +} diff --git a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package-lock.json b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package-lock.json new file mode 100644 index 0000000..e874f44 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package-lock.json @@ -0,0 +1,1438 @@ +{ + "name": "can-write-lambda", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "can-write-lambda", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.405.0.tgz", + "integrity": "sha512-+LK6OCbKplR51zBZAtK/+RxaPsXcEklsA1+mmUA3M1h4KHl6GMiK5r/D9dlKht5DRntmmjCn3SI99QbfckqKXg==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-bucket-endpoint": "3.405.0", + "@aws-sdk/middleware-expect-continue": "3.398.0", + "@aws-sdk/middleware-flexible-checksums": "3.400.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-location-constraint": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-s3": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-ssec": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/signature-v4-multi-region": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/eventstream-serde-browser": "^2.0.5", + "@smithy/eventstream-serde-config-resolver": "^2.0.5", + "@smithy/eventstream-serde-node": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-blob-browser": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/hash-stream-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/md5-js": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-stream": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.5", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", + "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", + "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-sts": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", + "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", + "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", + "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", + "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", + "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", + "dependencies": { + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/token-providers": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", + "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.405.0.tgz", + "integrity": "sha512-wKmHZi44NkbaGXXbMwassUm06/wDtSYucPbM4paU2cMbBUOnwFpndHWlrRYCNmj5Ty5A2HjdkGlhgla8nifHzQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.398.0.tgz", + "integrity": "sha512-d6he+Qqwh1yqml9duXSv5iKJ2lS0PVrF2UEsVew2GFxfUif0E/davTZJjvWtnelbuIGcTP+wDKVVjLwBN2sN/g==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.400.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.400.0.tgz", + "integrity": "sha512-lpsumd5/G+eAMTr61h/cJQZ8+i+xzC6OG3bvUcbRHqcjN49XgeNLcPfYcr6Rzf0QHxmuCN4te/4XGU3Fif2YVA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.398.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", + "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.398.0.tgz", + "integrity": "sha512-it+olJf1Lf2bmH8OL/N1jMOFB0zEVYs4rIzgFrluTRCuPatRuDi4LsXS8zqYxkBa05JE8JmqwW5gCzAmWyLLqw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", + "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", + "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.398.0.tgz", + "integrity": "sha512-yweSMc/TyiFtqc52hFMKQJvTm3i1KCoW5mB3o/Sla6zsHBh+nS6TTaBmo+2kcDIR7AKODwW+FLCTHWiazb7J3Q==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", + "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", + "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.398.0.tgz", + "integrity": "sha512-QtKr/hPcRugKSIZAH4+7hbUfdW7Lg+OQvD25nJn7ic1JHRZ+eDctEFxdsmnt68lE6aZxOcHCWHAW6/umcA93Dw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", + "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.398.0.tgz", + "integrity": "sha512-8fTqTxRDWE03T7ClaWlCfbwuSae//01XMNVy2a9g5QgaelQh7ZZyU3ZIJiV8gIj8v6ZM0NGn9Bz1liI/vmNmcw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", + "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", + "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", + "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", + "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.14.tgz", + "integrity": "sha512-zXtteuYLWbSXnzI3O6xq3FYvigYZFW8mdytGibfarLL2lxHto9L3ILtGVnVGmFZa7SDh62l39EnU5hesLN87Fw==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", + "dependencies": { + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.19.tgz", + "integrity": "sha512-JsghnQ5zjWmjEVY8TFOulLdEOCj09SjRLugrHlkPZTIBBm7PQitCFVLThbsKPZQOP7N3ME1DU1nKUc1UaVnBog==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.6", + "@smithy/types": "^2.6.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.7", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.2.tgz", + "integrity": "sha512-Y62jBWdoLPSYjr9fFvJf+KwTa1EunjVr6NryTEWCnwIY93OJxwV4t0qxjwdPl/XMsUkq79ppNJSEQN6Ohnhxjw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.6", + "@smithy/property-provider": "^2.0.15", + "@smithy/types": "^2.6.0", + "@smithy/url-parser": "^2.0.14", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.14.tgz", + "integrity": "sha512-g/OU/MeWGfHDygoXgMWfG/Xb0QqDnAGcM9t2FRrVAhleXYRddGOEnfanR5cmHgB9ue52MJsyorqFjckzXsylaA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.6.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.14.tgz", + "integrity": "sha512-41wmYE9smDGJi1ZXp+LogH6BR7MkSsQD91wneIFISF/mupKULvoOJUkv/Nf0NMRxWlM3Bf1Vvi9FlR2oV4KU8Q==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.14.tgz", + "integrity": "sha512-43IyRIzQ82s+5X+t/3Ood00CcWtAXQdmUIUKMed2Qg9REPk8SVIHhpm3rwewLwg+3G2Nh8NOxXlEQu6DsPUcMw==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.14.tgz", + "integrity": "sha512-jVh9E2qAr6DxH5tWfCAl9HV6tI0pEQ3JVmu85JknDvYTC66djcjDdhctPV2EHuKWf2kjRiFJcMIn0eercW4THA==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.14.tgz", + "integrity": "sha512-Ie35+AISNn1NmEjn5b2SchIE49pvKp4Q74bE9ME5RULWI1MgXyGkQUajWd5E6OBSr/sqGcs+rD3IjPErXnCm9g==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.7.tgz", + "integrity": "sha512-iSDBjxuH9TgrtMYAr7j5evjvkvgwLY3y+9D547uep+JNkZ1ZT+BaeU20j6I/bO/i26ilCWFImrlXTPsfQtZdIQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.10", + "@smithy/querystring-builder": "^2.0.14", + "@smithy/types": "^2.6.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", + "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.15.tgz", + "integrity": "sha512-HX/7GIyPUT/HDWVYe2HYQu0iRnSYpF4uZVNhAhZsObPRawk5Mv0PbyluBgIFI2DDCCKgL/tloCYYwycff1GtQg==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.16.tgz", + "integrity": "sha512-Wbi9A0PacMYUOwjAulQP90Wl3mQ6NDwnyrZQzFjDz+UzjXOSyQMgBrTkUBz+pVoYVlX3DUu24gWMZBcit+wOGg==", + "dependencies": { + "@smithy/types": "^2.6.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.16.tgz", + "integrity": "sha512-4x24GFdeWos1Z49MC5sYdM1j+z32zcUr6oWM9Ggm3WudFAcRIcbG9uDQ1XgJ0Kl+ZTjpqLKniG0iuWvQb2Ud1A==", + "dependencies": { + "@smithy/types": "^2.6.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.14.tgz", + "integrity": "sha512-d8ohpwZo9RzTpGlAfsWtfm1SHBSU7+N4iuZ6MzR10xDTujJJWtmXYHK1uzcr7rggbpUTaWyHpPFgnf91q0EFqQ==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.16.tgz", + "integrity": "sha512-YhWt9aKl+EMSNXyUTUo7I01WHf3HcCkPu/Hl2QmTNwrHT49eWaY7hptAMaERZuHFH0V5xHgPKgKZo2I93DFtgQ==", + "dependencies": { + "@smithy/types": "^2.6.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.16.tgz", + "integrity": "sha512-9ddDia3pp1d3XzLXKcm7QebGxLq9iwKf+J1LapvlSOhpF8EM9SjMeSrMOOFgG+2TfW5K3+qz4IAJYYm7INYCng==", + "dependencies": { + "@smithy/protocol-http": "^3.0.10", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", + "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.1.tgz", + "integrity": "sha512-dVDS7HNJl/wb0lpByXor6whqDbb1YlLoaoWYoelyYzLHioXOE7y/0iDwJWtDcN36/tVCw9EPBFZ3aans84jLpg==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.14", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/shared-ini-file-loader": "^2.2.5", + "@smithy/types": "^2.6.0", + "@smithy/url-parser": "^2.0.14", + "@smithy/util-middleware": "^2.0.7", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.21.tgz", + "integrity": "sha512-EZS1EXv1k6IJX6hyu/0yNQuPcPaXwG8SWljQHYueyRbOxmqYgoWMWPtfZj0xRRQ4YtLawQSpBgAeiJltq8/MPw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.6", + "@smithy/protocol-http": "^3.0.10", + "@smithy/service-error-classification": "^2.0.7", + "@smithy/types": "^2.6.0", + "@smithy/util-middleware": "^2.0.7", + "@smithy/util-retry": "^2.0.7", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", + "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.14.tgz", + "integrity": "sha512-hFi3FqoYWDntCYA2IGY6gJ6FKjq2gye+1tfxF2HnIJB5uW8y2DhpRNBSUMoqP+qvYzRqZ6ntv4kgbG+o3pX57g==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.8.tgz", + "integrity": "sha512-7/N59j0zWqVEKExJcA14MrLDZ/IeN+d6nbkN8ucs+eURyaDUXWYlZrQmMOd/TyptcQv0+RDlgag/zSTTV62y/Q==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.6.tgz", + "integrity": "sha512-HLqTs6O78m3M3z1cPLFxddxhEPv5MkVatfPuxoVO3A+cHZanNd/H5I6btcdHy6N2CB1MJ/lihJC92h30SESsBA==", + "dependencies": { + "@smithy/property-provider": "^2.0.15", + "@smithy/shared-ini-file-loader": "^2.2.5", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.10.tgz", + "integrity": "sha512-lkALAwtN6odygIM4nB8aHDahINM6WXXjNrZmWQAh0RSossySRT2qa31cFv0ZBuAYVWeprskRk13AFvvLmf1WLw==", + "dependencies": { + "@smithy/abort-controller": "^2.0.14", + "@smithy/protocol-http": "^3.0.10", + "@smithy/querystring-builder": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", + "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.15.tgz", + "integrity": "sha512-YbRFBn8oiiC3o1Kn3a4KjGa6k47rCM9++5W9cWqYn9WnkyH+hBWgfJAckuxpyA2Hq6Ys4eFrWzXq6fqHEw7iew==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.14.tgz", + "integrity": "sha512-lQ4pm9vTv9nIhl5jt6uVMPludr6syE2FyJmHsIJJuOD7QPIJnrf9HhUGf1iHh9KJ4CUv21tpOU3X6s0rB6uJ0g==", + "dependencies": { + "@smithy/types": "^2.6.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.14.tgz", + "integrity": "sha512-+cbtXWI9tNtQjlgQg3CA+pvL3zKTAxPnG3Pj6MP89CR3vi3QMmD0SOWoq84tqZDnJCxlsusbgIXk1ngMReXo+A==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.7.tgz", + "integrity": "sha512-LLxgW12qGz8doYto15kZ4x1rHjtXl0BnCG6T6Wb8z2DI4PT9cJfOSvzbuLzy7+5I24PAepKgFeWHRd9GYy3Z9w==", + "dependencies": { + "@smithy/types": "^2.6.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.5.tgz", + "integrity": "sha512-LHA68Iu7SmNwfAVe8egmjDCy648/7iJR/fK1UnVw+iAOUJoEYhX2DLgVd5pWllqdDiRbQQzgaHLcRokM+UFR1w==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.16.tgz", + "integrity": "sha512-ilLY85xS2kZZzTb83diQKYLIYALvart0KnBaKnIRnMBHAGEio5aHSlANQoxVn0VsonwmQ3CnWhnCT0sERD8uTg==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.14", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.6.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.7", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.16.tgz", + "integrity": "sha512-Lw67+yQSpLl4YkDLUzI2KgS8TXclXmbzSeOJUmRFS4ueT56B4pw3RZRF/SRzvgyxM/HxgkUan8oSHXCujPDafQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.8", + "@smithy/types": "^2.6.0", + "@smithy/util-stream": "^2.0.21", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.6.0.tgz", + "integrity": "sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.14.tgz", + "integrity": "sha512-kbu17Y1AFXi5lNlySdDj7ZzmvupyWKCX/0jNZ8ffquRyGdbDZb+eBh0QnWqsSmnZa/ctyWaTf7n4l/pXLExrnw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.20.tgz", + "integrity": "sha512-QJtnbTIl0/BbEASkx1MUFf6EaoWqWW1/IM90N++8NNscePvPf77GheYfpoPis6CBQawUWq8QepTP2QUSAdrVkw==", + "dependencies": { + "@smithy/property-provider": "^2.0.15", + "@smithy/smithy-client": "^2.1.16", + "@smithy/types": "^2.6.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.26.tgz", + "integrity": "sha512-lGFPOFCHv1ql019oegYqa54BZH7HREw6EBqjDLbAr0wquMX0BDi2sg8TJ6Eq+JGLijkZbJB73m4+aK8OFAapMg==", + "dependencies": { + "@smithy/config-resolver": "^2.0.19", + "@smithy/credential-provider-imds": "^2.1.2", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/property-provider": "^2.0.15", + "@smithy/smithy-client": "^2.1.16", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.7.tgz", + "integrity": "sha512-tRINOTlf1G9B0ECarFQAtTgMhpnrMPSa+5j4ZEwEawCLfTFTavk6757sxhE4RY5RMlD/I3x+DCS8ZUiR8ho9Pw==", + "dependencies": { + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.7.tgz", + "integrity": "sha512-fIe5yARaF0+xVT1XKcrdnHKTJ1Vc4+3e3tLDjCuIcE9b6fkBzzGFY7AFiX4M+vj6yM98DrwkuZeHf7/hmtVp0Q==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.7", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.21.tgz", + "integrity": "sha512-0BUE16d7n1x7pi1YluXJdB33jOTyBChT0j/BlOkFa9uxfg6YqXieHxjHNuCdJRARa7AZEj32LLLEPJ1fSa4inA==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.7", + "@smithy/node-http-handler": "^2.1.10", + "@smithy/types": "^2.6.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.14.tgz", + "integrity": "sha512-Q6gSz4GUNjNGhrfNg+2Mjy+7K4pEI3r82x1b/+3dSc03MQqobMiUrRVN/YK/4nHVagvBELCoXsiHAFQJNQ5BeA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.14", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.93", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.93.tgz", + "integrity": "sha512-Vsyi9ogDAY3REZDjYnXMRJJa62SDvxHXxJI5nGDQdZW058dDE+av/anynN2rLKbCKXDRNw3D/sQmqxVflZFi4A==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + } + } +} diff --git a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package.json b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package.json new file mode 100644 index 0000000..3e82df7 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/package.json @@ -0,0 +1,9 @@ +{ + "name": "thaw-objects-lambda", + "version": "1.0.0", + "main": "thaw-objects-lambda.ts", + "dependencies": { + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" + } +} diff --git a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts new file mode 100644 index 0000000..3f7be51 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts @@ -0,0 +1,160 @@ +import { + HeadObjectCommand, + RestoreObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { IsThawingError } from "./errors"; + +interface ThawObjectsEvent { + Items: { + bucket: string; + key: string; + }[]; + + BatchInput: { + // ... + // there are other fields in the batch input that we are not interested in - we pass them on + // ... + + glacierFlexibleRetrievalThawDays: number; + glacierFlexibleRetrievalThawSpeed: string; + + glacierDeepArchiveThawDays: number; + glacierDeepArchiveThawSpeed: string; + + intelligentTieringArchiveThawDays: number; + intelligentTieringArchiveThawSpeed: string; + + intelligentTieringDeepArchiveThawDays: number; + intelligentTieringDeepArchiveThawSpeed: string; + }; +} + +/** + * A function to initiate restore/monitor any S3 objects that are in storage + * classes that do not allow immediate access. + * + * Note that restoring objects is the *sole* purpose of this lambda - so even + * though it could detect invalid objects / permissions errors etc - that is + * not what it is going to do. + * + * It attempts to find any objects that need thawing and initiates a restore. + * And it detects if any of in the process of thawing. In those cases it + * throws an Error. In *all other cases* it passes on data for the Fargate + * rclone step (even if there were exceptions it gobbled up). + * + * We do this because rclone has better mechanism for detecting errors and + * we don't want to redo the work here. Also this means error reporting + * out of the overall Steps orchestration will be consistent for "missing files" + * etc. + * + * @param event + */ +export async function handler(event: ThawObjectsEvent) { + console.log("thawObjects()"); + console.log(JSON.stringify(event, null, 2)); + + const client = new S3Client({}); + + // count of how many of the passed in objects we are thawing + let isThawing = 0; + + for (const o of event.Items || []) { + try { + // need to find out if the object is in a "needs restore" or "currently restoring" or "restored" category + const headCommand = new HeadObjectCommand({ + Bucket: o.bucket, + Key: o.key, + }); + + const headResult = await client.send(headCommand); + + if (headResult.Restore) { + // the object is still being thawed + if (headResult.Restore.includes('ongoing-request="true"')) isThawing++; + + // otherwise it may successfully have been restored - in which case we can just continue + // as if the file was in S3 active + // TODO are there other states we should check here? + // the only one I've found is ongoing-request=\"false\", expiry-date=\"Sat, 02 Dec 2023 00:00:00 GMT\" + continue; + } + + // now deal with the objects we have detected that are in storage classes needing restoring but where it + // hasn't started yet + if ( + headResult.StorageClass == "GLACIER" || + headResult.StorageClass == "DEEP_ARCHIVE" || + headResult.StorageClass == "INTELLIGENT_TIERING" + ) { + // some sensible defaults - that we retain if any of the expected parameter values is not present + let days: number = 1; + let tier: string = "Bulk"; + + if (headResult.StorageClass == "GLACIER") { + days = event.BatchInput.glacierFlexibleRetrievalThawDays ?? days; + tier = event.BatchInput.glacierFlexibleRetrievalThawSpeed ?? tier; + } + if (headResult.StorageClass == "DEEP_ARCHIVE") { + days = event.BatchInput.glacierDeepArchiveThawDays ?? days; + tier = event.BatchInput.glacierDeepArchiveThawSpeed ?? tier; + } + if (headResult.StorageClass == "INTELLIGENT_TIERING") { + if (headResult.ArchiveStatus == "ARCHIVE_ACCESS") { + days = event.BatchInput.intelligentTieringArchiveThawDays ?? days; + tier = event.BatchInput.intelligentTieringArchiveThawSpeed ?? tier; + } + if (headResult.ArchiveStatus == "DEEP_ARCHIVE_ACCESS") { + days = + event.BatchInput.intelligentTieringDeepArchiveThawDays ?? days; + tier = + event.BatchInput.intelligentTieringDeepArchiveThawSpeed ?? tier; + } + } + + const restoreObjectCommand = new RestoreObjectCommand({ + Bucket: o.bucket, + Key: o.key, + RestoreRequest: { + Days: days, + GlacierJobParameters: { + Tier: tier, + }, + }, + }); + + const restoreObjectResult = await client.send(restoreObjectCommand); + + // note: if the restore operation itself fails - then above line will throw an exception + // which means this will not count for "isThawing" + // which I think is the correct logic - if there is a permanent reason we can't unthaw an object - it will + // fall through out of this and the rclone will fail (at which point we will get an error and + // we can investigate) + + isThawing++; + } + } catch (e: any) { + // we actually gobble up any errors here (with just a print) + // see the top of this method for details + console.error(e); + } + } + + // the *only* way this method can fail via error is this path + // where we tell the Steps we are in the process of thawing + // *all* other paths should continue on (where they can fail in the rclone) + if (isThawing > 0) + throw new IsThawingError( + `${isThawing}/${event.Items.length} are in the process of thawing`, + ); + + return { + // Note we are converting the objects to rclone format here + // A better spot would be in the Fargate run task but the JsonPath + // for that would be a nightmare + Items: event.Items.map((a) => ({ + rcloneSource: `s3:${a.bucket}/${a.key}`, + })), + BatchInput: event.BatchInput, + }; +} diff --git a/packages/aws-copy-out-sharer/package.json b/packages/aws-copy-out-sharer/package.json index b6e7ef2..c7bdcbf 100644 --- a/packages/aws-copy-out-sharer/package.json +++ b/packages/aws-copy-out-sharer/package.json @@ -27,7 +27,8 @@ "outdir": "dist", "targets": {}, "tsc": { - "outDir": "out" + "outDir": "out", + "rootDir": "src" } }, "dependencies": { diff --git a/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts similarity index 95% rename from packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts rename to packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts index da2b011..1236c01 100644 --- a/packages/aws-copy-out-sharer/construct/can-write-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts @@ -38,7 +38,13 @@ export class CanWriteLambdaStepConstruct extends Construct { const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { vpc: props.vpc, - entry: join(__dirname, "can-write-lambda", "can-write-lambda.ts"), + entry: join( + __dirname, + "..", + "lambda", + "can-write-lambda", + "can-write-lambda.ts", + ), // by specifying the precise runtime - the bundler knows exactly what packages are already in // the base image - and for us can skip bundling @aws-sdk // if we need to move this forward beyond node 18 - then we may need to revisit this diff --git a/packages/aws-copy-out-sharer/copy-out-stack-props.ts b/packages/aws-copy-out-sharer/src/copy-out-stack-props.ts similarity index 100% rename from packages/aws-copy-out-sharer/copy-out-stack-props.ts rename to packages/aws-copy-out-sharer/src/copy-out-stack-props.ts diff --git a/packages/aws-copy-out-sharer/copy-out-stack.ts b/packages/aws-copy-out-sharer/src/copy-out-stack.ts similarity index 94% rename from packages/aws-copy-out-sharer/copy-out-stack.ts rename to packages/aws-copy-out-sharer/src/copy-out-stack.ts index aecc5f5..9068949 100644 --- a/packages/aws-copy-out-sharer/copy-out-stack.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-stack.ts @@ -2,7 +2,7 @@ import { Stack } from "aws-cdk-lib"; import { Construct } from "constructs"; import { CopyOutStackProps } from "./copy-out-stack-props"; import { Cluster } from "aws-cdk-lib/aws-ecs"; -import { CopyOutStateMachineConstruct } from "./construct/copy-out-state-machine-construct"; +import { CopyOutStateMachineConstruct } from "./copy-out-state-machine-construct"; import { Service } from "aws-cdk-lib/aws-servicediscovery"; import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; diff --git a/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts similarity index 91% rename from packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts rename to packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index ba23e97..5410263 100644 --- a/packages/aws-copy-out-sharer/construct/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -15,6 +15,7 @@ import { CanWriteLambdaStepConstruct } from "./can-write-lambda-step-construct"; import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { DistributedMapStepConstruct } from "./distributed-map-step-construct"; import { FargateRunTaskConstruct } from "./fargate-run-task-construct"; +import { ThawObjectsLambdaStepConstruct } from "./thaw-objects-lambda-step-construct"; export type CopyOutStateMachineProps = { vpc: IVpc; @@ -53,6 +54,22 @@ export class CopyOutStateMachineConstruct extends Construct { }, ); + const thawObjectsLambdaStep = new ThawObjectsLambdaStepConstruct( + this, + "ThawObjects", + { + vpc: props.vpc, + vpcSubnetSelection: props.vpcSubnetSelection, + }, + ); + + thawObjectsLambdaStep.invocableLambda.addRetry({ + errors: ["IsThawingError"], + interval: Duration.minutes(1), + backoffRate: 1, + maxAttempts: 15, + }); + const rcloneRunTask = new FargateRunTaskConstruct( this, "RcloneFargateTask", @@ -69,11 +86,14 @@ export class CopyOutStateMachineConstruct extends Construct { maxAttempts: 3, }); + const distributedStepsChain = + thawObjectsLambdaStep.invocableLambda.next(rcloneRunTask); + const distributedMapStep = new DistributedMapStepConstruct( this, "MapStep", { - task: rcloneRunTask, + task: distributedStepsChain, //rcloneRunTask, }, ).distributedMapStep; diff --git a/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts b/packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts similarity index 80% rename from packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts rename to packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts index 0cb473b..89db4e4 100644 --- a/packages/aws-copy-out-sharer/construct/distributed-map-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts @@ -31,6 +31,7 @@ export class DistributedMapStepConstruct extends Construct { // }, // "Items": [ // { + // "protocol: "s3", // "source": "s3:bucket/1.fastq.gz" // }, // { @@ -51,7 +52,7 @@ export class DistributedMapStepConstruct extends Construct { // not sure distributed map knows how to handle back-off?? // https://docs.aws.amazon.com/AmazonECS/latest/userguide/throttling.html MaxConcurrency: 80, - ToleratedFailurePercentage: 25, + ToleratedFailurePercentage: 100, ItemReader: { ReaderConfig: { InputType: "CSV", @@ -68,11 +69,19 @@ export class DistributedMapStepConstruct extends Construct { ItemBatcher: { MaxItemsPerBatchPath: JsonPath.stringAt("$.maxItemsPerBatch"), BatchInput: { - "destinationForRclone.$": JsonPath.format( + "rcloneDestination.$": JsonPath.format( "s3:{}/{}", JsonPath.stringAt("$.destinationBucket"), JsonPath.stringAt("$.destinationKey"), ), + glacierFlexibleRetrievalThawDays: 1, + glacierFlexibleRetrievalThawSpeed: "Expedited", + glacierDeepArchiveThawDays: 1, + glacierDeepArchiveThawSpeed: "Standard", + intelligentTieringArchiveThawDays: 1, + intelligentTieringArchiveThawSpeed: "Standard", + intelligentTieringDeepArchiveThawDays: 1, + intelligentTieringDeepArchiveThawSpeed: "Standard", }, }, ItemProcessor: { @@ -83,12 +92,10 @@ export class DistributedMapStepConstruct extends Construct { }, }, ItemSelector: { - "source.$": JsonPath.format( - // note: this is not an s3:// URL, it is the peculiar syntax used by rclone - "s3:{}/{}", - JsonPath.stringAt(`$$.Map.Item.Value.${bucketColumnName}`), - JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), + "bucket.$": JsonPath.stringAt( + `$$.Map.Item.Value.${bucketColumnName}`, ), + "key.$": JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), }, ResultWriter: { Resource: "arn:aws:states:::s3:putObject", diff --git a/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts b/packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts similarity index 89% rename from packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts rename to packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts index 808aac4..4d71376 100644 --- a/packages/aws-copy-out-sharer/construct/fargate-run-task-construct.ts +++ b/packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts @@ -1,7 +1,7 @@ import { Construct } from "constructs"; import { ManagedPolicy, PolicyStatement } from "aws-cdk-lib/aws-iam"; import { IntegrationPattern, JsonPath } from "aws-cdk-lib/aws-stepfunctions"; -import { Duration, Stack, Tags } from "aws-cdk-lib"; +import { Duration, Stack } from "aws-cdk-lib"; import { AssetImage, CpuArchitecture, @@ -54,7 +54,7 @@ export class FargateRunTaskConstruct extends Construct { memoryLimitMiB: 512, }); - Tags.of(taskDefinition).add("test", "tag"); + // Tags.of(taskDefinition).add("test", "tag"); // we need to give the rclone task the ability to do the copy out in S3 // TODO can we limit this to reading from our designated buckets and writing out @@ -74,13 +74,16 @@ export class FargateRunTaskConstruct extends Construct { ); const containerDefinition = taskDefinition.addContainer("RcloneContainer", { - // set the stop timeout to the maximum allowed under Fargate - as potentially this will let us finish - // our rclone operation + // set the stop timeout to the maximum allowed under Fargate Spot + // potentially this will let us finish our rclone operation (!!! - we don't actually try to let rclone finish - see Docker image - we should) stopTimeout: Duration.seconds(120), - image: new AssetImage(join(__dirname, "rclone-batch-copy-docker-image"), { - // note we are forcing the X86 platform because we want to use Fargate spot which is only available intel/x86 - platform: Platform.LINUX_AMD64, - }), + image: new AssetImage( + join(__dirname, "..", "docker", "rclone-batch-docker-image"), + { + // note we are forcing the X86 platform because we want to use Fargate spot which is only available intel/x86 + platform: Platform.LINUX_AMD64, + }, + ), logging: LogDriver.awsLogs({ streamPrefix: "elsa-data-copy-out", logRetention: RetentionDays.ONE_WEEK, @@ -109,28 +112,27 @@ export class FargateRunTaskConstruct extends Construct { subnets: { subnetType: props.vpcSubnetSelection, }, - resultSelector: { - // NOTE almost any amount of output can cause the joint result to overflow.. - // best to look up all this data at the ECS Task level - // have left these here to show how you can export ECS output if you want - // "capacityProviderName.$": JsonPath.stringAt("$.CapacityProviderName"), - // "stoppedAt.$": JsonPath.numberAt("$.StoppedAt"), - // "stoppedReason.$": JsonPath.stringAt("$.StoppedReason"), - }, + //resultSelector: { + // "rclone.$": JsonPath.objectAt("$"), + // "capacityProviderName.$": JsonPath.stringAt("$.CapacityProviderName"), + //"stoppedAt.$": JsonPath.numberAt("$.StoppedAt"), + //"stoppedReason.$": JsonPath.stringAt("$.StoppedReason"), + // }, + resultPath: "$.rcloneResult", containerOverrides: [ { containerDefinition: containerDefinition, - command: JsonPath.listAt("$.Items[*].source"), + command: JsonPath.listAt("$.Items[*].rcloneSource"), environment: [ { - name: "destination", + name: "RB_DESTINATION", // note this might be just a bucket name, or a bucket name with path // (that decision is made higher in the stack) // as far as rclone binary itself is concerned, it does not matter - value: JsonPath.stringAt("$.BatchInput.destinationForRclone"), + value: JsonPath.stringAt("$.BatchInput.rcloneDestination"), }, { - name: "tasktoken", + name: "RB_TASK_TOKEN", value: JsonPath.stringAt("$$.Task.Token"), }, ], diff --git a/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts new file mode 100644 index 0000000..d84d1ec --- /dev/null +++ b/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts @@ -0,0 +1,65 @@ +import { Construct } from "constructs"; +import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { Duration } from "aws-cdk-lib"; +import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; +import { Runtime } from "aws-cdk-lib/aws-lambda"; +import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; +import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; +import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; +import { join } from "path"; + +type ThawObjectsLambdaStepProps = { + vpc: IVpc; + vpcSubnetSelection: SubnetType; +}; + +/** + * A construct for a Steps function that tests whether an S3 + * bucket exists, is in the correct region, and is writeable + * by us. Throws an exception if any of these conditions is not met. + */ +export class ThawObjectsLambdaStepConstruct extends Construct { + public readonly invocableLambda; + + constructor(scope: Construct, id: string, props: ThawObjectsLambdaStepProps) { + super(scope, id); + + const thawObjectsLambda = new NodejsFunction(this, "ThawObjectsFunction", { + vpc: props.vpc, + entry: join( + __dirname, + "..", + "lambda", + "thaw-objects-lambda", + "thaw-objects-lambda.ts", + ), + runtime: Runtime.NODEJS_20_X, + handler: "handler", + bundling: { + minify: false, + }, + vpcSubnets: { + subnetType: props.vpcSubnetSelection, + }, + // this seems like plenty of seconds to do a few API calls to S3 + timeout: Duration.seconds(300), + }); + + thawObjectsLambda.addToRolePolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["s3:*"], + resources: ["*"], + }), + ); + + this.invocableLambda = new LambdaInvoke( + this, + `Are The Objects Available To Copy?`, + { + lambdaFunction: thawObjectsLambda, + resultPath: JsonPath.DISCARD, + }, + ); + } +} From 8a3d9d2914e1dd9f3bbcd22e8edcb9ea5d5daf5d Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Fri, 1 Dec 2023 16:42:20 +1100 Subject: [PATCH 15/22] New distributed map construct from internet Working with thawing and copying --- dev/test.ts | 2 +- .../thaw-objects-lambda.ts | 14 +- .../src/can-write-lambda-step-construct.ts | 14 +- .../aws-copy-out-sharer/src/copy-out-stack.ts | 7 - .../src/copy-out-state-machine-construct.ts | 74 +++------ .../src/copy-out-state-machine-input.ts | 11 ++ .../src/rclone-map-construct.ts | 90 +++++++++++ ...struct.ts => rclone-run-task-construct.ts} | 8 +- .../src/s3-csv-distributed-map.ts | 152 ++++++++++++++++++ .../src/thaw-objects-lambda-step-construct.ts | 32 ++-- .../src/thaw-objects-map-construct.ts | 82 ++++++++++ 11 files changed, 377 insertions(+), 109 deletions(-) create mode 100644 packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts create mode 100644 packages/aws-copy-out-sharer/src/rclone-map-construct.ts rename packages/aws-copy-out-sharer/src/{fargate-run-task-construct.ts => rclone-run-task-construct.ts} (96%) create mode 100644 packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts create mode 100644 packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts diff --git a/dev/test.ts b/dev/test.ts index 27b5009..21b6b95 100644 --- a/dev/test.ts +++ b/dev/test.ts @@ -51,7 +51,7 @@ async function makeTestObject( async function createTestData() { const sourceObjects = { - [`${testFolderSrc}/1.bin`]: StorageClass.DEEP_ARCHIVE, + [`${testFolderSrc}/1.bin`]: StorageClass.GLACIER_IR, [`${testFolderSrc}/2.bin`]: StorageClass.STANDARD, [`${testFolderSrc}/3.bin`]: StorageClass.GLACIER, }; diff --git a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts index 3f7be51..a24254b 100644 --- a/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts +++ b/packages/aws-copy-out-sharer/lambda/thaw-objects-lambda/thaw-objects-lambda.ts @@ -12,10 +12,6 @@ interface ThawObjectsEvent { }[]; BatchInput: { - // ... - // there are other fields in the batch input that we are not interested in - we pass them on - // ... - glacierFlexibleRetrievalThawDays: number; glacierFlexibleRetrievalThawSpeed: string; @@ -148,13 +144,5 @@ export async function handler(event: ThawObjectsEvent) { `${isThawing}/${event.Items.length} are in the process of thawing`, ); - return { - // Note we are converting the objects to rclone format here - // A better spot would be in the Fargate run task but the JsonPath - // for that would be a nightmare - Items: event.Items.map((a) => ({ - rcloneSource: `s3:${a.bucket}/${a.key}`, - })), - BatchInput: event.BatchInput, - }; + return {}; } diff --git a/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts index 1236c01..e684ae2 100644 --- a/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/can-write-lambda-step-construct.ts @@ -3,15 +3,11 @@ import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; import { Duration, Stack } from "aws-cdk-lib"; import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; import { Runtime } from "aws-cdk-lib/aws-lambda"; -import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; import { join } from "path"; type CanWriteLambdaStepProps = { - vpc: IVpc; - vpcSubnetSelection: SubnetType; - requiredRegion: string; /** @@ -37,7 +33,6 @@ export class CanWriteLambdaStepConstruct extends Construct { super(scope, id); const canWriteLambda = new NodejsFunction(this, "CanWriteFunction", { - vpc: props.vpc, entry: join( __dirname, "..", @@ -45,18 +40,11 @@ export class CanWriteLambdaStepConstruct extends Construct { "can-write-lambda", "can-write-lambda.ts", ), - // by specifying the precise runtime - the bundler knows exactly what packages are already in - // the base image - and for us can skip bundling @aws-sdk - // if we need to move this forward beyond node 18 - then we may need to revisit this - runtime: Runtime.NODEJS_18_X, + runtime: Runtime.NODEJS_20_X, handler: "handler", bundling: { - externalModules: ["aws-sdk"], minify: false, }, - vpcSubnets: { - subnetType: props.vpcSubnetSelection, - }, // this seems like plenty of seconds to do a few API calls to S3 timeout: Duration.seconds(30), }); diff --git a/packages/aws-copy-out-sharer/src/copy-out-stack.ts b/packages/aws-copy-out-sharer/src/copy-out-stack.ts index 9068949..7d177d4 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-stack.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-stack.ts @@ -1,7 +1,6 @@ import { Stack } from "aws-cdk-lib"; import { Construct } from "constructs"; import { CopyOutStackProps } from "./copy-out-stack-props"; -import { Cluster } from "aws-cdk-lib/aws-ecs"; import { CopyOutStateMachineConstruct } from "./copy-out-state-machine-construct"; import { Service } from "aws-cdk-lib/aws-servicediscovery"; import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; @@ -20,11 +19,6 @@ export class CopyOutStack extends Stack { const namespace = infraClient.getNamespaceFromLookup(this); - const cluster = new Cluster(this, "FargateCluster", { - vpc: vpc, - enableFargateCapacityProviders: true, - }); - const service = new Service(this, "Service", { namespace: namespace, name: "CopyOut", @@ -34,7 +28,6 @@ export class CopyOutStack extends Stack { const copyOut = new CopyOutStateMachineConstruct(this, "CopyOut", { vpc: vpc, vpcSubnetSelection: props.infrastructureSubnetSelection, - fargateCluster: cluster, aggressiveTimes: props.isDevelopment, allowWriteToThisAccount: props.isDevelopment, }); diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index 5410263..cd3bb7d 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -10,20 +10,17 @@ import { WaitTime, } from "aws-cdk-lib/aws-stepfunctions"; import { Arn, ArnFormat, Duration, Stack } from "aws-cdk-lib"; -import { ICluster } from "aws-cdk-lib/aws-ecs"; import { CanWriteLambdaStepConstruct } from "./can-write-lambda-step-construct"; import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; -import { DistributedMapStepConstruct } from "./distributed-map-step-construct"; -import { FargateRunTaskConstruct } from "./fargate-run-task-construct"; -import { ThawObjectsLambdaStepConstruct } from "./thaw-objects-lambda-step-construct"; +import { ThawObjectsMapConstruct } from "./thaw-objects-map-construct"; +import { CopyOutStateMachineInput } from "./copy-out-state-machine-input"; +import { RcloneMapConstruct } from "./rclone-map-construct"; export type CopyOutStateMachineProps = { vpc: IVpc; vpcSubnetSelection: SubnetType; - fargateCluster: ICluster; - /** * Whether the stack should use duration/timeouts that are more suited * to demonstration/development. i.e. minutes rather than hours for wait times, @@ -47,56 +44,16 @@ export class CopyOutStateMachineConstruct extends Construct { this, "CanWrite", { - vpc: props.vpc, - vpcSubnetSelection: props.vpcSubnetSelection, requiredRegion: Stack.of(this).region, allowWriteToThisAccount: props.allowWriteToThisAccount, }, ); - const thawObjectsLambdaStep = new ThawObjectsLambdaStepConstruct( - this, - "ThawObjects", - { - vpc: props.vpc, - vpcSubnetSelection: props.vpcSubnetSelection, - }, - ); - - thawObjectsLambdaStep.invocableLambda.addRetry({ - errors: ["IsThawingError"], - interval: Duration.minutes(1), - backoffRate: 1, - maxAttempts: 15, - }); - - const rcloneRunTask = new FargateRunTaskConstruct( - this, - "RcloneFargateTask", - { - fargateCluster: props.fargateCluster, - vpcSubnetSelection: props.vpcSubnetSelection, - }, - ).ecsRunTask; - - // our task is an idempotent copy operation so we can retry if we happen to get killed - // (possible given we are using Spot fargate) - rcloneRunTask.addRetry({ - errors: ["States.TaskFailed"], - maxAttempts: 3, + const rcloneMap = new RcloneMapConstruct(this, "RcloneMap", { + vpc: props.vpc, + vpcSubnetSelection: props.vpcSubnetSelection, }); - const distributedStepsChain = - thawObjectsLambdaStep.invocableLambda.next(rcloneRunTask); - - const distributedMapStep = new DistributedMapStepConstruct( - this, - "MapStep", - { - task: distributedStepsChain, //rcloneRunTask, - }, - ).distributedMapStep; - const canWriteStep = canWriteLambdaStep.invocableLambda; const waitStep = new Wait(this, "Wait X Minutes", { @@ -105,12 +62,14 @@ export class CopyOutStateMachineConstruct extends Construct { ), }); + const defaults: Partial = { + maxItemsPerBatch: 1, + requiredRegion: Stack.of(this).region, + destinationKey: "", + }; + const defineDefaults = new Pass(this, "Define Defaults", { - parameters: { - maxItemsPerBatch: 1, - requiredRegion: Stack.of(this).region, - destinationKey: "", - }, + parameters: defaults, resultPath: "$.inputDefaults", }); @@ -134,11 +93,14 @@ export class CopyOutStateMachineConstruct extends Construct { canWriteStep.addCatch(fail, { errors: ["WrongRegionError"] }); + const thawObjectsMap = new ThawObjectsMapConstruct(this, "ThawObjects", {}); + const definition = ChainDefinitionBody.fromChainable( defineDefaults .next(applyDefaults) .next(canWriteStep) - .next(distributedMapStep) + .next(thawObjectsMap.distributedMap) + .next(rcloneMap.distributedMap) .next(success), ); @@ -151,6 +113,8 @@ export class CopyOutStateMachineConstruct extends Construct { definitionBody: definition, }); + thawObjectsMap.distributedMap.grantNestedPermissions(this._stateMachine); + // this is needed to support distributed map - once there is a native CDK for this I presume this goes this._stateMachine.addToRolePolicy( new PolicyStatement({ diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts new file mode 100644 index 0000000..482c362 --- /dev/null +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts @@ -0,0 +1,11 @@ +export type CopyOutStateMachineInput = { + maxItemsPerBatch: number; + requiredRegion: string; + + sourceFilesCsvBucket: string; + sourceFilesCsvKey: string; + + destinationKey: string; +}; + +export type CopyOutStateMachineInputKeys = keyof CopyOutStateMachineInput; diff --git a/packages/aws-copy-out-sharer/src/rclone-map-construct.ts b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts new file mode 100644 index 0000000..e7a658b --- /dev/null +++ b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts @@ -0,0 +1,90 @@ +import { Construct } from "constructs"; +import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; +import { S3CsvDistributedMap } from "./s3-csv-distributed-map"; +import { RcloneRunTaskConstruct } from "./rclone-run-task-construct"; +import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; +import { Cluster } from "aws-cdk-lib/aws-ecs"; + +type Props = { + vpc: IVpc; + vpcSubnetSelection: SubnetType; +}; + +export class RcloneMapConstruct extends Construct { + public readonly distributedMap: S3CsvDistributedMap; + + constructor(scope: Construct, id: string, props: Props) { + super(scope, id); + + const cluster = new Cluster(this, "FargateCluster", { + vpc: props.vpc, + enableFargateCapacityProviders: true, + }); + + const rcloneRunTask = new RcloneRunTaskConstruct( + this, + "RcloneFargateTask", + { + fargateCluster: cluster, + vpcSubnetSelection: props.vpcSubnetSelection, + }, + ).ecsRunTask; + + // our task is an idempotent copy operation so we can retry if we happen to get killed + // (possible given we are using Spot fargate) + rcloneRunTask.addRetry({ + errors: ["States.TaskFailed"], + maxAttempts: 3, + }); + + // these names are internal only - but we pull out as a const to make sure + // they are consistent + const bucketColumnName = "b"; + const keyColumnName = "k"; + + // { + // "BatchInput": { + // "rcloneDestination": "s3:cpg-cardiac-flagship-transfer/optionalpath" + // }, + // "Items": [ + // { + // "rcloneSource": "s3:bucket/1.fastq.gz" + // }, + // { + // "rcloneSource": "s3:bucket/2.fastq.gz" + // }, + // } + + this.distributedMap = new S3CsvDistributedMap(this, "RcloneMap", { + toleratedFailurePercentage: 25, + itemReaderCsvHeaders: [bucketColumnName, keyColumnName], + itemReader: { + "Bucket.$": "$.sourceFilesCsvBucket", + "Key.$": "$.sourceFilesCsvKey", + }, + itemSelector: { + "rcloneSource.$": JsonPath.format( + // note: this is not an s3:// URL, it is the peculiar syntax used by rclone + "s3:{}/{}", + JsonPath.stringAt(`$$.Map.Item.Value.${bucketColumnName}`), + JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), + ), + }, + batchInput: { + "rcloneDestination.$": JsonPath.format( + "s3:{}/{}", + JsonPath.stringAt(`$.destinationBucket`), + JsonPath.stringAt("$.destinationKey"), + ), + }, + iterator: rcloneRunTask, + resultWriter: { + "Bucket.$": "$.sourceFilesCsvBucket", + "Prefix.$": JsonPath.format( + "{}-results", + JsonPath.stringAt("$.sourceFilesCsvKey"), + ), + }, + }); + } +} diff --git a/packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts b/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts similarity index 96% rename from packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts rename to packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts index 4d71376..3c0f3a6 100644 --- a/packages/aws-copy-out-sharer/src/fargate-run-task-construct.ts +++ b/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts @@ -37,7 +37,7 @@ type Props = { //allowWriteToThisAccount?: boolean; WIP NEED TO IMPLEMENT }; -export class FargateRunTaskConstruct extends Construct { +export class RcloneRunTaskConstruct extends Construct { public readonly ecsRunTask: EcsRunTask; constructor(scope: Construct, id: string, props: Props) { @@ -88,6 +88,8 @@ export class FargateRunTaskConstruct extends Construct { streamPrefix: "elsa-data-copy-out", logRetention: RetentionDays.ONE_WEEK, }), + // eg the equivalent of + // RCLONE_CONFIG_S3_TYPE=s3 RCLONE_CONFIG_S3_PROVIDER=AWS RCLONE_CONFIG_S3_ENV_AUTH=true RCLONE_CONFIG_S3_REGION=ap-southeast-2 rclone copy src dest environment: { RCLONE_CONFIG_S3_TYPE: "s3", RCLONE_CONFIG_S3_PROVIDER: "AWS", @@ -98,12 +100,10 @@ export class FargateRunTaskConstruct extends Construct { }, }); - // RCLONE_CONFIG_S3_TYPE=s3 RCLONE_CONFIG_S3_PROVIDER=AWS RCLONE_CONFIG_S3_ENV_AUTH=true RCLONE_CONFIG_S3_REGION=ap-southeast-2 rclone copy src dest - // https://github.com/aws/aws-cdk/issues/20013 this.ecsRunTask = new EcsRunTask(this, "Copy File with Rclone", { + // we use task tokens as we want to return rclone stats/results integrationPattern: IntegrationPattern.WAIT_FOR_TASK_TOKEN, - // .RUN_JOB, cluster: props.fargateCluster, taskDefinition: taskDefinition, launchTarget: new EcsFargateSpotOnlyLaunchTarget({ diff --git a/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts new file mode 100644 index 0000000..ec3ec2a --- /dev/null +++ b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts @@ -0,0 +1,152 @@ +import { + Chain, + IChainable, + INextable, + JsonPath, + State, + StateGraph, + StateMachine, +} from "aws-cdk-lib/aws-stepfunctions"; +import { Effect, Policy, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { Construct } from "constructs"; + +export interface S3CsvDistributedMapProps { + readonly iterator: State; + readonly toleratedFailurePercentage: number; + readonly itemReaderCsvHeaders: string[]; + readonly itemReader: { + readonly Bucket?: JsonPath | string; + readonly "Bucket.$"?: string; + readonly Key?: JsonPath | string; + readonly "Key.$"?: string; + }; + readonly resultWriter?: { + readonly Bucket?: JsonPath | string; + readonly "Bucket.$"?: string; + readonly Prefix?: JsonPath | string; + readonly "Prefix.$"?: string; + }; + readonly itemSelector?: Readonly>; + + readonly batchMaxItems?: number; + readonly batchMaxItemsPath?: JsonPath | string; + readonly batchInput?: Readonly>; + + readonly maxConcurrency?: number; + readonly maxConcurrencyPath?: JsonPath | string; + + readonly resultPath?: JsonPath | string; + readonly label?: string; +} + +export class S3CsvDistributedMap + extends State + implements IChainable, INextable +{ + public readonly endStates: INextable[]; + private readonly props: S3CsvDistributedMapProps; + + private readonly graph: StateGraph; + private readonly policy: Policy; + + constructor(scope: Construct, id: string, props: S3CsvDistributedMapProps) { + super(scope, id, {}); + this.props = props; + + if (props.batchMaxItems && props.batchMaxItemsPath) + throw Error("Only one of batchMaxItems or batchMaxItemsPath can be set"); + + if (props.maxConcurrency && props.maxConcurrencyPath) + throw Error( + "Only one of maxConcurrency or maxConcurrencyPath can be set", + ); + + this.graph = new StateGraph(props.iterator, `Map ${this.stateId} Iterator`); + this.policy = new Policy(this, "IamRole"); + + this.endStates = [this]; + } + + grantNestedPermissions(stateMachine: StateMachine) { + // this grants the autogenerated permissions in the distributed maps substates to the state machine + // (e.g) dynamodb, lambda invoke, etc + this.graph.policyStatements.forEach((s) => stateMachine.addToRolePolicy(s)); + + // this grants the permissions to the state machine to start, stop, and describe the map + // NB: we can't add the statement directly to the state machine or it creates a circular + // reference which the CDK objects too. By using a policy we get around this limitation. + + this.policy.addStatements( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: [ + "states:StartExecution", + "states:DescribeExecution", + "states:StopExecution", + ], + resources: [stateMachine.stateMachineArn], + }), + ); + + this.policy.attachToRole(stateMachine.role); + } + + protected makeNext(next: State) { + super.makeNext(next); + next.bindToGraph(this.graph); + } + + public next(next: IChainable): Chain { + super.makeNext(next.startState); + return Chain.sequence(this, next); + } + + override toStateJson(): object { + const stateJson = { + Type: "Map", + ToleratedFailurePercentage: this.props.toleratedFailurePercentage, + ItemProcessor: { + ProcessorConfig: { + Mode: "DISTRIBUTED", + ExecutionType: "STANDARD", + }, + ...this.graph.toGraphJson(), + }, + ItemReader: { + Resource: "arn:aws:states:::s3:getObject", + ReaderConfig: { + InputType: "CSV", + CSVHeaderLocation: "GIVEN", + CSVHeaders: this.props.itemReaderCsvHeaders, + }, + Parameters: this.props.itemReader, + }, + ItemSelector: this.props.itemSelector, + ItemBatcher: + this.props.batchMaxItemsPath || + this.props.batchMaxItems || + this.props.batchInput + ? { + MaxItemsPerBatch: this.props.batchMaxItems, + MaxItemsPerBatchPath: this.props.batchMaxItemsPath, + BatchInput: this.props.batchInput, + } + : undefined, + MaxConcurrency: this.props.maxConcurrency, + MaxConcurrencyPath: this.props.maxConcurrencyPath, + Label: this.props.label, + ResultWriter: this.props.resultWriter + ? { + Resource: "arn:aws:states:::s3:putObject", + Parameters: this.props.resultWriter, + } + : undefined, + ResultPath: this.props.resultPath, + }; + + return { + ...this.renderNextEnd(), + ...stateJson, + }; + } +} diff --git a/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts index d84d1ec..4b08464 100644 --- a/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/thaw-objects-lambda-step-construct.ts @@ -3,29 +3,29 @@ import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; import { Duration } from "aws-cdk-lib"; import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; import { Runtime } from "aws-cdk-lib/aws-lambda"; -import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; import { join } from "path"; -type ThawObjectsLambdaStepProps = { - vpc: IVpc; - vpcSubnetSelection: SubnetType; -}; +type Props = {}; /** - * A construct for a Steps function that tests whether an S3 - * bucket exists, is in the correct region, and is writeable - * by us. Throws an exception if any of these conditions is not met. + * A construct for a Steps function that tests if a set + * of input files are available for copying (i.e. in active + * storage) and if not, triggers a restore on them. Whenever + * any input file is not available - this lambda throws a + * IsThawingError (at the end of processing all of them). + * + * It can then be used in a loop waiting + * for thawing to finish - by Retry/Catching this error. */ export class ThawObjectsLambdaStepConstruct extends Construct { public readonly invocableLambda; - constructor(scope: Construct, id: string, props: ThawObjectsLambdaStepProps) { + constructor(scope: Construct, id: string, _props: Props) { super(scope, id); const thawObjectsLambda = new NodejsFunction(this, "ThawObjectsFunction", { - vpc: props.vpc, entry: join( __dirname, "..", @@ -36,19 +36,19 @@ export class ThawObjectsLambdaStepConstruct extends Construct { runtime: Runtime.NODEJS_20_X, handler: "handler", bundling: { + // for a small method it is sometimes easier if it can be viewed + // in the AWS console un-minified minify: false, }, - vpcSubnets: { - subnetType: props.vpcSubnetSelection, - }, - // this seems like plenty of seconds to do a few API calls to S3 - timeout: Duration.seconds(300), + // we can theoretically need to loop through 1000s of objects + // so we give ourselves plenty of time + timeout: Duration.seconds(60 * 5), }); thawObjectsLambda.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, - actions: ["s3:*"], + actions: ["s3:GetObject", "s3:RestoreObject"], resources: ["*"], }), ); diff --git a/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts b/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts new file mode 100644 index 0000000..c5d305a --- /dev/null +++ b/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts @@ -0,0 +1,82 @@ +import { Construct } from "constructs"; +import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; +import { S3CsvDistributedMap } from "./s3-csv-distributed-map"; +import { ThawObjectsLambdaStepConstruct } from "./thaw-objects-lambda-step-construct"; +import { Duration } from "aws-cdk-lib"; +import { CopyOutStateMachineInputKeys } from "./copy-out-state-machine-input"; + +type Props = {}; + +export class ThawObjectsMapConstruct extends Construct { + public readonly distributedMap: S3CsvDistributedMap; + + constructor(scope: Construct, id: string, _props: Props) { + super(scope, id); + + const thawObjectsLambdaStep = new ThawObjectsLambdaStepConstruct( + this, + "LambdaStep", + {}, + ); + + thawObjectsLambdaStep.invocableLambda.addRetry({ + errors: ["IsThawingError"], + interval: Duration.minutes(1), + backoffRate: 1, + maxAttempts: 15, + }); + + // these names are internal only - but we pull out as a const to make sure + // they are consistent + const bucketColumnName = "b"; + const keyColumnName = "k"; + + // this odd construct just makes sure that the JSON paths we specify + // here correspond with fields in the master "input" schema for the + // overall Steps function + const bucketKeyName: CopyOutStateMachineInputKeys = "sourceFilesCsvBucket"; + const keyKeyName: CopyOutStateMachineInputKeys = "sourceFilesCsvKey"; + + this.distributedMap = new S3CsvDistributedMap(this, "ThawObjectsMap", { + // we do not expect any failures of these functions and if we + // do - we are fully prepared for us to move onto the rclone + // steps where we will get proper error messages if the copies fail + toleratedFailurePercentage: 100, + itemReaderCsvHeaders: [bucketColumnName, keyColumnName], + itemReader: { + "Bucket.$": `$.${bucketKeyName}`, + "Key.$": `$.${keyKeyName}`, + }, + itemSelector: { + "bucket.$": JsonPath.stringAt(`$$.Map.Item.Value.${bucketColumnName}`), + "key.$": JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), + }, + batchInput: { + glacierFlexibleRetrievalThawDays: 1, + glacierFlexibleRetrievalThawSpeed: "Expedited", + glacierDeepArchiveThawDays: 1, + glacierDeepArchiveThawSpeed: "Standard", + intelligentTieringArchiveThawDays: 1, + intelligentTieringArchiveThawSpeed: "Standard", + intelligentTieringDeepArchiveThawDays: 1, + intelligentTieringDeepArchiveThawSpeed: "Standard", + }, + iterator: thawObjectsLambdaStep.invocableLambda, + resultPath: JsonPath.DISCARD, + }); + } +} + +/* +{\"BatchInput\":{\"rcloneDestination\":" + +"\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-dest\"}," + +"\"Items\":[" + +"{\"rcloneSource\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/1.bin\"}," + +"{\"rcloneSource\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/2.bin\"}," + +"{\"rcloneSource\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/3.bin\"}]," + +"\"rcloneResult\":[" + +"{\"bytes\":0,\"checks\":0,\"deletedDirs\":0,\"deletes\":0,\"elapsedTime\":0.355840879,\"errors\":0,\"eta\":null,\"fatalError\":false,\"renames\":0,\"retryError\":false,\"serverSideCopies\":1,\"serverSideCopyBytes\":9,\"serverSideMoveBytes\":0,\"serverSideMoves\":0,\"source\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/1.bin\",\"speed\":0,\"totalBytes\":0,\"totalChecks\":0,\"totalTransfers\":1,\"transferTime\":0.057049542,\"transfers\":1}," + +"{\"bytes\":0,\"checks\":0,\"deletedDirs\":0,\"deletes\":0,\"elapsedTime\":0.368602993,\"errors\":0,\"eta\":null,\"fatalError\":false,\"renames\":0,\"retryError\":false,\"serverSideCopies\":1,\"serverSideCopyBytes\":9,\"serverSideMoveBytes\":0,\"serverSideMoves\":0,\"source\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/2.bin\",\"speed\":0,\"totalBytes\":0,\"totalChecks\":0,\"totalTransfers\":1,\"transferTime\":0.044628996,\"transfers\":1}," + +"{\"bytes\":0,\"checks\":0,\"deletedDirs\":0,\"deletes\":0,\"elapsedTime\":0.385300283,\"errors\":0,\"eta\":null,\"fatalError\":false,\"renames\":0,\"retryError\":false,\"serverSideCopies\":1,\"serverSideCopyBytes\":9,\"serverSideMoveBytes\":0,\"serverSideMoves\":0,\"source\":\"s3:elsa-data-tmp/8e467a3e27e1e0b73fcd15b5c419e53c-src/3.bin\",\"speed\":0,\"totalBytes\":0,\"totalChecks\":0,\"totalTransfers\":1,\"transferTime\":0.05217003,\"transfers\":1}]} + + */ From ece33d26b150f4bad6b6648d7882928de566c9c0 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Mon, 4 Dec 2023 18:11:05 +1100 Subject: [PATCH 16/22] Moved stack to dev only Added sumarrise step (WIP) --- dev/constants.ts | 22 + dev/dev.ts | 58 +- dev/package.json | 8 +- dev/test.ts | 182 ++- packages/aws-copy-out-sharer/README.md | 3 + .../can-write-lambda/can-write-lambda.ts | 33 +- .../lambda/can-write-lambda/errors.ts | 8 + .../lambda/summarise-copy-lambda/.gitignore | 3 + .../lambda/summarise-copy-lambda/errors.ts | 15 + .../summarise-copy-lambda/package-lock.json | 1438 +++++++++++++++++ .../lambda/summarise-copy-lambda/package.json | 9 + .../summarise-copy-lambda.ts | 98 ++ packages/aws-copy-out-sharer/package.json | 28 +- .../src/copy-out-stack-props.ts | 19 - .../aws-copy-out-sharer/src/copy-out-stack.ts | 41 - .../src/copy-out-state-machine-construct.ts | 206 +-- .../src/copy-out-state-machine-input.ts | 34 +- .../src/copy-out-state-machine-props.ts | 47 + .../src/distributed-map-step-construct.ts | 113 -- .../src/rclone-map-construct.ts | 21 +- .../summarise-copy-lambda-step-construct.ts | 101 ++ .../src/thaw-objects-map-construct.ts | 25 +- pnpm-lock.yaml | 460 +++--- 23 files changed, 2347 insertions(+), 625 deletions(-) create mode 100644 dev/constants.ts create mode 100644 packages/aws-copy-out-sharer/README.md create mode 100644 packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/.gitignore create mode 100644 packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/errors.ts create mode 100644 packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json create mode 100644 packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json create mode 100644 packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts delete mode 100644 packages/aws-copy-out-sharer/src/copy-out-stack-props.ts delete mode 100644 packages/aws-copy-out-sharer/src/copy-out-stack.ts create mode 100644 packages/aws-copy-out-sharer/src/copy-out-state-machine-props.ts delete mode 100644 packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts create mode 100644 packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts diff --git a/dev/constants.ts b/dev/constants.ts new file mode 100644 index 0000000..31e6d1b --- /dev/null +++ b/dev/constants.ts @@ -0,0 +1,22 @@ +/** + * The only configurable item needed for the test cases - set this to a bucket you have + * full access to. Ideally the bucket should have a lifecycle that auto expires objects after 1 day. + * In order to keep minimal AWS permissions this is also specified + * in the CDK deployment. + */ +export const TEST_BUCKET = "elsa-data-tmp"; + +/** + * A designated area in our test bucket that is where we can find the list + * of objects to copy - and other working files + * NOTE: this is not where the source or destination files are located. + */ +export const TEST_BUCKET_WORKING_PREFIX = "copy-out-test-working/"; + +/** + * We have a clear permissions split between the objects that we are copying - and + * the working objects we create in doing the copy. By making sure they are in + * different test folders - we can confirm that our permissions aren't accidentally + * overlapping (which might mean we pass tests that later fail for real) + */ +export const TEST_BUCKET_OBJECT_PREFIX = "copy-out-test-objects/"; diff --git a/dev/dev.ts b/dev/dev.ts index 97fe028..f3ab8b5 100644 --- a/dev/dev.ts +++ b/dev/dev.ts @@ -1,6 +1,10 @@ -import { CopyOutStack } from "aws-copy-out-sharer"; +import { CopyOutStateMachineConstruct } from "aws-copy-out-sharer"; import { SubnetType } from "aws-cdk-lib/aws-ec2"; -import { App } from "aws-cdk-lib"; +import { App, Stack, StackProps } from "aws-cdk-lib"; +import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; +import { Service } from "aws-cdk-lib/aws-servicediscovery"; +import { Construct } from "constructs"; +import { TEST_BUCKET, TEST_BUCKET_WORKING_PREFIX } from "./constants"; const app = new App(); @@ -9,7 +13,52 @@ const description = const devId = "ElsaDataDevCopyOutStack"; -new CopyOutStack(app, devId, { +/** + * Wraps the copy out construct for development purposes. We don't do this Stack definition in the + * construct itself - as unlike some other Elsa Data constructs - there may be general + * utility to the copy out service (i.e. we want to let people just install the Copy Out + * state machine without elsa infrastructure). But for dev purposes we are developing + * this in conjunction with Elsa Data - so we register it into the namespace and use a common + * VPC etc. + */ +class ElsaDataCopyOutStack extends Stack { + constructor(scope?: Construct, id?: string, props?: StackProps) { + super(scope, id, props); + + // our client unlocks the ability to fetch/create CDK objects that match our + // installed infrastructure stack (by infrastructure stack name) + const infraClient = new InfrastructureClient( + "ElsaDataDevInfrastructureStack", + ); + + const vpc = infraClient.getVpcFromLookup(this); + + const namespace = infraClient.getNamespaceFromLookup(this); + + const service = new Service(this, "Service", { + namespace: namespace, + name: "CopyOut", + description: "Parallel file copying service", + }); + + const copyOut = new CopyOutStateMachineConstruct(this, "CopyOut", { + vpc: vpc, + vpcSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, + workingBucket: TEST_BUCKET, + workingBucketPrefixKey: TEST_BUCKET_WORKING_PREFIX, + aggressiveTimes: true, + allowWriteToInstalledAccount: true, + }); + + service.registerNonIpInstance("StateMachine", { + customAttributes: { + stateMachineArn: copyOut.stateMachine.stateMachineArn, + }, + }); + } +} + +new ElsaDataCopyOutStack(app, devId, { // the stack can only be deployed to 'dev' env: { account: "843407916570", @@ -20,7 +69,4 @@ new CopyOutStack(app, devId, { "umccr-org:Stack": devId, }, description: description, - isDevelopment: true, - infrastructureStackName: "ElsaDataDevInfrastructureStack", - infrastructureSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, }); diff --git a/dev/package.json b/dev/package.json index db2c929..e5bc4f8 100644 --- a/dev/package.json +++ b/dev/package.json @@ -13,9 +13,11 @@ "@aws-sdk/client-s3": "3.450.0", "@aws-sdk/client-servicediscovery": "3.450.0", "@aws-sdk/client-sfn": "3.450.0", - "aws-cdk": "2.108.1", - "aws-cdk-lib": "2.108.1", - "aws-copy-out-sharer": "link:../packages/aws-copy-out-sharer" + "@elsa-data/aws-infrastructure": "1.5.1", + "aws-cdk": "2.113.0", + "aws-cdk-lib": "2.113.0", + "aws-copy-out-sharer": "link:../packages/aws-copy-out-sharer", + "constructs": "10.3.0" }, "devDependencies": {} } diff --git a/dev/test.ts b/dev/test.ts index 21b6b95..d7f9494 100644 --- a/dev/test.ts +++ b/dev/test.ts @@ -5,51 +5,127 @@ import { DiscoverInstancesCommand, ServiceDiscoveryClient, } from "@aws-sdk/client-servicediscovery"; - -/** - * The only configurable item needed for the test cases - set this to a bucket you have - * full access to. Ideally the bucket should have a lifecycle that auto expires objects after 1 day. - */ -const TEST_BUCKET = "elsa-data-tmp"; +import { + TEST_BUCKET, + TEST_BUCKET_OBJECT_PREFIX, + TEST_BUCKET_WORKING_PREFIX, +} from "./constants"; const discoveryClient = new ServiceDiscoveryClient({}); const s3Client = new S3Client({}); const sfnClient = new SFNClient({}); -const testFolder = randomBytes(16).toString("hex"); -const testFolderSrc = testFolder + "-src"; -const testFolderDest = testFolder + "-dest"; +// generate a unique run folder for this execution of the entire test suite +const uniqueFolder = randomBytes(8).toString("hex"); -async function makeObjectListCsv(key: string, keys: string[]) { +/** + * Put a list of objects as a CSV into an object. + * + * @param absoluteCsvKey the key of the CSV in the working folder + * @param keysBucket the source bucket of the objects + * @param keys the keys of the objects + */ +async function makeObjectListCsv( + absoluteCsvKey: string, + keysBucket: string, + keys: string[], +) { let content = ""; for (const k of keys) { - content += `${TEST_BUCKET},"${k}"\n`; + content += `${keysBucket},"${k}"\n`; } const response = await s3Client.send( new PutObjectCommand({ Bucket: TEST_BUCKET, - Key: key, + Key: absoluteCsvKey, Body: content, }), ); } -async function makeTestObject( - key: string, - sizeInBytes: number, - storageClass: StorageClass = "STANDARD", -) { - const response = await s3Client.send( - new PutObjectCommand({ - Bucket: TEST_BUCKET, - Key: key, - Body: "Hello S3!", - StorageClass: storageClass, +function getPaths(testNumber: number) { + const tsvName = `${testNumber}-objects-to-copy.tsv`; + + return { + // because this must exist in the working folder - we need it + // both as a relative path (how we will refer to it within the steps) + // and an absolute path (for use outside our steps) + testFolderObjectsTsvRelative: `${uniqueFolder}/${tsvName}`, + testFolderObjectsTsvAbsolute: `${TEST_BUCKET_WORKING_PREFIX}${uniqueFolder}/${tsvName}`, + + testFolderSrc: `${TEST_BUCKET_OBJECT_PREFIX}${uniqueFolder}/${testNumber}-src`, + testFolderDest: `${TEST_BUCKET_OBJECT_PREFIX}${uniqueFolder}/${testNumber}-dest/`, + }; +} + +async function doTest1(stateMachineArn: string) { + const { + testFolderSrc, + testFolderDest, + testFolderObjectsTsvAbsolute, + testFolderObjectsTsvRelative, + } = getPaths(1); + + // 3 files in standard storage (no thawing) + const sourceObjects = { + [`${testFolderSrc}/1.bin`]: StorageClass.STANDARD, + [`${testFolderSrc}/2.bin`]: StorageClass.STANDARD, + [`${testFolderSrc}/3.bin`]: StorageClass.STANDARD, + }; + + for (const [n, stor] of Object.entries(sourceObjects)) { + await makeTestObject(n, 256 * 1024, stor); + } + + await makeObjectListCsv( + testFolderObjectsTsvAbsolute, + TEST_BUCKET, + Object.keys(sourceObjects), + ); + + await sfnClient.send( + new StartExecutionCommand({ + stateMachineArn: stateMachineArn, + input: JSON.stringify({ + sourceFilesCsvKey: testFolderObjectsTsvRelative, + destinationBucket: TEST_BUCKET, + destinationPrefixKey: testFolderDest, + maxItemsPerBatch: 1, + }), + }), + ); +} + +async function doTest2(stateMachineArn: string) { + const { + testFolderDest, + testFolderObjectsTsvAbsolute, + testFolderObjectsTsvRelative, + } = getPaths(1); + + await makeObjectListCsv(testFolderObjectsTsvAbsolute, "umccr-10g-data-dev", [ + "HG00096/HG00096.hard-filtered.vcf.gz", + "HG00097/HG00097.hard-filtered.vcf.gz", + ]); + + await sfnClient.send( + new StartExecutionCommand({ + stateMachineArn: stateMachineArn, + input: JSON.stringify({ + sourceFilesCsvKey: testFolderObjectsTsvRelative, + destinationBucket: TEST_BUCKET, + destinationPrefixKey: testFolderDest, + maxItemsPerBatch: 1, + }), }), ); } -async function createTestData() { +// s3:///HG00096/HG00096.hard-filtered.vcf.gz +async function doTest3(stateMachineArn: string) { + const testFolderSrc = uniqueFolder + "-src2"; + const testFolderDest = uniqueFolder + "-dest2"; + const sourceObjects = { [`${testFolderSrc}/1.bin`]: StorageClass.GLACIER_IR, [`${testFolderSrc}/2.bin`]: StorageClass.STANDARD, @@ -62,13 +138,42 @@ async function createTestData() { await makeObjectListCsv( `${testFolderSrc}/objects-to-copy.tsv`, + TEST_BUCKET, Object.keys(sourceObjects), ); + + await sfnClient.send( + new StartExecutionCommand({ + stateMachineArn: stateMachineArn, + input: JSON.stringify({ + sourceFilesCsvKey: `${testFolderSrc}/objects-to-copy.tsv`, + destinationBucket: TEST_BUCKET, + destinationPrefixKey: testFolderDest, + maxItemsPerBatch: 1, + }), + }), + ); } +async function makeTestObject( + key: string, + sizeInBytes: number, + storageClass: StorageClass = "STANDARD", +) { + const response = await s3Client.send( + new PutObjectCommand({ + Bucket: TEST_BUCKET, + Key: key, + Body: Buffer.alloc(sizeInBytes, 13), + StorageClass: storageClass, + }), + ); +} + +async function createTestData() {} + (async () => { - console.log(`Src objects = ${TEST_BUCKET}:${testFolderSrc}`); - console.log(`Dest objects = ${TEST_BUCKET}:${testFolderDest}`); + console.log(`Working folder = ${TEST_BUCKET}:${uniqueFolder}`); const stepsDiscover = await discoveryClient.send( new DiscoverInstancesCommand({ @@ -95,28 +200,5 @@ async function createTestData() { const stateMachineArn = stateMachineDiscovered.Attributes["stateMachineArn"]; - await createTestData(); - - /*await sfnClient.send(new StartExecutionCommand({ - stateMachineArn: stateMachineArn, - input: JSON.stringify({ - sourceFilesCsvBucket: TEST_BUCKET, - sourceFilesCsvKey: `${testFolderSrc}/objects-to-copy.tsv`, - destinationBucket: TEST_BUCKET, - maxItemsPerBatch: 1 - }) - }));*/ - - await sfnClient.send( - new StartExecutionCommand({ - stateMachineArn: stateMachineArn, - input: JSON.stringify({ - sourceFilesCsvBucket: TEST_BUCKET, - sourceFilesCsvKey: `${testFolderSrc}/objects-to-copy.tsv`, - destinationBucket: TEST_BUCKET, - destinationKey: testFolderDest, - maxItemsPerBatch: 1, - }), - }), - ); + await doTest2(stateMachineArn); })(); diff --git a/packages/aws-copy-out-sharer/README.md b/packages/aws-copy-out-sharer/README.md new file mode 100644 index 0000000..750e874 --- /dev/null +++ b/packages/aws-copy-out-sharer/README.md @@ -0,0 +1,3 @@ +# copy out state machine + +A construct for a AWS Steps Copy Out state machine. diff --git a/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts b/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts index 85efc55..4331876 100644 --- a/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts +++ b/packages/aws-copy-out-sharer/lambda/can-write-lambda/can-write-lambda.ts @@ -1,14 +1,31 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; -import { AccessDeniedError, WrongRegionError } from "./errors"; +import { + AccessDeniedError, + DestinationPrefixKeyNoTrailingSlashError, + WrongRegionError, +} from "./errors"; + +// see the main src/copy-out-state-machine-input.ts for matching fields interface InvokeEvent { requiredRegion: string; + destinationBucket: string; + + destinationPrefixKey: string; + + destinationStartCopyRelativeKey: string; } export async function handler(event: InvokeEvent) { console.log(JSON.stringify(event, null, 2)); + if (event.destinationPrefixKey) + if (!event.destinationPrefixKey.endsWith("/")) + throw new DestinationPrefixKeyNoTrailingSlashError( + "The destination prefix key must either be an empty string or a string with a trailing slash", + ); + // we are being super specific here - more so than our normal client creation // the "required region" is where we are going // to make our client - in order to ensure we get 301 Redirects for buckets outside our location @@ -17,8 +34,8 @@ export async function handler(event: InvokeEvent) { try { const putCommand = new PutObjectCommand({ Bucket: event.destinationBucket, - Key: "ELSA_DATA_STARTED_TRANSFER.txt", - Body: "A file created by Elsa Data copy out to ensure correct permissions", + Key: `${event.destinationPrefixKey}${event.destinationStartCopyRelativeKey}`, + Body: "A file created by copy out to ensure correct permissions and to indicate that start of the copy process", }); await client.send(putCommand); @@ -34,13 +51,3 @@ export async function handler(event: InvokeEvent) { throw e; } } - -/*handler({ - requiredRegion: "ap-southeast-2", - //destinationBucket: "elsa-data-tmp" - //destinationBucket: "cdk-hnb659fds-assets-843407916570-us-east-1" - //destinationBucket: "elsa-data-replication-target-foo" - destinationBucket: "elsa-data-replication-target" - // destinationBucket: "elsa-data-copy-target-sydney" - // destinationBucket: "elsa-data-copy-target-tokyo" -}) */ diff --git a/packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts b/packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts index d693553..427d755 100644 --- a/packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts +++ b/packages/aws-copy-out-sharer/lambda/can-write-lambda/errors.ts @@ -13,3 +13,11 @@ export class AccessDeniedError extends Error { this.message = message; } } + +export class DestinationPrefixKeyNoTrailingSlashError extends Error { + constructor(message: string) { + super(); + this.name = "DestinationPrefixKeyNoTrailingSlashError"; + this.message = message; + } +} diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/.gitignore b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/.gitignore new file mode 100644 index 0000000..dc19133 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/.gitignore @@ -0,0 +1,3 @@ + +# this lambda is a straight JS - no typescript so we need to include the JS +!*.js diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/errors.ts b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/errors.ts new file mode 100644 index 0000000..d693553 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/errors.ts @@ -0,0 +1,15 @@ +export class WrongRegionError extends Error { + constructor(message: string) { + super(); + this.name = "WrongRegionError"; + this.message = message; + } +} + +export class AccessDeniedError extends Error { + constructor(message: string) { + super(); + this.name = "AccessDeniedError"; + this.message = message; + } +} diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json new file mode 100644 index 0000000..e84c5e8 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json @@ -0,0 +1,1438 @@ +{ + "name": "can-write-lambda", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "can-write-lambda", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.405.0.tgz", + "integrity": "sha512-+LK6OCbKplR51zBZAtK/+RxaPsXcEklsA1+mmUA3M1h4KHl6GMiK5r/D9dlKht5DRntmmjCn3SI99QbfckqKXg==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-bucket-endpoint": "3.405.0", + "@aws-sdk/middleware-expect-continue": "3.398.0", + "@aws-sdk/middleware-flexible-checksums": "3.400.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-location-constraint": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-s3": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-ssec": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/signature-v4-multi-region": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/eventstream-serde-browser": "^2.0.5", + "@smithy/eventstream-serde-config-resolver": "^2.0.5", + "@smithy/eventstream-serde-node": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-blob-browser": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/hash-stream-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/md5-js": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-stream": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.5", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", + "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", + "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-sts": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", + "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", + "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", + "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", + "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", + "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", + "dependencies": { + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/token-providers": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", + "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.405.0.tgz", + "integrity": "sha512-wKmHZi44NkbaGXXbMwassUm06/wDtSYucPbM4paU2cMbBUOnwFpndHWlrRYCNmj5Ty5A2HjdkGlhgla8nifHzQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.398.0.tgz", + "integrity": "sha512-d6he+Qqwh1yqml9duXSv5iKJ2lS0PVrF2UEsVew2GFxfUif0E/davTZJjvWtnelbuIGcTP+wDKVVjLwBN2sN/g==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.400.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.400.0.tgz", + "integrity": "sha512-lpsumd5/G+eAMTr61h/cJQZ8+i+xzC6OG3bvUcbRHqcjN49XgeNLcPfYcr6Rzf0QHxmuCN4te/4XGU3Fif2YVA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.398.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", + "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.398.0.tgz", + "integrity": "sha512-it+olJf1Lf2bmH8OL/N1jMOFB0zEVYs4rIzgFrluTRCuPatRuDi4LsXS8zqYxkBa05JE8JmqwW5gCzAmWyLLqw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", + "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", + "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.398.0.tgz", + "integrity": "sha512-yweSMc/TyiFtqc52hFMKQJvTm3i1KCoW5mB3o/Sla6zsHBh+nS6TTaBmo+2kcDIR7AKODwW+FLCTHWiazb7J3Q==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", + "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", + "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.398.0.tgz", + "integrity": "sha512-QtKr/hPcRugKSIZAH4+7hbUfdW7Lg+OQvD25nJn7ic1JHRZ+eDctEFxdsmnt68lE6aZxOcHCWHAW6/umcA93Dw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", + "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.398.0.tgz", + "integrity": "sha512-8fTqTxRDWE03T7ClaWlCfbwuSae//01XMNVy2a9g5QgaelQh7ZZyU3ZIJiV8gIj8v6ZM0NGn9Bz1liI/vmNmcw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", + "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", + "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", + "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", + "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.13.tgz", + "integrity": "sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", + "dependencies": { + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.18.tgz", + "integrity": "sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/types": "^2.5.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.6", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.1.tgz", + "integrity": "sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/property-provider": "^2.0.14", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.13.tgz", + "integrity": "sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.5.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.13.tgz", + "integrity": "sha512-OJ/2g/VxkzA+mYZxV102oX3CsiE+igTSmqq/ir3oEVG2kSIdRC00ryttj/lmL14W06ExNi0ysmfLxQkL8XrAZQ==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.13.tgz", + "integrity": "sha512-2BI1CbnYuEvAYoWSeWJtPNygbIKiWeSLxCmDLnyM6wQV32Of7VptiQlaFXPxXp4zqn/rs3ocZ/T29rxE4s4Gsg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.13.tgz", + "integrity": "sha512-7NbFwPafb924elFxCBDvm48jy/DeSrpFbFQN0uN2ThuY5HrEeubikS0t7WMva4Z4EnRoivpbuT0scb9vUIJKoA==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.13.tgz", + "integrity": "sha512-j0yFd5UfftM+ia9dxLRbheJDCkCZBHpcEzCsPO8BxVOTbdcX/auVJCv6ov/yvpCKsf4Hv3mOqi0Is1YogM2g3Q==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.6.tgz", + "integrity": "sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==", + "dependencies": { + "@smithy/protocol-http": "^3.0.9", + "@smithy/querystring-builder": "^2.0.13", + "@smithy/types": "^2.5.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.14.tgz", + "integrity": "sha512-yWdghyPJIEqLYsaE7YVgd3YhM7jN4Pv6eJQvTomnMsz5K2qRBlpjUx3T9fKlElp1qdeQ7DNc3sAat4i9CUBO7Q==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.15.tgz", + "integrity": "sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.15.tgz", + "integrity": "sha512-ZZ6kC/pHt5Dc2goXIIyC8uA7A4GUMSzdCynAabnZ3CSSaV6ctP8mlvVkqjPph0O3XzHlx/80gdLrNqi1GDPUsA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.13.tgz", + "integrity": "sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.15.tgz", + "integrity": "sha512-pAZaokib56XvhU0t/R9vAcr3L3bMhIakhF25X7EMSQ7LAURiLfce/tgON8I3x/dIbnZUyeRi8f2cx2azu6ATew==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.15.tgz", + "integrity": "sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==", + "dependencies": { + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.0.tgz", + "integrity": "sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.13", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/shared-ini-file-loader": "^2.2.4", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-middleware": "^2.0.6", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.20.tgz", + "integrity": "sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.5", + "@smithy/protocol-http": "^3.0.9", + "@smithy/service-error-classification": "^2.0.6", + "@smithy/types": "^2.5.0", + "@smithy/util-middleware": "^2.0.6", + "@smithy/util-retry": "^2.0.6", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.13.tgz", + "integrity": "sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.7.tgz", + "integrity": "sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.5.tgz", + "integrity": "sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==", + "dependencies": { + "@smithy/property-provider": "^2.0.14", + "@smithy/shared-ini-file-loader": "^2.2.4", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.9.tgz", + "integrity": "sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.13", + "@smithy/protocol-http": "^3.0.9", + "@smithy/querystring-builder": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.9.tgz", + "integrity": "sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.14.tgz", + "integrity": "sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.13.tgz", + "integrity": "sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.13.tgz", + "integrity": "sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.6.tgz", + "integrity": "sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==", + "dependencies": { + "@smithy/types": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.4.tgz", + "integrity": "sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.15.tgz", + "integrity": "sha512-SRTEJSEhQYVlBKIIdZ9SZpqW+KFqxqcNnEcBX+8xkDdWx+DItme9VcCDkdN32yTIrICC+irUufnUdV7mmHPjoA==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.13", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.5.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.6", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.15.tgz", + "integrity": "sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.7", + "@smithy/types": "^2.5.0", + "@smithy/util-stream": "^2.0.20", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.5.0.tgz", + "integrity": "sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.13.tgz", + "integrity": "sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.19.tgz", + "integrity": "sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==", + "dependencies": { + "@smithy/property-provider": "^2.0.14", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.25.tgz", + "integrity": "sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==", + "dependencies": { + "@smithy/config-resolver": "^2.0.18", + "@smithy/credential-provider-imds": "^2.1.1", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/property-provider": "^2.0.14", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.6.tgz", + "integrity": "sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==", + "dependencies": { + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.6.tgz", + "integrity": "sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.6", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.20.tgz", + "integrity": "sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/node-http-handler": "^2.1.9", + "@smithy/types": "^2.5.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.13.tgz", + "integrity": "sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg==", + "dependencies": { + "@smithy/abort-controller": "^2.0.13", + "@smithy/types": "^2.5.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.93", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.93.tgz", + "integrity": "sha512-Vsyi9ogDAY3REZDjYnXMRJJa62SDvxHXxJI5nGDQdZW058dDE+av/anynN2rLKbCKXDRNw3D/sQmqxVflZFi4A==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + } + } +} diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json new file mode 100644 index 0000000..764d461 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json @@ -0,0 +1,9 @@ +{ + "name": "can-write-lambda", + "version": "1.0.0", + "main": "summarise-copy-lambda.ts", + "dependencies": { + "@aws-sdk/client-s3": "3.405.0", + "@types/aws-lambda": "8.10.93" + } +} diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts new file mode 100644 index 0000000..cab1e99 --- /dev/null +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts @@ -0,0 +1,98 @@ +import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { basename } from "path/posix"; + +interface InvokeEvent { + Bucket: string; + Key: string; +} + +export async function handler(event: InvokeEvent) { + console.log(JSON.stringify(event, null, 2)); + + const client = new S3Client({}); + + const getManifestCommand = new GetObjectCommand({ + Bucket: event.Bucket, + Key: event.Key, + }); + + const getManifestResult = await client.send(getManifestCommand); + const getManifestContent = await getManifestResult.Body.transformToString(); + + const manifest = JSON.parse(getManifestContent); + + // {"DestinationBucket":"elsa-data-tmp", + // "MapRunArn":"arn:aws:states:ap-southeast-2:843407916570:mapRun:CopyOutStateMachineF3E7B017-3KDB9FinLIMl/4474d22f-4056-30e3-978c-027016edac90:0c17ffd6-e8ad-44c0-a65b-a8b721007241", + // "ResultFiles":{ + // "FAILED":[], + // "PENDING":[], + // "SUCCEEDED":[{"Key":"copy-out-test-working/a6faea86c066cd90/1-objects-to-copy.tsv/0c17ffd6-e8ad-44c0-a65b-a8b721007241/SUCCEEDED_0.json","Size":2887}]}} + if (manifest["ResultFiles"]) { + const rf = manifest["ResultFiles"]; + + if (rf["FAILED"] && rf["FAILED"].length > 0) + throw new Error("Copy is meant to succeed - but it had failed results"); + + if (rf["PENDING"] && rf["PENDING"].length > 0) + throw new Error("Copy is meant to succeed - but it had pending results"); + + if (!rf["SUCCEEDED"]) throw new Error("Copy is meant to succeed"); + + const fileResults = {}; + + for (const s of rf["SUCCEEDED"]) { + const getSuccessCommand = new GetObjectCommand({ + Bucket: event.Bucket, + Key: s["Key"], + }); + + const getSuccessResult = await client.send(getSuccessCommand); + const getSuccessContent = await getSuccessResult.Body.transformToString(); + + for (const row of JSON.parse(getSuccessContent)) { + if (row["Output"]) { + const rowOutput = JSON.parse(row["Output"]); + + // { "bytes": 0, + // "checks": 0, + // "deletedDirs": 0, + // "deletes": 0, + // "elapsedTime": 0.2928195, + // "errors": 0, + // "eta": null, + // "fatalError": false, + // "renames": 0, + // "retryError": false, + // "serverSideCopies": 1, + // "serverSideCopyBytes": 9, + // "serverSideMoveBytes": 0, + // "serverSideMoves": 0, + // "source": "s3:elsa-data-tmp/copy-out-test-objects/d76848c9ae316e13/1-src/1.bin", + // "speed": 0, + // "totalBytes": 0, + // "totalChecks": 0, + // "totalTransfers": 1, + // "transferTime": 0.046778609, + // "transfers": 1 } + for (const rcloneRow of rowOutput["rcloneResult"]) { + const s = rcloneRow["source"]; + const b = basename(s); + + const copiedBytes = rcloneRow["serverSideCopyBytes"]; + const copySeconds = rcloneRow["elapsedTime"]; + + fileResults[b] = { + name: b, + speedInMebibytesPerSecond: + copiedBytes / copySeconds / 1024 / 1024, + }; + } + } + } + + console.log(JSON.stringify(fileResults, null, 2)); + } + } else { + throw new Error("Missing result manifest"); + } +} diff --git a/packages/aws-copy-out-sharer/package.json b/packages/aws-copy-out-sharer/package.json index c7bdcbf..66af768 100644 --- a/packages/aws-copy-out-sharer/package.json +++ b/packages/aws-copy-out-sharer/package.json @@ -1,7 +1,7 @@ { "name": "@elsa-data/aws-copy-out-sharer", "version": "0.0.0", - "description": "CDK project for deploying a Copy Out service into Elsa Data", + "description": "CDK constructs for a AWS Steps machine that copies objects", "homepage": "https://github.com/elsa-data/aws-copy-out-sharer", "license": "MIT", "author": { @@ -12,16 +12,19 @@ "type": "git", "url": "git+https://github.com/elsa-data/aws-copy-out-sharer.git" }, - "main": "out/copy-out-stack.js", - "types": "out/copy-out-stack.d.ts", + "main": "out/copy-out-state-machine-construct.js", + "types": "out/copy-out-state-machine-construct.d.ts", "scripts": { - "build": "jsii -vvv", + "build": "jsii", "build:watch": "jsii -w", - "package": "jsii-pacmak -vvv" + "package": "jsii-pacmak" }, "keywords": [ "jsii", - "cdk" + "cdk", + "s3", + "steps", + "copy" ], "jsii": { "outdir": "dist", @@ -31,18 +34,15 @@ "rootDir": "src" } }, - "dependencies": { - "@elsa-data/aws-infrastructure": "^1.5.1" - }, "peerDependencies": { - "aws-cdk-lib": "^2.108.1", + "aws-cdk-lib": "^2.113.0", "constructs": "^10.3.0" }, "devDependencies": { - "aws-cdk-lib": "2.108.1", + "aws-cdk-lib": "2.113.0", "constructs": "10.3.0", - "jsii": "5.2.29", - "jsii-pacmak": "1.91.0", - "publib": "0.2.745" + "jsii": "5.2.35", + "jsii-pacmak": "1.92.0", + "publib": "0.2.756" } } diff --git a/packages/aws-copy-out-sharer/src/copy-out-stack-props.ts b/packages/aws-copy-out-sharer/src/copy-out-stack-props.ts deleted file mode 100644 index b135db3..0000000 --- a/packages/aws-copy-out-sharer/src/copy-out-stack-props.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { SubnetType } from "aws-cdk-lib/aws-ec2"; -import { StackProps } from "aws-cdk-lib"; - -export { SubnetType } from "aws-cdk-lib/aws-ec2"; - -export interface CopyOutStackProps extends StackProps { - readonly isDevelopment?: boolean; - - /** - * The name of a previously installed stack providing us with network/db/storage/cert infrastructure - * via cloud formation exports. - */ - readonly infrastructureStackName: string; - - /** - * The choice of what subnet in the VPC we want to run this copy operation. - */ - readonly infrastructureSubnetSelection: SubnetType; -} diff --git a/packages/aws-copy-out-sharer/src/copy-out-stack.ts b/packages/aws-copy-out-sharer/src/copy-out-stack.ts deleted file mode 100644 index 7d177d4..0000000 --- a/packages/aws-copy-out-sharer/src/copy-out-stack.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Stack } from "aws-cdk-lib"; -import { Construct } from "constructs"; -import { CopyOutStackProps } from "./copy-out-stack-props"; -import { CopyOutStateMachineConstruct } from "./copy-out-state-machine-construct"; -import { Service } from "aws-cdk-lib/aws-servicediscovery"; -import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; - -export { CopyOutStackProps, SubnetType } from "./copy-out-stack-props"; - -export class CopyOutStack extends Stack { - constructor(scope: Construct, id: string, props: CopyOutStackProps) { - super(scope, id, props); - - // our client unlocks the ability to fetch/create CDK objects that match our - // installed infrastructure stack (by infrastructure stack name) - const infraClient = new InfrastructureClient(props.infrastructureStackName); - - const vpc = infraClient.getVpcFromLookup(this); - - const namespace = infraClient.getNamespaceFromLookup(this); - - const service = new Service(this, "Service", { - namespace: namespace, - name: "CopyOut", - description: "Parallel file copying service", - }); - - const copyOut = new CopyOutStateMachineConstruct(this, "CopyOut", { - vpc: vpc, - vpcSubnetSelection: props.infrastructureSubnetSelection, - aggressiveTimes: props.isDevelopment, - allowWriteToThisAccount: props.isDevelopment, - }); - - service.registerNonIpInstance("StateMachine", { - customAttributes: { - stateMachineArn: copyOut.stateMachine.stateMachineArn, - }, - }); - } -} diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index cd3bb7d..d4161e5 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -1,5 +1,5 @@ import { Construct } from "constructs"; -import { Effect, ManagedPolicy, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; import { ChainDefinitionBody, Fail, @@ -9,64 +9,77 @@ import { Wait, WaitTime, } from "aws-cdk-lib/aws-stepfunctions"; -import { Arn, ArnFormat, Duration, Stack } from "aws-cdk-lib"; +import { Duration, Stack } from "aws-cdk-lib"; import { CanWriteLambdaStepConstruct } from "./can-write-lambda-step-construct"; -import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { ThawObjectsMapConstruct } from "./thaw-objects-map-construct"; import { CopyOutStateMachineInput } from "./copy-out-state-machine-input"; import { RcloneMapConstruct } from "./rclone-map-construct"; +import { CopyOutStateMachineProps } from "./copy-out-state-machine-props"; +import { SummariseCopyLambdaStepConstruct } from "./summarise-copy-lambda-step-construct"; -export type CopyOutStateMachineProps = { - vpc: IVpc; - - vpcSubnetSelection: SubnetType; - - /** - * Whether the stack should use duration/timeouts that are more suited - * to demonstration/development. i.e. minutes rather than hours for wait times, - * hours rather than days for copy time-outs. - */ - aggressiveTimes?: boolean; - - allowWriteToThisAccount?: boolean; - - // WIP workingBucket workingPrefix - // should make it that if specified this is a bucket that exclusively - // holds the source CSVs and result CSVs (so we can lock down the S3 perms) -}; +export { CopyOutStateMachineProps } from "./copy-out-state-machine-props"; +export { SubnetType } from "aws-cdk-lib/aws-ec2"; +/** + * A construct that makes a state machine for bulk copying (large) + * objects from one bucket to another. + */ export class CopyOutStateMachineConstruct extends Construct { private readonly _stateMachine: StateMachine; constructor(scope: Construct, id: string, props: CopyOutStateMachineProps) { super(scope, id); + if (props.workingBucketPrefixKey) + if (!props.workingBucketPrefixKey.endsWith("/")) + throw new Error( + "If specified, the working bucket prefix key must end with a slash", + ); + + // these are the default values that are applied to the *steps* input + const defaults: Partial = { + maxItemsPerBatch: 8, + copyConcurrency: 80, + requiredRegion: Stack.of(this).region, + // by default we just copy into the top level of the destination bucket + destinationPrefixKey: "", + + // these are the default objects that will be created in the destination prefix area + destinationStartCopyRelativeKey: "STARTED_COPY.txt", + destinationEndCopyRelativeKey: "ENDED_COPY.txt", + }; + const canWriteLambdaStep = new CanWriteLambdaStepConstruct( this, "CanWrite", { requiredRegion: Stack.of(this).region, - allowWriteToThisAccount: props.allowWriteToThisAccount, + allowWriteToThisAccount: props.allowWriteToInstalledAccount, }, ); - const rcloneMap = new RcloneMapConstruct(this, "RcloneMap", { - vpc: props.vpc, - vpcSubnetSelection: props.vpcSubnetSelection, - }); - const canWriteStep = canWriteLambdaStep.invocableLambda; - const waitStep = new Wait(this, "Wait X Minutes", { - time: WaitTime.duration( - props.aggressiveTimes ? Duration.seconds(30) : Duration.minutes(10), - ), - }); + // when choosing times remember + // AWS Step Functions has a hard quota of 25,000 entries in the execution event history + // so if a copy takes 1 month say (very worst case)... that's 30x24x60 minutes = 43,000 + // so waiting every 10 minutes would end up with 4,300 execution events - which is well + // inside the limit - const defaults: Partial = { - maxItemsPerBatch: 1, - requiredRegion: Stack.of(this).region, - destinationKey: "", - }; + const waitCanWriteStep = new Wait( + this, + "Wait X Minutes For Writeable Bucket", + { + time: WaitTime.duration( + props.aggressiveTimes ? Duration.seconds(30) : Duration.minutes(10), + ), + }, + ); + + //const waitIsThawedStep = new Wait(this, "Wait X Minutes For Thawed Objects", { + // time: WaitTime.duration( + // props.aggressiveTimes ? Duration.seconds(30) : Duration.minutes(10), + // ), + //}); const defineDefaults = new Pass(this, "Define Defaults", { parameters: defaults, @@ -87,13 +100,33 @@ export class CopyOutStateMachineConstruct extends Construct { }, }); - canWriteStep.addCatch(waitStep.next(canWriteStep), { + canWriteStep.addCatch(waitCanWriteStep.next(canWriteStep), { errors: ["AccessDeniedError"], }); canWriteStep.addCatch(fail, { errors: ["WrongRegionError"] }); - const thawObjectsMap = new ThawObjectsMapConstruct(this, "ThawObjects", {}); + const rcloneMap = new RcloneMapConstruct(this, "RcloneMap", { + vpc: props.vpc, + vpcSubnetSelection: props.vpcSubnetSelection, + workingBucket: props.workingBucket, + workingBucketPrefixKey: props.workingBucketPrefixKey ?? "", + }); + + const thawObjectsMap = new ThawObjectsMapConstruct(this, "ThawObjects", { + workingBucket: props.workingBucket, + workingBucketPrefixKey: props.workingBucketPrefixKey ?? "", + }); + + const summariseCopyLambdaStep = new SummariseCopyLambdaStepConstruct( + this, + "SummariseCopy", + { + workingBucket: props.workingBucket, + workingBucketPrefixKey: props.workingBucketPrefixKey ?? "", + allowWriteToThisAccount: props.allowWriteToInstalledAccount, + }, + ); const definition = ChainDefinitionBody.fromChainable( defineDefaults @@ -101,104 +134,43 @@ export class CopyOutStateMachineConstruct extends Construct { .next(canWriteStep) .next(thawObjectsMap.distributedMap) .next(rcloneMap.distributedMap) + .next(summariseCopyLambdaStep.invocableLambda) .next(success), ); // NOTE: we use a technique here to allow optional input parameters to the state machine // by defining defaults and then JsonMerging them with the actual input params this._stateMachine = new StateMachine(this, "StateMachine", { - // we give people a window of time in which to create the destination bucket - so this + // we might be thawing objects from S3 deep glacier (24-48 hrs) + // we also give people a window of time in which to create the destination bucket - so this // could run a long time - timeout: props.aggressiveTimes ? Duration.hours(24) : Duration.days(30), + timeout: props.aggressiveTimes ? Duration.days(7) : Duration.days(30), definitionBody: definition, }); thawObjectsMap.distributedMap.grantNestedPermissions(this._stateMachine); + rcloneMap.distributedMap.grantNestedPermissions(this._stateMachine); - // this is needed to support distributed map - once there is a native CDK for this I presume this goes + // first policy is we need to let the state machine access our CSV list + // of objects to copy, and write back to record the status of the copies + // i.e. perms needed for result writing from distributed map (from AWS docs) + // https://docs.aws.amazon.com/step-functions/latest/dg/input-output-resultwriter.html#resultwriter-iam-policies this._stateMachine.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, - actions: ["states:StartExecution"], - resources: [ - Arn.format( - { - arnFormat: ArnFormat.COLON_RESOURCE_NAME, - service: "states", - resource: "stateMachine", - resourceName: "*", - }, - Stack.of(this), - ), + actions: [ + "s3:GetObject", + "s3:PutObject", + "s3:ListMultipartUploadParts", + "s3:AbortMultipartUpload", ], - }), - ); - - // this is needed to support distributed map - once there is a native CDK for this I presume this goes - this._stateMachine.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["states:DescribeExecution", "states:StopExecution"], resources: [ - Arn.format( - { - arnFormat: ArnFormat.COLON_RESOURCE_NAME, - service: "states", - resource: "execution", - resourceName: "*" + "/*", - }, - Stack.of(this), - ), + `arn:aws:s3:::${props.workingBucket}/${ + props.workingBucketPrefixKey ?? "" + }*`, ], }), ); - - // this is too broad - but once the CFN native Distributed Map is created - it will handle this for us - // (I think it isn't doing it because of our DummyMap) - this._stateMachine.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["lambda:InvokeFunction"], - resources: ["*"], - }), - ); - - this._stateMachine.addToRolePolicy( - new PolicyStatement({ - effect: Effect.ALLOW, - actions: ["ecs:*", "iam:PassRole"], - resources: ["*"], - }), - ); - - // TODO tighten this - this._stateMachine.role.addManagedPolicy( - ManagedPolicy.fromAwsManagedPolicyName("AmazonS3FullAccess"), - ); - - // i.e perms needed for result writing from distributed map (from AWS docs) - // https://docs.aws.amazon.com/step-functions/latest/dg/input-output-resultwriter.html#resultwriter-iam-policies - // { - // "Version": "2012-10-17", - // "Statement": [ - // { - // "Effect": "Allow", - // "Action": [ - // "s3:PutObject", - // "s3:GetObject", - // "s3:ListMultipartUploadParts", - // "s3:AbortMultipartUpload" - // ], - // "Resource": [ - // "arn:aws:s3:::resultBucket/csvJobs/*" - // ] - // } - // ] - // } - - this._stateMachine.role.addManagedPolicy( - ManagedPolicy.fromAwsManagedPolicyName("CloudWatchEventsFullAccess"), - ); } public get stateMachine() { diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts index 482c362..c290bbf 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts @@ -1,11 +1,37 @@ +/** + * The type that matches our expected input to the state machine. + * This is more for internal consistency - it is not directly + * used to define the "schema" of the state machine. + */ export type CopyOutStateMachineInput = { - maxItemsPerBatch: number; + sourceFilesCsvKey: string; + requiredRegion: string; - sourceFilesCsvBucket: string; - sourceFilesCsvKey: string; + copyConcurrency: number; + maxItemsPerBatch: number; - destinationKey: string; + destinationBucket: string; + destinationPrefixKey: string; + + destinationStartCopyRelativeKey: string; + destinationEndCopyRelativeKey: string; }; export type CopyOutStateMachineInputKeys = keyof CopyOutStateMachineInput; + +// this odd construct just makes sure that the JSON paths we specify +// here correspond with fields in the master "input" schema for the +// overall Steps function +export const SOURCE_FILES_CSV_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = + "sourceFilesCsvKey"; + +export const DESTINATION_BUCKET_FIELD_NAME: CopyOutStateMachineInputKeys = + "destinationBucket"; +export const DESTINATION_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = + "destinationPrefixKey"; + +export const DESTINATION_START_COPY_RELATIVE_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = + "destinationStartCopyRelativeKey"; +export const DESTINATION_END_COPY_RELATIVE_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = + "destinationEndCopyRelativeKey"; diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-props.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-props.ts new file mode 100644 index 0000000..f3ef343 --- /dev/null +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-props.ts @@ -0,0 +1,47 @@ +import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; + +export interface CopyOutStateMachineProps { + /** + * The VPC that our compute cluster will be run in + */ + readonly vpc: IVpc; + + /** + * The VPC subnet that will be used for compute units (would generally + * be "private with egress" - but should work with others if properly + * configured. + */ + readonly vpcSubnetSelection: SubnetType; + + /** + * A bucket in the installation account that can be used for working + * artifacts such as temporary files, distributed maps outputs etc. + * These objects will be small, but the bucket can be set with a + * lifecycle to delete the objects after 30 days (or however long the + * maximum copy operation may be set to) + */ + readonly workingBucket: string; + + /** + * A prefix in the workingBucket that will be used for all artifacts + * created. Note that the prefix can be something simple such as "temp". + * The copy out stack will handle making sure there is enough + * uniqueness in artifacts that they don't clash. + */ + readonly workingBucketPrefixKey?: string; + + /** + * Whether the stack should use duration/timeouts that are more suited + * to demonstration/development. i.e. minutes rather than hours for wait times, + * hours rather than days for copy time-outs. + */ + readonly aggressiveTimes?: boolean; + + /** + * Whether the stack should be given any permissions to copy data into + * the same account it is installed into. For demonstration/development + * this might be useful - but in general this should be not set - as the + * primary use case is to copy objects "out" of the account/buckets. + */ + readonly allowWriteToInstalledAccount?: boolean; +} diff --git a/packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts b/packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts deleted file mode 100644 index 89db4e4..0000000 --- a/packages/aws-copy-out-sharer/src/distributed-map-step-construct.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Construct } from "constructs"; -import { - CustomState, - IChainable, - JsonPath, - Map, -} from "aws-cdk-lib/aws-stepfunctions"; - -type Props = { - task: IChainable; -}; - -export class DistributedMapStepConstruct extends Construct { - public readonly distributedMapStep: CustomState; - - constructor(scope: Construct, id: string, props: Props) { - super(scope, id); - - // This is a workaround from the following issue - // https://github.com/aws/aws-cdk/issues/23216 - // awaiting native support for a Distributed Map in CDK - // this uses a dummy map in order to generate all the fields we - // need to iterate over our ECS task - const dummyMap = new Map(this, "DummyMap"); - dummyMap.iterator(props.task); - const mapItemProcessor = (dummyMap.toStateJson() as any).Iterator; - - // { - // "BatchInput": { - // "destinationBucketForRclone": "s3:cpg-cardiac-flagship-transfer" - // }, - // "Items": [ - // { - // "protocol: "s3", - // "source": "s3:bucket/1.fastq.gz" - // }, - // { - // "source": "s3:bucket/2.fastq.gz" - // }, - // } - - // these names are internal only - but we pull out as a const to make sure - // they are consistent - const bucketColumnName = "b"; - const keyColumnName = "k"; - - this.distributedMapStep = new CustomState(this, "DistributedMap", { - stateJson: { - // https://states-language.net/#map-state - Type: "Map", - // we need to be careful of the concurrency of the Fargate RunTask.. - // not sure distributed map knows how to handle back-off?? - // https://docs.aws.amazon.com/AmazonECS/latest/userguide/throttling.html - MaxConcurrency: 80, - ToleratedFailurePercentage: 100, - ItemReader: { - ReaderConfig: { - InputType: "CSV", - // note we are providing the nominal column names... there is no header row in the CSV - CSVHeaderLocation: "GIVEN", - CSVHeaders: [bucketColumnName, keyColumnName], - }, - Resource: "arn:aws:states:::s3:getObject", - Parameters: { - "Bucket.$": "$.sourceFilesCsvBucket", - "Key.$": "$.sourceFilesCsvKey", - }, - }, - ItemBatcher: { - MaxItemsPerBatchPath: JsonPath.stringAt("$.maxItemsPerBatch"), - BatchInput: { - "rcloneDestination.$": JsonPath.format( - "s3:{}/{}", - JsonPath.stringAt("$.destinationBucket"), - JsonPath.stringAt("$.destinationKey"), - ), - glacierFlexibleRetrievalThawDays: 1, - glacierFlexibleRetrievalThawSpeed: "Expedited", - glacierDeepArchiveThawDays: 1, - glacierDeepArchiveThawSpeed: "Standard", - intelligentTieringArchiveThawDays: 1, - intelligentTieringArchiveThawSpeed: "Standard", - intelligentTieringDeepArchiveThawDays: 1, - intelligentTieringDeepArchiveThawSpeed: "Standard", - }, - }, - ItemProcessor: { - ...mapItemProcessor, - ProcessorConfig: { - Mode: "DISTRIBUTED", - ExecutionType: "STANDARD", - }, - }, - ItemSelector: { - "bucket.$": JsonPath.stringAt( - `$$.Map.Item.Value.${bucketColumnName}`, - ), - "key.$": JsonPath.stringAt(`$$.Map.Item.Value.${keyColumnName}`), - }, - ResultWriter: { - Resource: "arn:aws:states:::s3:putObject", - Parameters: { - "Bucket.$": "$.sourceFilesCsvBucket", - "Prefix.$": JsonPath.format( - "{}-results", - JsonPath.stringAt("$.sourceFilesCsvKey"), - ), - }, - }, - }, - }); - } -} diff --git a/packages/aws-copy-out-sharer/src/rclone-map-construct.ts b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts index e7a658b..a9d9608 100644 --- a/packages/aws-copy-out-sharer/src/rclone-map-construct.ts +++ b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts @@ -4,10 +4,14 @@ import { S3CsvDistributedMap } from "./s3-csv-distributed-map"; import { RcloneRunTaskConstruct } from "./rclone-run-task-construct"; import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { Cluster } from "aws-cdk-lib/aws-ecs"; +import { SOURCE_FILES_CSV_KEY_FIELD_NAME } from "./copy-out-state-machine-input"; type Props = { vpc: IVpc; vpcSubnetSelection: SubnetType; + + workingBucket: string; + workingBucketPrefixKey: string; }; export class RcloneMapConstruct extends Construct { @@ -59,8 +63,12 @@ export class RcloneMapConstruct extends Construct { toleratedFailurePercentage: 25, itemReaderCsvHeaders: [bucketColumnName, keyColumnName], itemReader: { - "Bucket.$": "$.sourceFilesCsvBucket", - "Key.$": "$.sourceFilesCsvKey", + Bucket: props.workingBucket, + "Key.$": JsonPath.format( + "{}{}", + props.workingBucketPrefixKey, + JsonPath.stringAt(`$.${SOURCE_FILES_CSV_KEY_FIELD_NAME}`), + ), }, itemSelector: { "rcloneSource.$": JsonPath.format( @@ -74,15 +82,16 @@ export class RcloneMapConstruct extends Construct { "rcloneDestination.$": JsonPath.format( "s3:{}/{}", JsonPath.stringAt(`$.destinationBucket`), - JsonPath.stringAt("$.destinationKey"), + JsonPath.stringAt("$.destinationPrefixKey"), ), }, iterator: rcloneRunTask, resultWriter: { - "Bucket.$": "$.sourceFilesCsvBucket", + Bucket: props.workingBucket, "Prefix.$": JsonPath.format( - "{}-results", - JsonPath.stringAt("$.sourceFilesCsvKey"), + "{}{}", + props.workingBucketPrefixKey, + JsonPath.stringAt(`$.${SOURCE_FILES_CSV_KEY_FIELD_NAME}`), ), }, }); diff --git a/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts new file mode 100644 index 0000000..a182f8f --- /dev/null +++ b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts @@ -0,0 +1,101 @@ +import { Construct } from "constructs"; +import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { Duration, Stack } from "aws-cdk-lib"; +import { LambdaInvoke } from "aws-cdk-lib/aws-stepfunctions-tasks"; +import { Runtime } from "aws-cdk-lib/aws-lambda"; +import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; +import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; +import { join } from "path"; + +type SummariseCopyLambdaStepProps = { + workingBucket: string; + workingBucketPrefixKey: string; + + /** + * If true, will allow this SummariseCopy lambda to write to a bucket that is + * in the same account. Otherwise, and by default, the SummariseCopy lambda + * is set up to not be able to write to a bucket in the same account as it + * is installed. This is a security mechanism as writes to buckets in the + * same account is allowed implicitly but is dangerous. This should only + * be set to true for development/testing. + */ + allowWriteToThisAccount?: boolean; +}; + +/** + * A construct for a Steps function that collates + * Steps results (SUCCEEDED_0.json etc) into a text file + * that is then written to the destination bucket to show what + * was copied. + */ +export class SummariseCopyLambdaStepConstruct extends Construct { + public readonly invocableLambda; + + constructor( + scope: Construct, + id: string, + props: SummariseCopyLambdaStepProps, + ) { + super(scope, id); + + const summariseCopyLambda = new NodejsFunction( + this, + "SummariseCopyFunction", + { + entry: join( + __dirname, + "..", + "lambda", + "summarise-copy-lambda", + "summarise-copy-lambda.ts", + ), + runtime: Runtime.NODEJS_20_X, + handler: "handler", + bundling: { + minify: false, + }, + // this seems like plenty of seconds to do a few API calls to S3 + timeout: Duration.seconds(30), + }, + ); + + summariseCopyLambda.addToRolePolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["s3:PutObject"], + resources: ["*"], + // yes - that's right - we want to give this lambda the ability to attempt the writes anywhere + // EXCEPT where we are deployed + // (under the assumption that buckets outside our account must be giving us explicit write permission, + // whilst within our account we get implicit access - in this case we don't want that ability) + conditions: props.allowWriteToThisAccount + ? undefined + : { + StringNotEquals: { + "s3:ResourceAccount": [Stack.of(this).account], + }, + }, + }), + ); + + // we need to be able to read the results created by Steps that it placed + // in the working folder + summariseCopyLambda.addToRolePolicy( + new PolicyStatement({ + effect: Effect.ALLOW, + actions: ["s3:GetObject"], + resources: [ + `arn:aws:s3:::${props.workingBucket}/${ + props.workingBucketPrefixKey ?? "" + }*`, + ], + }), + ); + + this.invocableLambda = new LambdaInvoke(this, `Summarise Copy Results`, { + inputPath: "$.ResultWriterDetails", + lambdaFunction: summariseCopyLambda, + resultPath: JsonPath.DISCARD, + }); + } +} diff --git a/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts b/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts index c5d305a..946a3d5 100644 --- a/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts +++ b/packages/aws-copy-out-sharer/src/thaw-objects-map-construct.ts @@ -3,14 +3,17 @@ import { JsonPath } from "aws-cdk-lib/aws-stepfunctions"; import { S3CsvDistributedMap } from "./s3-csv-distributed-map"; import { ThawObjectsLambdaStepConstruct } from "./thaw-objects-lambda-step-construct"; import { Duration } from "aws-cdk-lib"; -import { CopyOutStateMachineInputKeys } from "./copy-out-state-machine-input"; +import { SOURCE_FILES_CSV_KEY_FIELD_NAME } from "./copy-out-state-machine-input"; -type Props = {}; +type Props = { + workingBucket: string; + workingBucketPrefixKey: string; +}; export class ThawObjectsMapConstruct extends Construct { public readonly distributedMap: S3CsvDistributedMap; - constructor(scope: Construct, id: string, _props: Props) { + constructor(scope: Construct, id: string, props: Props) { super(scope, id); const thawObjectsLambdaStep = new ThawObjectsLambdaStepConstruct( @@ -31,21 +34,19 @@ export class ThawObjectsMapConstruct extends Construct { const bucketColumnName = "b"; const keyColumnName = "k"; - // this odd construct just makes sure that the JSON paths we specify - // here correspond with fields in the master "input" schema for the - // overall Steps function - const bucketKeyName: CopyOutStateMachineInputKeys = "sourceFilesCsvBucket"; - const keyKeyName: CopyOutStateMachineInputKeys = "sourceFilesCsvKey"; - this.distributedMap = new S3CsvDistributedMap(this, "ThawObjectsMap", { // we do not expect any failures of these functions and if we - // do - we are fully prepared for us to move onto the rclone + // do get one - we are fully prepared for us to move onto the rclone // steps where we will get proper error messages if the copies fail toleratedFailurePercentage: 100, itemReaderCsvHeaders: [bucketColumnName, keyColumnName], itemReader: { - "Bucket.$": `$.${bucketKeyName}`, - "Key.$": `$.${keyKeyName}`, + Bucket: props.workingBucket, + "Key.$": JsonPath.format( + "{}{}", + props.workingBucketPrefixKey, + JsonPath.stringAt(`$.${SOURCE_FILES_CSV_KEY_FIELD_NAME}`), + ), }, itemSelector: { "bucket.$": JsonPath.stringAt(`$$.Map.Item.Value.${bucketColumnName}`), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41908af..142b9e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,37 +37,39 @@ importers: "@aws-sdk/client-sfn": specifier: 3.450.0 version: 3.450.0 + "@elsa-data/aws-infrastructure": + specifier: 1.5.1 + version: 1.5.1(aws-cdk-lib@2.113.0)(constructs@10.3.0) aws-cdk: - specifier: 2.108.1 - version: 2.108.1 + specifier: 2.113.0 + version: 2.113.0 aws-cdk-lib: - specifier: 2.108.1 - version: 2.108.1(constructs@10.3.0) + specifier: 2.113.0 + version: 2.113.0(constructs@10.3.0) aws-copy-out-sharer: specifier: link:../packages/aws-copy-out-sharer version: link:../packages/aws-copy-out-sharer + constructs: + specifier: 10.3.0 + version: 10.3.0 packages/aws-copy-out-sharer: - dependencies: - "@elsa-data/aws-infrastructure": - specifier: ^1.5.1 - version: 1.5.1(aws-cdk-lib@2.108.1)(constructs@10.3.0) devDependencies: aws-cdk-lib: - specifier: 2.108.1 - version: 2.108.1(constructs@10.3.0) + specifier: 2.113.0 + version: 2.113.0(constructs@10.3.0) constructs: specifier: 10.3.0 version: 10.3.0 jsii: - specifier: 5.2.29 - version: 5.2.29 + specifier: 5.2.35 + version: 5.2.35 jsii-pacmak: - specifier: 1.91.0 - version: 1.91.0 + specifier: 1.92.0 + version: 1.92.0 publib: - specifier: 0.2.745 - version: 0.2.745 + specifier: 0.2.756 + version: 0.2.756 packages: /@aws-cdk/asset-awscli-v1@2.2.201: @@ -175,28 +177,28 @@ packages: "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 - /@aws-sdk/client-codeartifact@3.451.0: + /@aws-sdk/client-codeartifact@3.465.0: resolution: { - integrity: sha512-uM9/zPdP3xAi2sXFNa2/uzMVak0/pk7zcybFxUKuzG3mzUS05lbnbm5rz4l3ePoBidEE1Zqy070S6Uhl4SMl2g==, + integrity: sha512-ZM6tXlsgoTNCwTgv2UQzZTrhNmUAZbohiTOMoXJFeUO0nx9/mkwn8T4mfgHNpaApbCD3LJ6+EccYC6wv50cg1g==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.451.0 - "@aws-sdk/core": 3.451.0 - "@aws-sdk/credential-provider-node": 3.451.0 - "@aws-sdk/middleware-host-header": 3.451.0 - "@aws-sdk/middleware-logger": 3.451.0 - "@aws-sdk/middleware-recursion-detection": 3.451.0 - "@aws-sdk/middleware-signing": 3.451.0 - "@aws-sdk/middleware-user-agent": 3.451.0 - "@aws-sdk/region-config-resolver": 3.451.0 - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 - "@aws-sdk/util-user-agent-browser": 3.451.0 - "@aws-sdk/util-user-agent-node": 3.451.0 + "@aws-sdk/client-sts": 3.465.0 + "@aws-sdk/core": 3.465.0 + "@aws-sdk/credential-provider-node": 3.465.0 + "@aws-sdk/middleware-host-header": 3.465.0 + "@aws-sdk/middleware-logger": 3.465.0 + "@aws-sdk/middleware-recursion-detection": 3.465.0 + "@aws-sdk/middleware-signing": 3.465.0 + "@aws-sdk/middleware-user-agent": 3.465.0 + "@aws-sdk/region-config-resolver": 3.465.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 + "@aws-sdk/util-user-agent-browser": 3.465.0 + "@aws-sdk/util-user-agent-node": 3.465.0 "@smithy/config-resolver": 2.0.18 "@smithy/fetch-http-handler": 2.2.6 "@smithy/hash-node": 2.0.15 @@ -226,28 +228,28 @@ packages: - aws-crt dev: true - /@aws-sdk/client-cognito-identity@3.451.0: + /@aws-sdk/client-cognito-identity@3.465.0: resolution: { - integrity: sha512-xoImUiGoaXJZpOCgbWcdrU4vHJ8HG5KluaCkc32kuFobM277sjQimaUIHOGHL24M5vyo4QxcJD9CT/IhX63Vlg==, + integrity: sha512-Ku1034M9jjsXbLBS5DwQfcTwWwu2oxtmdbsxvEm4I7IUA/h1++hKPzZuJ6L9zo7I7GbA+WnCryviUdtbgCqTfA==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.451.0 - "@aws-sdk/core": 3.451.0 - "@aws-sdk/credential-provider-node": 3.451.0 - "@aws-sdk/middleware-host-header": 3.451.0 - "@aws-sdk/middleware-logger": 3.451.0 - "@aws-sdk/middleware-recursion-detection": 3.451.0 - "@aws-sdk/middleware-signing": 3.451.0 - "@aws-sdk/middleware-user-agent": 3.451.0 - "@aws-sdk/region-config-resolver": 3.451.0 - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 - "@aws-sdk/util-user-agent-browser": 3.451.0 - "@aws-sdk/util-user-agent-node": 3.451.0 + "@aws-sdk/client-sts": 3.465.0 + "@aws-sdk/core": 3.465.0 + "@aws-sdk/credential-provider-node": 3.465.0 + "@aws-sdk/middleware-host-header": 3.465.0 + "@aws-sdk/middleware-logger": 3.465.0 + "@aws-sdk/middleware-recursion-detection": 3.465.0 + "@aws-sdk/middleware-signing": 3.465.0 + "@aws-sdk/middleware-user-agent": 3.465.0 + "@aws-sdk/region-config-resolver": 3.465.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 + "@aws-sdk/util-user-agent-browser": 3.465.0 + "@aws-sdk/util-user-agent-node": 3.465.0 "@smithy/config-resolver": 2.0.18 "@smithy/fetch-http-handler": 2.2.6 "@smithy/hash-node": 2.0.15 @@ -492,25 +494,25 @@ packages: - aws-crt dev: false - /@aws-sdk/client-sso@3.451.0: + /@aws-sdk/client-sso@3.465.0: resolution: { - integrity: sha512-KkYSke3Pdv3MfVH/5fT528+MKjMyPKlcLcd4zQb0x6/7Bl7EHrPh1JZYjzPLHelb+UY5X0qN8+cb8iSu1eiwIQ==, + integrity: sha512-JXDBa3Sl+LS0KEOs0PZoIjpNKEEGfeyFwdnRxi8Y1hMXNEKyJug1cI2Psqu2olpn4KeXwoP1BuITppZYdolOew==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.451.0 - "@aws-sdk/middleware-host-header": 3.451.0 - "@aws-sdk/middleware-logger": 3.451.0 - "@aws-sdk/middleware-recursion-detection": 3.451.0 - "@aws-sdk/middleware-user-agent": 3.451.0 - "@aws-sdk/region-config-resolver": 3.451.0 - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 - "@aws-sdk/util-user-agent-browser": 3.451.0 - "@aws-sdk/util-user-agent-node": 3.451.0 + "@aws-sdk/core": 3.465.0 + "@aws-sdk/middleware-host-header": 3.465.0 + "@aws-sdk/middleware-logger": 3.465.0 + "@aws-sdk/middleware-recursion-detection": 3.465.0 + "@aws-sdk/middleware-user-agent": 3.465.0 + "@aws-sdk/region-config-resolver": 3.465.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 + "@aws-sdk/util-user-agent-browser": 3.465.0 + "@aws-sdk/util-user-agent-node": 3.465.0 "@smithy/config-resolver": 2.0.18 "@smithy/fetch-http-handler": 2.2.6 "@smithy/hash-node": 2.0.15 @@ -590,28 +592,28 @@ packages: - aws-crt dev: false - /@aws-sdk/client-sts@3.451.0: + /@aws-sdk/client-sts@3.465.0: resolution: { - integrity: sha512-48NcIRxWBdP1fom6RSjwn2R2u7SE7eeV3p+c4s7ukEOfrHhBxJfn3EpqBVQMGzdiU55qFImy+Fe81iA2lXq3Jw==, + integrity: sha512-rHi9ba6ssNbVjlWSdhi4C5newEhGhzkY9UE4KB+/Tj21zXfEP8r6uIltnQXPtun2SdA95Krh/yS1qQ4MRuzqyA==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.451.0 - "@aws-sdk/credential-provider-node": 3.451.0 - "@aws-sdk/middleware-host-header": 3.451.0 - "@aws-sdk/middleware-logger": 3.451.0 - "@aws-sdk/middleware-recursion-detection": 3.451.0 - "@aws-sdk/middleware-sdk-sts": 3.451.0 - "@aws-sdk/middleware-signing": 3.451.0 - "@aws-sdk/middleware-user-agent": 3.451.0 - "@aws-sdk/region-config-resolver": 3.451.0 - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 - "@aws-sdk/util-user-agent-browser": 3.451.0 - "@aws-sdk/util-user-agent-node": 3.451.0 + "@aws-sdk/core": 3.465.0 + "@aws-sdk/credential-provider-node": 3.465.0 + "@aws-sdk/middleware-host-header": 3.465.0 + "@aws-sdk/middleware-logger": 3.465.0 + "@aws-sdk/middleware-recursion-detection": 3.465.0 + "@aws-sdk/middleware-sdk-sts": 3.465.0 + "@aws-sdk/middleware-signing": 3.465.0 + "@aws-sdk/middleware-user-agent": 3.465.0 + "@aws-sdk/region-config-resolver": 3.465.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 + "@aws-sdk/util-user-agent-browser": 3.465.0 + "@aws-sdk/util-user-agent-node": 3.465.0 "@smithy/config-resolver": 2.0.18 "@smithy/fetch-http-handler": 2.2.6 "@smithy/hash-node": 2.0.15 @@ -652,10 +654,10 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/core@3.451.0: + /@aws-sdk/core@3.465.0: resolution: { - integrity: sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==, + integrity: sha512-fHSIw/Rgex3KbrEKn6ZrUc2VcsOTpdBMeyYtfmsTOLSyDDOG9k3jelOvVbCbrK5N6uEUSM8hrnySEKg94UB0cg==, } engines: { node: ">=14.0.0" } dependencies: @@ -663,15 +665,15 @@ packages: tslib: 2.6.2 dev: true - /@aws-sdk/credential-provider-cognito-identity@3.451.0: + /@aws-sdk/credential-provider-cognito-identity@3.465.0: resolution: { - integrity: sha512-g1ZT46NuYfou00d94rJZ59N4TLI1T+v46lbHTtF9jwohiUsi7/vHkPIOdrgtrThGzGUVl01w62N0a2mpMydaBA==, + integrity: sha512-bvZNgA2Cx54eTSZm2bXCUbz5rQjcNqTONuvjNIl1CFK9lEj3o3rRU1EqAwX6AIrT1OIstnDr1Z6llxjwvTLqiA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/client-cognito-identity": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/types": 2.5.0 tslib: 2.6.2 @@ -692,27 +694,27 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-env@3.451.0: + /@aws-sdk/credential-provider-env@3.465.0: resolution: { - integrity: sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==, + integrity: sha512-fku37AgkB9KhCuWHE6mfvbWYU0X84Df6MQ60nYH7s/PiNEhkX2cVI6X6kOKjP1MNIwRcYt+oQDvplVKdHume+A==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/credential-provider-http@3.451.0: + /@aws-sdk/credential-provider-http@3.465.0: resolution: { - integrity: sha512-q82kEzymqimkJ2dHmuN2RGpi9HTFSxwwoXALnzPRaRcvR/v+YY8FMgSTfwXzPkHUDf/q8J+aDz6lPcYlnsP3sQ==, + integrity: sha512-Rj/zFgP0i0tpuaO+sm1csGU7NLQa1F9eE9c3VKbYECiXAZwrGJnY1TdG2iSsLpkMtyfOhRrRvAuYAUCUemWg3g==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/fetch-http-handler": 2.2.6 "@smithy/node-http-handler": 2.1.9 "@smithy/property-provider": 2.0.14 @@ -744,18 +746,18 @@ packages: - aws-crt dev: false - /@aws-sdk/credential-provider-ini@3.451.0: + /@aws-sdk/credential-provider-ini@3.465.0: resolution: { - integrity: sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==, + integrity: sha512-B1MFufvdToAEMtfszilVnKer2S7P/OfMhkCizq2zuu8aU/CquRyHvKEQgWdvqunUDrFnVTc0kUZgsbBY0uPjLg==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.451.0 - "@aws-sdk/credential-provider-process": 3.451.0 - "@aws-sdk/credential-provider-sso": 3.451.0 - "@aws-sdk/credential-provider-web-identity": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/credential-provider-env": 3.465.0 + "@aws-sdk/credential-provider-process": 3.465.0 + "@aws-sdk/credential-provider-sso": 3.465.0 + "@aws-sdk/credential-provider-web-identity": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/credential-provider-imds": 2.1.1 "@smithy/property-provider": 2.0.14 "@smithy/shared-ini-file-loader": 2.2.4 @@ -787,19 +789,19 @@ packages: - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.451.0: + /@aws-sdk/credential-provider-node@3.465.0: resolution: { - integrity: sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==, + integrity: sha512-R3VA9yJ0BvezvrDxcgPTv9VHbVPbzchLTrX5jLFSVuW/lPPYLUi/Cjtyg9C9Y7qRfoQS4fNMvSRhwO5/TF68gA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.451.0 - "@aws-sdk/credential-provider-ini": 3.451.0 - "@aws-sdk/credential-provider-process": 3.451.0 - "@aws-sdk/credential-provider-sso": 3.451.0 - "@aws-sdk/credential-provider-web-identity": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/credential-provider-env": 3.465.0 + "@aws-sdk/credential-provider-ini": 3.465.0 + "@aws-sdk/credential-provider-process": 3.465.0 + "@aws-sdk/credential-provider-sso": 3.465.0 + "@aws-sdk/credential-provider-web-identity": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/credential-provider-imds": 2.1.1 "@smithy/property-provider": 2.0.14 "@smithy/shared-ini-file-loader": 2.2.4 @@ -823,14 +825,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-process@3.451.0: + /@aws-sdk/credential-provider-process@3.465.0: resolution: { - integrity: sha512-HQywSdKeD5PErcLLnZfSyCJO+6T+ZyzF+Lm/QgscSC+CbSUSIPi//s15qhBRVely/3KBV6AywxwNH+5eYgt4lQ==, + integrity: sha512-YE6ZrRYwvb8969hWQnr4uvOJ8RU0JrNsk3vWTe/czly37ioZUEhi8jmpQp4f2mX/6U6buoFGWu5Se3VCdw2SFQ==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/shared-ini-file-loader": 2.2.4 "@smithy/types": 2.5.0 @@ -855,16 +857,16 @@ packages: - aws-crt dev: false - /@aws-sdk/credential-provider-sso@3.451.0: + /@aws-sdk/credential-provider-sso@3.465.0: resolution: { - integrity: sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==, + integrity: sha512-tLIP/4JQIJpn8yIg6RZRQ2nmvj5i4wLZvYvY4RtaFv2JrQUkmmTfyOZJuOBrIFRwJjx0fHmFu8DJjcOhMzllIQ==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-sso": 3.451.0 - "@aws-sdk/token-providers": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/client-sso": 3.465.0 + "@aws-sdk/token-providers": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/shared-ini-file-loader": 2.2.4 "@smithy/types": 2.5.0 @@ -886,38 +888,38 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-web-identity@3.451.0: + /@aws-sdk/credential-provider-web-identity@3.465.0: resolution: { - integrity: sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==, + integrity: sha512-B4Y75fMTZIniEU0yyqat+9NsQbYlXdqP5Y3bShkaG3pGLOHzF/xMlWuG+D3kkQ806PLYi+BgfVls4BcO+NyVcA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true - /@aws-sdk/credential-providers@3.451.0: + /@aws-sdk/credential-providers@3.465.0: resolution: { - integrity: sha512-ihbYZrI/tSVsZFDGLfJoCx3sg1s9EQqWA+xbLoquK+RjMqTnaeshYntFJmQA5yqCIbcAkyw63OwOIBRrVb7tMA==, + integrity: sha512-mtndyew33Fnv30zVCQLBkqvUeFvjAlgAe3yM/10U//dxsOW3pfYWZ6sMzDbuXHLCyROQXJqZfnsQKQs0rOaO0Q==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.451.0 - "@aws-sdk/client-sso": 3.451.0 - "@aws-sdk/client-sts": 3.451.0 - "@aws-sdk/credential-provider-cognito-identity": 3.451.0 - "@aws-sdk/credential-provider-env": 3.451.0 - "@aws-sdk/credential-provider-http": 3.451.0 - "@aws-sdk/credential-provider-ini": 3.451.0 - "@aws-sdk/credential-provider-node": 3.451.0 - "@aws-sdk/credential-provider-process": 3.451.0 - "@aws-sdk/credential-provider-sso": 3.451.0 - "@aws-sdk/credential-provider-web-identity": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/client-cognito-identity": 3.465.0 + "@aws-sdk/client-sso": 3.465.0 + "@aws-sdk/client-sts": 3.465.0 + "@aws-sdk/credential-provider-cognito-identity": 3.465.0 + "@aws-sdk/credential-provider-env": 3.465.0 + "@aws-sdk/credential-provider-http": 3.465.0 + "@aws-sdk/credential-provider-ini": 3.465.0 + "@aws-sdk/credential-provider-node": 3.465.0 + "@aws-sdk/credential-provider-process": 3.465.0 + "@aws-sdk/credential-provider-sso": 3.465.0 + "@aws-sdk/credential-provider-web-identity": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/credential-provider-imds": 2.1.1 "@smithy/property-provider": 2.0.14 "@smithy/types": 2.5.0 @@ -985,14 +987,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-host-header@3.451.0: + /@aws-sdk/middleware-host-header@3.465.0: resolution: { - integrity: sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==, + integrity: sha512-nnGva8eplwEJqdVzcb+xF2Fwua0PpiwxMEvpnIy73gNbetbJdgFIprryMLYes00xzJEqnew+LWdpcd3YyS34ZA==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/protocol-http": 3.0.9 "@smithy/types": 2.5.0 tslib: 2.6.2 @@ -1022,14 +1024,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-logger@3.451.0: + /@aws-sdk/middleware-logger@3.465.0: resolution: { - integrity: sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==, + integrity: sha512-aGMx1aSlzDDgjZ7fSxLhGD5rkyCfHwq04TSB5fQAgDBqUjj4IQXZwmNglX0sLRmArXZtDglUVESOfKvTANJTPg==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true @@ -1047,14 +1049,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-recursion-detection@3.451.0: + /@aws-sdk/middleware-recursion-detection@3.465.0: resolution: { - integrity: sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==, + integrity: sha512-ol3dlsTnryBhV5qkUvK5Yg3dRaV1NXIxYJaIkShrl8XAv4wRNcDJDmO5NYq5eVZ3zgV1nv6xIpZ//dDnnf6Z+g==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/protocol-http": 3.0.9 "@smithy/types": 2.5.0 tslib: 2.6.2 @@ -1088,15 +1090,15 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-sts@3.451.0: + /@aws-sdk/middleware-sdk-sts@3.465.0: resolution: { - integrity: sha512-UJ6UfVUEgp0KIztxpAeelPXI5MLj9wUtUCqYeIMP7C1ZhoEMNm3G39VLkGN43dNhBf1LqjsV9jkKMZbVfYXuwg==, + integrity: sha512-PmTM5ycUe1RLAPrQXLCR8JzKamJuKDB0aIW4rx4/skurzWsEGRI47WHggf9N7sPie41IBGUhRbXcf7sfPjvI3Q==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/middleware-signing": 3.451.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/middleware-signing": 3.465.0 + "@aws-sdk/types": 3.465.0 "@smithy/types": 2.5.0 tslib: 2.6.2 dev: true @@ -1117,14 +1119,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-signing@3.451.0: + /@aws-sdk/middleware-signing@3.465.0: resolution: { - integrity: sha512-s5ZlcIoLNg1Huj4Qp06iKniE8nJt/Pj1B/fjhWc6cCPCM7XJYUCejCnRh6C5ZJoBEYodjuwZBejPc1Wh3j+znA==, + integrity: sha512-d90KONWXSC3jA0kqJ6u8ygS4LoMg1TmSM7bPhHyibJVAEhnrlB4Aq1CWljNbbtphGpdKy5/XRM9O0/XCXWKQ4w==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/property-provider": 2.0.14 "@smithy/protocol-http": 3.0.9 "@smithy/signature-v4": 2.0.5 @@ -1159,15 +1161,15 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/middleware-user-agent@3.451.0: + /@aws-sdk/middleware-user-agent@3.465.0: resolution: { - integrity: sha512-8NM/0JiKLNvT9wtAQVl1DFW0cEO7OvZyLSUBLNLTHqyvOZxKaZ8YFk7d8PL6l76LeUKRxq4NMxfZQlUIRe0eSA==, + integrity: sha512-1MvIWMj2nktLOJN8Kh4jiTK28oL85fTeoXHZ+V8xYMzont6C6Y8gQPtg7ka+RotHwqWMrovfnANisnX8EzEP/Q==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 "@smithy/protocol-http": 3.0.9 "@smithy/types": 2.5.0 tslib: 2.6.2 @@ -1187,10 +1189,10 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/region-config-resolver@3.451.0: + /@aws-sdk/region-config-resolver@3.465.0: resolution: { - integrity: sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==, + integrity: sha512-h0Phd2Ae873dsPSWuxqxz2yRC5NMeeWxQiJPh4j42HF8g7dZK7tMQPkYznAoA/BzSBsEX87sbr3MmigquSyUTA==, } engines: { node: ">=14.0.0" } dependencies: @@ -1263,24 +1265,24 @@ packages: - aws-crt dev: false - /@aws-sdk/token-providers@3.451.0: + /@aws-sdk/token-providers@3.465.0: resolution: { - integrity: sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==, + integrity: sha512-NaZbsyLs3whzRHGV27hrRwEdXB/tEK6tqn/aCNBy862LhVzocY1A+eYLKrnrvpraOOd2vyAuOtvvB3RMIdiL6g==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.451.0 - "@aws-sdk/middleware-logger": 3.451.0 - "@aws-sdk/middleware-recursion-detection": 3.451.0 - "@aws-sdk/middleware-user-agent": 3.451.0 - "@aws-sdk/region-config-resolver": 3.451.0 - "@aws-sdk/types": 3.451.0 - "@aws-sdk/util-endpoints": 3.451.0 - "@aws-sdk/util-user-agent-browser": 3.451.0 - "@aws-sdk/util-user-agent-node": 3.451.0 + "@aws-sdk/middleware-host-header": 3.465.0 + "@aws-sdk/middleware-logger": 3.465.0 + "@aws-sdk/middleware-recursion-detection": 3.465.0 + "@aws-sdk/middleware-user-agent": 3.465.0 + "@aws-sdk/region-config-resolver": 3.465.0 + "@aws-sdk/types": 3.465.0 + "@aws-sdk/util-endpoints": 3.465.0 + "@aws-sdk/util-user-agent-browser": 3.465.0 + "@aws-sdk/util-user-agent-node": 3.465.0 "@smithy/config-resolver": 2.0.18 "@smithy/fetch-http-handler": 2.2.6 "@smithy/hash-node": 2.0.15 @@ -1330,6 +1332,7 @@ packages: dependencies: "@smithy/types": 2.5.0 tslib: 2.6.2 + dev: false /@aws-sdk/types@3.451.0: resolution: @@ -1341,6 +1344,17 @@ packages: "@smithy/types": 2.5.0 tslib: 2.6.2 + /@aws-sdk/types@3.465.0: + resolution: + { + integrity: sha512-Clqu2eD50OOzwSftGpzJrIOGev/7VJhJpc02SeS4cqFgI9EVd+rnFKS/Ux0kcwjLQBMiPcCLtql3KAHApFHAIA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.5.0 + tslib: 2.6.2 + dev: true + /@aws-sdk/util-arn-parser@3.310.0: resolution: { @@ -1363,14 +1377,14 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/util-endpoints@3.451.0: + /@aws-sdk/util-endpoints@3.465.0: resolution: { - integrity: sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==, + integrity: sha512-lDpBN1faVw8Udg5hIo+LJaNfllbBF86PCisv628vfcggO8/EArL/v2Eos0KeqVT8yaINXCRSagwfo5TNTuW0KQ==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/util-endpoints": 1.0.4 tslib: 2.6.2 dev: true @@ -1396,13 +1410,13 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/util-user-agent-browser@3.451.0: + /@aws-sdk/util-user-agent-browser@3.465.0: resolution: { - integrity: sha512-Ws5mG3J0TQifH7OTcMrCTexo7HeSAc3cBgjfhS/ofzPUzVCtsyg0G7I6T7wl7vJJETix2Kst2cpOsxygPgPD9w==, + integrity: sha512-RM+LjkIsmUCBJ4yQeBnkJWJTjPOPqcNaKv8bpZxatIHdvzGhXLnWLNi3qHlBsJB2mKtKRet6nAUmKmzZR1sDzA==, } dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/types": 2.5.0 bowser: 2.11.0 tslib: 2.6.2 @@ -1426,10 +1440,10 @@ packages: tslib: 2.6.2 dev: false - /@aws-sdk/util-user-agent-node@3.451.0: + /@aws-sdk/util-user-agent-node@3.465.0: resolution: { - integrity: sha512-TBzm6P+ql4mkGFAjPlO1CI+w3yUT+NulaiALjl/jNX/nnUp6HsJsVxJf4nVFQTG5KRV0iqMypcs7I3KIhH+LmA==, + integrity: sha512-XsHbq7gLCiGdy6FQ7/5nGslK0ij3Iuh051djuIICvNurlds5cqKLiBe63gX3IUUwxJcrKh4xBGviQJ52KdVSeg==, } engines: { node: ">=14.0.0" } peerDependencies: @@ -1438,7 +1452,7 @@ packages: aws-crt: optional: true dependencies: - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.465.0 "@smithy/node-config-provider": 2.1.5 "@smithy/types": 2.5.0 tslib: 2.6.2 @@ -1472,7 +1486,7 @@ packages: "@jridgewell/trace-mapping": 0.3.9 dev: true - /@elsa-data/aws-infrastructure@1.5.1(aws-cdk-lib@2.108.1)(constructs@10.3.0): + /@elsa-data/aws-infrastructure@1.5.1(aws-cdk-lib@2.113.0)(constructs@10.3.0): resolution: { integrity: sha512-foP1LgYFWP2sR9R4FrpQyE/I+Vwh4NCMIt/8MwliNMwtAYYzCSHZduwyo9EekcHvCotfSC/hYexTL8uer+P37g==, @@ -1481,7 +1495,7 @@ packages: aws-cdk-lib: ^2.108.1 constructs: ^10.3.0 dependencies: - aws-cdk-lib: 2.108.1(constructs@10.3.0) + aws-cdk-lib: 2.113.0(constructs@10.3.0) constructs: 10.3.0 dev: false @@ -1774,10 +1788,10 @@ packages: "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@jsii/check-node@1.91.0: + /@jsii/check-node@1.92.0: resolution: { - integrity: sha512-K9UFkRe4uJNVp1O2o4OBM/3usba6Vw3XF1Mq3TVBAYl1EzpAiA62DojGp30+3zwFlb1lkavVj1hKlCrIWIuJhw==, + integrity: sha512-MQnFvDIn/VOz4FzchobZ4dfrl6qfuZIlYviNbGXhPMSeJ92BVB2F+NEyem9Sg/Csy2ehhtO1FGaUj4mO9/7Ntg==, } engines: { node: ">= 14.17.0" } dependencies: @@ -1785,10 +1799,10 @@ packages: semver: 7.5.4 dev: true - /@jsii/spec@1.91.0: + /@jsii/spec@1.92.0: resolution: { - integrity: sha512-Ir01bk5CwIFAApRJjRC+JG/f9db5dACEYFSxsHyvXRMu+J/LIANdwD4OPSelWrhbRiQdY6U16BKsRO63uaNRqg==, + integrity: sha512-6jbwQ2uCVOUq6eddKQG/cPzuUsdJwaszQstTZtruhhjWNuoC4CjT5eHlzjeBqtxQZpGiKkRRwPHb1bCEGgffxA==, } engines: { node: ">= 14.17.0" } dependencies: @@ -2535,10 +2549,10 @@ packages: } dev: true - /aws-cdk-lib@2.108.1(constructs@10.3.0): + /aws-cdk-lib@2.113.0(constructs@10.3.0): resolution: { - integrity: sha512-rqBJIB8cVjF2BjO3kEUn1j0JVY0GqrQc7KzMez40ew6I/QzqJwy6j8lPAI+eibn1JBifNeMb8wU2DpwVxz4fhQ==, + integrity: sha512-wZYooUd8nb3ADFtg1dSnsRt1MJmeqEK8cKOnPfCGCfm852YnVdb0qIEclURCQ4ygDJSuqiw9CE+xWVeTQTG6Dw==, } engines: { node: ">= 14.15.0" } peerDependencies: @@ -2560,10 +2574,10 @@ packages: - table - yaml - /aws-cdk@2.108.1: + /aws-cdk@2.113.0: resolution: { - integrity: sha512-VSu1KYLT1VzJdZqKPgVFQGfEBxaWmWCp0USfT4Xqk7drOmMzZK1PmXhSDpWr1mq1jn0m+4rwaifUi1Tt/0eFNQ==, + integrity: sha512-XEM8DSZpcMO1yXqozub8LiXK+3ihEqoWdeFDaIoMq0YmLspo9iAE3FPcKcIfv+ihRIEyvJLekGlxJPkx3+NOGA==, } engines: { node: ">= 14.15.0" } hasBin: true @@ -2671,10 +2685,10 @@ packages: engines: { node: ">=0.8" } dev: true - /codemaker@1.91.0: + /codemaker@1.92.0: resolution: { - integrity: sha512-yI9ibYUBdJDI8n5Vffd4kfg7mSy6Fes2FHq3/TrZtqhL5CJcXvI8Lltl6iTWM5f1JkeIeAMQOC45PjscBhWyZg==, + integrity: sha512-h9LW/YFYMAXHvv4aHNxVfawza/8GHL0Nw0zFpqdURXsjRlsCtG+SzqRvYLOJoFqxzZ9+rkXJf8fODImC6WHa8g==, } engines: { node: ">= 14.17.0" } dependencies: @@ -2798,7 +2812,7 @@ packages: dependencies: semver: 7.5.4 shelljs: 0.8.5 - typescript: 5.4.0-dev.20231114 + typescript: 5.4.0-dev.20231203 dev: true /emoji-regex@8.0.0: @@ -2878,10 +2892,10 @@ packages: } dev: true - /fast-glob@3.3.1: + /fast-glob@3.3.2: resolution: { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, } engines: { node: ">=8.6.0" } dependencies: @@ -3114,61 +3128,61 @@ packages: engines: { node: ">=0.12.0" } dev: true - /jsii-pacmak@1.91.0: + /jsii-pacmak@1.92.0: resolution: { - integrity: sha512-k3Mc8v2nS7OTZxbwXczjSl5/RzGXHPq/BzZ+MRQhP5Z0Ai7QDF++aJxx6GZT9JXOD8zpHpv74QOr6eLPRVRIEQ==, + integrity: sha512-LIwXYTYjX5APnb6qzu5TDMEkSJXq5ntE71fT5Lpj3KMpOGGOrYlCAuP1lxpf1oWfIZeuyC4orRafuE7AECEa/A==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.91.0 - "@jsii/spec": 1.91.0 + "@jsii/check-node": 1.92.0 + "@jsii/spec": 1.92.0 clone: 2.1.2 - codemaker: 1.91.0 + codemaker: 1.92.0 commonmark: 0.30.0 escape-string-regexp: 4.0.0 fs-extra: 10.1.0 - jsii-reflect: 1.91.0 - jsii-rosetta: 1.91.0 + jsii-reflect: 1.92.0 + jsii-rosetta: 1.92.0 semver: 7.5.4 - spdx-license-list: 6.7.0 + spdx-license-list: 6.8.0 xmlbuilder: 15.1.1 yargs: 16.2.0 transitivePeerDependencies: - supports-color dev: true - /jsii-reflect@1.91.0: + /jsii-reflect@1.92.0: resolution: { - integrity: sha512-RRFmvscXiBHUOP9ew71gPQ2IptiHYoRaihKoLg5+SQSeCvynaJrBWhNcBy26LHd28HEN2atdzYems0+HgeQNRg==, + integrity: sha512-9ZLaygpYXG7UBqcUtgINd4pDL43l2gdUwOqWUrMz5beVOgp1ccvbihVPW6LtWGcTDfC+A2oNzjEP6roUvWvDDw==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.91.0 - "@jsii/spec": 1.91.0 + "@jsii/check-node": 1.92.0 + "@jsii/spec": 1.92.0 chalk: 4.1.2 fs-extra: 10.1.0 - oo-ascii-tree: 1.91.0 + oo-ascii-tree: 1.92.0 yargs: 16.2.0 dev: true - /jsii-rosetta@1.91.0: + /jsii-rosetta@1.92.0: resolution: { - integrity: sha512-v8eW/XiJHklnkmTtCIbyAeDPUVfovU/ZNh1ixvGri/ps5H3iRRpLEmqGJGMm2IEIjNCSmnmIsDMQLw20/7Nu+Q==, + integrity: sha512-TKrCq3FToJ3rgCUzDEOWHIoYEs4CvtyXNNE2dPkX5YYv3+18vP8qiftGpyHGcgyslx2E7gm1g/8uPkAxeAEP+A==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.91.0 - "@jsii/spec": 1.91.0 + "@jsii/check-node": 1.92.0 + "@jsii/spec": 1.92.0 "@xmldom/xmldom": 0.8.10 commonmark: 0.30.0 - fast-glob: 3.3.1 - jsii: 1.91.0 + fast-glob: 3.3.2 + jsii: 1.92.0 semver: 7.5.4 semver-intersect: 1.4.0 stream-json: 1.8.0 @@ -3179,16 +3193,16 @@ packages: - supports-color dev: true - /jsii@1.91.0: + /jsii@1.92.0: resolution: { - integrity: sha512-dJ2FbnUfX5Eg9BdZx6Cz2JhDsvzGi2DoQeomzdjO9ltvVUouAFPWkpcUtJdLXaNmHQtPM4/I+AzelUX7w2mWVw==, + integrity: sha512-UHuPVMkUXBcbnSAsylQSea7BFNkr6hkx6NhGGoZ5Xnb3fZV7wwr9DHnE14yQJUIsrCL8WcqhCU79QTbWmnKpag==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.91.0 - "@jsii/spec": 1.91.0 + "@jsii/check-node": 1.92.0 + "@jsii/spec": 1.92.0 case: 1.6.3 chalk: 4.1.2 fast-deep-equal: 3.1.3 @@ -3197,23 +3211,23 @@ packages: semver: 7.5.4 semver-intersect: 1.4.0 sort-json: 2.0.1 - spdx-license-list: 6.7.0 + spdx-license-list: 6.8.0 typescript: 3.9.10 yargs: 16.2.0 transitivePeerDependencies: - supports-color dev: true - /jsii@5.2.29: + /jsii@5.2.35: resolution: { - integrity: sha512-2ApVgH/6473cyyVIxDtYGCm2yozJn0yhXYM+KYBxXsTjVXaXtkzSfD2PbPvzJ1phlR3FKAXSphFv8HIheRc/BA==, + integrity: sha512-idWKsPquJDpJR8rCxOVtTwUKtvHM4BA6e8SvylTF6ZVDHBxnKbD4wB7cQLeB2JPKKsW31TIG63+fND6HUw2V3w==, } engines: { node: ">= 16.14.0" } hasBin: true dependencies: - "@jsii/check-node": 1.91.0 - "@jsii/spec": 1.91.0 + "@jsii/check-node": 1.92.0 + "@jsii/spec": 1.92.0 case: 1.6.3 chalk: 4.1.2 downlevel-dts: 0.11.0 @@ -3373,10 +3387,10 @@ packages: wrappy: 1.0.2 dev: true - /oo-ascii-tree@1.91.0: + /oo-ascii-tree@1.92.0: resolution: { - integrity: sha512-pH4FFNLTO8VG+vNUm4AHmhLNjoSfQlO1UKIrzBGdeScppY785D93GVMH1XkCwbuO7pd9rrh6El5WF3a5QNvaww==, + integrity: sha512-rLSPbnakn5Wb3dOIVtrmn8jfHKqWv7bROpyBiw6DExq+dOG7qC49EIs89hBhyHkvLolX0oC+0a/RMPAyHEZ+1w==, } engines: { node: ">= 14.17.0" } dev: true @@ -3453,16 +3467,16 @@ packages: hasBin: true dev: true - /publib@0.2.745: + /publib@0.2.756: resolution: { - integrity: sha512-/HzsNkJAC15znzXF0xmY9Vsdz8ET2w5hPsl7B3ZMW3SrAT8P5dz5ucoqhKtnt6/3Odp/R6T0xqT4LdnGA9snUQ==, + integrity: sha512-9f0r75KrBbMmK2XeyCUw1lpwjuAyRlQpqQ+uvt7c9FSbVyczxj/YrIuR+YhYvfztVwkjwwbNMEG5FsknElqyuQ==, } hasBin: true dependencies: - "@aws-sdk/client-codeartifact": 3.451.0 - "@aws-sdk/credential-providers": 3.451.0 - "@aws-sdk/types": 3.449.0 + "@aws-sdk/client-codeartifact": 3.465.0 + "@aws-sdk/credential-providers": 3.465.0 + "@aws-sdk/types": 3.465.0 "@types/fs-extra": 8.1.2 fs-extra: 8.1.0 glob: 10.0.0 @@ -3610,14 +3624,6 @@ packages: minimist: 1.2.8 dev: true - /spdx-license-list@6.7.0: - resolution: - { - integrity: sha512-NFqavuJxNsHdwSy/0PjmUpcc76XwlmHQRPjVVtE62qmSLhKJUnzSvJCkU9nrY6TsChfGU1xqGePriBkNtNRMiA==, - } - engines: { node: ">=8" } - dev: true - /spdx-license-list@6.8.0: resolution: { @@ -3792,10 +3798,10 @@ packages: hasBin: true dev: true - /typescript@5.4.0-dev.20231114: + /typescript@5.4.0-dev.20231203: resolution: { - integrity: sha512-z7rH8Vy4KWJyzNUaFt1HMzwYNRUmy2HMN98eufjvqbhmS3WPoQF89/UgonRmYf1vAP/69z0PytuV9hBMHNkaDg==, + integrity: sha512-6Y/R8j4ZKcCbddjtRncKgCKz5RbqfQe04TIfYnUbPq2CKhJVGP6Bvmkm2GVI9lpTZR64c3wvY28k+exT/jBVdQ==, } engines: { node: ">=14.17" } hasBin: true From f0da9f62bca7e46784020e3ce7ce1b953bb164fc Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 5 Dec 2023 14:56:06 +1100 Subject: [PATCH 17/22] Better testing and creates a CSV of copy stats --- dev/test.ts | 114 ++++----- dev/tests-util.ts | 68 +++++ .../rclone-batch-docker-image/rclone-batch.go | 9 +- .../summarise-copy-lambda/package-lock.json | 8 +- .../lambda/summarise-copy-lambda/package.json | 3 +- .../summarise-copy-lambda.ts | 239 +++++++++++++----- .../src/copy-out-state-machine-construct.ts | 2 +- .../src/copy-out-state-machine-input.ts | 5 +- .../src/rclone-map-construct.ts | 16 +- .../src/s3-csv-distributed-map.ts | 27 +- .../summarise-copy-lambda-step-construct.ts | 1 - 11 files changed, 341 insertions(+), 151 deletions(-) create mode 100644 dev/tests-util.ts diff --git a/dev/test.ts b/dev/test.ts index d7f9494..bf19db6 100644 --- a/dev/test.ts +++ b/dev/test.ts @@ -10,6 +10,7 @@ import { TEST_BUCKET_OBJECT_PREFIX, TEST_BUCKET_WORKING_PREFIX, } from "./constants"; +import { makeObjectDictionaryCsv, makeTestObject } from "./tests-util"; const discoveryClient = new ServiceDiscoveryClient({}); const s3Client = new S3Client({}); @@ -18,31 +19,6 @@ const sfnClient = new SFNClient({}); // generate a unique run folder for this execution of the entire test suite const uniqueFolder = randomBytes(8).toString("hex"); -/** - * Put a list of objects as a CSV into an object. - * - * @param absoluteCsvKey the key of the CSV in the working folder - * @param keysBucket the source bucket of the objects - * @param keys the keys of the objects - */ -async function makeObjectListCsv( - absoluteCsvKey: string, - keysBucket: string, - keys: string[], -) { - let content = ""; - for (const k of keys) { - content += `${keysBucket},"${k}"\n`; - } - const response = await s3Client.send( - new PutObjectCommand({ - Bucket: TEST_BUCKET, - Key: absoluteCsvKey, - Body: content, - }), - ); -} - function getPaths(testNumber: number) { const tsvName = `${testNumber}-objects-to-copy.tsv`; @@ -53,7 +29,7 @@ function getPaths(testNumber: number) { testFolderObjectsTsvRelative: `${uniqueFolder}/${tsvName}`, testFolderObjectsTsvAbsolute: `${TEST_BUCKET_WORKING_PREFIX}${uniqueFolder}/${tsvName}`, - testFolderSrc: `${TEST_BUCKET_OBJECT_PREFIX}${uniqueFolder}/${testNumber}-src`, + testFolderSrc: `${TEST_BUCKET_OBJECT_PREFIX}${uniqueFolder}/${testNumber}-src/`, testFolderDest: `${TEST_BUCKET_OBJECT_PREFIX}${uniqueFolder}/${testNumber}-dest/`, }; } @@ -74,14 +50,12 @@ async function doTest1(stateMachineArn: string) { }; for (const [n, stor] of Object.entries(sourceObjects)) { - await makeTestObject(n, 256 * 1024, stor); + await makeTestObject(TEST_BUCKET, n, 256 * 1024, stor); } - await makeObjectListCsv( - testFolderObjectsTsvAbsolute, - TEST_BUCKET, - Object.keys(sourceObjects), - ); + await makeObjectDictionaryCsv(TEST_BUCKET, testFolderObjectsTsvAbsolute, { + TEST_BUCKET: Object.keys(sourceObjects), + }); await sfnClient.send( new StartExecutionCommand({ @@ -98,15 +72,54 @@ async function doTest1(stateMachineArn: string) { async function doTest2(stateMachineArn: string) { const { + testFolderSrc, testFolderDest, testFolderObjectsTsvAbsolute, testFolderObjectsTsvRelative, } = getPaths(1); - await makeObjectListCsv(testFolderObjectsTsvAbsolute, "umccr-10g-data-dev", [ - "HG00096/HG00096.hard-filtered.vcf.gz", - "HG00097/HG00097.hard-filtered.vcf.gz", - ]); + // we are going to make objects that are in both the src *and* destination + // this will let us test our "checksum skipping" + + // same name and same content + await makeTestObject( + TEST_BUCKET, + `${testFolderSrc}existing-a.bin`, + 256 * 1024, + ); + await makeTestObject( + TEST_BUCKET, + `${testFolderDest}existing-a.bin`, + 256 * 1024, + ); + + // same name and different content - the result should be that rclone *does* copy this + await makeTestObject( + TEST_BUCKET, + `${testFolderSrc}existing-b.bin`, + 64 * 1024, + ); + await makeTestObject( + TEST_BUCKET, + `${testFolderDest}existing-b.bin`, + 64 * 1024, + "STANDARD", + 1, + ); + + await makeObjectDictionaryCsv(TEST_BUCKET, testFolderObjectsTsvAbsolute, { + "umccr-10g-data-dev": [ + "HG00096/HG00096.hard-filtered.vcf.gz", + "HG00097/HG00097.hard-filtered.vcf.gz", + // this does not exist + "HG000XX/HG000XX.hard-filtered.vcf.gz", + ], + "not-a-bucket-that-exists": ["a-file-that-also-does-not-exist.bam"], + [TEST_BUCKET]: [ + `${testFolderSrc}existing-a.bin`, + `${testFolderSrc}existing-b.bin`, + ], + }); await sfnClient.send( new StartExecutionCommand({ @@ -115,7 +128,7 @@ async function doTest2(stateMachineArn: string) { sourceFilesCsvKey: testFolderObjectsTsvRelative, destinationBucket: TEST_BUCKET, destinationPrefixKey: testFolderDest, - maxItemsPerBatch: 1, + maxItemsPerBatch: 2, }), }), ); @@ -133,14 +146,12 @@ async function doTest3(stateMachineArn: string) { }; for (const [n, stor] of Object.entries(sourceObjects)) { - await makeTestObject(n, 1000, stor); + await makeTestObject(TEST_BUCKET, n, 1000, stor); } - await makeObjectListCsv( - `${testFolderSrc}/objects-to-copy.tsv`, - TEST_BUCKET, - Object.keys(sourceObjects), - ); + //await makeObjectDictionaryCsv(TEST_BUCKET, testFolderObjectsTsvAbsolute, { + // TEST_BUCKET: Object.keys(sourceObjects), + //}); await sfnClient.send( new StartExecutionCommand({ @@ -155,23 +166,6 @@ async function doTest3(stateMachineArn: string) { ); } -async function makeTestObject( - key: string, - sizeInBytes: number, - storageClass: StorageClass = "STANDARD", -) { - const response = await s3Client.send( - new PutObjectCommand({ - Bucket: TEST_BUCKET, - Key: key, - Body: Buffer.alloc(sizeInBytes, 13), - StorageClass: storageClass, - }), - ); -} - -async function createTestData() {} - (async () => { console.log(`Working folder = ${TEST_BUCKET}:${uniqueFolder}`); diff --git a/dev/tests-util.ts b/dev/tests-util.ts new file mode 100644 index 0000000..1940305 --- /dev/null +++ b/dev/tests-util.ts @@ -0,0 +1,68 @@ +import { PutObjectCommand, S3Client, StorageClass } from "@aws-sdk/client-s3"; + +const s3Client = new S3Client({}); + +/** + * Put a dictionary of objects as a two column CSV into an S3 object. + * + * @param csvBucket + * @param csvAbsoluteKey the key of the CSV in the working folder + * @param objects a dictionary of buckets->key[] + */ +export async function makeObjectDictionaryCsv( + csvBucket: string, + csvAbsoluteKey: string, + objects: Record, +) { + let content = ""; + + // for each bucket + for (const b of Object.keys(objects)) { + // for each key + for (const k of objects[b]) content += `${b},"${k}"\n`; + } + + // now save the CSV to S3 + const response = await s3Client.send( + new PutObjectCommand({ + Bucket: csvBucket, + Key: csvAbsoluteKey, + Body: content, + }), + ); +} + +/** + * Makes an S3 object of a certain size and storage class - and + * filled with basically blank data + * + * @param bucket the bucket of the object + * @param key the key of the object + * @param sizeInBytes the size in bytes of the object to make + * @param storageClass the storage class for the object, defaults to STANDARD + * @param forceContentByte force a content byte if the default needs to be overridden + * @returns the byte value that is the content of the created file + */ +export async function makeTestObject( + bucket: string, + key: string, + sizeInBytes: number, + storageClass: StorageClass = "STANDARD", + forceContentByte: number | undefined = undefined, +) { + const contentByte = + forceContentByte === undefined ? sizeInBytes % 256 : forceContentByte; + const response = await s3Client.send( + new PutObjectCommand({ + Bucket: bucket, + Key: key, + // so rather than make every file filled with 0s - we fill + // with a value that depends on the size... no particular + // point other than we can I guess assert content has been + // successfully copied by looking at the destination content after copy + Body: Buffer.alloc(sizeInBytes, contentByte), + StorageClass: storageClass, + }), + ); + return contentByte; +} diff --git a/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go index 198b03e..481c92b 100644 --- a/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go +++ b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/rclone-batch.go @@ -122,6 +122,9 @@ func main() { "--stats", "10000h", // normally no bandwidth limiting ("0") - but can institute bandwidth limit if asked "--bwlimit", If(debugBandwidthOk, debugBandwidth, "0"), + // because we are transferring between S3 - which has a consistent idea of checksums + // at src and destination we enable this options + "--checksum", "copy", source, destination) // we are only interested in stderr @@ -225,13 +228,13 @@ func main() { case 143: results[which] = map[string]any{ "errors": 1, - "lastError": "Interrupted by SIGTERM", + "lastError": "interrupted by SIGTERM", "source": source} resultErrorCount++ default: results[which] = map[string]any{ "errors": 1, - "lastError": fmt.Sprintf("Exit of rclone with code %v but no JSON statistics block generated", runExitErr.ExitCode()), + "lastError": fmt.Sprintf("exit of rclone with code %v but no JSON statistics block generated", runExitErr.ExitCode()), "systemError": fmt.Sprintf("%#v", runExitErr), "source": source} resultErrorCount++ @@ -245,7 +248,7 @@ func main() { // create a fake "compatible" stats block results[which] = map[string]any{ "errors": 1, - "lastError": "Skipped due to previous SIGTERM received", + "lastError": "skipped due to previous SIGTERM received", "source": source} resultErrorCount++ } diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json index e84c5e8..dbd2b9a 100644 --- a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.0", "dependencies": { "@aws-sdk/client-s3": "3.405.0", - "@types/aws-lambda": "8.10.93" + "@types/aws-lambda": "8.10.93", + "csv-stringify": "6.4.4" } }, "node_modules/@aws-crypto/crc32": { @@ -1395,6 +1396,11 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, + "node_modules/csv-stringify": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", + "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" + }, "node_modules/fast-xml-parser": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json index 764d461..5df6d4a 100644 --- a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/package.json @@ -4,6 +4,7 @@ "main": "summarise-copy-lambda.ts", "dependencies": { "@aws-sdk/client-s3": "3.405.0", - "@types/aws-lambda": "8.10.93" + "@types/aws-lambda": "8.10.93", + "csv-stringify": "6.4.4" } } diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts index cab1e99..a44ba9d 100644 --- a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts @@ -1,98 +1,197 @@ -import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { + GetObjectCommand, + PutObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; import { basename } from "path/posix"; +import { stringify } from "csv-stringify/sync"; interface InvokeEvent { - Bucket: string; - Key: string; + rcloneResults: { + manifestAbsoluteKey: string; + }; + destinationBucket: string; + destinationPrefixKey: string; + destinationEndCopyRelativeKey: string; } +/** + * A handler that process the Steps CSV result (which should have a bunch + * of rclone stats) - and converts that into a CSV report for the + * copy out destination. + * + * @param event + */ export async function handler(event: InvokeEvent) { - console.log(JSON.stringify(event, null, 2)); + // debug input event + console.debug(JSON.stringify(event, null, 2)); const client = new S3Client({}); + // the manifest.json is generated by an AWS Steps DISTRIBUTED map and shows the results + // of all the individual map run parts const getManifestCommand = new GetObjectCommand({ - Bucket: event.Bucket, - Key: event.Key, + Bucket: event.destinationBucket, + Key: event.rcloneResults.manifestAbsoluteKey, }); const getManifestResult = await client.send(getManifestCommand); const getManifestContent = await getManifestResult.Body.transformToString(); - - const manifest = JSON.parse(getManifestContent); - + // A sample manifest // {"DestinationBucket":"elsa-data-tmp", - // "MapRunArn":"arn:aws:states:ap-southeast-2:843407916570:mapRun:CopyOutStateMachineF3E7B017-3KDB9FinLIMl/4474d22f-4056-30e3-978c-027016edac90:0c17ffd6-e8ad-44c0-a65b-a8b721007241", + // "MapRunArn":"arn:aws:states:ap-southeast-2:12345678:mapRun:CopyOutStateMachineABCD/4474d22f-4056-30e3-978c-027016edac90:0c17ffd6-e8ad-44c0-a65b-a8b721007241", // "ResultFiles":{ // "FAILED":[], // "PENDING":[], - // "SUCCEEDED":[{"Key":"copy-out-test-working/a6faea86c066cd90/1-objects-to-copy.tsv/0c17ffd6-e8ad-44c0-a65b-a8b721007241/SUCCEEDED_0.json","Size":2887}]}} - if (manifest["ResultFiles"]) { - const rf = manifest["ResultFiles"]; - - if (rf["FAILED"] && rf["FAILED"].length > 0) - throw new Error("Copy is meant to succeed - but it had failed results"); - - if (rf["PENDING"] && rf["PENDING"].length > 0) - throw new Error("Copy is meant to succeed - but it had pending results"); - - if (!rf["SUCCEEDED"]) throw new Error("Copy is meant to succeed"); - - const fileResults = {}; - - for (const s of rf["SUCCEEDED"]) { - const getSuccessCommand = new GetObjectCommand({ - Bucket: event.Bucket, - Key: s["Key"], - }); - - const getSuccessResult = await client.send(getSuccessCommand); - const getSuccessContent = await getSuccessResult.Body.transformToString(); - - for (const row of JSON.parse(getSuccessContent)) { - if (row["Output"]) { - const rowOutput = JSON.parse(row["Output"]); - - // { "bytes": 0, - // "checks": 0, - // "deletedDirs": 0, - // "deletes": 0, - // "elapsedTime": 0.2928195, - // "errors": 0, - // "eta": null, - // "fatalError": false, - // "renames": 0, - // "retryError": false, - // "serverSideCopies": 1, - // "serverSideCopyBytes": 9, - // "serverSideMoveBytes": 0, - // "serverSideMoves": 0, - // "source": "s3:elsa-data-tmp/copy-out-test-objects/d76848c9ae316e13/1-src/1.bin", - // "speed": 0, - // "totalBytes": 0, - // "totalChecks": 0, - // "totalTransfers": 1, - // "transferTime": 0.046778609, - // "transfers": 1 } - for (const rcloneRow of rowOutput["rcloneResult"]) { - const s = rcloneRow["source"]; - const b = basename(s); - - const copiedBytes = rcloneRow["serverSideCopyBytes"]; - const copySeconds = rcloneRow["elapsedTime"]; + // "SUCCEEDED":[{"Key":"copy-out-test-working/a6faea86c066cd90/1-objects-to-copy.tsv/0c17ffd6-e8ad-44c0-a65b-a8b721007241/SUCCEEDED_0.json", + // "Size":2887}]}} + const manifest = JSON.parse(getManifestContent); + + const rf = manifest["ResultFiles"]; + + if (!rf) + throw new Error( + "AWS Steps Distributed map manifest.json is missing ResultFiles", + ); + + const pending = rf["PENDING"]; + const failed = rf["FAILED"]; + const succeeded = rf["SUCCEEDED"]; + + if ( + !Array.isArray(pending) || + !Array.isArray(failed) || + !Array.isArray(succeeded) + ) + throw new Error( + "AWS Steps Distributed map manifest.json is missing an expected array for PENDING, FAILED or SUCCEEDED", + ); + + if (pending.length > 0) + throw new Error( + "AWS Steps Distributed map manifest.json indicates there are PENDING results which is not a state we are expecting", + ); + + if (failed.length > 0) + throw new Error("Copy is meant to succeed - but it had failed results"); + + const fileResults = {}; + + for (const s of succeeded) { + const getSuccessCommand = new GetObjectCommand({ + Bucket: event.destinationBucket, + Key: s["Key"], + }); + + const getSuccessResult = await client.send(getSuccessCommand); + const getSuccessContent = await getSuccessResult.Body.transformToString(); + + for (const row of JSON.parse(getSuccessContent)) { + if (row["Output"]) { + const rowOutput = JSON.parse(row["Output"]); + + // { "bytes": 0, + // "checks": 0, + // "deletedDirs": 0, + // "deletes": 0, + // "elapsedTime": 0.2928195, + // "errors": 0, + // "eta": null, + // "fatalError": false, + // "renames": 0, + // "retryError": false, + // "serverSideCopies": 1, + // "serverSideCopyBytes": 9, + // "serverSideMoveBytes": 0, + // "serverSideMoves": 0, + // "source": "s3:elsa-data-tmp/copy-out-test-objects/d76848c9ae316e13/1-src/1.bin", + // "speed": 0, + // "totalBytes": 0, + // "totalChecks": 0, + // "totalTransfers": 1, + // "transferTime": 0.046778609, + // "transfers": 1 } + for (const rcloneRow of rowOutput["rcloneResult"]) { + console.log(JSON.stringify(rcloneRow, null, 2)); + + const s = rcloneRow["source"]; + const b = basename(s); + + // NOTE/WARNING: this behaviour is very dependent on rclone and our interpretation + // of rclone stats - so if things start breaking this is where I would start + // looking + const errors: number = rcloneRow["errors"]; + const lastError: number = rcloneRow["lastError"]; + const copiedBytes: number = rcloneRow["serverSideCopyBytes"]; + const copySeconds = rcloneRow["elapsedTime"]; + const totalTransfers = rcloneRow["totalTransfers"]; + const retryError = rcloneRow["retryError"]; + + // firstly if we have been signalled an error - we need to report that + if (errors > 0) { fileResults[b] = { name: b, - speedInMebibytesPerSecond: - copiedBytes / copySeconds / 1024 / 1024, + status: "ERROR", + speed: 0, + message: lastError, }; + } else { + // if we didn't end up transferring anything BUT there was no actual error AND + // we did a retry - then that probably means the source file didn't exist + if (totalTransfers < 1 && retryError) { + fileResults[b] = { + name: b, + status: "ERROR", + speed: 0, + message: "source file did not exist so nothing was transferred", + }; + } + // if we didn't end up transferring anything BUT there was no actual error + // AND we didn't do any retries then changes are we skipped due to it already + // being at the destination + else if (totalTransfers < 1 && !retryError) { + fileResults[b] = { + name: b, + status: "ALREADYCOPIED", + speed: 0, + message: + "destination file already exists with same checksum so nothing was transferred", + }; + } else { + // if we did do a copy then copySeconds will normally be a value and we can compute a speed + if (copySeconds) + fileResults[b] = { + name: b, + status: "COPIED", + speed: Math.floor(copiedBytes / copySeconds / 1024 / 1024), + message: "", + }; + } } } } - - console.log(JSON.stringify(fileResults, null, 2)); } - } else { - throw new Error("Missing result manifest"); + + // debug results before we make the CSV + console.debug(JSON.stringify(fileResults, null, 2)); + + const output = stringify(Object.values(fileResults), { + header: true, + columns: { + name: "OBJECTNAME", + status: "TRANSFERSTATUS", + speed: "MBPERSEC", + message: "MESSAGE", + }, + }); + + const putCommand = new PutObjectCommand({ + Bucket: event.destinationBucket, + Key: `${event.destinationPrefixKey}${event.destinationEndCopyRelativeKey}`, + Body: output, + }); + + await client.send(putCommand); } } diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index d4161e5..64d57bd 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -45,7 +45,7 @@ export class CopyOutStateMachineConstruct extends Construct { // these are the default objects that will be created in the destination prefix area destinationStartCopyRelativeKey: "STARTED_COPY.txt", - destinationEndCopyRelativeKey: "ENDED_COPY.txt", + destinationEndCopyRelativeKey: "ENDED_COPY.csv", }; const canWriteLambdaStep = new CanWriteLambdaStepConstruct( diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts index c290bbf..81331c3 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-input.ts @@ -26,9 +26,12 @@ export type CopyOutStateMachineInputKeys = keyof CopyOutStateMachineInput; export const SOURCE_FILES_CSV_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = "sourceFilesCsvKey"; +export const MAX_ITEMS_PER_BATCH_FIELD_NAME: CopyOutStateMachineInputKeys = + "maxItemsPerBatch"; + export const DESTINATION_BUCKET_FIELD_NAME: CopyOutStateMachineInputKeys = "destinationBucket"; -export const DESTINATION_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = +export const DESTINATION_PREFIX_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = "destinationPrefixKey"; export const DESTINATION_START_COPY_RELATIVE_KEY_FIELD_NAME: CopyOutStateMachineInputKeys = diff --git a/packages/aws-copy-out-sharer/src/rclone-map-construct.ts b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts index a9d9608..8180e13 100644 --- a/packages/aws-copy-out-sharer/src/rclone-map-construct.ts +++ b/packages/aws-copy-out-sharer/src/rclone-map-construct.ts @@ -4,7 +4,12 @@ import { S3CsvDistributedMap } from "./s3-csv-distributed-map"; import { RcloneRunTaskConstruct } from "./rclone-run-task-construct"; import { IVpc, SubnetType } from "aws-cdk-lib/aws-ec2"; import { Cluster } from "aws-cdk-lib/aws-ecs"; -import { SOURCE_FILES_CSV_KEY_FIELD_NAME } from "./copy-out-state-machine-input"; +import { + DESTINATION_BUCKET_FIELD_NAME, + DESTINATION_PREFIX_KEY_FIELD_NAME, + MAX_ITEMS_PER_BATCH_FIELD_NAME, + SOURCE_FILES_CSV_KEY_FIELD_NAME, +} from "./copy-out-state-machine-input"; type Props = { vpc: IVpc; @@ -61,6 +66,7 @@ export class RcloneMapConstruct extends Construct { this.distributedMap = new S3CsvDistributedMap(this, "RcloneMap", { toleratedFailurePercentage: 25, + batchMaxItemsPath: `$.${MAX_ITEMS_PER_BATCH_FIELD_NAME}`, itemReaderCsvHeaders: [bucketColumnName, keyColumnName], itemReader: { Bucket: props.workingBucket, @@ -81,8 +87,8 @@ export class RcloneMapConstruct extends Construct { batchInput: { "rcloneDestination.$": JsonPath.format( "s3:{}/{}", - JsonPath.stringAt(`$.destinationBucket`), - JsonPath.stringAt("$.destinationPrefixKey"), + JsonPath.stringAt(`$.${DESTINATION_BUCKET_FIELD_NAME}`), + JsonPath.stringAt(`$.${DESTINATION_PREFIX_KEY_FIELD_NAME}`), ), }, iterator: rcloneRunTask, @@ -94,6 +100,10 @@ export class RcloneMapConstruct extends Construct { JsonPath.stringAt(`$.${SOURCE_FILES_CSV_KEY_FIELD_NAME}`), ), }, + resultSelector: { + "manifestAbsoluteKey.$": "$.ResultWriterDetails.Key", + }, + resultPath: `$.rcloneResults`, }); } } diff --git a/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts index ec3ec2a..e7dc97e 100644 --- a/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts +++ b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts @@ -36,6 +36,8 @@ export interface S3CsvDistributedMapProps { readonly maxConcurrencyPath?: JsonPath | string; readonly resultPath?: JsonPath | string; + readonly resultSelector?: Readonly>; + readonly label?: string; } @@ -102,6 +104,13 @@ export class S3CsvDistributedMap } override toStateJson(): object { + // if any of these are specified we want to put in an ItemBatcher + // block which will tell the DISTRIBUTED map to switch on batching + const useBatching = + !!this.props.batchMaxItemsPath || + !!this.props.batchMaxItems || + !!this.props.batchInput; + const stateJson = { Type: "Map", ToleratedFailurePercentage: this.props.toleratedFailurePercentage, @@ -122,16 +131,13 @@ export class S3CsvDistributedMap Parameters: this.props.itemReader, }, ItemSelector: this.props.itemSelector, - ItemBatcher: - this.props.batchMaxItemsPath || - this.props.batchMaxItems || - this.props.batchInput - ? { - MaxItemsPerBatch: this.props.batchMaxItems, - MaxItemsPerBatchPath: this.props.batchMaxItemsPath, - BatchInput: this.props.batchInput, - } - : undefined, + ItemBatcher: useBatching + ? { + MaxItemsPerBatch: this.props.batchMaxItems, + MaxItemsPerBatchPath: this.props.batchMaxItemsPath, + BatchInput: this.props.batchInput, + } + : undefined, MaxConcurrency: this.props.maxConcurrency, MaxConcurrencyPath: this.props.maxConcurrencyPath, Label: this.props.label, @@ -142,6 +148,7 @@ export class S3CsvDistributedMap } : undefined, ResultPath: this.props.resultPath, + ResultSelector: this.props.resultSelector, }; return { diff --git a/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts index a182f8f..69103ed 100644 --- a/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts @@ -93,7 +93,6 @@ export class SummariseCopyLambdaStepConstruct extends Construct { ); this.invocableLambda = new LambdaInvoke(this, `Summarise Copy Results`, { - inputPath: "$.ResultWriterDetails", lambdaFunction: summariseCopyLambda, resultPath: JsonPath.DISCARD, }); From 452185c6c8aac58264dced0d70c8abc82d4181db Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Tue, 14 May 2024 18:03:03 +1000 Subject: [PATCH 18/22] Added dev example and an AG deploy Fixed permissions throughout (by making over broad!) --- .gitignore | 3 ++ README.md | 11 ++++- dev/EXAMPLE-COPY-README.md | 18 +++++++++ dev/dev.ts | 40 ++++++++++++++++++- dev/example-copy-manifest.csv | 12 ++++++ dev/package.json | 6 ++- .../summarise-copy-lambda.ts | 18 ++++++--- .../src/copy-out-state-machine-construct.ts | 7 ++-- .../src/rclone-run-task-construct.ts | 23 +++++++++++ .../src/s3-csv-distributed-map.ts | 11 ++++- .../summarise-copy-lambda-step-construct.ts | 13 +++--- 11 files changed, 142 insertions(+), 20 deletions(-) create mode 100644 dev/EXAMPLE-COPY-README.md create mode 100644 dev/example-copy-manifest.csv diff --git a/.gitignore b/.gitignore index ee45e62..9e6ca9c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ node_modules/ cdk.context.json cdk.out/ + + +.DS_Store diff --git a/README.md b/README.md index 98cbc98..48e7bce 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,16 @@ test invocations. { "sourceFilesCsvBucket": "bucket-with-csv", "sourceFilesCsvKey": "key-of-source-files.csv", - "destinationBucket": "a-target-bucket-in-same-region", + "destinationBucket": "a-target-bucket-in-same-region-but-not-same-account", "maxItemsPerBatch": 10 } ``` + +The copy will fan out wide (to sensible width (~ 100)) - but there is a small cost to the startup/shutdown +of the Fargate tasks. The maxItemsPerBatch controls how many individuals files are attempted per +Fargate task - though noting that we request SPOT tasks. + +So there is balance between the likelihood of SPOT interruptions v re-use of Fargate tasks. If +tasks are SPOT interrupted - then the next invocation will skip already transferred files (assuming +at least one is copied) - so it is probably safe and cheapest to leave the items per batch at 10 +and be prepared to perhaps re-execute the copy. diff --git a/dev/EXAMPLE-COPY-README.md b/dev/EXAMPLE-COPY-README.md new file mode 100644 index 0000000..83db531 --- /dev/null +++ b/dev/EXAMPLE-COPY-README.md @@ -0,0 +1,18 @@ +How to do a full scale invoke test. + +Go to "elsa-data-tmp" bucket in dev. +It probably will be empty as objects auto-expire. +Make a folder "copy-out-test-working". +Copy "example-copy-manifest.csv" to that folder. + +THE FOLDER MUST BE EXACTLY AS SPECIFIED AS THAT PERMISSION IS BAKED INTO +THE DEV DEPLOYMENT (IN ORDER TO TEST PERMISSIONS!) + +Invoke the dev Steps with the input + +{ +"sourceFilesCsvBucket": "elsa-data-tmp", +"sourceFilesCsvKey": "example-copy-manifest.csv", +"destinationBucket": "elsa-data-copy-target-sydney", +"maxItemsPerBatch": 2 +} diff --git a/dev/dev.ts b/dev/dev.ts index f3ab8b5..af8122e 100644 --- a/dev/dev.ts +++ b/dev/dev.ts @@ -1,5 +1,5 @@ import { CopyOutStateMachineConstruct } from "aws-copy-out-sharer"; -import { SubnetType } from "aws-cdk-lib/aws-ec2"; +import { SubnetType, Vpc } from "aws-cdk-lib/aws-ec2"; import { App, Stack, StackProps } from "aws-cdk-lib"; import { InfrastructureClient } from "@elsa-data/aws-infrastructure"; import { Service } from "aws-cdk-lib/aws-servicediscovery"; @@ -12,6 +12,7 @@ const description = "Bulk copy-out service for Elsa Data - an application for controlled genomic data sharing"; const devId = "ElsaDataDevCopyOutStack"; +const agId = "ElsaDataAgCopyOutStack"; /** * Wraps the copy out construct for development purposes. We don't do this Stack definition in the @@ -70,3 +71,40 @@ new ElsaDataCopyOutStack(app, devId, { }, description: description, }); + +/** + * Wraps an even simpler deployment direct for AG. We have needs to do AG copies + * outside of Elsa. This is also a good test of the copy-out mechanics. So this + * allows us to directly deploy/destroy. + */ +class ElsaDataSimpleCopyOutStack extends Stack { + constructor(scope?: Construct, id?: string, props?: StackProps) { + super(scope, id, props); + + const vpc = Vpc.fromLookup(this, "Vpc", { vpcName: "main-vpc" }); + + const copyOut = new CopyOutStateMachineConstruct(this, "CopyOut", { + vpc: vpc, + vpcSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, + workingBucket: "elsa-data-copy-working", + workingBucketPrefixKey: "temp/", + aggressiveTimes: false, + allowWriteToInstalledAccount: true, + }); + + //stateMachineArn: copyOut.stateMachine.stateMachineArn, + } +} + +new ElsaDataSimpleCopyOutStack(app, agId, { + // the stack can only be deployed to 'dev' + env: { + account: "602836945884", + region: "ap-southeast-2", + }, + tags: { + "umccr-org:Product": "ElsaData", + "umccr-org:Stack": agId, + }, + description: description, +}); diff --git a/dev/example-copy-manifest.csv b/dev/example-copy-manifest.csv new file mode 100644 index 0000000..05ebf63 --- /dev/null +++ b/dev/example-copy-manifest.csv @@ -0,0 +1,12 @@ +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.bcf" +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.bcf.csi" +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf" +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz" +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz.csi" +umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz.tbi" +umccr-10f-data-dev,ASHKENAZIM/HG002.bam +umccr-10f-data-dev,ASHKENAZIM/HG002.bam.bai +umccr-10f-data-dev,ASHKENAZIM/HG003.bam +umccr-10f-data-dev,ASHKENAZIM/HG003.bam.bai +umccr-10f-data-dev,ASHKENAZIM/HG004.bam +umccr-10f-data-dev,ASHKENAZIM/HG004.bam.bai diff --git a/dev/package.json b/dev/package.json index e5bc4f8..b2ddf9c 100644 --- a/dev/package.json +++ b/dev/package.json @@ -4,8 +4,10 @@ "version": "0.0.0", "description": "Manual CDK deployment for development", "scripts": { - "deploy": "pnpm -w run build && cdk deploy", - "destroy": "pnpm -w run build && cdk destroy", + "deploy": "pnpm -w run build && cdk deploy ElsaDataDevCopyOutStack", + "destroy": "pnpm -w run build && cdk destroy ElsaDataDevCopyOutStack", + "agdeploy": "pnpm -w run build && cdk deploy ElsaDataAgCopyOutStack", + "agdestroy": "pnpm -w run build && cdk destroy ElsaDataAgCopyOutStack", "test": "ts-node --prefer-ts-exts test.ts", "test-quick": "ts-node --prefer-ts-exts test.ts" }, diff --git a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts index a44ba9d..444cd31 100644 --- a/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts +++ b/packages/aws-copy-out-sharer/lambda/summarise-copy-lambda/summarise-copy-lambda.ts @@ -31,12 +31,14 @@ export async function handler(event: InvokeEvent) { // the manifest.json is generated by an AWS Steps DISTRIBUTED map and shows the results // of all the individual map run parts const getManifestCommand = new GetObjectCommand({ - Bucket: event.destinationBucket, + Bucket: (event as any).sourceFilesCsvBucket, Key: event.rcloneResults.manifestAbsoluteKey, }); const getManifestResult = await client.send(getManifestCommand); + const getManifestContent = await getManifestResult.Body.transformToString(); + // A sample manifest // {"DestinationBucket":"elsa-data-tmp", // "MapRunArn":"arn:aws:states:ap-southeast-2:12345678:mapRun:CopyOutStateMachineABCD/4474d22f-4056-30e3-978c-027016edac90:0c17ffd6-e8ad-44c0-a65b-a8b721007241", @@ -48,6 +50,8 @@ export async function handler(event: InvokeEvent) { const manifest = JSON.parse(getManifestContent); + console.debug(JSON.stringify(manifest, null, 2)); + const rf = manifest["ResultFiles"]; if (!rf) @@ -80,7 +84,7 @@ export async function handler(event: InvokeEvent) { for (const s of succeeded) { const getSuccessCommand = new GetObjectCommand({ - Bucket: event.destinationBucket, + Bucket: (event as any).sourceFilesCsvBucket, Key: s["Key"], }); @@ -123,8 +127,8 @@ export async function handler(event: InvokeEvent) { // looking const errors: number = rcloneRow["errors"]; const lastError: number = rcloneRow["lastError"]; - const copiedBytes: number = rcloneRow["serverSideCopyBytes"]; - const copySeconds = rcloneRow["elapsedTime"]; + const serverSideCopyBytes: number = rcloneRow["serverSideCopyBytes"]; + const elapsedTime = rcloneRow["elapsedTime"]; const totalTransfers = rcloneRow["totalTransfers"]; const retryError = rcloneRow["retryError"]; @@ -160,11 +164,13 @@ export async function handler(event: InvokeEvent) { }; } else { // if we did do a copy then copySeconds will normally be a value and we can compute a speed - if (copySeconds) + if (elapsedTime) fileResults[b] = { name: b, status: "COPIED", - speed: Math.floor(copiedBytes / copySeconds / 1024 / 1024), + speed: Math.floor( + serverSideCopyBytes / elapsedTime / 1024 / 1024, + ), message: "", }; } diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index 64d57bd..27739e5 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -165,9 +165,10 @@ export class CopyOutStateMachineConstruct extends Construct { "s3:AbortMultipartUpload", ], resources: [ - `arn:aws:s3:::${props.workingBucket}/${ - props.workingBucketPrefixKey ?? "" - }*`, + "*", + //`arn:aws:s3:::${props.workingBucket}/${ + // props.workingBucketPrefixKey ?? "" + //}*`, ], }), ); diff --git a/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts b/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts index 3c0f3a6..7cb4764 100644 --- a/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts +++ b/packages/aws-copy-out-sharer/src/rclone-run-task-construct.ts @@ -73,6 +73,25 @@ export class RcloneRunTaskConstruct extends Construct { }), ); + /* + import { LinuxParameters } from "aws-cdk-lib/aws-ecs"; + const linux = new LinuxParameters(this, "Linux", { + + }); + + linux.addTmpfs( + { + "mountOptions": [ TmpfsMountOption.RW ], + "containerPath": "/run", + "size": 10 + }, + { + "mountOptions": [ TmpfsMountOption.RW], + "containerPath": "/tmp", + "size": 10 + } + ); */ + const containerDefinition = taskDefinition.addContainer("RcloneContainer", { // set the stop timeout to the maximum allowed under Fargate Spot // potentially this will let us finish our rclone operation (!!! - we don't actually try to let rclone finish - see Docker image - we should) @@ -84,6 +103,10 @@ export class RcloneRunTaskConstruct extends Construct { platform: Platform.LINUX_AMD64, }, ), + readonlyRootFilesystem: true, + // https://stackoverflow.com/questions/68933848/how-to-allow-container-with-read-only-root-filesystem-writing-to-tmpfs-volume + // DOESN'T WORK FOR FARGATE SO NEED TO THINK ABOUT THIS OTHER WAY + // linuxParameters: linux, logging: LogDriver.awsLogs({ streamPrefix: "elsa-data-copy-out", logRetention: RetentionDays.ONE_WEEK, diff --git a/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts index e7dc97e..e561365 100644 --- a/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts +++ b/packages/aws-copy-out-sharer/src/s3-csv-distributed-map.ts @@ -7,7 +7,12 @@ import { StateGraph, StateMachine, } from "aws-cdk-lib/aws-stepfunctions"; -import { Effect, Policy, PolicyStatement } from "aws-cdk-lib/aws-iam"; +import { + Effect, + ManagedPolicy, + Policy, + PolicyStatement, +} from "aws-cdk-lib/aws-iam"; import { Construct } from "constructs"; export interface S3CsvDistributedMapProps { @@ -91,6 +96,10 @@ export class S3CsvDistributedMap ); this.policy.attachToRole(stateMachine.role); + + stateMachine.role.addManagedPolicy( + ManagedPolicy.fromAwsManagedPolicyName("AmazonS3FullAccess"), + ); } protected makeNext(next: State) { diff --git a/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts index 69103ed..db52a58 100644 --- a/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts +++ b/packages/aws-copy-out-sharer/src/summarise-copy-lambda-step-construct.ts @@ -83,12 +83,13 @@ export class SummariseCopyLambdaStepConstruct extends Construct { summariseCopyLambda.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, - actions: ["s3:GetObject"], - resources: [ - `arn:aws:s3:::${props.workingBucket}/${ - props.workingBucketPrefixKey ?? "" - }*`, - ], + actions: ["s3:*"], + resources: ["*"], + //[ + //`arn:aws:s3:::${props.workingBucket}/${ + // props.workingBucketPrefixKey ?? "" + //}*`, + //], }), ); From 6ede8437781894364d824767d3c507e289f7c9ee Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 15 May 2024 13:12:24 +1000 Subject: [PATCH 19/22] Bump CDK for ECS Runtask bug Final tidies --- README.md | 5 +- dev/EXAMPLE-COPY-README.md | 28 +- dev/dev.ts | 1 - dev/example-copy-manifest-ag.csv | 2 + dev/example-copy-manifest.csv | 1 + dev/package.json | 11 +- packages/aws-copy-out-sharer/README.md | 2 +- packages/aws-copy-out-sharer/package.json | 10 +- .../src/copy-out-state-machine-construct.ts | 2 +- pnpm-lock.yaml | 3389 ++++++++++------- 10 files changed, 2077 insertions(+), 1374 deletions(-) create mode 100644 dev/example-copy-manifest-ag.csv diff --git a/README.md b/README.md index 48e7bce..6b8d98e 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,9 @@ test invocations. } ``` -The copy will fan out wide (to sensible width (~ 100)) - but there is a small cost to the startup/shutdown -of the Fargate tasks. The maxItemsPerBatch controls how many individuals files are attempted per +The copy will fan-out wide (to sensible width (~ 100)) - but there is a small AWS Config +cost to the startup/shutdown +of the Fargate tasks. Therefore the `maxItemsPerBatch` controls how many individuals files are attempted per Fargate task - though noting that we request SPOT tasks. So there is balance between the likelihood of SPOT interruptions v re-use of Fargate tasks. If diff --git a/dev/EXAMPLE-COPY-README.md b/dev/EXAMPLE-COPY-README.md index 83db531..6bc0bf1 100644 --- a/dev/EXAMPLE-COPY-README.md +++ b/dev/EXAMPLE-COPY-README.md @@ -8,11 +8,29 @@ Copy "example-copy-manifest.csv" to that folder. THE FOLDER MUST BE EXACTLY AS SPECIFIED AS THAT PERMISSION IS BAKED INTO THE DEV DEPLOYMENT (IN ORDER TO TEST PERMISSIONS!) -Invoke the dev Steps with the input +Invoke the dev Steps with the input (feel free to change to "0\_" if you +want to run multiple experiments without overriding the results) +```json { -"sourceFilesCsvBucket": "elsa-data-tmp", -"sourceFilesCsvKey": "example-copy-manifest.csv", -"destinationBucket": "elsa-data-copy-target-sydney", -"maxItemsPerBatch": 2 + "sourceFilesCsvBucket": "elsa-data-tmp", + "sourceFilesCsvKey": "example-copy-manifest.csv", + "destinationBucket": "elsa-data-copy-target-sydney", + "maxItemsPerBatch": 2, + "destinationStartCopyRelativeKey": "0_STARTED_COPY.txt", + "destinationEndCopyRelativeKey": "0_ENDED_COPY.csv" } +``` + +For a test of AG (in the AG account - with public/made up data files) + +```json +{ + "sourceFilesCsvBucket": "elsa-data-copy-working", + "sourceFilesCsvKey": "example-copy-manifest-ag.csv", + "destinationBucket": "elsa-data-copy-target-sydney", + "maxItemsPerBatch": 1, + "destinationStartCopyRelativeKey": "AG_STARTED_COPY.txt", + "destinationEndCopyRelativeKey": "AG_ENDED_COPY.csv" +} +``` diff --git a/dev/dev.ts b/dev/dev.ts index af8122e..9e3b75f 100644 --- a/dev/dev.ts +++ b/dev/dev.ts @@ -87,7 +87,6 @@ class ElsaDataSimpleCopyOutStack extends Stack { vpc: vpc, vpcSubnetSelection: SubnetType.PRIVATE_WITH_EGRESS, workingBucket: "elsa-data-copy-working", - workingBucketPrefixKey: "temp/", aggressiveTimes: false, allowWriteToInstalledAccount: true, }); diff --git a/dev/example-copy-manifest-ag.csv b/dev/example-copy-manifest-ag.csv new file mode 100644 index 0000000..18c3ad9 --- /dev/null +++ b/dev/example-copy-manifest-ag.csv @@ -0,0 +1,2 @@ +elsa-data-demo-agha-gdr-store,FLAGSHIP_A/2020-02-01/ERR251112_R1.fastq.gz +elsa-data-demo-agha-gdr-store,FLAGSHIP_A/2020-02-01/ERR251112_R2.fastq.gz diff --git a/dev/example-copy-manifest.csv b/dev/example-copy-manifest.csv index 05ebf63..ca86f0d 100644 --- a/dev/example-copy-manifest.csv +++ b/dev/example-copy-manifest.csv @@ -4,6 +4,7 @@ umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf" umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz" umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz.csi" umccr-10f-data-dev,"ASHKENAZIM/HG002-HG003-HG004.joint.filter.vcf.gz.tbi" +umccr-10f-data-dev,AFILETHATDOESNOTEXIST.txt umccr-10f-data-dev,ASHKENAZIM/HG002.bam umccr-10f-data-dev,ASHKENAZIM/HG002.bam.bai umccr-10f-data-dev,ASHKENAZIM/HG003.bam diff --git a/dev/package.json b/dev/package.json index b2ddf9c..d609d55 100644 --- a/dev/package.json +++ b/dev/package.json @@ -12,12 +12,13 @@ "test-quick": "ts-node --prefer-ts-exts test.ts" }, "dependencies": { - "@aws-sdk/client-s3": "3.450.0", - "@aws-sdk/client-servicediscovery": "3.450.0", - "@aws-sdk/client-sfn": "3.450.0", + "@aws-sdk/client-s3": "3.576.0", + "@aws-sdk/client-servicediscovery": "3.576.0", + "@aws-sdk/client-sfn": "3.576.0", + "@aws-sdk/client-sso-oidc": "3.574.0", "@elsa-data/aws-infrastructure": "1.5.1", - "aws-cdk": "2.113.0", - "aws-cdk-lib": "2.113.0", + "aws-cdk": "2.141.0", + "aws-cdk-lib": "2.141.0", "aws-copy-out-sharer": "link:../packages/aws-copy-out-sharer", "constructs": "10.3.0" }, diff --git a/packages/aws-copy-out-sharer/README.md b/packages/aws-copy-out-sharer/README.md index 750e874..7b7bc85 100644 --- a/packages/aws-copy-out-sharer/README.md +++ b/packages/aws-copy-out-sharer/README.md @@ -1,3 +1,3 @@ -# copy out state machine +# Copy out state machine A construct for a AWS Steps Copy Out state machine. diff --git a/packages/aws-copy-out-sharer/package.json b/packages/aws-copy-out-sharer/package.json index 66af768..7799759 100644 --- a/packages/aws-copy-out-sharer/package.json +++ b/packages/aws-copy-out-sharer/package.json @@ -35,14 +35,14 @@ } }, "peerDependencies": { - "aws-cdk-lib": "^2.113.0", + "aws-cdk-lib": "^2.141.0", "constructs": "^10.3.0" }, "devDependencies": { - "aws-cdk-lib": "2.113.0", + "aws-cdk-lib": "2.141.0", "constructs": "10.3.0", - "jsii": "5.2.35", - "jsii-pacmak": "1.92.0", - "publib": "0.2.756" + "jsii": "5.4.15", + "jsii-pacmak": "1.98.0", + "publib": "0.2.834" } } diff --git a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts index 27739e5..78aff02 100644 --- a/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts +++ b/packages/aws-copy-out-sharer/src/copy-out-state-machine-construct.ts @@ -40,7 +40,7 @@ export class CopyOutStateMachineConstruct extends Construct { maxItemsPerBatch: 8, copyConcurrency: 80, requiredRegion: Stack.of(this).region, - // by default we just copy into the top level of the destination bucket + // by default, we just copy into the top level of the destination bucket destinationPrefixKey: "", // these are the default objects that will be created in the destination prefix area diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 142b9e8..b8d7f00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,23 +29,26 @@ importers: dev: dependencies: "@aws-sdk/client-s3": - specifier: 3.450.0 - version: 3.450.0 + specifier: 3.576.0 + version: 3.576.0 "@aws-sdk/client-servicediscovery": - specifier: 3.450.0 - version: 3.450.0 + specifier: 3.576.0 + version: 3.576.0 "@aws-sdk/client-sfn": - specifier: 3.450.0 - version: 3.450.0 + specifier: 3.576.0 + version: 3.576.0 + "@aws-sdk/client-sso-oidc": + specifier: 3.576.0 + version: 3.576.0(@aws-sdk/client-sts@3.576.0) "@elsa-data/aws-infrastructure": specifier: 1.5.1 - version: 1.5.1(aws-cdk-lib@2.113.0)(constructs@10.3.0) + version: 1.5.1(aws-cdk-lib@2.141.0)(constructs@10.3.0) aws-cdk: - specifier: 2.113.0 - version: 2.113.0 + specifier: 2.141.0 + version: 2.141.0 aws-cdk-lib: - specifier: 2.113.0 - version: 2.113.0(constructs@10.3.0) + specifier: 2.141.0 + version: 2.141.0(constructs@10.3.0) aws-copy-out-sharer: specifier: link:../packages/aws-copy-out-sharer version: link:../packages/aws-copy-out-sharer @@ -56,26 +59,26 @@ importers: packages/aws-copy-out-sharer: devDependencies: aws-cdk-lib: - specifier: 2.113.0 - version: 2.113.0(constructs@10.3.0) + specifier: 2.141.0 + version: 2.141.0(constructs@10.3.0) constructs: specifier: 10.3.0 version: 10.3.0 jsii: - specifier: 5.2.35 - version: 5.2.35 + specifier: 5.4.15 + version: 5.4.15 jsii-pacmak: - specifier: 1.92.0 - version: 1.92.0 + specifier: 1.98.0 + version: 1.98.0(jsii-rosetta@5.4.17) publib: - specifier: 0.2.756 - version: 0.2.756 + specifier: 0.2.834 + version: 0.2.834(@aws-sdk/client-sso-oidc@3.575.0) packages: - /@aws-cdk/asset-awscli-v1@2.2.201: + /@aws-cdk/asset-awscli-v1@2.2.202: resolution: { - integrity: sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==, + integrity: sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg==, } /@aws-cdk/asset-kubectl-v20@2.1.2: @@ -84,10 +87,10 @@ packages: integrity: sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==, } - /@aws-cdk/asset-node-proxy-agent-v6@2.0.1: + /@aws-cdk/asset-node-proxy-agent-v6@2.0.3: resolution: { - integrity: sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==, + integrity: sha512-twhuEG+JPOYCYPx/xy5uH2+VUsIEhPTzDY0F1KuB+ocjWWB/KEDiOVL19nHvbPCB6fhWnkykXEMJ4HHcKvjtvg==, } /@aws-crypto/crc32@3.0.0: @@ -97,8 +100,9 @@ packages: } dependencies: "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.398.0 + "@aws-sdk/types": 3.575.0 tslib: 1.14.1 + dev: false /@aws-crypto/crc32c@3.0.0: resolution: @@ -107,7 +111,7 @@ packages: } dependencies: "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.449.0 + "@aws-sdk/types": 3.575.0 tslib: 1.14.1 dev: false @@ -128,7 +132,7 @@ packages: "@aws-crypto/ie11-detection": 3.0.0 "@aws-crypto/supports-web-crypto": 3.0.0 "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.449.0 + "@aws-sdk/types": 3.575.0 "@aws-sdk/util-locate-window": 3.310.0 "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 @@ -144,7 +148,7 @@ packages: "@aws-crypto/sha256-js": 3.0.0 "@aws-crypto/supports-web-crypto": 3.0.0 "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.575.0 "@aws-sdk/util-locate-window": 3.310.0 "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 @@ -156,7 +160,7 @@ packages: } dependencies: "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.451.0 + "@aws-sdk/types": 3.575.0 tslib: 1.14.1 /@aws-crypto/supports-web-crypto@3.0.0: @@ -173,1221 +177,1188 @@ packages: integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==, } dependencies: - "@aws-sdk/types": 3.398.0 + "@aws-sdk/types": 3.575.0 "@aws-sdk/util-utf8-browser": 3.259.0 tslib: 1.14.1 - /@aws-sdk/client-codeartifact@3.465.0: + /@aws-sdk/client-codeartifact@3.576.0: resolution: { - integrity: sha512-ZM6tXlsgoTNCwTgv2UQzZTrhNmUAZbohiTOMoXJFeUO0nx9/mkwn8T4mfgHNpaApbCD3LJ6+EccYC6wv50cg1g==, + integrity: sha512-vCca4/Q8OLLJCqEwZAs+GXetiu+EN/P1W59aQSuVoL6g+dPnJy0Vo4syFV9oXrIMJjAjobbu8CVzQDgX2Wok/g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-stream": 2.0.20 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-stream": 3.0.1 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/client-cognito-identity@3.465.0: + /@aws-sdk/client-cognito-identity@3.576.0: resolution: { - integrity: sha512-Ku1034M9jjsXbLBS5DwQfcTwWwu2oxtmdbsxvEm4I7IUA/h1++hKPzZuJ6L9zo7I7GbA+WnCryviUdtbgCqTfA==, + integrity: sha512-SgfR1LLZWT1NrNOB968OKC8RAbaQUFG4V1eDjAeNjtuqC7iAlY9Ogrl824XJY4muz4ErVAga7A+Xn9QTOSSTBQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/client-s3@3.450.0: + /@aws-sdk/client-s3@3.576.0: resolution: { - integrity: sha512-mw+zNVOXqsNjGrKjykcqxsiTMHTomcFEYODa5CEE6CeJQ2COwjNN9urzFO/uocA9z/2K3t1dG/q+2mvP0EcC2A==, + integrity: sha512-6Xhj8x7ijLqoLYncKMUn433QKWzEezDLR3TipKv/qHThTa8oYXkymMat/MfJ/lx3jsc8wS72i+1kTwO+AFUg6w==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.450.0 - "@aws-sdk/core": 3.445.0 - "@aws-sdk/credential-provider-node": 3.450.0 - "@aws-sdk/middleware-bucket-endpoint": 3.449.0 - "@aws-sdk/middleware-expect-continue": 3.449.0 - "@aws-sdk/middleware-flexible-checksums": 3.449.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-location-constraint": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-sdk-s3": 3.449.0 - "@aws-sdk/middleware-signing": 3.449.0 - "@aws-sdk/middleware-ssec": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/signature-v4-multi-region": 3.449.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@aws-sdk/xml-builder": 3.310.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/eventstream-serde-browser": 2.0.13 - "@smithy/eventstream-serde-config-resolver": 2.0.13 - "@smithy/eventstream-serde-node": 2.0.13 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-blob-browser": 2.0.14 - "@smithy/hash-node": 2.0.15 - "@smithy/hash-stream-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/md5-js": 2.0.15 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.0 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-stream": 2.0.20 - "@smithy/util-utf8": 2.0.0 - "@smithy/util-waiter": 2.0.13 - fast-xml-parser: 4.2.5 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-bucket-endpoint": 3.575.0 + "@aws-sdk/middleware-expect-continue": 3.575.0 + "@aws-sdk/middleware-flexible-checksums": 3.575.0 + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-location-constraint": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-sdk-s3": 3.575.0 + "@aws-sdk/middleware-signing": 3.575.0 + "@aws-sdk/middleware-ssec": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/signature-v4-multi-region": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@aws-sdk/xml-builder": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/eventstream-serde-browser": 3.0.0 + "@smithy/eventstream-serde-config-resolver": 3.0.0 + "@smithy/eventstream-serde-node": 3.0.0 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-blob-browser": 3.0.0 + "@smithy/hash-node": 3.0.0 + "@smithy/hash-stream-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/md5-js": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-stream": 3.0.1 + "@smithy/util-utf8": 3.0.0 + "@smithy/util-waiter": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-servicediscovery@3.450.0: + /@aws-sdk/client-servicediscovery@3.576.0: resolution: { - integrity: sha512-TM4KvHrw+Fq9yPQhzRINQ79jP24lS8JfiGb7mEKPZbRIMu0bW+26zgELD9BftfPa/vtubFwBA0qcwpk/g3J5SA==, + integrity: sha512-Nb8FhNlVWakv1mbHqT2WENl6yzveIzN/WPj9dXw70gKGfrr9MSV8IB3/eoNKwDx7fyZwPpg+4265dVl1XaUFJA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.450.0 - "@aws-sdk/core": 3.445.0 - "@aws-sdk/credential-provider-node": 3.450.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-signing": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 - tslib: 2.6.2 - uuid: 8.3.2 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 + tslib: 2.6.2 + uuid: 9.0.1 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sfn@3.450.0: + /@aws-sdk/client-sfn@3.576.0: resolution: { - integrity: sha512-z0SyE6fUpJ3IEbaHruw4oCqszxAt97507/KZBv89DLFz2WBuZCmq4hr0rp4/rQuMzi6X9Tvd6MZP4GeuNWDm8g==, + integrity: sha512-M1Hz5W1NWZ3+Ixe59nG3wY1ReZx+o3msgRe9fY7JCluw9xOtce5QF3I5sbu/KvOL1cipLfBymuqWC7eV3Jb6KQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.450.0 - "@aws-sdk/core": 3.445.0 - "@aws-sdk/credential-provider-node": 3.450.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-signing": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 + uuid: 9.0.1 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso@3.450.0: + /@aws-sdk/client-sso-oidc@3.575.0: resolution: { - integrity: sha512-xutima6DhrTLMyBc1nmLhWXarvrqbH1zizrQpG7cLdwfqHEOi3thR3SWu+pUC4XN9kiXQUb2HUMcv/vdqmknkQ==, + integrity: sha512-YCstVaW5tAvXs+v4LR9gNAO+VRhIObjk1/knCdVQ5QQRTevtVQtdJWeNrDZYo4ATo0OHGyqGCj5Z09TWMv+e1Q==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.445.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/client-sts": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/core": 3.575.0 + "@aws-sdk/credential-provider-node": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false + dev: true - /@aws-sdk/client-sso@3.465.0: + /@aws-sdk/client-sso-oidc@3.576.0(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-JXDBa3Sl+LS0KEOs0PZoIjpNKEEGfeyFwdnRxi8Y1hMXNEKyJug1cI2Psqu2olpn4KeXwoP1BuITppZYdolOew==, + integrity: sha512-6U8933O9h6iMnQDpH3OtFhS3G3FVttYZUqTpC2T0FnSSX7zgG0GnlxdQiyZh1j1aFrEB8bFw/RSmxPcMJJuSlQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - "@aws-sdk/client-sts" - aws-crt - dev: true - /@aws-sdk/client-sts@3.450.0: + /@aws-sdk/client-sso@3.575.0: resolution: { - integrity: sha512-pHZ/3NHHtK5YbjYrh2jT8eePSYSunyvcIhdASMqYVg3Enw/BxA0IKL8bZ/slolhqR1sAQx4sKRAO7dZK418Q6w==, + integrity: sha512-elFWpAtktD3XBy47etG80GKXK9Lh3sNCMXLjcSs0NS0fdRIQJS2zKxC8qK22UQmdFKpXxthND5FKk7fNEqrR+g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.445.0 - "@aws-sdk/credential-provider-node": 3.450.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-sdk-sts": 3.449.0 - "@aws-sdk/middleware-signing": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 - fast-xml-parser: 4.2.5 + "@aws-sdk/core": 3.575.0 + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false + dev: true - /@aws-sdk/client-sts@3.465.0: + /@aws-sdk/client-sso@3.576.0: resolution: { - integrity: sha512-rHi9ba6ssNbVjlWSdhi4C5newEhGhzkY9UE4KB+/Tj21zXfEP8r6uIltnQXPtun2SdA95Krh/yS1qQ4MRuzqyA==, + integrity: sha512-xbKE4bf3HYvkdrvn5kkpUdcoi3mg7uDLLkSbGaj0tzW3vNSdx9qLrCMuwfV7KrhVKWwx+lnw/2LGuCR2B5y0IA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-sdk-sts": 3.465.0 - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 - fast-xml-parser: 4.2.5 + "@aws-sdk/core": 3.576.0 + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: true - - /@aws-sdk/core@3.445.0: - resolution: - { - integrity: sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/smithy-client": 2.1.15 - tslib: 2.6.2 - dev: false - - /@aws-sdk/core@3.465.0: - resolution: - { - integrity: sha512-fHSIw/Rgex3KbrEKn6ZrUc2VcsOTpdBMeyYtfmsTOLSyDDOG9k3jelOvVbCbrK5N6uEUSM8hrnySEKg94UB0cg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/smithy-client": 2.1.15 - tslib: 2.6.2 - dev: true - /@aws-sdk/credential-provider-cognito-identity@3.465.0: + /@aws-sdk/client-sts@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-bvZNgA2Cx54eTSZm2bXCUbz5rQjcNqTONuvjNIl1CFK9lEj3o3rRU1EqAwX6AIrT1OIstnDr1Z6llxjwvTLqiA==, + integrity: sha512-8MrT4J2dRiskf0JFMGL5VNBqPvc6igNa218LGBJzHXmLsm1WfGCGnce84R7U2USr8oPOenu0XzSCLvMQyZbGWQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sso-oidc": 3.575.0 + "@aws-sdk/core": 3.575.0 + "@aws-sdk/credential-provider-node": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" - aws-crt dev: true - /@aws-sdk/credential-provider-env@3.449.0: - resolution: - { - integrity: sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/credential-provider-env@3.465.0: - resolution: - { - integrity: sha512-fku37AgkB9KhCuWHE6mfvbWYU0X84Df6MQ60nYH7s/PiNEhkX2cVI6X6kOKjP1MNIwRcYt+oQDvplVKdHume+A==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - dev: true - - /@aws-sdk/credential-provider-http@3.465.0: - resolution: - { - integrity: sha512-Rj/zFgP0i0tpuaO+sm1csGU7NLQa1F9eE9c3VKbYECiXAZwrGJnY1TdG2iSsLpkMtyfOhRrRvAuYAUCUemWg3g==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/node-http-handler": 2.1.9 - "@smithy/property-provider": 2.0.14 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/util-stream": 2.0.20 - tslib: 2.6.2 - dev: true - - /@aws-sdk/credential-provider-ini@3.450.0: + /@aws-sdk/client-sts@3.576.0: resolution: { - integrity: sha512-quil0bUH43irhEtHBBpnleVQd1ZBX9kDVf8HziK/LIhujTmHDAoDODnjhUczdJU6srMJgAJi1oVTaVek5emh9Q==, + integrity: sha512-GHqqfRcUW/nGE4lpRafNKRxi4K7+SaQjYLjQnTEioUhr+w1IT/fFb3rGZYHHnN9ZCzbnrBULRC+1XOPIQWyLsw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.449.0 - "@aws-sdk/credential-provider-process": 3.449.0 - "@aws-sdk/credential-provider-sso": 3.450.0 - "@aws-sdk/credential-provider-web-identity": 3.449.0 - "@aws-sdk/types": 3.449.0 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/core": 3.576.0 + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/middleware-host-header": 3.575.0 + "@aws-sdk/middleware-logger": 3.575.0 + "@aws-sdk/middleware-recursion-detection": 3.575.0 + "@aws-sdk/middleware-user-agent": 3.575.0 + "@aws-sdk/region-config-resolver": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@aws-sdk/util-user-agent-browser": 3.575.0 + "@aws-sdk/util-user-agent-node": 3.575.0 + "@smithy/config-resolver": 3.0.0 + "@smithy/core": 2.0.1 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/hash-node": 3.0.0 + "@smithy/invalid-dependency": 3.0.0 + "@smithy/middleware-content-length": 3.0.0 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/node-http-handler": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.1 + "@smithy/util-defaults-mode-node": 3.0.1 + "@smithy/util-endpoints": 2.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false - /@aws-sdk/credential-provider-ini@3.465.0: + /@aws-sdk/core@3.575.0: resolution: { - integrity: sha512-B1MFufvdToAEMtfszilVnKer2S7P/OfMhkCizq2zuu8aU/CquRyHvKEQgWdvqunUDrFnVTc0kUZgsbBY0uPjLg==, + integrity: sha512-117U+kQki2XoKcYQfepmlRcNxn6rELGlOFOBQ8Z2JTBXEYHblW2ke067a0CLmxFwp/zCWuc7IGjd3in3x4Q3rg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@smithy/core": 2.0.1 + "@smithy/protocol-http": 4.0.0 + "@smithy/signature-v4": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + fast-xml-parser: 4.2.5 tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt dev: true - /@aws-sdk/credential-provider-node@3.450.0: + /@aws-sdk/core@3.576.0: resolution: { - integrity: sha512-d4tQklhvsydNCer5Axd2sNptqqdalE78esDk0zA/cYaj56GniKqk3HLJLgb/wdv2/Ho6/4DhWeM5W4LaJNRivA==, + integrity: sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.449.0 - "@aws-sdk/credential-provider-ini": 3.450.0 - "@aws-sdk/credential-provider-process": 3.449.0 - "@aws-sdk/credential-provider-sso": 3.450.0 - "@aws-sdk/credential-provider-web-identity": 3.449.0 - "@aws-sdk/types": 3.449.0 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@smithy/core": 2.0.1 + "@smithy/protocol-http": 4.0.0 + "@smithy/signature-v4": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + fast-xml-parser: 4.2.5 tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - dev: false - /@aws-sdk/credential-provider-node@3.465.0: + /@aws-sdk/credential-provider-cognito-identity@3.576.0: resolution: { - integrity: sha512-R3VA9yJ0BvezvrDxcgPTv9VHbVPbzchLTrX5jLFSVuW/lPPYLUi/Cjtyg9C9Y7qRfoQS4fNMvSRhwO5/TF68gA==, + integrity: sha512-pi5gY+VhuQk8PUskxSonRS7IZk82jbhpfLBFnbFdNDUpBPSrHAfi1AukqAgbbiB/MfJTKaI/rNg3VfwyOzPmJw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-ini": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@aws-sdk/client-cognito-identity": 3.576.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: true - /@aws-sdk/credential-provider-process@3.449.0: + /@aws-sdk/credential-provider-env@3.575.0: resolution: { - integrity: sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==, + integrity: sha512-YTgpq3rvYBXzW6OTDB00cE79evQtss/lz2GlJXgqqVXD0m7i77hGA8zb44VevP/WxtDaiSW7SSjuu8VCBGsg4g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false - /@aws-sdk/credential-provider-process@3.465.0: + /@aws-sdk/credential-provider-http@3.575.0: resolution: { - integrity: sha512-YE6ZrRYwvb8969hWQnr4uvOJ8RU0JrNsk3vWTe/czly37ioZUEhi8jmpQp4f2mX/6U6buoFGWu5Se3VCdw2SFQ==, + integrity: sha512-xQfVmYI+9KqRvhWY8fyElnpcVUBBUgi/Hoji3oU6WLrUjrX98k93He7gKDQSyHf7ykMLUAJYWwsV4AjQ2j6njA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/node-http-handler": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/util-stream": 3.0.1 tslib: 2.6.2 - dev: true - /@aws-sdk/credential-provider-sso@3.450.0: + /@aws-sdk/credential-provider-ini@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0): resolution: { - integrity: sha512-zzr9s5bG38TRn82eJXzG1/AglDihrcINn9TBfwOL8OBl0J6MF7EPAS92VpOuYs09H70MOWSZkmzEftq1urwC0g==, + integrity: sha512-BdM6a/5VUuNge3c6yRuxvO+4srLoSfqHfkQGfUDfhTdTJpljlpfnc9h3z2Ni1+aueOHPZMNFWIktHDcX5wUGBg==, } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/client-sso": 3.450.0 - "@aws-sdk/token-providers": 3.449.0 - "@aws-sdk/types": 3.449.0 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.575.0 + dependencies: + "@aws-sdk/client-sts": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.575.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" - aws-crt - dev: false + dev: true - /@aws-sdk/credential-provider-sso@3.465.0: + /@aws-sdk/credential-provider-ini@3.576.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-tLIP/4JQIJpn8yIg6RZRQ2nmvj5i4wLZvYvY4RtaFv2JrQUkmmTfyOZJuOBrIFRwJjx0fHmFu8DJjcOhMzllIQ==, + integrity: sha512-AwH/+29SbjhxGJVYhFn6+7r0MZ7TjJClySTJzuOoyjJGPWAifTdEuFkyOw8Bs9fEvbJ0ExgFxSaa445fO56kmg==, } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/client-sso": 3.465.0 - "@aws-sdk/token-providers": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.576.0 + dependencies: + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" - aws-crt dev: true - /@aws-sdk/credential-provider-web-identity@3.449.0: + /@aws-sdk/credential-provider-ini@3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==, + integrity: sha512-AwH/+29SbjhxGJVYhFn6+7r0MZ7TjJClySTJzuOoyjJGPWAifTdEuFkyOw8Bs9fEvbJ0ExgFxSaa445fO56kmg==, } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.576.0 + dependencies: + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt - /@aws-sdk/credential-provider-web-identity@3.465.0: + /@aws-sdk/credential-provider-node@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0): resolution: { - integrity: sha512-B4Y75fMTZIniEU0yyqat+9NsQbYlXdqP5Y3bShkaG3pGLOHzF/xMlWuG+D3kkQ806PLYi+BgfVls4BcO+NyVcA==, + integrity: sha512-rEdNpqW2jEc5kwbf/s9XQywMLQlIkMjuCK6mw9sF2OVRGHGVnh+6eh/1JFx8Kj+eU51ctifQ7KaHe8dGco8HYQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-http": 3.575.0 + "@aws-sdk/credential-provider-ini": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0) + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.575.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - "@aws-sdk/client-sts" + - aws-crt dev: true - /@aws-sdk/credential-providers@3.465.0: + /@aws-sdk/credential-provider-node@3.576.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-mtndyew33Fnv30zVCQLBkqvUeFvjAlgAe3yM/10U//dxsOW3pfYWZ6sMzDbuXHLCyROQXJqZfnsQKQs0rOaO0Q==, + integrity: sha512-Ad244g3TJnfY1QFlZ+cywD6kgGD2yj+qg47Ryt50Y42bwmNuuqSpF9n0C71opRR68Rcl7ksOxixCJomWqpcHbA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/client-cognito-identity": 3.465.0 - "@aws-sdk/client-sso": 3.465.0 - "@aws-sdk/client-sts": 3.465.0 - "@aws-sdk/credential-provider-cognito-identity": 3.465.0 - "@aws-sdk/credential-provider-env": 3.465.0 - "@aws-sdk/credential-provider-http": 3.465.0 - "@aws-sdk/credential-provider-ini": 3.465.0 - "@aws-sdk/credential-provider-node": 3.465.0 - "@aws-sdk/credential-provider-process": 3.465.0 - "@aws-sdk/credential-provider-sso": 3.465.0 - "@aws-sdk/credential-provider-web-identity": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-http": 3.575.0 + "@aws-sdk/credential-provider-ini": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - "@aws-sdk/client-sts" - aws-crt dev: true - /@aws-sdk/middleware-bucket-endpoint@3.449.0: - resolution: - { - integrity: sha512-gH+IEdDfhzTmQLdWwfc23A40EhvvAhk8taXUu3DX/lXl+2lBqd4qCoGk8vfUtwh9y1kbRDnhLq04XM2DPvvj2w==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/node-config-provider": 2.1.5 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 - "@smithy/util-config-provider": 2.0.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-expect-continue@3.449.0: - resolution: - { - integrity: sha512-OOR78JoTbCo/42HViuA+F2Uy/cNWo31mN0YZJRbnY5oAMgLRrY7d2+NlJpvHlS4XPdUZ6UHeUecJ9BAWuVuWAQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/middleware-flexible-checksums@3.449.0: + /@aws-sdk/credential-provider-node@3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-pKBgmwqA6jdiWZrYX0uaPOGdRldRiG2ArA7ufS5B7iz9X1JJP8ESZcO2wD+AbrLBtkZtVG31974qpqfNU6n4dQ==, + integrity: sha512-Ad244g3TJnfY1QFlZ+cywD6kgGD2yj+qg47Ryt50Y42bwmNuuqSpF9n0C71opRR68Rcl7ksOxixCJomWqpcHbA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-crypto/crc32": 3.0.0 - "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/types": 3.449.0 - "@smithy/is-array-buffer": 2.0.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 - "@smithy/util-utf8": 2.0.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-http": 3.575.0 + "@aws-sdk/credential-provider-ini": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.576.0(@aws-sdk/client-sso-oidc@3.576.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - "@aws-sdk/client-sts" + - aws-crt - /@aws-sdk/middleware-host-header@3.449.0: + /@aws-sdk/credential-provider-process@3.575.0: resolution: { - integrity: sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==, + integrity: sha512-2/5NJV7MZysKglqJSQ/O8OELNcwLcH3xknabL9NagtzB7RNB2p1AUXR0UlTey9sSDLL4oCmNa/+unYuglW/Ahg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false - /@aws-sdk/middleware-host-header@3.465.0: + /@aws-sdk/credential-provider-sso@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-nnGva8eplwEJqdVzcb+xF2Fwua0PpiwxMEvpnIy73gNbetbJdgFIprryMLYes00xzJEqnew+LWdpcd3YyS34ZA==, + integrity: sha512-NtXA9OPIKsqavs2F7hhLT/t2ZDjwJsvQevj31ov1NpmTNYMc7OWFWDptOG7rppsWMsk5KKmfiL2qViQJnezXNA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/client-sso": 3.575.0 + "@aws-sdk/token-providers": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt dev: true - /@aws-sdk/middleware-location-constraint@3.449.0: + /@aws-sdk/credential-provider-sso@3.576.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-MPCFKOpgke/ZV6WSxZZ/y9X4mn0ywLC2HVcaPJvDSKA0gsRtJLEQjWs2+I2QYTzEM0iwgoW9UOSgbFZYXF0Pow==, + integrity: sha512-1F17issiqf+mSG7KJ+D0SfZRYBZPAmRcA5+VHDUuMLozhh8tyYMe0mwzOt9IKc7ocrJA+2Wp7l7sg3h6aanedQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/types": 2.5.0 + "@aws-sdk/client-sso": 3.576.0 + "@aws-sdk/token-providers": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt + dev: true - /@aws-sdk/middleware-logger@3.449.0: + /@aws-sdk/credential-provider-sso@3.576.0(@aws-sdk/client-sso-oidc@3.576.0): resolution: { - integrity: sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==, + integrity: sha512-1F17issiqf+mSG7KJ+D0SfZRYBZPAmRcA5+VHDUuMLozhh8tyYMe0mwzOt9IKc7ocrJA+2Wp7l7sg3h6aanedQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/types": 2.5.0 + "@aws-sdk/client-sso": 3.576.0 + "@aws-sdk/token-providers": 3.575.0(@aws-sdk/client-sso-oidc@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt - /@aws-sdk/middleware-logger@3.465.0: + /@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.575.0): resolution: { - integrity: sha512-aGMx1aSlzDDgjZ7fSxLhGD5rkyCfHwq04TSB5fQAgDBqUjj4IQXZwmNglX0sLRmArXZtDglUVESOfKvTANJTPg==, + integrity: sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.575.0 dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": 2.5.0 + "@aws-sdk/client-sts": 3.575.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: true - /@aws-sdk/middleware-recursion-detection@3.449.0: + /@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.576.0): resolution: { - integrity: sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==, + integrity: sha512-QcvVH7wpvpFRXGAGgCBfQeiF/ptD0NJ+Hrc8dDYfPGhFeZ0EoVQBYNphLi25xe7JZ+XbaqCKrURHZtr4fAEOJw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.575.0 dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false - /@aws-sdk/middleware-recursion-detection@3.465.0: + /@aws-sdk/credential-providers@3.576.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-ol3dlsTnryBhV5qkUvK5Yg3dRaV1NXIxYJaIkShrl8XAv4wRNcDJDmO5NYq5eVZ3zgV1nv6xIpZ//dDnnf6Z+g==, + integrity: sha512-OoYyhSpxshmijD4aG/wDJIciFTh1DoNKyVyLaMGaJkE9nblArRCO+z0DEg9Yqlo8tLG0HLiTAJbyLxdQryKV5Q==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/client-cognito-identity": 3.576.0 + "@aws-sdk/client-sso": 3.576.0 + "@aws-sdk/client-sts": 3.576.0 + "@aws-sdk/credential-provider-cognito-identity": 3.576.0 + "@aws-sdk/credential-provider-env": 3.575.0 + "@aws-sdk/credential-provider-http": 3.575.0 + "@aws-sdk/credential-provider-ini": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/credential-provider-node": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/credential-provider-process": 3.575.0 + "@aws-sdk/credential-provider-sso": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/credential-provider-web-identity": 3.575.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt dev: true - /@aws-sdk/middleware-sdk-s3@3.449.0: + /@aws-sdk/middleware-bucket-endpoint@3.575.0: resolution: { - integrity: sha512-HbgWdv0txBdV9+9aJSGtGWXnQlVvpIXS6gqmJ5ESHKwZMiRHXswwptccZkvSrLjCQr5uuN37yIz3219MRrvrmw==, + integrity: sha512-ytsp7xcmbpkVk4TLoi91YyXQh/vwSIGdJ2Awo/pi6ac5Fqe6OntPijh5GHSVj5ZrxW4haPWb6HdBmKMo4liGEw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-arn-parser": 3.568.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-config-provider": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-sts@3.449.0: + /@aws-sdk/middleware-expect-continue@3.575.0: resolution: { - integrity: sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==, + integrity: sha512-8Nq4UtEi63MJPoYBACW5YoMKQdbrkLNGIdTyrolNRNwVS+6nQqDMvBplakCzQ1nL1rHOEEsKKc8e2BlG9SkR5A==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/middleware-signing": 3.449.0 - "@aws-sdk/types": 3.449.0 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-sts@3.465.0: - resolution: - { - integrity: sha512-PmTM5ycUe1RLAPrQXLCR8JzKamJuKDB0aIW4rx4/skurzWsEGRI47WHggf9N7sPie41IBGUhRbXcf7sfPjvI3Q==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/middleware-signing": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - dev: true - - /@aws-sdk/middleware-signing@3.449.0: + /@aws-sdk/middleware-flexible-checksums@3.575.0: resolution: { - integrity: sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==, + integrity: sha512-UbyqN39v6s+olyuVKwX778w6J2ZuYpxb1j+KdhFtZwpMSLd/UIQ0+A71U2vB6TrC52OEW0jIXEEBv6PcMBz9nw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/property-provider": 2.0.14 - "@smithy/protocol-http": 3.0.9 - "@smithy/signature-v4": 2.0.5 - "@smithy/types": 2.5.0 - "@smithy/util-middleware": 2.0.6 + "@aws-crypto/crc32": 3.0.0 + "@aws-crypto/crc32c": 3.0.0 + "@aws-sdk/types": 3.575.0 + "@smithy/is-array-buffer": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-signing@3.465.0: + /@aws-sdk/middleware-host-header@3.575.0: resolution: { - integrity: sha512-d90KONWXSC3jA0kqJ6u8ygS4LoMg1TmSM7bPhHyibJVAEhnrlB4Aq1CWljNbbtphGpdKy5/XRM9O0/XCXWKQ4w==, + integrity: sha512-V2WoLBiXNCc4rIWZt6FUcP4TN0Vk02A9PPCBWkTfyOooiqfq+WZmZjRRBpwl1+5UsvARslrKWF0VzheMRXPJLQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/property-provider": 2.0.14 - "@smithy/protocol-http": 3.0.9 - "@smithy/signature-v4": 2.0.5 - "@smithy/types": 2.5.0 - "@smithy/util-middleware": 2.0.6 + "@aws-sdk/types": 3.575.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: true - /@aws-sdk/middleware-ssec@3.449.0: + /@aws-sdk/middleware-location-constraint@3.575.0: resolution: { - integrity: sha512-NY7jt1/ukqXCUqnaK2rlm5yGFyj9sOJBqK6X8Gpu5qQaYAvIP892U1UMj6VTPC7yBLPYhW2/YCfDvxOClbqKEg==, + integrity: sha512-MtQsLsEjSSSfm0OlQqg9PEzS1nxJDdApGoeCYLTbCzIp6hChdLZCCsDXwGg9S++24rjQsUglMhXh4WGXQ9FDnw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/middleware-user-agent@3.449.0: + /@aws-sdk/middleware-logger@3.575.0: resolution: { - integrity: sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==, + integrity: sha512-7DEKx9Z11Maaye7FfhYtC8rjbM/PcFcMO2N4QEAfypcgWCj+w4gseE2OGdfAH9OFDoFc6YvLp53v16vbPjzQSg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false - /@aws-sdk/middleware-user-agent@3.465.0: + /@aws-sdk/middleware-recursion-detection@3.575.0: resolution: { - integrity: sha512-1MvIWMj2nktLOJN8Kh4jiTK28oL85fTeoXHZ+V8xYMzont6C6Y8gQPtg7ka+RotHwqWMrovfnANisnX8EzEP/Q==, + integrity: sha512-ri89ldRFos6KZDGaknWPS2XPO9qr+gZ7+mPaoU8YkSM1W4uKqtnUSONyc+O3CFGJrqReuGHhRq0l2Sld0bjwOw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: true - /@aws-sdk/region-config-resolver@3.433.0: + /@aws-sdk/middleware-sdk-s3@3.575.0: resolution: { - integrity: sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==, + integrity: sha512-8cBG8/tap4F6+UigTpKu8D2bvsLgqRTmn1K86qo3LqRX0Wc5X8TVjdKA2PmG0onOOr7rqTLcP9Q02LCh3usU6Q==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 - "@smithy/util-config-provider": 2.0.0 - "@smithy/util-middleware": 2.0.6 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-arn-parser": 3.568.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/signature-v4": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/util-config-provider": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/region-config-resolver@3.465.0: - resolution: - { - integrity: sha512-h0Phd2Ae873dsPSWuxqxz2yRC5NMeeWxQiJPh4j42HF8g7dZK7tMQPkYznAoA/BzSBsEX87sbr3MmigquSyUTA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 - "@smithy/util-config-provider": 2.0.0 - "@smithy/util-middleware": 2.0.6 - tslib: 2.6.2 - dev: true - - /@aws-sdk/signature-v4-multi-region@3.449.0: + /@aws-sdk/middleware-signing@3.575.0: resolution: { - integrity: sha512-Ne8dF3R2Cj6JJBw0Utm7INtoJ2PdqGNgDpeTOFTnFGSGWnsumACbcVp4ikcZzgABTCQgKx88wPdXUHUZtaBqcg==, + integrity: sha512-frpGG7i3YngWwrYIeDq8/nbat3Gfl803qasaS112rmlPU0ezmYS1SPxpXjpIKxUUYofbzaFtRBAOHU1u7GnWew==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/protocol-http": 3.0.9 - "@smithy/signature-v4": 2.0.5 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/signature-v4": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/token-providers@3.449.0: + /@aws-sdk/middleware-ssec@3.575.0: resolution: { - integrity: sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==, + integrity: sha512-rEFt2w3DdlmPsHRvVXOW6rNDIPE7UaEZ5a4LAkn78XilQYuQdhm5wtw5Ao0pJpDSVYNCZDVZaAvdHKQ1dnfwCA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.449.0 - "@aws-sdk/middleware-logger": 3.449.0 - "@aws-sdk/middleware-recursion-detection": 3.449.0 - "@aws-sdk/middleware-user-agent": 3.449.0 - "@aws-sdk/region-config-resolver": 3.433.0 - "@aws-sdk/types": 3.449.0 - "@aws-sdk/util-endpoints": 3.449.0 - "@aws-sdk/util-user-agent-browser": 3.449.0 - "@aws-sdk/util-user-agent-node": 3.449.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/property-provider": 2.0.14 - "@smithy/protocol-http": 3.0.9 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/types": 3.575.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt dev: false - /@aws-sdk/token-providers@3.465.0: + /@aws-sdk/middleware-user-agent@3.575.0: resolution: { - integrity: sha512-NaZbsyLs3whzRHGV27hrRwEdXB/tEK6tqn/aCNBy862LhVzocY1A+eYLKrnrvpraOOd2vyAuOtvvB3RMIdiL6g==, + integrity: sha512-fWlr4RfrUNS2R3PgP+WsoMYORAgv/47Lp0J0fb3dXO1YvdczNWddRbFSUX2MQxM/y9XFfQPLpLgzluhoL3Cjeg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.465.0 - "@aws-sdk/middleware-logger": 3.465.0 - "@aws-sdk/middleware-recursion-detection": 3.465.0 - "@aws-sdk/middleware-user-agent": 3.465.0 - "@aws-sdk/region-config-resolver": 3.465.0 - "@aws-sdk/types": 3.465.0 - "@aws-sdk/util-endpoints": 3.465.0 - "@aws-sdk/util-user-agent-browser": 3.465.0 - "@aws-sdk/util-user-agent-node": 3.465.0 - "@smithy/config-resolver": 2.0.18 - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/hash-node": 2.0.15 - "@smithy/invalid-dependency": 2.0.13 - "@smithy/middleware-content-length": 2.0.15 - "@smithy/middleware-endpoint": 2.2.0 - "@smithy/middleware-retry": 2.0.20 - "@smithy/middleware-serde": 2.0.13 - "@smithy/middleware-stack": 2.0.7 - "@smithy/node-config-provider": 2.1.5 - "@smithy/node-http-handler": 2.1.9 - "@smithy/property-provider": 2.0.14 - "@smithy/protocol-http": 3.0.9 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-base64": 2.0.1 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.1.0 - "@smithy/util-defaults-mode-browser": 2.0.19 - "@smithy/util-defaults-mode-node": 2.0.25 - "@smithy/util-endpoints": 1.0.4 - "@smithy/util-retry": 2.0.6 - "@smithy/util-utf8": 2.0.2 + "@aws-sdk/types": 3.575.0 + "@aws-sdk/util-endpoints": 3.575.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - dev: true - /@aws-sdk/types@3.398.0: + /@aws-sdk/region-config-resolver@3.575.0: resolution: { - integrity: sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==, + integrity: sha512-sBJKwTWKCWu9y8FzXIijYGwkKr3tDkPXM7BylToe6W+tGkp4OirV4iXrWA9zReNwTTepoxHufofqjGK9BtcI8g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.2.2 + "@aws-sdk/types": 3.575.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-config-provider": 3.0.0 + "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 - /@aws-sdk/types@3.449.0: + /@aws-sdk/signature-v4-multi-region@3.575.0: resolution: { - integrity: sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==, + integrity: sha512-QMwuLuNwnEQ51RCZX8H/lXnOJgBcJJOCgClB9usW/XujNJVq8GnpZ5E7TsQLN88G6fifmcjQWonLKummuh/zVA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@aws-sdk/middleware-sdk-s3": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/signature-v4": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@aws-sdk/types@3.451.0: + /@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==, + integrity: sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sso-oidc": 3.575.0 dependencies: - "@smithy/types": 2.5.0 + "@aws-sdk/client-sso-oidc": 3.575.0 + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 + dev: true - /@aws-sdk/types@3.465.0: + /@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.576.0): resolution: { - integrity: sha512-Clqu2eD50OOzwSftGpzJrIOGev/7VJhJpc02SeS4cqFgI9EVd+rnFKS/Ux0kcwjLQBMiPcCLtql3KAHApFHAIA==, + integrity: sha512-EPNDPQoQkjKqn4D2t70qVzbfdtlaAy9KBdG58qD1yNWVxq8Rh/lXdwmB+aE2PSahtyfVikZdCRoZiFzxDh5IUA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sso-oidc": 3.575.0 dependencies: - "@smithy/types": 2.5.0 + "@aws-sdk/client-sso-oidc": 3.576.0(@aws-sdk/client-sts@3.576.0) + "@aws-sdk/types": 3.575.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: true - /@aws-sdk/util-arn-parser@3.310.0: + /@aws-sdk/types@3.575.0: resolution: { - integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==, + integrity: sha512-XrnolQGs0wXxdgNudirR14OgNOarH7WUif38+2Pd4onZH+L7XoILem0EgA1tRpgFpw2pFHlZCNaAHDNSBEal7g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: false - /@aws-sdk/util-endpoints@3.449.0: + /@aws-sdk/util-arn-parser@3.568.0: resolution: { - integrity: sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==, + integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/util-endpoints": 1.0.4 tslib: 2.6.2 dev: false - /@aws-sdk/util-endpoints@3.465.0: + /@aws-sdk/util-endpoints@3.575.0: resolution: { - integrity: sha512-lDpBN1faVw8Udg5hIo+LJaNfllbBF86PCisv628vfcggO8/EArL/v2Eos0KeqVT8yaINXCRSagwfo5TNTuW0KQ==, + integrity: sha512-wC5x+V6w3kRlR6X6XVINsAPDYG+Tzs3Wthlw+YLtjuPODUNZIQAqsABHahxnekFyAvse+1929Hwo+CaL+BHZGA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/util-endpoints": 1.0.4 + "@aws-sdk/types": 3.575.0 + "@smithy/types": 3.0.0 + "@smithy/util-endpoints": 2.0.0 tslib: 2.6.2 - dev: true /@aws-sdk/util-locate-window@3.310.0: resolution: @@ -1398,65 +1369,33 @@ packages: dependencies: tslib: 2.6.2 - /@aws-sdk/util-user-agent-browser@3.449.0: - resolution: - { - integrity: sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==, - } - dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/types": 2.5.0 - bowser: 2.11.0 - tslib: 2.6.2 - dev: false - - /@aws-sdk/util-user-agent-browser@3.465.0: + /@aws-sdk/util-user-agent-browser@3.575.0: resolution: { - integrity: sha512-RM+LjkIsmUCBJ4yQeBnkJWJTjPOPqcNaKv8bpZxatIHdvzGhXLnWLNi3qHlBsJB2mKtKRet6nAUmKmzZR1sDzA==, + integrity: sha512-iADonXyaXgwvC4T0qRuDWCdKInz82GX2cyezq/oqVlL8bPY7HD8jwZZruuJdq5tkaJi1EhbO4+f1ksZqOiZKvQ==, } dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/types": 3.0.0 bowser: 2.11.0 tslib: 2.6.2 - dev: true - - /@aws-sdk/util-user-agent-node@3.449.0: - resolution: - { - integrity: sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - dependencies: - "@aws-sdk/types": 3.449.0 - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - dev: false - /@aws-sdk/util-user-agent-node@3.465.0: + /@aws-sdk/util-user-agent-node@3.575.0: resolution: { - integrity: sha512-XsHbq7gLCiGdy6FQ7/5nGslK0ij3Iuh051djuIICvNurlds5cqKLiBe63gX3IUUwxJcrKh4xBGviQJ52KdVSeg==, + integrity: sha512-kwzvBfA0LoILDOFS6BV8uOkksBHrYulP6kNXegB5eZnDSNia5DbBsXqxQ/HknNF5a429SWQw2aaQJEgQvZB1VA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true dependencies: - "@aws-sdk/types": 3.465.0 - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 + "@aws-sdk/types": 3.575.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - dev: true /@aws-sdk/util-utf8-browser@3.259.0: resolution: @@ -1466,13 +1405,14 @@ packages: dependencies: tslib: 2.6.2 - /@aws-sdk/xml-builder@3.310.0: + /@aws-sdk/xml-builder@3.575.0: resolution: { - integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==, + integrity: sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false @@ -1486,7 +1426,7 @@ packages: "@jridgewell/trace-mapping": 0.3.9 dev: true - /@elsa-data/aws-infrastructure@1.5.1(aws-cdk-lib@2.113.0)(constructs@10.3.0): + /@elsa-data/aws-infrastructure@1.5.1(aws-cdk-lib@2.141.0)(constructs@10.3.0): resolution: { integrity: sha512-foP1LgYFWP2sR9R4FrpQyE/I+Vwh4NCMIt/8MwliNMwtAYYzCSHZduwyo9EekcHvCotfSC/hYexTL8uer+P37g==, @@ -1495,7 +1435,7 @@ packages: aws-cdk-lib: ^2.108.1 constructs: ^10.3.0 dependencies: - aws-cdk-lib: 2.113.0(constructs@10.3.0) + aws-cdk-lib: 2.141.0(constructs@10.3.0) constructs: 10.3.0 dev: false @@ -1788,21 +1728,21 @@ packages: "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@jsii/check-node@1.92.0: + /@jsii/check-node@1.98.0: resolution: { - integrity: sha512-MQnFvDIn/VOz4FzchobZ4dfrl6qfuZIlYviNbGXhPMSeJ92BVB2F+NEyem9Sg/Csy2ehhtO1FGaUj4mO9/7Ntg==, + integrity: sha512-hI53TMW/fylHyY3CrJvqWvfSPJvBL82GSAB1m2CKNC0yHb0pZHCdBZnLrrr4rgTCQx8kIJjcUc0rQ/Ba3w+GaA==, } engines: { node: ">= 14.17.0" } dependencies: chalk: 4.1.2 - semver: 7.5.4 + semver: 7.6.2 dev: true - /@jsii/spec@1.92.0: + /@jsii/spec@1.98.0: resolution: { - integrity: sha512-6jbwQ2uCVOUq6eddKQG/cPzuUsdJwaszQstTZtruhhjWNuoC4CjT5eHlzjeBqtxQZpGiKkRRwPHb1bCEGgffxA==, + integrity: sha512-5FCJedjFrxKt0wrcSnXetHHTXQV6OQM2NlE/WJNvjwqlk+RYfw+BwZOBYHsoaQx1Qh0pTwN7ZM9WmEusN3GdNw==, } engines: { node: ">= 14.17.0" } dependencies: @@ -1839,600 +1779,569 @@ packages: fastq: 1.15.0 dev: true - /@smithy/abort-controller@2.0.13: + /@smithy/abort-controller@3.0.0: resolution: { - integrity: sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q==, + integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/chunked-blob-reader-native@2.0.1: + /@smithy/chunked-blob-reader-native@3.0.0: resolution: { - integrity: sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==, + integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==, } dependencies: - "@smithy/util-base64": 2.0.1 + "@smithy/util-base64": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/chunked-blob-reader@2.0.0: + /@smithy/chunked-blob-reader@3.0.0: resolution: { - integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==, + integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==, } dependencies: tslib: 2.6.2 dev: false - /@smithy/config-resolver@2.0.18: + /@smithy/config-resolver@3.0.0: resolution: { - integrity: sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g==, + integrity: sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 - "@smithy/util-config-provider": 2.0.0 - "@smithy/util-middleware": 2.0.6 + "@smithy/node-config-provider": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-config-provider": 3.0.0 + "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 - /@smithy/credential-provider-imds@2.1.1: + /@smithy/core@2.0.1: resolution: { - integrity: sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw==, + integrity: sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/property-provider": 2.0.14 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-retry": 3.0.1 + "@smithy/middleware-serde": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 - /@smithy/eventstream-codec@2.0.13: + /@smithy/credential-provider-imds@3.0.0: resolution: { - integrity: sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g==, + integrity: sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==, } + engines: { node: ">=16.0.0" } dependencies: - "@aws-crypto/crc32": 3.0.0 - "@smithy/types": 2.5.0 - "@smithy/util-hex-encoding": 2.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 tslib: 2.6.2 - dev: false - /@smithy/eventstream-codec@2.0.5: + /@smithy/eventstream-codec@3.0.0: resolution: { - integrity: sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==, + integrity: sha512-PUtyEA0Oik50SaEFCZ0WPVtF9tz/teze2fDptW6WRXl+RrEenH8UbEjudOz8iakiMl3lE3lCVqYf2Y+znL8QFQ==, } dependencies: "@aws-crypto/crc32": 3.0.0 - "@smithy/types": 2.2.2 - "@smithy/util-hex-encoding": 2.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-hex-encoding": 3.0.0 tslib: 2.6.2 + dev: false - /@smithy/eventstream-serde-browser@2.0.13: + /@smithy/eventstream-serde-browser@3.0.0: resolution: { - integrity: sha512-OJ/2g/VxkzA+mYZxV102oX3CsiE+igTSmqq/ir3oEVG2kSIdRC00ryttj/lmL14W06ExNi0ysmfLxQkL8XrAZQ==, + integrity: sha512-NB7AFiPN4NxP/YCAnrvYR18z2/ZsiHiF7VtG30gshO9GbFrIb1rC8ep4NGpJSWrz6P64uhPXeo4M0UsCLnZKqw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/eventstream-serde-universal": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/eventstream-serde-universal": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-config-resolver@2.0.13: + /@smithy/eventstream-serde-config-resolver@3.0.0: resolution: { - integrity: sha512-2BI1CbnYuEvAYoWSeWJtPNygbIKiWeSLxCmDLnyM6wQV32Of7VptiQlaFXPxXp4zqn/rs3ocZ/T29rxE4s4Gsg==, + integrity: sha512-RUQG3vQ3LX7peqqHAbmayhgrF5aTilPnazinaSGF1P0+tgM3vvIRWPHmlLIz2qFqB9LqFIxditxc8O2Z6psrRw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-node@2.0.13: + /@smithy/eventstream-serde-node@3.0.0: resolution: { - integrity: sha512-7NbFwPafb924elFxCBDvm48jy/DeSrpFbFQN0uN2ThuY5HrEeubikS0t7WMva4Z4EnRoivpbuT0scb9vUIJKoA==, + integrity: sha512-baRPdMBDMBExZXIUAoPGm/hntixjt/VFpU6+VmCyiYJYzRHRxoaI1MN+5XE+hIS8AJ2GCHLMFEIOLzq9xx1EgQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/eventstream-serde-universal": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/eventstream-serde-universal": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-universal@2.0.13: + /@smithy/eventstream-serde-universal@3.0.0: resolution: { - integrity: sha512-j0yFd5UfftM+ia9dxLRbheJDCkCZBHpcEzCsPO8BxVOTbdcX/auVJCv6ov/yvpCKsf4Hv3mOqi0Is1YogM2g3Q==, + integrity: sha512-HNFfShmotWGeAoW4ujP8meV9BZavcpmerDbPIjkJbxKbN8RsUcpRQ/2OyIxWNxXNH2GWCAxuSB7ynmIGJlQ3Dw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/eventstream-codec": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/eventstream-codec": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/fetch-http-handler@2.2.6: + /@smithy/fetch-http-handler@3.0.1: resolution: { - integrity: sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg==, + integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==, } dependencies: - "@smithy/protocol-http": 3.0.9 - "@smithy/querystring-builder": 2.0.13 - "@smithy/types": 2.5.0 - "@smithy/util-base64": 2.0.1 + "@smithy/protocol-http": 4.0.0 + "@smithy/querystring-builder": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-base64": 3.0.0 tslib: 2.6.2 - /@smithy/hash-blob-browser@2.0.14: + /@smithy/hash-blob-browser@3.0.0: resolution: { - integrity: sha512-yWdghyPJIEqLYsaE7YVgd3YhM7jN4Pv6eJQvTomnMsz5K2qRBlpjUx3T9fKlElp1qdeQ7DNc3sAat4i9CUBO7Q==, + integrity: sha512-/Wbpdg+bwJvW7lxR/zpWAc1/x/YkcqguuF2bAzkJrvXriZu1vm8r+PUdE4syiVwQg7PPR2dXpi3CLBb9qRDaVQ==, } dependencies: - "@smithy/chunked-blob-reader": 2.0.0 - "@smithy/chunked-blob-reader-native": 2.0.1 - "@smithy/types": 2.5.0 + "@smithy/chunked-blob-reader": 3.0.0 + "@smithy/chunked-blob-reader-native": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/hash-node@2.0.15: + /@smithy/hash-node@3.0.0: resolution: { - integrity: sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ==, + integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 - "@smithy/util-buffer-from": 2.0.0 - "@smithy/util-utf8": 2.0.2 + "@smithy/types": 3.0.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 - /@smithy/hash-stream-node@2.0.15: + /@smithy/hash-stream-node@3.0.0: resolution: { - integrity: sha512-ZZ6kC/pHt5Dc2goXIIyC8uA7A4GUMSzdCynAabnZ3CSSaV6ctP8mlvVkqjPph0O3XzHlx/80gdLrNqi1GDPUsA==, + integrity: sha512-J0i7de+EgXDEGITD4fxzmMX8CyCNETTIRXlxjMiNUvvu76Xn3GJ31wQR85ynlPk2wI1lqoknAFJaD1fiNDlbIA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 - "@smithy/util-utf8": 2.0.2 + "@smithy/types": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/invalid-dependency@2.0.13: + /@smithy/invalid-dependency@3.0.0: resolution: { - integrity: sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw==, + integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==, } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/is-array-buffer@2.0.0: + /@smithy/is-array-buffer@3.0.0: resolution: { - integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==, + integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: tslib: 2.6.2 - /@smithy/md5-js@2.0.15: + /@smithy/md5-js@3.0.0: resolution: { - integrity: sha512-pAZaokib56XvhU0t/R9vAcr3L3bMhIakhF25X7EMSQ7LAURiLfce/tgON8I3x/dIbnZUyeRi8f2cx2azu6ATew==, + integrity: sha512-Tm0vrrVzjlD+6RCQTx7D3Ls58S3FUH1ZCtU1MIh/qQmaOo1H9lMN2as6CikcEwgattnA9SURSdoJJ27xMcEfMA==, } dependencies: - "@smithy/types": 2.5.0 - "@smithy/util-utf8": 2.0.2 + "@smithy/types": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 dev: false - /@smithy/middleware-content-length@2.0.15: + /@smithy/middleware-content-length@3.0.0: resolution: { - integrity: sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q==, + integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/protocol-http": 3.0.9 - "@smithy/types": 2.5.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/middleware-endpoint@2.2.0: + /@smithy/middleware-endpoint@3.0.0: resolution: { - integrity: sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw==, + integrity: sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/middleware-serde": 2.0.13 - "@smithy/node-config-provider": 2.1.5 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 - "@smithy/url-parser": 2.0.13 - "@smithy/util-middleware": 2.0.6 + "@smithy/middleware-serde": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/url-parser": 3.0.0 + "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 - /@smithy/middleware-retry@2.0.20: + /@smithy/middleware-retry@3.0.1: resolution: { - integrity: sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg==, + integrity: sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/protocol-http": 3.0.9 - "@smithy/service-error-classification": 2.0.6 - "@smithy/types": 2.5.0 - "@smithy/util-middleware": 2.0.6 - "@smithy/util-retry": 2.0.6 + "@smithy/node-config-provider": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/service-error-classification": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-retry": 3.0.0 tslib: 2.6.2 - uuid: 8.3.2 + uuid: 9.0.1 - /@smithy/middleware-serde@2.0.13: + /@smithy/middleware-serde@3.0.0: resolution: { - integrity: sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg==, + integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/middleware-stack@2.0.7: + /@smithy/middleware-stack@3.0.0: resolution: { - integrity: sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw==, + integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/node-config-provider@2.1.5: + /@smithy/node-config-provider@3.0.0: resolution: { - integrity: sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw==, + integrity: sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/property-provider": 2.0.14 - "@smithy/shared-ini-file-loader": 2.2.4 - "@smithy/types": 2.5.0 + "@smithy/property-provider": 3.0.0 + "@smithy/shared-ini-file-loader": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/node-http-handler@2.1.9: + /@smithy/node-http-handler@3.0.0: resolution: { - integrity: sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA==, + integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/abort-controller": 2.0.13 - "@smithy/protocol-http": 3.0.9 - "@smithy/querystring-builder": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/abort-controller": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/querystring-builder": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/property-provider@2.0.14: + /@smithy/property-provider@3.0.0: resolution: { - integrity: sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A==, + integrity: sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/protocol-http@3.0.9: + /@smithy/protocol-http@4.0.0: resolution: { - integrity: sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg==, + integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/querystring-builder@2.0.13: + /@smithy/querystring-builder@3.0.0: resolution: { - integrity: sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw==, + integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 - "@smithy/util-uri-escape": 2.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-uri-escape": 3.0.0 tslib: 2.6.2 - /@smithy/querystring-parser@2.0.13: + /@smithy/querystring-parser@3.0.0: resolution: { - integrity: sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA==, + integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/service-error-classification@2.0.6: + /@smithy/service-error-classification@3.0.0: resolution: { - integrity: sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg==, + integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 - /@smithy/shared-ini-file-loader@2.2.4: + /@smithy/shared-ini-file-loader@3.0.0: resolution: { - integrity: sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw==, + integrity: sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/signature-v4@2.0.5: + /@smithy/signature-v4@3.0.0: resolution: { - integrity: sha512-ABIzXmUDXK4n2c9cXjQLELgH2RdtABpYKT+U131e2I6RbCypFZmxIHmIBufJzU2kdMCQ3+thBGDWorAITFW04A==, + integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/eventstream-codec": 2.0.5 - "@smithy/is-array-buffer": 2.0.0 - "@smithy/types": 2.2.2 - "@smithy/util-hex-encoding": 2.0.0 - "@smithy/util-middleware": 2.0.0 - "@smithy/util-uri-escape": 2.0.0 - "@smithy/util-utf8": 2.0.0 + "@smithy/is-array-buffer": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-hex-encoding": 3.0.0 + "@smithy/util-middleware": 3.0.0 + "@smithy/util-uri-escape": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 - /@smithy/smithy-client@2.1.15: + /@smithy/smithy-client@3.0.1: resolution: { - integrity: sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ==, + integrity: sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/middleware-stack": 2.0.7 - "@smithy/types": 2.5.0 - "@smithy/util-stream": 2.0.20 + "@smithy/middleware-endpoint": 3.0.0 + "@smithy/middleware-stack": 3.0.0 + "@smithy/protocol-http": 4.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-stream": 3.0.1 tslib: 2.6.2 - /@smithy/types@2.2.2: + /@smithy/types@3.0.0: resolution: { - integrity: sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw==, + integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: tslib: 2.6.2 - /@smithy/types@2.5.0: + /@smithy/url-parser@3.0.0: resolution: { - integrity: sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA==, + integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==, } - engines: { node: ">=14.0.0" } dependencies: + "@smithy/querystring-parser": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/url-parser@2.0.13: + /@smithy/util-base64@3.0.0: resolution: { - integrity: sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA==, + integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==, } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/querystring-parser": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 - /@smithy/util-base64@2.0.0: + /@smithy/util-body-length-browser@3.0.0: resolution: { - integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==, + integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==, } - engines: { node: ">=14.0.0" } dependencies: - "@smithy/util-buffer-from": 2.0.0 tslib: 2.6.2 - dev: false - /@smithy/util-base64@2.0.1: + /@smithy/util-body-length-node@3.0.0: resolution: { - integrity: sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==, + integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/util-buffer-from": 2.0.0 tslib: 2.6.2 - /@smithy/util-body-length-browser@2.0.0: + /@smithy/util-buffer-from@3.0.0: resolution: { - integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, + integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==, } + engines: { node: ">=16.0.0" } dependencies: + "@smithy/is-array-buffer": 3.0.0 tslib: 2.6.2 - /@smithy/util-body-length-node@2.1.0: + /@smithy/util-config-provider@3.0.0: resolution: { - integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==, + integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==, } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.2 - - /@smithy/util-buffer-from@2.0.0: - resolution: - { - integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==, - } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/is-array-buffer": 2.0.0 tslib: 2.6.2 - /@smithy/util-config-provider@2.0.0: + /@smithy/util-defaults-mode-browser@3.0.1: resolution: { - integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.2 - - /@smithy/util-defaults-mode-browser@2.0.19: - resolution: - { - integrity: sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw==, + integrity: sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/property-provider": 2.0.14 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 + "@smithy/property-provider": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 bowser: 2.11.0 tslib: 2.6.2 - /@smithy/util-defaults-mode-node@2.0.25: + /@smithy/util-defaults-mode-node@3.0.1: resolution: { - integrity: sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA==, + integrity: sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/config-resolver": 2.0.18 - "@smithy/credential-provider-imds": 2.1.1 - "@smithy/node-config-provider": 2.1.5 - "@smithy/property-provider": 2.0.14 - "@smithy/smithy-client": 2.1.15 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - - /@smithy/util-endpoints@1.0.4: - resolution: - { - integrity: sha512-FPry8j1xye5yzrdnf4xKUXVnkQErxdN7bUIaqC0OFoGsv2NfD9b2UUMuZSSt+pr9a8XWAqj0HoyVNUfPiZ/PvQ==, - } - engines: { node: ">= 14.0.0" } - dependencies: - "@smithy/node-config-provider": 2.1.5 - "@smithy/types": 2.5.0 - tslib: 2.6.2 - - /@smithy/util-hex-encoding@2.0.0: - resolution: - { - integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==, - } - engines: { node: ">=14.0.0" } - dependencies: + "@smithy/config-resolver": 3.0.0 + "@smithy/credential-provider-imds": 3.0.0 + "@smithy/node-config-provider": 3.0.0 + "@smithy/property-provider": 3.0.0 + "@smithy/smithy-client": 3.0.1 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/util-middleware@2.0.0: + /@smithy/util-endpoints@2.0.0: resolution: { - integrity: sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==, + integrity: sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: + "@smithy/node-config-provider": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/util-middleware@2.0.6: + /@smithy/util-hex-encoding@3.0.0: resolution: { - integrity: sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA==, + integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/types": 2.5.0 tslib: 2.6.2 - /@smithy/util-retry@2.0.6: + /@smithy/util-middleware@3.0.0: resolution: { - integrity: sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw==, + integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==, } - engines: { node: ">= 14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/service-error-classification": 2.0.6 - "@smithy/types": 2.5.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/util-stream@2.0.20: + /@smithy/util-retry@3.0.0: resolution: { - integrity: sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg==, + integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/fetch-http-handler": 2.2.6 - "@smithy/node-http-handler": 2.1.9 - "@smithy/types": 2.5.0 - "@smithy/util-base64": 2.0.1 - "@smithy/util-buffer-from": 2.0.0 - "@smithy/util-hex-encoding": 2.0.0 - "@smithy/util-utf8": 2.0.2 + "@smithy/service-error-classification": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 - /@smithy/util-uri-escape@2.0.0: + /@smithy/util-stream@3.0.1: resolution: { - integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==, + integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: + "@smithy/fetch-http-handler": 3.0.1 + "@smithy/node-http-handler": 3.0.0 + "@smithy/types": 3.0.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-hex-encoding": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 - /@smithy/util-utf8@2.0.0: + /@smithy/util-uri-escape@3.0.0: resolution: { - integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==, + integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/util-buffer-from": 2.0.0 tslib: 2.6.2 - /@smithy/util-utf8@2.0.2: + /@smithy/util-utf8@3.0.0: resolution: { - integrity: sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==, + integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-buffer-from": 3.0.0 tslib: 2.6.2 - /@smithy/util-waiter@2.0.13: + /@smithy/util-waiter@3.0.0: resolution: { - integrity: sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg==, + integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/abort-controller": 2.0.13 - "@smithy/types": 2.5.0 + "@smithy/abort-controller": 3.0.0 + "@smithy/types": 3.0.0 tslib: 2.6.2 dev: false @@ -2549,18 +2458,56 @@ packages: } dev: true - /aws-cdk-lib@2.113.0(constructs@10.3.0): + /array-buffer-byte-length@1.0.1: + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /available-typed-arrays@1.0.7: + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /aws-cdk-lib@2.141.0(constructs@10.3.0): resolution: { - integrity: sha512-wZYooUd8nb3ADFtg1dSnsRt1MJmeqEK8cKOnPfCGCfm852YnVdb0qIEclURCQ4ygDJSuqiw9CE+xWVeTQTG6Dw==, + integrity: sha512-xda56Lfwpdqg9MssnFdXrAKTmeeNjfrfFCaWwqGqToG6cfGY2W+6wyyoObX60/MeZGhhs3Lhdb/K94ulLJ4X/A==, } engines: { node: ">= 14.15.0" } peerDependencies: constructs: ^10.0.0 dependencies: - "@aws-cdk/asset-awscli-v1": 2.2.201 + "@aws-cdk/asset-awscli-v1": 2.2.202 "@aws-cdk/asset-kubectl-v20": 2.1.2 - "@aws-cdk/asset-node-proxy-agent-v6": 2.0.1 + "@aws-cdk/asset-node-proxy-agent-v6": 2.0.3 constructs: 10.3.0 bundledDependencies: - "@balena/dockerignore" @@ -2573,11 +2520,12 @@ packages: - semver - table - yaml + - mime-types - /aws-cdk@2.113.0: + /aws-cdk@2.141.0: resolution: { - integrity: sha512-XEM8DSZpcMO1yXqozub8LiXK+3ihEqoWdeFDaIoMq0YmLspo9iAE3FPcKcIfv+ihRIEyvJLekGlxJPkx3+NOGA==, + integrity: sha512-RM9uDiETBEKCHemItaRGVjOLwoZ5iqXnejpyXY7+YF75c2c0Ui7HSZI8QD0stDg3S/2UbLcKv2RA9dBsjrWUGA==, } engines: { node: ">= 14.15.0" } hasBin: true @@ -2627,6 +2575,20 @@ packages: fill-range: 7.0.1 dev: true + /call-bind@1.0.7: + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + /camelcase@6.3.0: resolution: { @@ -2685,10 +2647,10 @@ packages: engines: { node: ">=0.8" } dev: true - /codemaker@1.92.0: + /codemaker@1.98.0: resolution: { - integrity: sha512-h9LW/YFYMAXHvv4aHNxVfawza/8GHL0Nw0zFpqdURXsjRlsCtG+SzqRvYLOJoFqxzZ9+rkXJf8fODImC6WHa8g==, + integrity: sha512-UAeICTmY7lJXf4OPnDTwKWg/DU87u67nyxuTjMON+vO8yo8C+EcPWnmmOmWtZm3wWLPsPuxyYIQxIIi/4OZ9TA==, } engines: { node: ">= 14.17.0" } dependencies: @@ -2727,6 +2689,19 @@ packages: string.prototype.repeat: 0.2.0 dev: true + /commonmark@0.31.0: + resolution: + { + integrity: sha512-nuDsQ34gjmgAqjyIz6mbRWBW/XPE9wsBempAMBk2V/AA88ekztjTM46oi07J6c6Y/2Y8TdYCZi9L0pIBt/oMZw==, + } + hasBin: true + dependencies: + entities: 3.0.1 + mdurl: 1.0.1 + minimist: 1.2.8 + string.prototype.repeat: 1.0.0 + dev: true + /concat-map@0.0.1: resolution: { @@ -2748,6 +2723,42 @@ packages: } dev: true + /data-view-buffer@1.0.1: + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /date-format@4.0.14: resolution: { @@ -2779,6 +2790,30 @@ packages: engines: { node: ">=10" } dev: true + /define-data-property@1.1.4: + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + /detect-indent@5.0.0: resolution: { @@ -2810,9 +2845,9 @@ packages: } hasBin: true dependencies: - semver: 7.5.4 + semver: 7.6.2 shelljs: 0.8.5 - typescript: 5.4.0-dev.20231203 + typescript: 5.5.0-dev.20240514 dev: true /emoji-regex@8.0.0: @@ -2829,6 +2864,121 @@ packages: } dev: true + /entities@3.0.1: + resolution: + { + integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==, + } + engines: { node: ">=0.12" } + dev: true + + /es-abstract@1.23.3: + resolution: + { + integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==, + } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } + dev: true + + /es-object-atoms@1.0.0: + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + /esbuild@0.19.2: resolution: { @@ -2941,6 +3091,15 @@ packages: } dev: true + /for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + dependencies: + is-callable: 1.2.7 + dev: true + /fs-extra@10.1.0: resolution: { @@ -2990,6 +3149,33 @@ packages: } dev: true + /function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + dev: true + + /function.prototype.name@1.1.6: + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + dev: true + /get-caller-file@2.0.5: resolution: { @@ -2998,6 +3184,32 @@ packages: engines: { node: 6.* || 8.* || >= 10.* } dev: true + /get-intrinsic@1.2.4: + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-symbol-description@1.0.2: + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + /glob-parent@5.1.2: resolution: { @@ -3035,6 +3247,26 @@ packages: path-is-absolute: 1.0.1 dev: true + /globalthis@1.0.4: + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: ">= 0.4" } + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + dev: true + + /gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.4 + dev: true + /graceful-fs@4.2.11: resolution: { @@ -3042,202 +3274,386 @@ packages: } dev: true - /has-flag@4.0.0: + /has-bigints@1.0.2: resolution: { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, } - engines: { node: ">=8" } dev: true - /has@1.0.3: + /has-flag@4.0.0: resolution: { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, } - engines: { node: ">= 0.4.0" } - dependencies: - function-bind: 1.1.1 + engines: { node: ">=8" } dev: true - /inflight@1.0.6: + /has-property-descriptors@1.0.2: resolution: { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, } dependencies: - once: 1.4.0 - wrappy: 1.0.2 + es-define-property: 1.0.0 dev: true - /inherits@2.0.4: + /has-proto@1.0.3: resolution: { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, } + engines: { node: ">= 0.4" } dev: true - /interpret@1.4.0: + /has-symbols@1.0.3: resolution: { - integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, } - engines: { node: ">= 0.10" } + engines: { node: ">= 0.4" } dev: true - /is-core-module@2.13.0: + /has-tostringtag@1.0.2: resolution: { - integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==, + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, } + engines: { node: ">= 0.4" } dependencies: - has: 1.0.3 + has-symbols: 1.0.3 dev: true - /is-extglob@2.1.1: + /has@1.0.3: resolution: { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, } - engines: { node: ">=0.10.0" } + engines: { node: ">= 0.4.0" } + dependencies: + function-bind: 1.1.1 dev: true - /is-fullwidth-code-point@3.0.0: + /hasown@2.0.2: resolution: { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, } - engines: { node: ">=8" } + engines: { node: ">= 0.4" } + dependencies: + function-bind: 1.1.2 dev: true - /is-glob@4.0.3: + /inflight@1.0.6: resolution: { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, } - engines: { node: ">=0.10.0" } dependencies: - is-extglob: 2.1.1 + once: 1.4.0 + wrappy: 1.0.2 dev: true - /is-number@7.0.0: + /inherits@2.0.4: resolution: { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, } - engines: { node: ">=0.12.0" } dev: true - /jsii-pacmak@1.92.0: + /internal-slot@1.0.7: resolution: { - integrity: sha512-LIwXYTYjX5APnb6qzu5TDMEkSJXq5ntE71fT5Lpj3KMpOGGOrYlCAuP1lxpf1oWfIZeuyC4orRafuE7AECEa/A==, + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, } - engines: { node: ">= 14.17.0" } - hasBin: true + engines: { node: ">= 0.4" } dependencies: - "@jsii/check-node": 1.92.0 - "@jsii/spec": 1.92.0 - clone: 2.1.2 - codemaker: 1.92.0 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /interpret@1.4.0: + resolution: + { + integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, + } + engines: { node: ">= 0.10" } + dev: true + + /is-array-buffer@3.0.4: + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-bigint@1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-core-module@2.13.0: + resolution: + { + integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==, + } + dependencies: + has: 1.0.3 + dev: true + + /is-data-view@1.0.1: + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: ">= 0.4" } + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + dev: true + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero@2.0.3: + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-number-object@1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + dev: true + + /is-regex@1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + dev: true + + /is-string@1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: ">= 0.4" } + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-weakref@1.0.2: + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } + dependencies: + call-bind: 1.0.7 + dev: true + + /isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + dev: true + + /jsii-pacmak@1.98.0(jsii-rosetta@5.4.17): + resolution: + { + integrity: sha512-p2H8IbiI3RNIUg+oRcJ9Xu1I7CgJUxCMpUl5IPzWAjz1qzhIKOzlkaAMGJfJZJQtib5kWI2OmZ6xBZScWg16+Q==, + } + engines: { node: ">= 14.17.0" } + hasBin: true + peerDependencies: + jsii-rosetta: ^1.98.0 || ~5.2.0 || ~5.3.0 || ~5.4.0 + dependencies: + "@jsii/check-node": 1.98.0 + "@jsii/spec": 1.98.0 + clone: 2.1.2 + codemaker: 1.98.0 commonmark: 0.30.0 escape-string-regexp: 4.0.0 fs-extra: 10.1.0 - jsii-reflect: 1.92.0 - jsii-rosetta: 1.92.0 + jsii-reflect: 1.98.0 + jsii-rosetta: 5.4.17 semver: 7.5.4 spdx-license-list: 6.8.0 xmlbuilder: 15.1.1 yargs: 16.2.0 - transitivePeerDependencies: - - supports-color dev: true - /jsii-reflect@1.92.0: + /jsii-reflect@1.98.0: resolution: { - integrity: sha512-9ZLaygpYXG7UBqcUtgINd4pDL43l2gdUwOqWUrMz5beVOgp1ccvbihVPW6LtWGcTDfC+A2oNzjEP6roUvWvDDw==, + integrity: sha512-HulKk6pQOk0zkqJXRaweV5PezvAghZAX4cuB7i0sBA0/kz1ypqB1KFhBiZ1PLeeMzAfb1/WmCF2UTu9xzQit4w==, } engines: { node: ">= 14.17.0" } hasBin: true dependencies: - "@jsii/check-node": 1.92.0 - "@jsii/spec": 1.92.0 + "@jsii/check-node": 1.98.0 + "@jsii/spec": 1.98.0 chalk: 4.1.2 fs-extra: 10.1.0 - oo-ascii-tree: 1.92.0 + oo-ascii-tree: 1.98.0 yargs: 16.2.0 dev: true - /jsii-rosetta@1.92.0: + /jsii-rosetta@5.4.17: resolution: { - integrity: sha512-TKrCq3FToJ3rgCUzDEOWHIoYEs4CvtyXNNE2dPkX5YYv3+18vP8qiftGpyHGcgyslx2E7gm1g/8uPkAxeAEP+A==, + integrity: sha512-BFkL3y4IgOxBKVPk43OwCFgjiYwR05t41ZP9ZjQP9AZeeiCiP89NQ7Y7qrs8+A5z8RyEw6RuAtkHPke2oPtR2w==, } - engines: { node: ">= 14.17.0" } + engines: { node: ">= 18.12.0" } hasBin: true dependencies: - "@jsii/check-node": 1.92.0 - "@jsii/spec": 1.92.0 + "@jsii/check-node": 1.98.0 + "@jsii/spec": 1.98.0 "@xmldom/xmldom": 0.8.10 - commonmark: 0.30.0 + chalk: 4.1.2 + commonmark: 0.31.0 fast-glob: 3.3.2 - jsii: 1.92.0 - semver: 7.5.4 - semver-intersect: 1.4.0 + jsii: 5.4.15 + semver: 7.6.2 + semver-intersect: 1.5.0 stream-json: 1.8.0 - typescript: 3.9.10 + typescript: 5.4.5 workerpool: 6.5.1 - yargs: 16.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jsii@1.92.0: - resolution: - { - integrity: sha512-UHuPVMkUXBcbnSAsylQSea7BFNkr6hkx6NhGGoZ5Xnb3fZV7wwr9DHnE14yQJUIsrCL8WcqhCU79QTbWmnKpag==, - } - engines: { node: ">= 14.17.0" } - hasBin: true - dependencies: - "@jsii/check-node": 1.92.0 - "@jsii/spec": 1.92.0 - case: 1.6.3 - chalk: 4.1.2 - fast-deep-equal: 3.1.3 - fs-extra: 10.1.0 - log4js: 6.9.1 - semver: 7.5.4 - semver-intersect: 1.4.0 - sort-json: 2.0.1 - spdx-license-list: 6.8.0 - typescript: 3.9.10 - yargs: 16.2.0 + yargs: 17.7.2 transitivePeerDependencies: - supports-color dev: true - /jsii@5.2.35: + /jsii@5.4.15: resolution: { - integrity: sha512-idWKsPquJDpJR8rCxOVtTwUKtvHM4BA6e8SvylTF6ZVDHBxnKbD4wB7cQLeB2JPKKsW31TIG63+fND6HUw2V3w==, + integrity: sha512-syw2kfZJyb+A6G9ApsmlTBUd/+xMCAQRjml45NSZs6k7+4ifVByOfiIoA05e8zfkn+nOOC+BcTFlHeYubiBHKQ==, } - engines: { node: ">= 16.14.0" } + engines: { node: ">= 18.12.0" } hasBin: true dependencies: - "@jsii/check-node": 1.92.0 - "@jsii/spec": 1.92.0 + "@jsii/check-node": 1.98.0 + "@jsii/spec": 1.98.0 case: 1.6.3 chalk: 4.1.2 downlevel-dts: 0.11.0 fast-deep-equal: 3.1.3 log4js: 6.9.1 - semver: 7.5.4 - semver-intersect: 1.4.0 + semver: 7.6.2 + semver-intersect: 1.5.0 sort-json: 2.0.1 - spdx-license-list: 6.8.0 - typescript: 5.2.2 + spdx-license-list: 6.9.0 + typescript: 5.4.5 yargs: 17.7.2 transitivePeerDependencies: - supports-color @@ -3378,6 +3794,34 @@ packages: } dev: true + /object-inspect@1.13.1: + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + } + dev: true + + /object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + dev: true + + /object.assign@4.1.5: + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /once@1.4.0: resolution: { @@ -3387,10 +3831,10 @@ packages: wrappy: 1.0.2 dev: true - /oo-ascii-tree@1.92.0: + /oo-ascii-tree@1.98.0: resolution: { - integrity: sha512-rLSPbnakn5Wb3dOIVtrmn8jfHKqWv7bROpyBiw6DExq+dOG7qC49EIs89hBhyHkvLolX0oC+0a/RMPAyHEZ+1w==, + integrity: sha512-+GE7ywhtS6MctbfcO+vZzqIxcFzucZCwmawcwCVo89DxQDakV1JFfFViTXG4A90UzTAsU4tQteGmwDtwOlOXLw==, } engines: { node: ">= 14.17.0" } dev: true @@ -3458,6 +3902,14 @@ packages: engines: { node: ">=8.6" } dev: true + /possible-typed-array-names@1.0.0: + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } + dev: true + /prettier@3.0.3: resolution: { @@ -3467,16 +3919,16 @@ packages: hasBin: true dev: true - /publib@0.2.756: + /publib@0.2.834(@aws-sdk/client-sso-oidc@3.575.0): resolution: { - integrity: sha512-9f0r75KrBbMmK2XeyCUw1lpwjuAyRlQpqQ+uvt7c9FSbVyczxj/YrIuR+YhYvfztVwkjwwbNMEG5FsknElqyuQ==, + integrity: sha512-PEtUqGkkuTquX/Af2ZF61getGFs7o4tkCMEKMNThwDWwsxFkI2JoId2ATZuoLu2p1wGEjHypy6Y+NFeK9cxAJw==, } hasBin: true dependencies: - "@aws-sdk/client-codeartifact": 3.465.0 - "@aws-sdk/credential-providers": 3.465.0 - "@aws-sdk/types": 3.465.0 + "@aws-sdk/client-codeartifact": 3.576.0 + "@aws-sdk/credential-providers": 3.576.0(@aws-sdk/client-sso-oidc@3.575.0) + "@aws-sdk/types": 3.575.0 "@types/fs-extra": 8.1.2 fs-extra: 8.1.0 glob: 10.0.0 @@ -3484,6 +3936,7 @@ packages: shlex: 2.1.2 yargs: 17.7.2 transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" - aws-crt dev: true @@ -3512,6 +3965,19 @@ packages: resolve: 1.22.4 dev: true + /regexp.prototype.flags@1.5.2: + resolution: + { + integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + /require-directory@2.1.1: resolution: { @@ -3564,19 +4030,44 @@ packages: queue-microtask: 1.2.3 dev: true - /semver-intersect@1.4.0: + /safe-array-concat@1.1.2: + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: ">=0.4" } + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-regex-test@1.0.3: + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /semver-intersect@1.5.0: resolution: { - integrity: sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==, + integrity: sha512-BDjWX7yCC0haX4W/zrnV2JaMpVirwaEkGOBmgRQtH++F1N3xl9v7k9H44xfTqwl+yLNNSbMKosoVSTIiJVQ2Pw==, } dependencies: - semver: 5.7.2 + semver: 6.3.1 dev: true - /semver@5.7.2: + /semver@6.3.1: resolution: { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, } hasBin: true dev: true @@ -3592,6 +4083,43 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.6.2: + resolution: + { + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, + } + engines: { node: ">=10" } + hasBin: true + dev: true + + /set-function-length@1.2.2: + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + /shelljs@0.8.5: resolution: { @@ -3612,6 +4140,19 @@ packages: } dev: true + /side-channel@1.0.6: + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + /sort-json@2.0.1: resolution: { @@ -3632,6 +4173,14 @@ packages: engines: { node: ">=8" } dev: true + /spdx-license-list@6.9.0: + resolution: + { + integrity: sha512-L2jl5vc2j6jxWcNCvcVj/BW9A8yGIG02Dw+IUw0ZxDM70f7Ylf5Hq39appV1BI9yxyWQRpq2TQ1qaXvf+yjkqA==, + } + engines: { node: ">=8" } + dev: true + /stream-chain@2.2.5: resolution: { @@ -3681,6 +4230,52 @@ packages: } dev: true + /string.prototype.repeat@1.0.0: + resolution: + { + integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, + } + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /string.prototype.trim@1.2.9: + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + /strip-ansi@6.0.1: resolution: { @@ -3771,13 +4366,60 @@ packages: integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - /typescript@3.9.10: + /typed-array-buffer@1.0.2: resolution: { - integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==, + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, } - engines: { node: ">=4.2.0" } - hasBin: true + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 dev: true /typescript@5.0.4: @@ -3789,24 +4431,36 @@ packages: hasBin: true dev: true - /typescript@5.2.2: + /typescript@5.4.5: resolution: { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, + integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, } engines: { node: ">=14.17" } hasBin: true dev: true - /typescript@5.4.0-dev.20231203: + /typescript@5.5.0-dev.20240514: resolution: { - integrity: sha512-6Y/R8j4ZKcCbddjtRncKgCKz5RbqfQe04TIfYnUbPq2CKhJVGP6Bvmkm2GVI9lpTZR64c3wvY28k+exT/jBVdQ==, + integrity: sha512-NccALPZlTF/kDNV2Q071Or2T5CcoAHodWjsKseA4LZKfdqufQzebaQlPuZatC8AgHY2cnQJBcKMCHNFWW9ubpA==, } engines: { node: ">=14.17" } hasBin: true dev: true + /unbox-primitive@1.0.2: + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + /universalify@0.1.2: resolution: { @@ -3832,10 +4486,10 @@ packages: punycode: 2.3.0 dev: true - /uuid@8.3.2: + /uuid@9.0.1: resolution: { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, } hasBin: true @@ -3846,6 +4500,33 @@ packages: } dev: true + /which-boxed-primitive@1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.15: + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + /workerpool@6.5.1: resolution: { From 9bdc67ba1644dc99226153f5e5f17bd712ce6b84 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 15 May 2024 13:13:55 +1000 Subject: [PATCH 20/22] Final --- pnpm-lock.yaml | 920 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 918 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8d7f00..2cb9a19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,8 +38,8 @@ importers: specifier: 3.576.0 version: 3.576.0 "@aws-sdk/client-sso-oidc": - specifier: 3.576.0 - version: 3.576.0(@aws-sdk/client-sts@3.576.0) + specifier: 3.574.0 + version: 3.574.0 "@elsa-data/aws-infrastructure": specifier: 1.5.1 version: 1.5.1(aws-cdk-lib@2.141.0)(constructs@10.3.0) @@ -461,6 +461,57 @@ packages: - aws-crt dev: false + /@aws-sdk/client-sso-oidc@3.574.0: + resolution: + { + integrity: sha512-WcR8AnFhx7bqhYwfSl3OrF0Pu0LfHGgSOnmmORHqRF7ykguE09M/WUlCCjTGmZjJZ1we3uF5Xg8Jg12eiD+bmw==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.574.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/core": 3.572.0 + "@aws-sdk/credential-provider-node": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0)(@aws-sdk/client-sts@3.574.0) + "@aws-sdk/middleware-host-header": 3.567.0 + "@aws-sdk/middleware-logger": 3.568.0 + "@aws-sdk/middleware-recursion-detection": 3.567.0 + "@aws-sdk/middleware-user-agent": 3.572.0 + "@aws-sdk/region-config-resolver": 3.572.0 + "@aws-sdk/types": 3.567.0 + "@aws-sdk/util-endpoints": 3.572.0 + "@aws-sdk/util-user-agent-browser": 3.567.0 + "@aws-sdk/util-user-agent-node": 3.568.0 + "@smithy/config-resolver": 2.2.0 + "@smithy/core": 1.4.2 + "@smithy/fetch-http-handler": 2.5.0 + "@smithy/hash-node": 2.2.0 + "@smithy/invalid-dependency": 2.2.0 + "@smithy/middleware-content-length": 2.2.0 + "@smithy/middleware-endpoint": 2.5.1 + "@smithy/middleware-retry": 2.3.1 + "@smithy/middleware-serde": 2.3.0 + "@smithy/middleware-stack": 2.2.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/node-http-handler": 2.5.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/url-parser": 2.2.0 + "@smithy/util-base64": 2.3.0 + "@smithy/util-body-length-browser": 2.2.0 + "@smithy/util-body-length-node": 2.3.0 + "@smithy/util-defaults-mode-browser": 2.2.1 + "@smithy/util-defaults-mode-node": 2.3.1 + "@smithy/util-endpoints": 1.2.0 + "@smithy/util-middleware": 2.2.0 + "@smithy/util-retry": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-sso-oidc@3.575.0: resolution: { @@ -563,6 +614,55 @@ packages: - "@aws-sdk/client-sts" - aws-crt + /@aws-sdk/client-sso@3.572.0: + resolution: + { + integrity: sha512-S+xhScao5MD79AkrcHmFpEDk+CgoiuB/31WFcTcnrTio5TOUONAaT0QyscOIwRp7BZ7Aez7TBM+loTteJ+TQvg==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.572.0 + "@aws-sdk/middleware-host-header": 3.567.0 + "@aws-sdk/middleware-logger": 3.568.0 + "@aws-sdk/middleware-recursion-detection": 3.567.0 + "@aws-sdk/middleware-user-agent": 3.572.0 + "@aws-sdk/region-config-resolver": 3.572.0 + "@aws-sdk/types": 3.567.0 + "@aws-sdk/util-endpoints": 3.572.0 + "@aws-sdk/util-user-agent-browser": 3.567.0 + "@aws-sdk/util-user-agent-node": 3.568.0 + "@smithy/config-resolver": 2.2.0 + "@smithy/core": 1.4.2 + "@smithy/fetch-http-handler": 2.5.0 + "@smithy/hash-node": 2.2.0 + "@smithy/invalid-dependency": 2.2.0 + "@smithy/middleware-content-length": 2.2.0 + "@smithy/middleware-endpoint": 2.5.1 + "@smithy/middleware-retry": 2.3.1 + "@smithy/middleware-serde": 2.3.0 + "@smithy/middleware-stack": 2.2.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/node-http-handler": 2.5.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/url-parser": 2.2.0 + "@smithy/util-base64": 2.3.0 + "@smithy/util-body-length-browser": 2.2.0 + "@smithy/util-body-length-node": 2.3.0 + "@smithy/util-defaults-mode-browser": 2.2.1 + "@smithy/util-defaults-mode-node": 2.3.1 + "@smithy/util-endpoints": 1.2.0 + "@smithy/util-middleware": 2.2.0 + "@smithy/util-retry": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-sso@3.575.0: resolution: { @@ -660,6 +760,58 @@ packages: transitivePeerDependencies: - aws-crt + /@aws-sdk/client-sts@3.574.0(@aws-sdk/client-sso-oidc@3.574.0): + resolution: + { + integrity: sha512-WNDSG9nipap/L1gGDkCQvU2u413HmVxMJKr41lBCibioz42Z4i6XkCr1etYwIjuVfGF6QPrsEsYLqRwlAC/BQg==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sso-oidc": 3.574.0 + "@aws-sdk/core": 3.572.0 + "@aws-sdk/credential-provider-node": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0)(@aws-sdk/client-sts@3.574.0) + "@aws-sdk/middleware-host-header": 3.567.0 + "@aws-sdk/middleware-logger": 3.568.0 + "@aws-sdk/middleware-recursion-detection": 3.567.0 + "@aws-sdk/middleware-user-agent": 3.572.0 + "@aws-sdk/region-config-resolver": 3.572.0 + "@aws-sdk/types": 3.567.0 + "@aws-sdk/util-endpoints": 3.572.0 + "@aws-sdk/util-user-agent-browser": 3.567.0 + "@aws-sdk/util-user-agent-node": 3.568.0 + "@smithy/config-resolver": 2.2.0 + "@smithy/core": 1.4.2 + "@smithy/fetch-http-handler": 2.5.0 + "@smithy/hash-node": 2.2.0 + "@smithy/invalid-dependency": 2.2.0 + "@smithy/middleware-content-length": 2.2.0 + "@smithy/middleware-endpoint": 2.5.1 + "@smithy/middleware-retry": 2.3.1 + "@smithy/middleware-serde": 2.3.0 + "@smithy/middleware-stack": 2.2.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/node-http-handler": 2.5.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/url-parser": 2.2.0 + "@smithy/util-base64": 2.3.0 + "@smithy/util-body-length-browser": 2.2.0 + "@smithy/util-body-length-node": 2.3.0 + "@smithy/util-defaults-mode-browser": 2.2.1 + "@smithy/util-defaults-mode-node": 2.3.1 + "@smithy/util-endpoints": 1.2.0 + "@smithy/util-middleware": 2.2.0 + "@smithy/util-retry": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt + dev: false + /@aws-sdk/client-sts@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { @@ -762,6 +914,22 @@ packages: transitivePeerDependencies: - aws-crt + /@aws-sdk/core@3.572.0: + resolution: + { + integrity: sha512-DBmf94qfN0dfaLl5EnNcq6TakWfOtVXYifHoTbX+VBwESj3rlY4W+W4mAnvBgAqDjlLFy7bBljmx+vnjnV73lg==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@smithy/core": 1.4.2 + "@smithy/protocol-http": 3.3.0 + "@smithy/signature-v4": 2.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + dev: false + /@aws-sdk/core@3.575.0: resolution: { @@ -809,6 +977,19 @@ packages: - aws-crt dev: true + /@aws-sdk/credential-provider-env@3.568.0: + resolution: + { + integrity: sha512-MVTQoZwPnP1Ev5A7LG+KzeU6sCB8BcGkZeDT1z1V5Wt7GPq0MgFQTSSjhImnB9jqRSZkl1079Bt3PbO6lfIS8g==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/property-provider": 2.2.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-env@3.575.0: resolution: { @@ -821,6 +1002,24 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@aws-sdk/credential-provider-http@3.568.0: + resolution: + { + integrity: sha512-gL0NlyI2eW17hnCrh45hZV+qjtBquB+Bckiip9R6DIVRKqYcoILyiFhuOgf2bXeF23gVh6j18pvUvIoTaFWs5w==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/fetch-http-handler": 2.5.0 + "@smithy/node-http-handler": 2.5.0 + "@smithy/property-provider": 2.2.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/util-stream": 2.2.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-http@3.575.0: resolution: { @@ -838,6 +1037,31 @@ packages: "@smithy/util-stream": 3.0.1 tslib: 2.6.2 + /@aws-sdk/credential-provider-ini@3.572.0(@aws-sdk/client-sso-oidc@3.574.0)(@aws-sdk/client-sts@3.574.0): + resolution: + { + integrity: sha512-05KzbAp77fEiQXqMeodXeMbT83FOqSyBrfSEMz6U8uBXeJCy8zPUjN3acqcbG55/HNJHUvg1cftqzy+fUz71gA==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": 3.572.0 + dependencies: + "@aws-sdk/client-sts": 3.574.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/credential-provider-env": 3.568.0 + "@aws-sdk/credential-provider-process": 3.572.0 + "@aws-sdk/credential-provider-sso": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/credential-provider-web-identity": 3.568.0(@aws-sdk/client-sts@3.574.0) + "@aws-sdk/types": 3.567.0 + "@smithy/credential-provider-imds": 2.3.0 + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt + dev: false + /@aws-sdk/credential-provider-ini@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0): resolution: { @@ -912,6 +1136,31 @@ packages: - "@aws-sdk/client-sso-oidc" - aws-crt + /@aws-sdk/credential-provider-node@3.572.0(@aws-sdk/client-sso-oidc@3.574.0)(@aws-sdk/client-sts@3.574.0): + resolution: + { + integrity: sha512-anlYZnpmVkfp9Gan+LcEkQvmRf/m0KcbR11th8sBEyI5lxMaHKXhnAtC/hEGT7e3L6rgNOrFYTPuSvllITD/Pg==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.568.0 + "@aws-sdk/credential-provider-http": 3.568.0 + "@aws-sdk/credential-provider-ini": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0)(@aws-sdk/client-sts@3.574.0) + "@aws-sdk/credential-provider-process": 3.572.0 + "@aws-sdk/credential-provider-sso": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/credential-provider-web-identity": 3.568.0(@aws-sdk/client-sts@3.574.0) + "@aws-sdk/types": 3.567.0 + "@smithy/credential-provider-imds": 2.3.0 + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - "@aws-sdk/client-sts" + - aws-crt + dev: false + /@aws-sdk/credential-provider-node@3.575.0(@aws-sdk/client-sso-oidc@3.575.0)(@aws-sdk/client-sts@3.575.0): resolution: { @@ -986,6 +1235,20 @@ packages: - "@aws-sdk/client-sts" - aws-crt + /@aws-sdk/credential-provider-process@3.572.0: + resolution: + { + integrity: sha512-hXcOytf0BadSm/MMy7MV8mmY0+Jv3mkavsHNBx0R82hw5ollD0I3JyOAaCtdUpztF0I72F8K+q8SpJQZ+EwArw==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-process@3.575.0: resolution: { @@ -999,6 +1262,25 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@aws-sdk/credential-provider-sso@3.572.0(@aws-sdk/client-sso-oidc@3.574.0): + resolution: + { + integrity: sha512-iIlnpJiDXFp3XC4hJNSiNurnU24mr3iLB3HoNa9efr944bo6XBl9FQdk3NssIkqzSmgyoB2CEUx/daBHz4XSow==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/client-sso": 3.572.0 + "@aws-sdk/token-providers": 3.572.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/types": 3.567.0 + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - "@aws-sdk/client-sso-oidc" + - aws-crt + dev: false + /@aws-sdk/credential-provider-sso@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { @@ -1055,6 +1337,22 @@ packages: - "@aws-sdk/client-sso-oidc" - aws-crt + /@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.574.0): + resolution: + { + integrity: sha512-ZJSmTmoIdg6WqAULjYzaJ3XcbgBzVy36lir6Y0UBMRGaxDgos1AARuX6EcYzXOl+ksLvxt/xMQ+3aYh1LWfKSw==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sts": ^3.568.0 + dependencies: + "@aws-sdk/client-sts": 3.574.0(@aws-sdk/client-sso-oidc@3.574.0) + "@aws-sdk/types": 3.567.0 + "@smithy/property-provider": 2.2.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/credential-provider-web-identity@3.575.0(@aws-sdk/client-sts@3.575.0): resolution: { @@ -1160,6 +1458,19 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-host-header@3.567.0: + resolution: + { + integrity: sha512-zQHHj2N3in9duKghH7AuRNrOMLnKhW6lnmb7dznou068DJtDr76w475sHp2TF0XELsOGENbbBsOlN/S5QBFBVQ==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-host-header@3.575.0: resolution: { @@ -1184,6 +1495,18 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-logger@3.568.0: + resolution: + { + integrity: sha512-BinH72RG7K3DHHC1/tCulocFv+ZlQ9SrPF9zYT0T1OT95JXuHhB7fH8gEABrc6DAtOdJJh2fgxQjPy5tzPtsrA==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-logger@3.575.0: resolution: { @@ -1195,6 +1518,19 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@aws-sdk/middleware-recursion-detection@3.567.0: + resolution: + { + integrity: sha512-rFk3QhdT4IL6O/UWHmNdjJiURutBCy+ogGqaNHf/RELxgXH3KmYorLwCe0eFb5hq8f6vr3zl4/iH7YtsUOuo1w==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-recursion-detection@3.575.0: resolution: { @@ -1253,6 +1589,20 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/middleware-user-agent@3.572.0: + resolution: + { + integrity: sha512-R4bBbLp1ywtF1kJoOX1juDMztKPWeQHNj6XuTvtruFDn1RdfnBlbM3+9rguRfH5s4V+xfl8SSWchnyo2cI00xg==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@aws-sdk/util-endpoints": 3.572.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/middleware-user-agent@3.575.0: resolution: { @@ -1266,6 +1616,21 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@aws-sdk/region-config-resolver@3.572.0: + resolution: + { + integrity: sha512-xkZMIxek44F4YW5r9otD1O5Y/kDkgAb6JNJePkP1qPVojrkCmin3OFYAOZgGm+T4DZAQ5rWhpaqTAWmnRumYfw==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/types": 2.12.0 + "@smithy/util-config-provider": 2.3.0 + "@smithy/util-middleware": 2.2.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/region-config-resolver@3.575.0: resolution: { @@ -1295,6 +1660,23 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.574.0): + resolution: + { + integrity: sha512-IkSu8p32tQZhKqwmfLZLGfYwNhsS/HUQBLnDMHJlr9VifmDqlTurcr+DwMCaMimuFhcLeb45vqTymKf/ro/OBw==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + "@aws-sdk/client-sso-oidc": 3.572.0 + dependencies: + "@aws-sdk/client-sso-oidc": 3.574.0 + "@aws-sdk/types": 3.567.0 + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/token-providers@3.575.0(@aws-sdk/client-sso-oidc@3.575.0): resolution: { @@ -1328,6 +1710,17 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@aws-sdk/types@3.567.0: + resolution: + { + integrity: sha512-JBznu45cdgQb8+T/Zab7WpBmfEAh77gsk99xuF4biIb2Sw1mdseONdoGDjEJX57a25TzIv/WUJ2oABWumckz1A==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/types@3.575.0: resolution: { @@ -1348,6 +1741,19 @@ packages: tslib: 2.6.2 dev: false + /@aws-sdk/util-endpoints@3.572.0: + resolution: + { + integrity: sha512-AIEC7ItIWBqkJLtqcSd0HG8tvdh3zVwqnKPHNrcfFay0Xonqx3p/qTCDwGosh5CM5hDGzyOSRA5PkacEDBTz9w==, + } + engines: { node: ">=16.0.0" } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/types": 2.12.0 + "@smithy/util-endpoints": 1.2.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-endpoints@3.575.0: resolution: { @@ -1369,6 +1775,18 @@ packages: dependencies: tslib: 2.6.2 + /@aws-sdk/util-user-agent-browser@3.567.0: + resolution: + { + integrity: sha512-cqP0uXtZ7m7hRysf3fRyJwcY1jCgQTpJy7BHB5VpsE7DXlXHD5+Ur5L42CY7UrRPrB6lc6YGFqaAOs5ghMcLyA==, + } + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/types": 2.12.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-user-agent-browser@3.575.0: resolution: { @@ -1380,6 +1798,24 @@ packages: bowser: 2.11.0 tslib: 2.6.2 + /@aws-sdk/util-user-agent-node@3.568.0: + resolution: + { + integrity: sha512-NVoZoLnKF+eXPBvXg+KqixgJkPSrerR6Gqmbjwqbv14Ini+0KNKB0/MXas1mDGvvEgtNkHI/Cb9zlJ3KXpti2A==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + "@aws-sdk/types": 3.567.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@aws-sdk/util-user-agent-node@3.575.0: resolution: { @@ -1779,6 +2215,17 @@ packages: fastq: 1.15.0 dev: true + /@smithy/abort-controller@2.2.0: + resolution: + { + integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/abort-controller@3.0.0: resolution: { @@ -1808,6 +2255,20 @@ packages: tslib: 2.6.2 dev: false + /@smithy/config-resolver@2.2.0: + resolution: + { + integrity: sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.3.0 + "@smithy/types": 2.12.0 + "@smithy/util-config-provider": 2.3.0 + "@smithy/util-middleware": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/config-resolver@3.0.0: resolution: { @@ -1821,6 +2282,23 @@ packages: "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 + /@smithy/core@1.4.2: + resolution: + { + integrity: sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/middleware-endpoint": 2.5.1 + "@smithy/middleware-retry": 2.3.1 + "@smithy/middleware-serde": 2.3.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/util-middleware": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/core@2.0.1: resolution: { @@ -1837,6 +2315,20 @@ packages: "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 + /@smithy/credential-provider-imds@2.3.0: + resolution: + { + integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.3.0 + "@smithy/property-provider": 2.2.0 + "@smithy/types": 2.12.0 + "@smithy/url-parser": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/credential-provider-imds@3.0.0: resolution: { @@ -1909,6 +2401,19 @@ packages: tslib: 2.6.2 dev: false + /@smithy/fetch-http-handler@2.5.0: + resolution: + { + integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==, + } + dependencies: + "@smithy/protocol-http": 3.3.0 + "@smithy/querystring-builder": 2.2.0 + "@smithy/types": 2.12.0 + "@smithy/util-base64": 2.3.0 + tslib: 2.6.2 + dev: false + /@smithy/fetch-http-handler@3.0.1: resolution: { @@ -1933,6 +2438,19 @@ packages: tslib: 2.6.2 dev: false + /@smithy/hash-node@2.2.0: + resolution: + { + integrity: sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + "@smithy/util-buffer-from": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + dev: false + /@smithy/hash-node@3.0.0: resolution: { @@ -1957,6 +2475,16 @@ packages: tslib: 2.6.2 dev: false + /@smithy/invalid-dependency@2.2.0: + resolution: + { + integrity: sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==, + } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/invalid-dependency@3.0.0: resolution: { @@ -1966,6 +2494,16 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/is-array-buffer@2.2.0: + resolution: + { + integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/is-array-buffer@3.0.0: resolution: { @@ -1986,6 +2524,18 @@ packages: tslib: 2.6.2 dev: false + /@smithy/middleware-content-length@2.2.0: + resolution: + { + integrity: sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/protocol-http": 3.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-content-length@3.0.0: resolution: { @@ -1997,6 +2547,22 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/middleware-endpoint@2.5.1: + resolution: + { + integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/middleware-serde": 2.3.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + "@smithy/url-parser": 2.2.0 + "@smithy/util-middleware": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-endpoint@3.0.0: resolution: { @@ -2012,6 +2578,24 @@ packages: "@smithy/util-middleware": 3.0.0 tslib: 2.6.2 + /@smithy/middleware-retry@2.3.1: + resolution: + { + integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.3.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/service-error-classification": 2.1.5 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + "@smithy/util-middleware": 2.2.0 + "@smithy/util-retry": 2.2.0 + tslib: 2.6.2 + uuid: 9.0.1 + dev: false + /@smithy/middleware-retry@3.0.1: resolution: { @@ -2029,6 +2613,17 @@ packages: tslib: 2.6.2 uuid: 9.0.1 + /@smithy/middleware-serde@2.3.0: + resolution: + { + integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-serde@3.0.0: resolution: { @@ -2039,6 +2634,17 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/middleware-stack@2.2.0: + resolution: + { + integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/middleware-stack@3.0.0: resolution: { @@ -2049,6 +2655,19 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/node-config-provider@2.3.0: + resolution: + { + integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/property-provider": 2.2.0 + "@smithy/shared-ini-file-loader": 2.4.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/node-config-provider@3.0.0: resolution: { @@ -2061,6 +2680,20 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/node-http-handler@2.5.0: + resolution: + { + integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/abort-controller": 2.2.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/querystring-builder": 2.2.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/node-http-handler@3.0.0: resolution: { @@ -2074,6 +2707,17 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/property-provider@2.2.0: + resolution: + { + integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/property-provider@3.0.0: resolution: { @@ -2084,6 +2728,17 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/protocol-http@3.3.0: + resolution: + { + integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/protocol-http@4.0.0: resolution: { @@ -2094,6 +2749,18 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/querystring-builder@2.2.0: + resolution: + { + integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + "@smithy/util-uri-escape": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/querystring-builder@3.0.0: resolution: { @@ -2105,6 +2772,17 @@ packages: "@smithy/util-uri-escape": 3.0.0 tslib: 2.6.2 + /@smithy/querystring-parser@2.2.0: + resolution: + { + integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/querystring-parser@3.0.0: resolution: { @@ -2115,6 +2793,16 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/service-error-classification@2.1.5: + resolution: + { + integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + dev: false + /@smithy/service-error-classification@3.0.0: resolution: { @@ -2124,6 +2812,17 @@ packages: dependencies: "@smithy/types": 3.0.0 + /@smithy/shared-ini-file-loader@2.4.0: + resolution: + { + integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/shared-ini-file-loader@3.0.0: resolution: { @@ -2134,6 +2833,22 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/signature-v4@2.3.0: + resolution: + { + integrity: sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/is-array-buffer": 2.2.0 + "@smithy/types": 2.12.0 + "@smithy/util-hex-encoding": 2.2.0 + "@smithy/util-middleware": 2.2.0 + "@smithy/util-uri-escape": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + dev: false + /@smithy/signature-v4@3.0.0: resolution: { @@ -2149,6 +2864,21 @@ packages: "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 + /@smithy/smithy-client@2.5.1: + resolution: + { + integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/middleware-endpoint": 2.5.1 + "@smithy/middleware-stack": 2.2.0 + "@smithy/protocol-http": 3.3.0 + "@smithy/types": 2.12.0 + "@smithy/util-stream": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/smithy-client@3.0.1: resolution: { @@ -2163,6 +2893,16 @@ packages: "@smithy/util-stream": 3.0.1 tslib: 2.6.2 + /@smithy/types@2.12.0: + resolution: + { + integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/types@3.0.0: resolution: { @@ -2172,6 +2912,17 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/url-parser@2.2.0: + resolution: + { + integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==, + } + dependencies: + "@smithy/querystring-parser": 2.2.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/url-parser@3.0.0: resolution: { @@ -2182,6 +2933,18 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/util-base64@2.3.0: + resolution: + { + integrity: sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/util-buffer-from": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-base64@3.0.0: resolution: { @@ -2193,6 +2956,15 @@ packages: "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 + /@smithy/util-body-length-browser@2.2.0: + resolution: + { + integrity: sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==, + } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-body-length-browser@3.0.0: resolution: { @@ -2201,6 +2973,16 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/util-body-length-node@2.3.0: + resolution: + { + integrity: sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-body-length-node@3.0.0: resolution: { @@ -2210,6 +2992,17 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/util-buffer-from@2.2.0: + resolution: + { + integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/is-array-buffer": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/util-buffer-from@3.0.0: resolution: { @@ -2220,6 +3013,16 @@ packages: "@smithy/is-array-buffer": 3.0.0 tslib: 2.6.2 + /@smithy/util-config-provider@2.3.0: + resolution: + { + integrity: sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-config-provider@3.0.0: resolution: { @@ -2229,6 +3032,20 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/util-defaults-mode-browser@2.2.1: + resolution: + { + integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==, + } + engines: { node: ">= 10.0.0" } + dependencies: + "@smithy/property-provider": 2.2.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + /@smithy/util-defaults-mode-browser@3.0.1: resolution: { @@ -2242,6 +3059,22 @@ packages: bowser: 2.11.0 tslib: 2.6.2 + /@smithy/util-defaults-mode-node@2.3.1: + resolution: + { + integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==, + } + engines: { node: ">= 10.0.0" } + dependencies: + "@smithy/config-resolver": 2.2.0 + "@smithy/credential-provider-imds": 2.3.0 + "@smithy/node-config-provider": 2.3.0 + "@smithy/property-provider": 2.2.0 + "@smithy/smithy-client": 2.5.1 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/util-defaults-mode-node@3.0.1: resolution: { @@ -2257,6 +3090,18 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/util-endpoints@1.2.0: + resolution: + { + integrity: sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==, + } + engines: { node: ">= 14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.3.0 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/util-endpoints@2.0.0: resolution: { @@ -2268,6 +3113,16 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/util-hex-encoding@2.2.0: + resolution: + { + integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-hex-encoding@3.0.0: resolution: { @@ -2277,6 +3132,17 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/util-middleware@2.2.0: + resolution: + { + integrity: sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/util-middleware@3.0.0: resolution: { @@ -2287,6 +3153,18 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/util-retry@2.2.0: + resolution: + { + integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==, + } + engines: { node: ">= 14.0.0" } + dependencies: + "@smithy/service-error-classification": 2.1.5 + "@smithy/types": 2.12.0 + tslib: 2.6.2 + dev: false + /@smithy/util-retry@3.0.0: resolution: { @@ -2298,6 +3176,23 @@ packages: "@smithy/types": 3.0.0 tslib: 2.6.2 + /@smithy/util-stream@2.2.0: + resolution: + { + integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/fetch-http-handler": 2.5.0 + "@smithy/node-http-handler": 2.5.0 + "@smithy/types": 2.12.0 + "@smithy/util-base64": 2.3.0 + "@smithy/util-buffer-from": 2.2.0 + "@smithy/util-hex-encoding": 2.2.0 + "@smithy/util-utf8": 2.3.0 + tslib: 2.6.2 + dev: false + /@smithy/util-stream@3.0.1: resolution: { @@ -2314,6 +3209,16 @@ packages: "@smithy/util-utf8": 3.0.0 tslib: 2.6.2 + /@smithy/util-uri-escape@2.2.0: + resolution: + { + integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.2 + dev: false + /@smithy/util-uri-escape@3.0.0: resolution: { @@ -2323,6 +3228,17 @@ packages: dependencies: tslib: 2.6.2 + /@smithy/util-utf8@2.3.0: + resolution: + { + integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/util-buffer-from": 2.2.0 + tslib: 2.6.2 + dev: false + /@smithy/util-utf8@3.0.0: resolution: { From 8f37fb19c0ad3509f79a353350dfa6258e2044a6 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 15 May 2024 13:16:39 +1000 Subject: [PATCH 21/22] build workflow --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad24831..e180d99 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,9 +23,9 @@ jobs: uses: animmouse/setup-rclone@v1 - run: ./test-go-direct.sh - working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-docker-image + working-directory: packages/aws-copy-out-sharer/docker/rclone-batch-docker-image - run: ./test-docker-direct.sh - working-directory: packages/aws-copy-out-sharer/construct/rclone-batch-docker-image + working-directory: packages/aws-copy-out-sharer/docker/rclone-batch-docker-image # - run: pnpm run build # - run: pnpm run package From d261b471d61706b1d5c35ad3f5e8c9d9d4348560 Mon Sep 17 00:00:00 2001 From: andrewpatto Date: Wed, 15 May 2024 13:19:31 +1000 Subject: [PATCH 22/22] test case case --- .../docker/rclone-batch-docker-image/test-go-direct.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh index c91a67a..06c1ea5 100755 --- a/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh +++ b/packages/aws-copy-out-sharer/docker/rclone-batch-docker-image/test-go-direct.sh @@ -90,8 +90,8 @@ wait %1 cat "$TEMPD/result.json" -assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "Interrupted by SIGTERM" -assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "Skipped due to previous SIGTERM received" +assert " cat $TEMPD/result.json | jq -r '.[0] | .lastError' " "interrupted by SIGTERM" +assert " cat $TEMPD/result.json | jq -r '.[1] | .lastError' " "skipped due to previous SIGTERM received" rm "$TEMPD/result.json"