From ff46f9510e38558b124ce439dda4134714d91bda Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 15 Dec 2023 17:34:21 +0200 Subject: [PATCH 01/16] Add new Promisify Anything (AWS Athena edition) example --- .gitignore | 2 + typescript/promisify-anything/.prettierrc | 7 + typescript/promisify-anything/README.md | 133 + .../promisify-anything/data/sample.jsonl | 3 + .../promisify-anything/package-lock.json | 2578 +++++++++++++++++ typescript/promisify-anything/package.json | 34 + .../promisify-anything/src/aws-stack.ts | 78 + typescript/promisify-anything/src/client.ts | 56 + typescript/promisify-anything/src/service.ts | 92 + typescript/promisify-anything/tsconfig.json | 112 + 10 files changed, 3095 insertions(+) create mode 100644 typescript/promisify-anything/.prettierrc create mode 100644 typescript/promisify-anything/README.md create mode 100644 typescript/promisify-anything/data/sample.jsonl create mode 100644 typescript/promisify-anything/package-lock.json create mode 100644 typescript/promisify-anything/package.json create mode 100755 typescript/promisify-anything/src/aws-stack.ts create mode 100644 typescript/promisify-anything/src/client.ts create mode 100644 typescript/promisify-anything/src/service.ts create mode 100644 typescript/promisify-anything/tsconfig.json diff --git a/.gitignore b/.gitignore index 11f1aa9e..d28263fd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ **/dist **/.vscode **/.idea +cdk.out +.DS_Store diff --git a/typescript/promisify-anything/.prettierrc b/typescript/promisify-anything/.prettierrc new file mode 100644 index 00000000..da245af4 --- /dev/null +++ b/typescript/promisify-anything/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "arrowParens": "always", + "printWidth": 120 +} diff --git a/typescript/promisify-anything/README.md b/typescript/promisify-anything/README.md new file mode 100644 index 00000000..f8ff692c --- /dev/null +++ b/typescript/promisify-anything/README.md @@ -0,0 +1,133 @@ +# Restate Promisify complex dependency example + +This example shows how to use Restate to promisify a complex dependency, in this case executing queries on AWS Athena. +A long-polling HTTP client is set up to simulate long-polling against the Restate ingress endpoint that wraps a query's +result in a very simple promise. Using a consistent idempotency token turns this into a true durable promise. + +## Running the example + +Prerequisites: + +- npm, jq, curl +- Docker +- [Optional] An AWS account where you can deploy a demo stack + +There are several components to running the example: + +- Restate (you will start a single-node local server) +- [Optional] An AWS stack with an S3 bucket and an Athena database +- A Restate service (provided) +- A promise "client" which uses long-polling with an idempotency key to await the completion of an operation + +### Start Restate + +If you prefer, you can omit the `--rm` flag to retain the stored invocation state between container restarts. + +```shell +docker run --name restate_dev --rm -p 8080:8080 -p 9070:9070 -p 9071:9071 -e RUST_LOG=info,restate=debug docker.io/restatedev/restate:latest +``` + +### [Optional] Deploy the AWS stack + +If you prefer not to deploy AWS resources, edit [service.ts](src/service.ts) and replace the Athena interactions with a +Restate context sleep call as suggested in the comments. This will simulate a long-running operation without any +external dependencies. Alternatively, make sure you have an active session with sufficient privileges and deploy the +demo stack: + +```shell +npm run deploy +``` + +Note the value of the `BucketName` output. Now copy the sample data file into S3: + +```shell +aws s3 cp data/sample.jsonl s3://${BUCKET_NAME}/data/ +``` + +### Start the service + +Use the `DemoRoleArn` output from the stack deployment above to set the `ROLE_ARN` environment variable: + +```shell +output=$(aws sts assume-role --role-arn ${ROLE_ARN} --role-session-name restate-demo) +export AWS_ACCESS_KEY_ID=$(echo $output | jq -r '.Credentials.AccessKeyId') +export AWS_SECRET_ACCESS_KEY=$(echo $output | jq -r '.Credentials.SecretAccessKey') +export AWS_SESSION_TOKEN=$(echo $output | jq -r '.Credentials.SessionToken') +``` + +Now start the Restate service: + +```shell +npm run service +``` + +Register the service with Restate - you only need to do this once: + +```shell +curl -X POST http://localhost:9070/endpoints -H 'content-type: application/json' -d '{"uri": "http://host.docker.internal:9080"}' +``` + +### Run the client + +To make the example more interesting, we set a relatively short timeout on the client connection which causes us to +disconnect and retry. This demonstrates the built-in idempotency support that makes it very easy to retry. Let's run the +client against the Restate ingress endpoint with `npm run client`. You should see the following output: + +``` +Starting query with idempotency key: 6pbxlpuwect ... +Attempt #1 failed with AxiosError: timeout of 500ms exceeded. Backing off for 225.4295680836923ms... +Attempt #2 failed with AxiosError: timeout of 500ms exceeded. Backing off for 421.82781013856396ms... +Query finished with status: 200. +{ + status: 'SUCCESS', + result: { + response: { _id: 'd69d08af-299f-4068-9bd2-42d11dca603a', result: [Object] } + } +} +``` + +Let's look at the server logs: we see that the side effect wrapping the call to retrieve the query results has most +likely been retried several times because Athena takes some time to start, execute, and return the results of a query. +Our logic in the service handler didn't have to deal with any of that backing off - Restate did it all for us: + +``` +[restate] [2023-12-15T15:20:03.451Z] DEBUG: [query/query] [Ogrphy5abhwAYxuEC5ecQa5i7mwGNNa0g] : Invoking function. +[restate] [2023-12-15T15:20:03.458Z] DEBUG: [internal/query] [pua_tEavBlwAYxuEC58fyigRM4drFneMA] : Invoking function. +Starting query: [object Object] with id: 06d81b82-1a77-4eb2-ae0e-039828efff08 +[restate] [2023-12-15T15:20:03.851Z] DEBUG: Error while executing side effect 'side-effect': InvalidRequestException - Query has not yet finished. Current state: QUEUED +[restate] [2023-12-15T15:20:03.852Z] DEBUG: InvalidRequestException: Query has not yet finished. Current state: QUEUED +... +... +... +[restate] [2023-12-15T15:20:03.995Z] DEBUG: Retrying in 40 ms +[restate] [2023-12-15T15:20:04.092Z] DEBUG: Error while executing side effect 'side-effect': InvalidRequestException - Query has not yet finished. Current state: RUNNING +[restate] [2023-12-15T15:20:04.099Z] DEBUG: InvalidRequestException: Query has not yet finished. Current state: RUNNING +... +... +... +[restate] [2023-12-15T15:20:04.452Z] DEBUG: Retrying in 320 ms +[restate] [2023-12-15T15:20:04.882Z] DEBUG: [internal/query] [pua_tEavBlwAYxuEC58fyigRM4drFneMA] : Function completed successfully. +[restate] [2023-12-15T15:20:04.905Z] DEBUG: [query/query] [Ogrphy5abhwAYxuEC5ecQa5i7mwGNNa0g] : Function completed successfully. +``` + +Notice how if you re-run the client with the same idempotency token as a previous run using `IDEMPOTENCY_KEY=${TOKEN} npm run client`, +the server will immediately return a cached result: + +``` +Starting query with idempotency key: 6pbxlpuwect ... +Query finished with status: 200. +{ + status: 'SUCCESS', + result: { + response: { _id: 'd69d08af-299f-4068-9bd2-42d11dca603a', result: [Object] } + } +} +``` + +### Clean up + +If you created an AWS stack you can destroy it using: + +```shell +npx cdk destroy +``` diff --git a/typescript/promisify-anything/data/sample.jsonl b/typescript/promisify-anything/data/sample.jsonl new file mode 100644 index 00000000..03c1540e --- /dev/null +++ b/typescript/promisify-anything/data/sample.jsonl @@ -0,0 +1,3 @@ +{"id": "1", "date": "2023-12-15T08:18:03+00:00", "value": "17"} +{"id": "2", "date": "2023-12-15T08:18:03+00:00", "value": "75"} +{"id": "3", "date": "2023-12-15T08:18:03+00:00", "value": "-50"} diff --git a/typescript/promisify-anything/package-lock.json b/typescript/promisify-anything/package-lock.json new file mode 100644 index 00000000..b8d2f3c3 --- /dev/null +++ b/typescript/promisify-anything/package-lock.json @@ -0,0 +1,2578 @@ +{ + "name": "promisify-anything", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "promisify-anything", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-athena": "^3.470.0", + "@restatedev/restate-sdk": "^0.5.1", + "@types/uuid": "^9.0.7", + "axios-retry": "^4.0.0", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@aws-cdk/aws-glue-alpha": "^2.115.0-alpha.0", + "aws-cdk-lib": "^2.115.0", + "cdk": "^2.115.0", + "constructs": "^10.3.0", + "prettier": "^3.1.1", + "ts-node-dev": "^2.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==", + "dev": true + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", + "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", + "dev": true + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.1.tgz", + "integrity": "sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==", + "dev": true + }, + "node_modules/@aws-cdk/aws-glue-alpha": { + "version": "2.115.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.115.0-alpha.0.tgz", + "integrity": "sha512-PJi9rJ/sJNq6ECyYfpS9vclQGkoi6nb5XiPaTqwUzq2A7Uhqw4O7EAC/YkSBSdc9FJGOWm7uCU9/O72/9qKZ+A==", + "dev": true, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.115.0", + "constructs": "^10.0.0" + } + }, + "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/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/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-athena": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.470.0.tgz", + "integrity": "sha512-ZOwgHyF4VfNUczOeEEJcCUt83qRNtGy+RFBePrQu3G4ybyVSSrRrnfHlWd2+hcEc9zxx3bgLmK7kIsv8E1rJvQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.470.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.470.0.tgz", + "integrity": "sha512-iMXqdXuypE3OK0rggbvSz7vBGlLDG418dNidHhdaeLluMTG/GfHbh1fLOlavhYxRwrsPrtYvFiVkxXFGzXva4w==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.470.0.tgz", + "integrity": "sha512-TP3A4t8FoFEQinm6axxduTUnlMMLpmLi4Sf00JTI2CszxLUFh/JyUhYQ5gSOoXgPFmfwVXUNKCtmR3jdP0ZGPw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.468.0", + "@aws-sdk/credential-provider-node": "3.470.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-sdk-sts": "3.468.0", + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/protocol-http": "^3.0.11", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", + "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", + "dependencies": { + "@smithy/smithy-client": "^2.1.18", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", + "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.470.0.tgz", + "integrity": "sha512-eF22iPO6J2jY+LbuTv5dW0hZBmi6ksRDFFd/zT6TLasrzH2Ex+gAfN3c7rFHF+XAubL0JXFUKFA3UAwoZpO9Zg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.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.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.470.0.tgz", + "integrity": "sha512-paySXwzGxBVU+2cVUkRIXafKhYhtO2fJJ3MotR6euvRONK/dta+bhEc5Z4QnTo/gNLoELK/QUC0EGoF+oPfk8g==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.468.0", + "@aws-sdk/credential-provider-ini": "3.470.0", + "@aws-sdk/credential-provider-process": "3.468.0", + "@aws-sdk/credential-provider-sso": "3.470.0", + "@aws-sdk/credential-provider-web-identity": "3.468.0", + "@aws-sdk/types": "3.468.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.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", + "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.470.0.tgz", + "integrity": "sha512-biGDSh9S9KDR9Tl/8cCPn9g5KPNkXg/CIJIOk3X+6valktbJ2UVYBzi0ZX4vZiudt5ry/Hsu6Pgo+KN1AmBWdg==", + "dependencies": { + "@aws-sdk/client-sso": "3.470.0", + "@aws-sdk/token-providers": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", + "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", + "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", + "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", + "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz", + "integrity": "sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.468.0", + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", + "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz", + "integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", + "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz", + "integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.468.0", + "@aws-sdk/middleware-logger": "3.468.0", + "@aws-sdk/middleware-recursion-detection": "3.468.0", + "@aws-sdk/middleware-user-agent": "3.470.0", + "@aws-sdk/region-config-resolver": "3.470.0", + "@aws-sdk/types": "3.468.0", + "@aws-sdk/util-endpoints": "3.470.0", + "@aws-sdk/util-user-agent-browser": "3.468.0", + "@aws-sdk/util-user-agent-node": "3.470.0", + "@smithy/config-resolver": "^2.0.21", + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/hash-node": "^2.0.17", + "@smithy/invalid-dependency": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.17", + "@smithy/middleware-endpoint": "^2.2.3", + "@smithy/middleware-retry": "^2.0.24", + "@smithy/middleware-serde": "^2.0.15", + "@smithy/middleware-stack": "^2.0.9", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.11", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-body-length-browser": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.22", + "@smithy/util-defaults-mode-node": "^2.0.29", + "@smithy/util-endpoints": "^1.0.7", + "@smithy/util-retry": "^2.0.8", + "@smithy/util-utf8": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", + "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz", + "integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/util-endpoints": "^1.0.7", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.465.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz", + "integrity": "sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.468.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", + "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.470.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", + "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", + "dependencies": { + "@aws-sdk/types": "3.468.0", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "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/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@restatedev/restate-sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-0.5.1.tgz", + "integrity": "sha512-eh+VohwJK5c2e10gQWkW21F1CefIVJpoQnoPbWAGUm7WYDeDZYOKiKhzK3/DKWn42c1PH4a2oeEvHmvDXU42zA==", + "dependencies": { + "protobufjs": "^7.2.2", + "ts-proto": "^1.140.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", + "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", + "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", + "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", + "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", + "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", + "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "dependencies": { + "@smithy/types": "^2.7.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/invalid-dependency": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", + "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "dependencies": { + "@smithy/types": "^2.7.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/middleware-content-length": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", + "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "dependencies": { + "@smithy/protocol-http": "^3.0.11", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", + "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.15", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "@smithy/url-parser": "^2.0.15", + "@smithy/util-middleware": "^2.0.8", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz", + "integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/protocol-http": "^3.0.11", + "@smithy/service-error-classification": "^2.0.8", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "@smithy/util-middleware": "^2.0.8", + "@smithy/util-retry": "^2.0.8", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", + "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", + "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", + "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "dependencies": { + "@smithy/property-provider": "^2.0.16", + "@smithy/shared-ini-file-loader": "^2.2.7", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", + "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", + "dependencies": { + "@smithy/abort-controller": "^2.0.15", + "@smithy/protocol-http": "^3.0.11", + "@smithy/querystring-builder": "^2.0.15", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", + "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", + "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", + "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "dependencies": { + "@smithy/types": "^2.7.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.15", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", + "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", + "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "dependencies": { + "@smithy/types": "^2.7.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", + "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.17.tgz", + "integrity": "sha512-ru5IUbHUAYgJ5ZqZaBi6PEsMjFT/do0Eu21Qt7b07NuRuPlwAMhlqNRDy/KE9QAF20ygehb+xe9ebmyZ26/BSA==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.15", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.7.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.8", + "@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.18", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz", + "integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.9", + "@smithy/types": "^2.7.0", + "@smithy/util-stream": "^2.0.23", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", + "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", + "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.15", + "@smithy/types": "^2.7.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.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", + "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "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.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz", + "integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==", + "dependencies": { + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz", + "integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==", + "dependencies": { + "@smithy/config-resolver": "^2.0.21", + "@smithy/credential-provider-imds": "^2.1.4", + "@smithy/node-config-provider": "^2.1.8", + "@smithy/property-provider": "^2.0.16", + "@smithy/smithy-client": "^2.1.18", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", + "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.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.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", + "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "dependencies": { + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", + "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.8", + "@smithy/types": "^2.7.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", + "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.3.1", + "@smithy/node-http-handler": "^2.2.1", + "@smithy/types": "^2.7.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/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", + "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "peer": true + }, + "node_modules/aws-cdk": { + "version": "2.115.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.115.0.tgz", + "integrity": "sha512-jf+5j+ygk/DqxLzYyjFnCOOlRgvL/fwcYhyanhpb1OEQEe1FF6NGUb1TYsnQc3Ly67qLOKkQgdeyeXgzkKoSOQ==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/aws-cdk-lib": { + "version": "2.115.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.115.0.tgz", + "integrity": "sha512-PGIwmjo9BcviKxuMfMlUCwevUjwXnaS5h8fxZOM6bN1HXCS/wIusft4tMmkiNYjPiNE1sHJbCDIbxxntCQ/7jg==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dev": true, + "dependencies": { + "@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", + "fs-extra": "^11.2.0", + "ignore": "^5.3.0", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.1", + "semver": "^7.5.4", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/aws-cdk/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-retry": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.0.0.tgz", + "integrity": "sha512-F6P4HVGITD/v4z9Lw2mIA24IabTajvpDZmKa6zq/gGwn57wN5j1P3uWrAV0+diqnW6kTM2fTqmWNfgYWGmMuiA==", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cdk": { + "version": "2.115.0", + "resolved": "https://registry.npmjs.org/cdk/-/cdk-2.115.0.tgz", + "integrity": "sha512-jZQ0NkHz5Qcq+zHt4bk3S7BABlHIIZR1WwYDfAq2IIKH79qCY+OytD9P6lmJm7Lq/h9YMphoxHIJs7dg6qdPMw==", + "dev": true, + "dependencies": { + "aws-cdk": "2.115.0" + }, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "peer": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/constructs": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", + "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", + "dev": true, + "engines": { + "node": ">= 16.14.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "peer": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-poet": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.6.0.tgz", + "integrity": "sha512-4vEH/wkhcjRPFOdBwIh9ItO6jOoumVLRF4aABDX5JSNEubSqwOulihxQPqai+OkuygJm3WYMInxXQX4QwVNMuw==", + "dependencies": { + "dprint-node": "^1.0.7" + } + }, + "node_modules/ts-proto": { + "version": "1.165.1", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.165.1.tgz", + "integrity": "sha512-tn/sj9i31Q4d3/HtN2PFMU/OQwrBYP2cfhYo75cPpO2ks7unFxf1/oMdIt/2woCcOwRclxruGCrs7Ljdl9BPkw==", + "dependencies": { + "case-anything": "^2.1.13", + "protobufjs": "^7.2.4", + "ts-poet": "^6.5.0", + "ts-proto-descriptors": "1.15.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz", + "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==", + "dependencies": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "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/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/typescript/promisify-anything/package.json b/typescript/promisify-anything/package.json new file mode 100644 index 00000000..462124b1 --- /dev/null +++ b/typescript/promisify-anything/package.json @@ -0,0 +1,34 @@ +{ + "name": "promisify-anything", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc --noEmitOnError", + "lint": "eslint --ignore-path .eslintignore --ext .ts .", + "format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|ts|json)\"", + "verify": "npm run format -- --check && npm run lint && npm run build", + "client": "ts-node src/client.ts", + "service": "ts-node src/service.ts", + "service:dev": "RESTATE_DEBUG_LOGGING=JOURNAL ts-node-dev --respawn --transpile-only src/service.ts", + "deploy": "npx cdk --app src/aws-stack.ts deploy" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@aws-sdk/client-athena": "^3.470.0", + "@restatedev/restate-sdk": "^0.5.1", + "@types/uuid": "^9.0.7", + "axios-retry": "^4.0.0", + "typescript": "^5.3.3" + }, + "devDependencies": { + "@aws-cdk/aws-glue-alpha": "^2.115.0-alpha.0", + "aws-cdk-lib": "^2.115.0", + "cdk": "^2.115.0", + "constructs": "^10.3.0", + "prettier": "^3.1.1", + "ts-node-dev": "^2.0.0" + } +} diff --git a/typescript/promisify-anything/src/aws-stack.ts b/typescript/promisify-anything/src/aws-stack.ts new file mode 100755 index 00000000..3ac99bdd --- /dev/null +++ b/typescript/promisify-anything/src/aws-stack.ts @@ -0,0 +1,78 @@ +#!/usr/bin/env npx ts-node + +import * as cdk from "aws-cdk-lib"; +import * as athena from "aws-cdk-lib/aws-athena"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as glue from "@aws-cdk/aws-glue-alpha"; +import { Construct } from "constructs"; + +class AthenaTableStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + // We'll use this bucket for both the source data and Athena results output + const bucket = new s3.Bucket(this, "DataBucket", { + removalPolicy: cdk.RemovalPolicy.DESTROY, + }); + + const database = new glue.Database(this, "DB", { + databaseName: "demo_db", + }); + + const table = new glue.S3Table(this, "Table", { + bucket, + tableName: "table", + s3Prefix: "data/", + database: database, + columns: [ + { name: "id", type: glue.Schema.STRING }, + { name: "date", type: glue.Schema.DATE }, + { name: "value", type: glue.Schema.DOUBLE }, + ], + dataFormat: glue.DataFormat.JSON, + }); + + const workgroup = new athena.CfnWorkGroup(this, "Workgroup", { + name: "demo-workgroup", + recursiveDeleteOption: true, + state: "ENABLED", + workGroupConfiguration: { + enforceWorkGroupConfiguration: true, + publishCloudWatchMetricsEnabled: true, + resultConfiguration: { + encryptionConfiguration: { + encryptionOption: "SSE_S3", + }, + outputLocation: `s3://${bucket.bucketName}/results/`, + }, + }, + }); + + const dbAccessRole = new iam.Role(this, "DemoDbAccess", { + assumedBy: new iam.ArnPrincipal( + "arn:aws:sts::663487780041:assumed-role/AWSReservedSSO_EngineerAccess_d82d10a8890c4e29/pavel", + ), + }); + bucket.grantRead(dbAccessRole); + bucket.grantWrite(dbAccessRole, "data/*"); + table.grantRead(dbAccessRole); + + dbAccessRole.addToPolicy( + new iam.PolicyStatement({ + actions: ["athena:*", "glue:*", "datalake:*"], + resources: ["*"], + }), + ); + + new cdk.CfnOutput(this, "BucketName", { + value: bucket.bucketName, + }); + new cdk.CfnOutput(this, "DemoRoleArn", { + value: dbAccessRole.roleArn, + }); + } +} + +const app = new cdk.App(); +new AthenaTableStack(app, "AthenaTableStack"); diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts new file mode 100644 index 00000000..84c0f584 --- /dev/null +++ b/typescript/promisify-anything/src/client.ts @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2023 - Restate Software, Inc., Restate GmbH + * + * This file is part of the Tour of Restate Typescript handler API, + * which is released under the MIT license. + * + * You can find a copy of the license in the file LICENSE + * in the root directory of this repository or package or at + * https://github.com/restatedev/tour-of-restate-typescript + */ + +import axios, { AxiosResponse } from "axios"; +import axiosRetry from "axios-retry"; + +axiosRetry(axios, { + retries: Infinity, + retryCondition: () => true, // requests are explicitly idempotent, retry on any error + shouldResetTimeout: true, // the timeout set is per request, not for the overall interaction + retryDelay: (retryCount, error) => { + const delay = axiosRetry.exponentialDelay(retryCount, error, 100); + console.log(`Attempt #${retryCount} failed with ${error}. Backing off for ${delay}ms...`); + return delay; + }, +}); + +const query = async (idempotencyKey: string, input: string): Promise => { + const url = "http://localhost:8080/query/query"; + const timeout = 500; // short .5s timeout to demonstrate retries + console.log(`Starting query with idempotency key: ${idempotencyKey} ...`); + + let response = await axios.post( + url, + { + request: input, + }, + { + headers: { + "Content-Type": "application/json", + "idempotency-key": idempotencyKey, + }, + timeout, + }, + ); + + console.log(`Query finished with status: ${response.status}.`); + return response; +}; + +const idempotencyKey = () => { + return process.env["IDEMPOTENCY_KEY"] || Math.random().toString(36).substring(2); +}; + +(async () => { + const result = await query(idempotencyKey(), "foo"); + console.log({ status: "SUCCESS", result: result.data }); +})(); diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts new file mode 100644 index 00000000..bdb67238 --- /dev/null +++ b/typescript/promisify-anything/src/service.ts @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2023 - Restate Software, Inc., Restate GmbH + * + * This file is part of the Tour of Restate Typescript handler API, + * which is released under the MIT license. + * + * You can find a copy of the license in the file LICENSE + * in the root directory of this repository or package or at + * https://github.com/restatedev/tour-of-restate-typescript + */ + +import * as restate from "@restatedev/restate-sdk"; +import * as athena from "@aws-sdk/client-athena"; + +export const publicApi: restate.ServiceApi = { + path: "query", +}; +export const internalApi: restate.ServiceApi = { + path: "internal", +}; + +// Public API implementation + +const query = async (ctx: restate.RpcContext, param: string) => { + const uniqueId = ctx.rand.uuidv4(); + const awakeable = ctx.awakeable(); + + ctx.send(internalApi).query(uniqueId, { + awakeableId: awakeable.id, + query: param, + }); + + return await awakeable.promise; +}; + +export const queryRouter = restate.router({ + query, +}); + +// Internal API implementation + +const client = new athena.AthenaClient({}); + +type QueryRequest = { + awakeableId: string; + query: string; +}; + +const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { + console.log("Starting query: " + request + " with id: " + requestId); + + // If you want to test the promise integration without actually calling Athena, you can just uncomment this instead: + // await ctx.sleep(5000); + // ctx.resolveAwakeable(request.awakeableId, { result: "foo", _id: requestId }); + // return; + + let executionId: string; + try { + executionId = (await ctx.sideEffect(async () => { + const startQueryResult = await client.send( + new athena.StartQueryExecutionCommand({ + QueryString: 'SELECT * FROM "demo_db"."table" limit 10;', + WorkGroup: "demo-workgroup", + ClientRequestToken: requestId, + }), + ); + return startQueryResult.QueryExecutionId; + })) as string; + } catch (err) { + throw new restate.TerminalError("Unable to start query", { cause: err }); + } + + const results = await ctx.sideEffect(async () => { + return await client.send( + new athena.GetQueryResultsCommand({ + QueryExecutionId: executionId, + }), + ); + }); + + ctx.resolveAwakeable(request.awakeableId, { result: results.ResultSet, _id: results.$metadata.requestId }); +}; + +export const internalAthenaApiRouter = restate.keyedRouter({ + query: queryInternal, +}); + +restate + .createServer() + .bindRouter(publicApi.path, queryRouter) + .bindKeyedRouter(internalApi.path, internalAthenaApiRouter) + .listen(9080); diff --git a/typescript/promisify-anything/tsconfig.json b/typescript/promisify-anything/tsconfig.json new file mode 100644 index 00000000..cf07910f --- /dev/null +++ b/typescript/promisify-anything/tsconfig.json @@ -0,0 +1,112 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */ + }, + "include": [ + "src/" + ] +} From 2d6d3caf2ef3a090e31d4125cbd0275496272107 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 16:42:12 +0200 Subject: [PATCH 02/16] Trust entire AWS account, add results prefix write access --- typescript/promisify-anything/src/aws-stack.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/typescript/promisify-anything/src/aws-stack.ts b/typescript/promisify-anything/src/aws-stack.ts index 3ac99bdd..a22f47d7 100755 --- a/typescript/promisify-anything/src/aws-stack.ts +++ b/typescript/promisify-anything/src/aws-stack.ts @@ -50,12 +50,11 @@ class AthenaTableStack extends cdk.Stack { }); const dbAccessRole = new iam.Role(this, "DemoDbAccess", { - assumedBy: new iam.ArnPrincipal( - "arn:aws:sts::663487780041:assumed-role/AWSReservedSSO_EngineerAccess_d82d10a8890c4e29/pavel", - ), + assumedBy: new iam.AccountRootPrincipal(), }); bucket.grantRead(dbAccessRole); bucket.grantWrite(dbAccessRole, "data/*"); + bucket.grantWrite(dbAccessRole, "results/*"); table.grantRead(dbAccessRole); dbAccessRole.addToPolicy( From f51c60fc98c284154eaafc9bfd754803d96ac610 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 16:42:27 +0200 Subject: [PATCH 03/16] Pass idempotency key through from CLI --- typescript/promisify-anything/src/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts index 84c0f584..82040e59 100644 --- a/typescript/promisify-anything/src/client.ts +++ b/typescript/promisify-anything/src/client.ts @@ -18,7 +18,7 @@ axiosRetry(axios, { shouldResetTimeout: true, // the timeout set is per request, not for the overall interaction retryDelay: (retryCount, error) => { const delay = axiosRetry.exponentialDelay(retryCount, error, 100); - console.log(`Attempt #${retryCount} failed with ${error}. Backing off for ${delay}ms...`); + console.log(`Attempt #${retryCount} failed with ${JSON.stringify(error)}. Backing off for ${delay}ms...`); return delay; }, }); @@ -51,6 +51,6 @@ const idempotencyKey = () => { }; (async () => { - const result = await query(idempotencyKey(), "foo"); + const result = await query(process.argv[2] ?? idempotencyKey(), "foo"); console.log({ status: "SUCCESS", result: result.data }); })(); From 54fb5f9d33b5609fa2127659c8c9238072ac8f6e Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 16:45:03 +0200 Subject: [PATCH 04/16] Update SDKs and instructions --- typescript/promisify-anything/README.md | 50 +- .../promisify-anything/package-lock.json | 1116 +++++++++-------- typescript/promisify-anything/package.json | 14 +- 3 files changed, 627 insertions(+), 553 deletions(-) diff --git a/typescript/promisify-anything/README.md b/typescript/promisify-anything/README.md index f8ff692c..5246d99c 100644 --- a/typescript/promisify-anything/README.md +++ b/typescript/promisify-anything/README.md @@ -8,8 +8,8 @@ result in a very simple promise. Using a consistent idempotency token turns this Prerequisites: -- npm, jq, curl -- Docker +- npm +- supported Restate OS environment (macOS, Linux, Docker) - [Optional] An AWS account where you can deploy a demo stack There are several components to running the example: @@ -21,12 +21,16 @@ There are several components to running the example: ### Start Restate -If you prefer, you can omit the `--rm` flag to retain the stored invocation state between container restarts. +In a separate terminal, start a Restate server: ```shell -docker run --name restate_dev --rm -p 8080:8080 -p 9070:9070 -p 9071:9071 -e RUST_LOG=info,restate=debug docker.io/restatedev/restate:latest +npx @restatedev/restate-server ``` +Note: the server keeps a persistent store of previous invocations, stored state, idempotency keys in a directory named +`target`. If you would later like to drop the stored state without needing to re-register the service deployment again, +you can relaunch the server with the `--wipe worker` flag. + ### [Optional] Deploy the AWS stack If you prefer not to deploy AWS resources, edit [service.ts](src/service.ts) and replace the Athena interactions with a @@ -38,24 +42,46 @@ demo stack: npm run deploy ``` -Note the value of the `BucketName` output. Now copy the sample data file into S3: +Next, copy the sample data file into S3: ```shell +BUCKET_NAME=$(aws cloudformation describe-stacks \ + --stack-name AthenaTableStack --query "Stacks[0].Outputs[?OutputKey=='BucketName'].OutputValue" --output text) + aws s3 cp data/sample.jsonl s3://${BUCKET_NAME}/data/ ``` +You can confirm that the file landed under the `data/` prefix using the S3 console or the CLI using +`aws s3 ls s3://${BUCKET_NAME}/data/`. + ### Start the service -Use the `DemoRoleArn` output from the stack deployment above to set the `ROLE_ARN` environment variable: +The restate service houses the Athena adapter logic and requires AWS credentials. We can use short-term credentials from +the AWS demo stack we deployed earlier. If you've commented out the AWS SDK interactions, you can directly start the +service. + +```shell +ROLE_ARN=$(aws cloudformation describe-stacks \ + --stack-name AthenaTableStack --query "Stacks[0].Outputs[?OutputKey=='DemoRoleArn'].OutputValue" --output text) + +export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \ + $(aws sts assume-role \ + --role-arn ${ROLE_ARN} \ + --role-session-name restate-demo \ + --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ + --output text)) +``` + +If you ordinarily use an AWS credential profile with the CLI, you should unset that; you must also make sure that your +preferred region is specified: ```shell -output=$(aws sts assume-role --role-arn ${ROLE_ARN} --role-session-name restate-demo) -export AWS_ACCESS_KEY_ID=$(echo $output | jq -r '.Credentials.AccessKeyId') -export AWS_SECRET_ACCESS_KEY=$(echo $output | jq -r '.Credentials.SecretAccessKey') -export AWS_SESSION_TOKEN=$(echo $output | jq -r '.Credentials.SessionToken') +unset AWS_PROFILE +export AWS_REGION=... ``` -Now start the Restate service: +You can verify that you've obtained the correct short-term credentials using `aws sts get-caller-identity` - this should +print out the ARN of the "DemoDbAccess" role. Now start the Restate service: ```shell npm run service @@ -64,7 +90,7 @@ npm run service Register the service with Restate - you only need to do this once: ```shell -curl -X POST http://localhost:9070/endpoints -H 'content-type: application/json' -d '{"uri": "http://host.docker.internal:9080"}' +npx @restatedev/restate deployments register --yes localhost:9080 ``` ### Run the client diff --git a/typescript/promisify-anything/package-lock.json b/typescript/promisify-anything/package-lock.json index b8d2f3c3..c5f5c31e 100644 --- a/typescript/promisify-anything/package-lock.json +++ b/typescript/promisify-anything/package-lock.json @@ -1,26 +1,26 @@ { "name": "promisify-anything", - "version": "1.0.0", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "promisify-anything", - "version": "1.0.0", + "version": "0.1.0", "license": "ISC", "dependencies": { - "@aws-sdk/client-athena": "^3.470.0", - "@restatedev/restate-sdk": "^0.5.1", + "@aws-sdk/client-athena": "^3.495.0", + "@restatedev/restate-sdk": "^0.7.0", "@types/uuid": "^9.0.7", "axios-retry": "^4.0.0", "typescript": "^5.3.3" }, "devDependencies": { - "@aws-cdk/aws-glue-alpha": "^2.115.0-alpha.0", - "aws-cdk-lib": "^2.115.0", - "cdk": "^2.115.0", + "@aws-cdk/aws-glue-alpha": "^2.122.0-alpha.0", + "aws-cdk-lib": "^2.121.1", + "cdk": "^2.121.1", "constructs": "^10.3.0", - "prettier": "^3.1.1", + "prettier": "^3.2.4", "ts-node-dev": "^2.0.0" } }, @@ -43,15 +43,15 @@ "dev": true }, "node_modules/@aws-cdk/aws-glue-alpha": { - "version": "2.115.0-alpha.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.115.0-alpha.0.tgz", - "integrity": "sha512-PJi9rJ/sJNq6ECyYfpS9vclQGkoi6nb5XiPaTqwUzq2A7Uhqw4O7EAC/YkSBSdc9FJGOWm7uCU9/O72/9qKZ+A==", + "version": "2.122.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-glue-alpha/-/aws-glue-alpha-2.122.0-alpha.0.tgz", + "integrity": "sha512-RMDv352PsT79JoPYtqpW7p1NZSun80t0Aoc9wmUyPqI0+059lyoJu+LJWHYDO0C3R6u13JdKCsBGbp3ttI0vog==", "dev": true, "engines": { "node": ">= 14.15.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.115.0", + "aws-cdk-lib": "^2.122.0", "constructs": "^10.0.0" } }, @@ -147,48 +147,49 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-athena": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.470.0.tgz", - "integrity": "sha512-ZOwgHyF4VfNUczOeEEJcCUt83qRNtGy+RFBePrQu3G4ybyVSSrRrnfHlWd2+hcEc9zxx3bgLmK7kIsv8E1rJvQ==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.495.0.tgz", + "integrity": "sha512-ngFIoQtazxSuyo5i8LScfpQwO4xvdZqSeyx2reXQcJVeuUVV69LkCnfmRiHbwDhwgN3kNgTvPSkW7ZH/e8A+tg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.470.0", - "@aws-sdk/core": "3.468.0", - "@aws-sdk/credential-provider-node": "3.470.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-signing": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.470.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.470.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", + "@aws-sdk/client-sts": "3.495.0", + "@aws-sdk/core": "3.495.0", + "@aws-sdk/credential-provider-node": "3.495.0", + "@aws-sdk/middleware-host-header": "3.495.0", + "@aws-sdk/middleware-logger": "3.495.0", + "@aws-sdk/middleware-recursion-detection": "3.495.0", + "@aws-sdk/middleware-signing": "3.495.0", + "@aws-sdk/middleware-user-agent": "3.495.0", + "@aws-sdk/region-config-resolver": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@aws-sdk/util-endpoints": "3.495.0", + "@aws-sdk/util-user-agent-browser": "3.495.0", + "@aws-sdk/util-user-agent-node": "3.495.0", + "@smithy/config-resolver": "^2.1.0", + "@smithy/core": "^1.3.0", + "@smithy/fetch-http-handler": "^2.4.0", + "@smithy/hash-node": "^2.1.0", + "@smithy/invalid-dependency": "^2.1.0", + "@smithy/middleware-content-length": "^2.1.0", + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-retry": "^2.1.0", + "@smithy/middleware-serde": "^2.1.0", + "@smithy/middleware-stack": "^2.1.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/node-http-handler": "^2.3.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", + "@smithy/util-base64": "^2.1.0", + "@smithy/util-body-length-browser": "^2.1.0", + "@smithy/util-body-length-node": "^2.2.0", + "@smithy/util-defaults-mode-browser": "^2.1.0", + "@smithy/util-defaults-mode-node": "^2.1.0", + "@smithy/util-endpoints": "^1.1.0", + "@smithy/util-retry": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -197,45 +198,46 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.470.0.tgz", - "integrity": "sha512-iMXqdXuypE3OK0rggbvSz7vBGlLDG418dNidHhdaeLluMTG/GfHbh1fLOlavhYxRwrsPrtYvFiVkxXFGzXva4w==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.495.0.tgz", + "integrity": "sha512-Uerh3aDe/JeQNjcyXKI+8VuKPOAB6mCUKlScD0AIca1Kdyk8PsQTq4rDzFCYAQsNS5/BuPN+Ak0NqwsJM0agYA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.468.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.470.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.470.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", + "@aws-sdk/core": "3.495.0", + "@aws-sdk/middleware-host-header": "3.495.0", + "@aws-sdk/middleware-logger": "3.495.0", + "@aws-sdk/middleware-recursion-detection": "3.495.0", + "@aws-sdk/middleware-user-agent": "3.495.0", + "@aws-sdk/region-config-resolver": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@aws-sdk/util-endpoints": "3.495.0", + "@aws-sdk/util-user-agent-browser": "3.495.0", + "@aws-sdk/util-user-agent-node": "3.495.0", + "@smithy/config-resolver": "^2.1.0", + "@smithy/core": "^1.3.0", + "@smithy/fetch-http-handler": "^2.4.0", + "@smithy/hash-node": "^2.1.0", + "@smithy/invalid-dependency": "^2.1.0", + "@smithy/middleware-content-length": "^2.1.0", + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-retry": "^2.1.0", + "@smithy/middleware-serde": "^2.1.0", + "@smithy/middleware-stack": "^2.1.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/node-http-handler": "^2.3.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", + "@smithy/util-base64": "^2.1.0", + "@smithy/util-body-length-browser": "^2.1.0", + "@smithy/util-body-length-node": "^2.2.0", + "@smithy/util-defaults-mode-browser": "^2.1.0", + "@smithy/util-defaults-mode-node": "^2.1.0", + "@smithy/util-endpoints": "^1.1.0", + "@smithy/util-retry": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -243,48 +245,48 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.470.0.tgz", - "integrity": "sha512-TP3A4t8FoFEQinm6axxduTUnlMMLpmLi4Sf00JTI2CszxLUFh/JyUhYQ5gSOoXgPFmfwVXUNKCtmR3jdP0ZGPw==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.495.0.tgz", + "integrity": "sha512-lXQIx7D1MQ5+F8PaSYV7UiSxgP9M5ba/YFx1rcxi5l1GlbAWuHWhrk15qKe9d6vLxa2eTjJFiVzbO7pJqRBEWw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.468.0", - "@aws-sdk/credential-provider-node": "3.470.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-sdk-sts": "3.468.0", - "@aws-sdk/middleware-signing": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.470.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.470.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", + "@aws-sdk/core": "3.495.0", + "@aws-sdk/credential-provider-node": "3.495.0", + "@aws-sdk/middleware-host-header": "3.495.0", + "@aws-sdk/middleware-logger": "3.495.0", + "@aws-sdk/middleware-recursion-detection": "3.495.0", + "@aws-sdk/middleware-user-agent": "3.495.0", + "@aws-sdk/region-config-resolver": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@aws-sdk/util-endpoints": "3.495.0", + "@aws-sdk/util-user-agent-browser": "3.495.0", + "@aws-sdk/util-user-agent-node": "3.495.0", + "@smithy/config-resolver": "^2.1.0", + "@smithy/core": "^1.3.0", + "@smithy/fetch-http-handler": "^2.4.0", + "@smithy/hash-node": "^2.1.0", + "@smithy/invalid-dependency": "^2.1.0", + "@smithy/middleware-content-length": "^2.1.0", + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-retry": "^2.1.0", + "@smithy/middleware-serde": "^2.1.0", + "@smithy/middleware-stack": "^2.1.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/node-http-handler": "^2.3.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", + "@smithy/util-base64": "^2.1.0", + "@smithy/util-body-length-browser": "^2.1.0", + "@smithy/util-body-length-node": "^2.2.0", + "@smithy/util-defaults-mode-browser": "^2.1.0", + "@smithy/util-defaults-mode-node": "^2.1.0", + "@smithy/util-endpoints": "^1.1.0", + "@smithy/util-middleware": "^2.1.0", + "@smithy/util-retry": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -293,11 +295,15 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.468.0.tgz", - "integrity": "sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ==", - "dependencies": { - "@smithy/smithy-client": "^2.1.18", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.495.0.tgz", + "integrity": "sha512-TI/jq1cSUR+r1prJ9xXtxMO0u2/jXrWjf3Z2ekForsCObPtR9qkJCYyezargupoSJqZA60KUpOhxrKW/dFJ1rw==", + "dependencies": { + "@smithy/core": "^1.3.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/signature-v4": "^2.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -305,13 +311,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", - "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.495.0.tgz", + "integrity": "sha512-2CKlHiQRXyVA7t3VGXo39a/UwRrZs/VG0jYZFu60dK9afxesRkA4XOJto765VenT/eR3LkeVW+RBzOISHUFg0Q==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -319,19 +325,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.470.0.tgz", - "integrity": "sha512-eF22iPO6J2jY+LbuTv5dW0hZBmi6ksRDFFd/zT6TLasrzH2Ex+gAfN3c7rFHF+XAubL0JXFUKFA3UAwoZpO9Zg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.470.0", - "@aws-sdk/credential-provider-web-identity": "3.468.0", - "@aws-sdk/types": "3.468.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.7.0", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.495.0.tgz", + "integrity": "sha512-DGRfND+FIacuQQNozMa8fS4yUrWZgkB6CEH4ghiqUvtE7h2sGMMVEerlaCGgTnQlpWWvDS656orzwEO3vuMTVw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.495.0", + "@aws-sdk/credential-provider-process": "3.495.0", + "@aws-sdk/credential-provider-sso": "3.495.0", + "@aws-sdk/credential-provider-web-identity": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@smithy/credential-provider-imds": "^2.2.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -339,20 +345,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.470.0.tgz", - "integrity": "sha512-paySXwzGxBVU+2cVUkRIXafKhYhtO2fJJ3MotR6euvRONK/dta+bhEc5Z4QnTo/gNLoELK/QUC0EGoF+oPfk8g==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-ini": "3.470.0", - "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.470.0", - "@aws-sdk/credential-provider-web-identity": "3.468.0", - "@aws-sdk/types": "3.468.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.7.0", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.495.0.tgz", + "integrity": "sha512-OH3lV7erPLNxkZQ+QBEgX353mseelBaHutyJNFKdgCYMZUhENu2DNTvkasGtwA24TqG0sRiuO2yNhpqP8IF+LA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.495.0", + "@aws-sdk/credential-provider-ini": "3.495.0", + "@aws-sdk/credential-provider-process": "3.495.0", + "@aws-sdk/credential-provider-sso": "3.495.0", + "@aws-sdk/credential-provider-web-identity": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@smithy/credential-provider-imds": "^2.2.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -360,14 +366,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", - "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.495.0.tgz", + "integrity": "sha512-AouHJtg5qXeqzlY5plqbBkQPea1Kd3/tz9wfN+d5gbTUsDBlV7R6IinzhJWWgniS0jsaEOronlCXLIEOWUzTsw==", + "dependencies": { + "@aws-sdk/types": "3.495.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -375,16 +381,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.470.0.tgz", - "integrity": "sha512-biGDSh9S9KDR9Tl/8cCPn9g5KPNkXg/CIJIOk3X+6valktbJ2UVYBzi0ZX4vZiudt5ry/Hsu6Pgo+KN1AmBWdg==", - "dependencies": { - "@aws-sdk/client-sso": "3.470.0", - "@aws-sdk/token-providers": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.495.0.tgz", + "integrity": "sha512-brbgLtws+jmBPm6FrQ0CT2mHCgFKdopwxJj/4+j//OH0aAgzBH5gOztoDu1R556KU9K8Co220J79gJWV3s40zQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.495.0", + "@aws-sdk/token-providers": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -392,13 +398,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", - "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.495.0.tgz", + "integrity": "sha512-w4S01mdQZ8kQn4J6CM2Fgral9xtNBh8h5i4DWSOwFxfiokott59zDoFMWJRUdUHzXsnAGULC8+wJ4VeiZZBq1Q==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -406,13 +412,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", - "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.495.0.tgz", + "integrity": "sha512-qqE6mVxbyJwn59NQMvtYyaZT3GEZnmsvBUry3sDtU7Be1g9w5OKhY4CnAAQyXZI288iQUtyxxDh+hnSLy6RFjA==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -420,12 +426,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", - "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.495.0.tgz", + "integrity": "sha512-sgmr9fpCSg3rFvMnvfKeN7dhY+AmUpZPPWyc+s1kgQONeLUUxQkbdqR2/V+tz2ZPxUBD2dToTG/JhtMcIKmt4Q==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -433,27 +439,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", - "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.495.0.tgz", + "integrity": "sha512-jhuOcLsMrHengJy/oz6Waumwx/vtSMKnEbROR7qZ7CaTDHRUbriPYXGen7CHCs/6aWN0UeI3JBAqwlnSW5tpIg==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz", - "integrity": "sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg==", - "dependencies": { - "@aws-sdk/middleware-signing": "3.468.0", - "@aws-sdk/types": "3.468.0", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -461,16 +453,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", - "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.495.0.tgz", + "integrity": "sha512-QZuWRo6JQ7UKeHzqqnP/qmUXirVKXSMXSEFtpOHio/JkQPASVlD1TNs5L6RL7dKrnqLrg/jpTiw4b0UdAU8kOw==", + "dependencies": { + "@aws-sdk/types": "3.495.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/signature-v4": "^2.1.0", + "@smithy/types": "^2.9.0", + "@smithy/util-middleware": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -478,14 +470,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz", - "integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.470.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.495.0.tgz", + "integrity": "sha512-n+lC43Z7+LyAF7b63bR+e5pBmBqPaqh4gupEmrORc4wKsX7U4OncDPiVn5jPD7ZC3IZbLeTuDsjQOK8Ev+Hraw==", + "dependencies": { + "@aws-sdk/types": "3.495.0", + "@aws-sdk/util-endpoints": "3.495.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -493,14 +485,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", - "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.495.0.tgz", + "integrity": "sha512-ZgixNb+8dWUvc42Uso2fh38U7W7wW4OESUmQIFQzYW58B1ylZ4xuq/mo0xSY5b5j6u/+pJadvlIpx/QYBafVHg==", + "dependencies": { + "@aws-sdk/types": "3.495.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/types": "^2.9.0", + "@smithy/util-config-provider": "^2.2.0", + "@smithy/util-middleware": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -508,46 +501,46 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz", - "integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.495.0.tgz", + "integrity": "sha512-1JSEx82FMKNNtPoV5NRpFxi0XHgfvonCKb4+2lR/k4nljqeysZPnOaIW/7C1eAwhoJ6buEIVxoHscemBtdKo+A==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.470.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.470.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", + "@aws-sdk/middleware-host-header": "3.495.0", + "@aws-sdk/middleware-logger": "3.495.0", + "@aws-sdk/middleware-recursion-detection": "3.495.0", + "@aws-sdk/middleware-user-agent": "3.495.0", + "@aws-sdk/region-config-resolver": "3.495.0", + "@aws-sdk/types": "3.495.0", + "@aws-sdk/util-endpoints": "3.495.0", + "@aws-sdk/util-user-agent-browser": "3.495.0", + "@aws-sdk/util-user-agent-node": "3.495.0", + "@smithy/config-resolver": "^2.1.0", + "@smithy/fetch-http-handler": "^2.4.0", + "@smithy/hash-node": "^2.1.0", + "@smithy/invalid-dependency": "^2.1.0", + "@smithy/middleware-content-length": "^2.1.0", + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-retry": "^2.1.0", + "@smithy/middleware-serde": "^2.1.0", + "@smithy/middleware-stack": "^2.1.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/node-http-handler": "^2.3.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", + "@smithy/util-base64": "^2.1.0", + "@smithy/util-body-length-browser": "^2.1.0", + "@smithy/util-body-length-node": "^2.2.0", + "@smithy/util-defaults-mode-browser": "^2.1.0", + "@smithy/util-defaults-mode-node": "^2.1.0", + "@smithy/util-endpoints": "^1.1.0", + "@smithy/util-retry": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -555,11 +548,11 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", - "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.495.0.tgz", + "integrity": "sha512-KUpo2U1rD4U6gT1QNPUJGmbQnruvIJmPeuyKndil6h2zkCpG5I0AHE8ixpfuBbizIZQOIA/26pArQivDChOD9A==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -567,12 +560,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz", - "integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.495.0.tgz", + "integrity": "sha512-pMJ6rb16y51I4G33xtinkXAXH/2mQ0WZCwoh1sNkCM2MUfZDw9zAyP+PvB2tpEytQX8Fc7bR4qIP+td+pPEXAg==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/util-endpoints": "^1.0.7", + "@aws-sdk/types": "3.495.0", + "@smithy/types": "^2.9.0", + "@smithy/util-endpoints": "^1.1.0", "tslib": "^2.5.0" }, "engines": { @@ -580,9 +574,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.465.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz", - "integrity": "sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz", + "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==", "dependencies": { "tslib": "^2.5.0" }, @@ -591,24 +585,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", - "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.495.0.tgz", + "integrity": "sha512-CIlY54aKahUqF4kygbMkDkFRc9t+8Km/r+IWapy91h0Exy84V+S47MJdAelsMg8Id6hZ47jWmuuzz5UcjU/+sQ==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/types": "^2.9.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", - "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.495.0.tgz", + "integrity": "sha512-BbEwwh9SCtMrcNES0u4q5/8BjAKkOiHGia0gDSlQHOmEzXxYvhx0ByRMaPeprL06iESFa6HcleJWenWktfxk3g==", "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", + "@aws-sdk/types": "3.495.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -723,9 +717,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@restatedev/restate-sdk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-0.5.1.tgz", - "integrity": "sha512-eh+VohwJK5c2e10gQWkW21F1CefIVJpoQnoPbWAGUm7WYDeDZYOKiKhzK3/DKWn42c1PH4a2oeEvHmvDXU42zA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@restatedev/restate-sdk/-/restate-sdk-0.7.0.tgz", + "integrity": "sha512-Pxmhxq5Lfom9v9r8vEbBz3KxCVjgknt6Ej6hAsBDBg/s4jawesSdqh1rySLdqy5q0Zo0+P9YpVQtf7Q1r1FoDw==", "dependencies": { "protobufjs": "^7.2.2", "ts-proto": "^1.140.0" @@ -735,11 +729,11 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.15.tgz", - "integrity": "sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.0.tgz", + "integrity": "sha512-fyPlWpzXyKzDVRRMUbsfH7AV/2xX+dyZ5RqeEo6Hjz9YUvDMGVSnm88iHH0zqZ+XmH4+sH4+mhwRL76HXX65uw==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -747,14 +741,32 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.21.tgz", - "integrity": "sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA==", - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.0.tgz", + "integrity": "sha512-NcR1Hw2uZgwHT7/KFsQH76YHb/mNGLFu+hS0ODnoFUpViE8ddIVOXm/8sgwdh0QvFPtWGzPn0Wcp19Cm31wv2A==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.0", + "@smithy/types": "^2.9.0", + "@smithy/util-config-provider": "^2.2.0", + "@smithy/util-middleware": "^2.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.0.tgz", + "integrity": "sha512-XoU9eiICwhxZIyAdugijyD/YqsumDQ3FgGyFSJibO60qoUkdfMGSjnIvrTemjFBdnDsj4B26F/ZRxSR3PUJbJQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-retry": "^2.1.0", + "@smithy/middleware-serde": "^2.1.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/util-middleware": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -762,14 +774,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz", - "integrity": "sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A==", - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.0.tgz", + "integrity": "sha512-uqoRizHR8rKih6SuWcJRSv46tdqZk1zPEk6r909O87XO85j21MfUcxRKzbkORM2JOlaFhCH4geRcvlvYfK6EyQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -777,36 +789,36 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz", - "integrity": "sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.0.tgz", + "integrity": "sha512-1yQnf8bSycsZ5ICXVMf8pEj1DQSUsw6/3H4nEdzH2+E3RZdNGPjVecQEm9kWPW7fvXvNvzT8MvZOQdk1IWoVTg==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/types": "^2.9.0", + "@smithy/util-hex-encoding": "^2.1.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz", - "integrity": "sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ==", - "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", - "@smithy/util-base64": "^2.0.1", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.0.tgz", + "integrity": "sha512-fLhPNfbWG8vTcS9PsR1wjHaA54kDcSiAZKVuVAfjHleS7QDWjrCr1SDUqCB2yAc9NBLe2lIDbDL8+i9yoYhxoQ==", + "dependencies": { + "@smithy/protocol-http": "^3.1.0", + "@smithy/querystring-builder": "^2.1.0", + "@smithy/types": "^2.9.0", + "@smithy/util-base64": "^2.1.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.17.tgz", - "integrity": "sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.0.tgz", + "integrity": "sha512-/B7b6NNjw+i4PlwsrYHmxmmrTxp2oRejgZH26HhXE77XWwAiPEI9iHu7GZR9fYhm7Fsj66Z9Bk6JA9aEvUC9/w==", "dependencies": { - "@smithy/types": "^2.7.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", + "@smithy/types": "^2.9.0", + "@smithy/util-buffer-from": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -814,18 +826,18 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz", - "integrity": "sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.0.tgz", + "integrity": "sha512-hvryGI0KChV4jMgK/kwr6U4/HaYldzjiQAZ+c//QAMDoCp0KkP0Xt94XqAkr7Uq08577mAMW5U70YCaAx+KjSQ==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.0.tgz", + "integrity": "sha512-XnQvn/6ie5kjFyeW94NqSjGGOdMuB2WnNmDWKHHLVMCR/Emu7B8pcAZX4k8H3tjDujXAQvfBrEgmPRq6FgqmZg==", "dependencies": { "tslib": "^2.5.0" }, @@ -834,12 +846,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz", - "integrity": "sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.0.tgz", + "integrity": "sha512-XYhKZPuS8nnecdx0IGGUt1Nt2/ekoVOw1zal4c0ARRaLJEw+umFLxwHUelIeBocbdOcPCeZRE6pdk35Y2T2wpw==", "dependencies": { - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -847,16 +859,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz", - "integrity": "sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ==", - "dependencies": { - "@smithy/middleware-serde": "^2.0.15", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-middleware": "^2.0.8", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.0.tgz", + "integrity": "sha512-GMebLCihCxIlbPdA/l6WDpNJppIgW5OeTJkIAbqVArg1vFxZ92XhW+UwN12av5OAXswySGJ80/fpDFP7HmSyYg==", + "dependencies": { + "@smithy/middleware-serde": "^2.1.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/url-parser": "^2.1.0", + "@smithy/util-middleware": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -864,17 +876,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.24", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz", - "integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==", - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/protocol-http": "^3.0.11", - "@smithy/service-error-classification": "^2.0.8", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-retry": "^2.0.8", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.0.tgz", + "integrity": "sha512-lGEVds90hFyIAvypH58rwC6j9mrCR2ZwYbcxow7AgW6sWCCoBppz5FtLpgSg6QV/CTRh8K7w4kxGVx8LqINQBg==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/service-error-classification": "^2.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/util-middleware": "^2.1.0", + "@smithy/util-retry": "^2.1.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -883,11 +895,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz", - "integrity": "sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.0.tgz", + "integrity": "sha512-iysAUIDKsc354HMnYVQxMJEzNaOrQQvE86b1oSl2fRwcFqn+9TTi028a37PLFE+ccAiyVGjBjB8PBsAz9plUug==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -895,11 +907,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz", - "integrity": "sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.0.tgz", + "integrity": "sha512-y5Ph/TWfO7oTfxNqKU+uAK5cFRTYeP16ReOmDweq+zQ8NQODDg7LSxsfQT4Wp0mhIvm0bt3pZp66T1YMtnihWw==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -907,13 +919,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz", - "integrity": "sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.0.tgz", + "integrity": "sha512-rU82PFR32Bxo4EMGUJ2BGG+K97zUp9j6SWjG83T2itmbXwA/+DoCc4xCON8kcmdej822x1yLcSzFiTeg0b472w==", "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/shared-ini-file-loader": "^2.2.7", - "@smithy/types": "^2.7.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/shared-ini-file-loader": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -921,14 +933,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz", - "integrity": "sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw==", - "dependencies": { - "@smithy/abort-controller": "^2.0.15", - "@smithy/protocol-http": "^3.0.11", - "@smithy/querystring-builder": "^2.0.15", - "@smithy/types": "^2.7.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.0.tgz", + "integrity": "sha512-8jcQaOdrD/X0VihhM2W/KtJ5fvKaT8UpNf/pl/epvLQ6MkAttIMaCLex6xk31BpFSPvS2+q65ZdBBjQ3cMOSiA==", + "dependencies": { + "@smithy/abort-controller": "^2.1.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/querystring-builder": "^2.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -936,11 +948,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.16.tgz", - "integrity": "sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.0.tgz", + "integrity": "sha512-6cpCSsgwbKHnl567SrthpqLgZ7e5jc7qPHG6wz9U2T24vcUp2yiG0vdAlH1QdTH20+/PGamKR0ZM35a08X1Tbg==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -948,11 +960,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.11.tgz", - "integrity": "sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.0.tgz", + "integrity": "sha512-CGNzkKza1yUga7sv+U4gx3jbwSh5x42/9vy0E/NoR2HTFken2MuMc/bClxXAO0Z6EQoTYHHA6FMCREXwSP04lg==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -960,12 +972,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz", - "integrity": "sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.0.tgz", + "integrity": "sha512-8QColSkqn9TbvpX40zW0T8IrKcLXg7Um4bczm9qIYDRPh8T873WNIOWzYBw8chI8SWizMXbsSR95PFCP/YlgYw==", "dependencies": { - "@smithy/types": "^2.7.0", - "@smithy/util-uri-escape": "^2.0.0", + "@smithy/types": "^2.9.0", + "@smithy/util-uri-escape": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -973,11 +985,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz", - "integrity": "sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.0.tgz", + "integrity": "sha512-+l17LQQxelslo5CHsLXwSw2F1J6Qmf64OgByreNnLR82gHkJ91ZbMFhxZeLTo2qXxEu0uqraMc4uNw8qE9A6bw==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -985,22 +997,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz", - "integrity": "sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.0.tgz", + "integrity": "sha512-yBMJk4IfYqUxsPmc8P0YtWHd/Kbd0PP+kU0dgFksH6eiE2ZQJl7478xNtkUKp2QJLcooYEbA3gBFUza6ukXMiA==", "dependencies": { - "@smithy/types": "^2.7.0" + "@smithy/types": "^2.9.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz", - "integrity": "sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.0.tgz", + "integrity": "sha512-jgm7cjj0d08jIB9cp4idtpIUY590Twecv4xpijgl2IzkrPfBddzKTH4Zk+Zwfyk8ecz2T/7ihqtnNcq7Qdj9lw==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -1008,17 +1020,17 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.17.tgz", - "integrity": "sha512-ru5IUbHUAYgJ5ZqZaBi6PEsMjFT/do0Eu21Qt7b07NuRuPlwAMhlqNRDy/KE9QAF20ygehb+xe9ebmyZ26/BSA==", - "dependencies": { - "@smithy/eventstream-codec": "^2.0.15", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.0.tgz", + "integrity": "sha512-ONi89MBjxNtl497obaO/qGixsOedikTV3CAj3ZBPGY3IKykS8wQ2Wkctsx2T1J5B9OnynH0KuGGmgG91utX/7w==", + "dependencies": { + "@smithy/eventstream-codec": "^2.1.0", + "@smithy/is-array-buffer": "^2.1.0", + "@smithy/types": "^2.9.0", + "@smithy/util-hex-encoding": "^2.1.0", + "@smithy/util-middleware": "^2.1.0", + "@smithy/util-uri-escape": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1026,13 +1038,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz", - "integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==", - "dependencies": { - "@smithy/middleware-stack": "^2.0.9", - "@smithy/types": "^2.7.0", - "@smithy/util-stream": "^2.0.23", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.0.tgz", + "integrity": "sha512-oEaLdVmHcbdK8IHQ4yE7xOYK2nSkF2xXp6nRr5NhfKB5QTKNzpNsXLiGJgfmm7j0ol1S6BhjyBhi7tZ8M0JJtg==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.0", + "@smithy/middleware-stack": "^2.1.0", + "@smithy/protocol-http": "^3.1.0", + "@smithy/types": "^2.9.0", + "@smithy/util-stream": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1040,9 +1054,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz", - "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.0.tgz", + "integrity": "sha512-ST1M87Lf2cLHRI+irEFRIHXGY08HHTAUbiRFYkmFyJdTMg3VDxkcm7DwW9/EgV3X8M6wDPrbIkx/RXONyttrQg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1051,21 +1065,21 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.15.tgz", - "integrity": "sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.0.tgz", + "integrity": "sha512-V3FMzNFCDwQNAgJdxI6Gj48qP9WAyvK59WE90hOoya3m8ey02uLDhWjZkl+505s7iTVVmJ7Mr7nKwG5vU2NIMQ==", "dependencies": { - "@smithy/querystring-parser": "^2.0.15", - "@smithy/types": "^2.7.0", + "@smithy/querystring-parser": "^2.1.0", + "@smithy/types": "^2.9.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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.0.tgz", + "integrity": "sha512-zjXlHFm7S+TEDVA3j1rWGpuNDTlTxIWDqzwIfWUENT0VqCGDAdJITd8RYVjduf3u8HWMlgALkrY6B62UTESQ5w==", "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-buffer-from": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1073,17 +1087,17 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", - "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.0.tgz", + "integrity": "sha512-fkLY8W+jXGSkymLNe9NB7u6lGflHz6w1R+a3RxLOK6UrtwU4LBLskAP5Ag/zVPUNd5tmfv3/W6cTVzk8IBJuiw==", "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.0.tgz", + "integrity": "sha512-ZLsqYH+s71y6Oc2Auws6zYI4LzsSi6N8+W+Gq7CwXaZm7QIKGiCeEunEwxo50OGAqJs0g6F9kCIwNxhlK1s4Aw==", "dependencies": { "tslib": "^2.5.0" }, @@ -1092,11 +1106,11 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.0.tgz", + "integrity": "sha512-3w7AM0moGyBmr9gMBGE7+pqG3cjboRvmMyRhpesbJoOUHO0BV1Qrk00M/wQ3EHJAQXM3dehQfFNUf7sR6nT6+Q==", "dependencies": { - "@smithy/is-array-buffer": "^2.0.0", + "@smithy/is-array-buffer": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1104,9 +1118,9 @@ } }, "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==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.0.tgz", + "integrity": "sha512-D3Gx0BWXjsn1E25ikUt0+yc8oZnViTa5IHZ1JvD9J1NyyVS4c3IgHqbG64XRverEMnhzUb0EhqMTwQTY12in+w==", "dependencies": { "tslib": "^2.5.0" }, @@ -1115,13 +1129,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz", - "integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.0.tgz", + "integrity": "sha512-zmXL4aKeBGBz02kDZdks2QfG+HGq99Tp4/ICPmu2OvSbwTOLjmlCnUrtZJTmLhX4etP3o0voOL9gFEa2PSjlJg==", "dependencies": { - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1130,16 +1144,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz", - "integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==", - "dependencies": { - "@smithy/config-resolver": "^2.0.21", - "@smithy/credential-provider-imds": "^2.1.4", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/property-provider": "^2.0.16", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.0.tgz", + "integrity": "sha512-pVBaw2fBJMjjJj+AR69xQhjzYLZ5u9azdKyaAAjR16dthdBOcnczBClBVCfhb/Moj0ivIHnaXJ5AXCdbDok94g==", + "dependencies": { + "@smithy/config-resolver": "^2.1.0", + "@smithy/credential-provider-imds": "^2.2.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/property-provider": "^2.1.0", + "@smithy/smithy-client": "^2.3.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -1147,12 +1161,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz", - "integrity": "sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.0.tgz", + "integrity": "sha512-gKzfdj5pyEOg1fVOsZVpVPRWAXbWqt9JgZdwU4cjKlJ57Fuccfk0ui5twh1TYvuJWtR2Tw3GwUmUuBM3qRWJJg==", "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", + "@smithy/node-config-provider": "^2.2.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -1160,9 +1174,9 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.0.tgz", + "integrity": "sha512-haxSIaBxn3p/lK+bEyqC32myHffacBLD61/HHzBGcG1Vo8dFTm5y0vhdR5R4wakW7H8Tr/czx+uckDOWZ1Km9Q==", "dependencies": { "tslib": "^2.5.0" }, @@ -1171,11 +1185,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.8.tgz", - "integrity": "sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.0.tgz", + "integrity": "sha512-bKfhAsdjRyGmYDsJUW5hPsL3qofgPgLPsuV+V6nNGyD/kjMobwstiIpA3ddGFT+XDwVOIUHElg7I06/wOpwKiQ==", "dependencies": { - "@smithy/types": "^2.7.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -1183,12 +1197,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.8.tgz", - "integrity": "sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.0.tgz", + "integrity": "sha512-igJw+/olhAUtocMbEMBjy8SKRTHfefS+qcgmMUVEBLFgLjqMfpc8EDVB1BebNBQ1rre5yLDbi2UHUz48eZNkPQ==", "dependencies": { - "@smithy/service-error-classification": "^2.0.8", - "@smithy/types": "^2.7.0", + "@smithy/service-error-classification": "^2.1.0", + "@smithy/types": "^2.9.0", "tslib": "^2.5.0" }, "engines": { @@ -1196,17 +1210,17 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.23.tgz", - "integrity": "sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ==", - "dependencies": { - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/types": "^2.7.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", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.0.tgz", + "integrity": "sha512-lcw9JVXLHvRawaXnfxdnGRw5pQM5c9XMEkBuMec+fIhGuPHIezqhQq7oO0jJcj0xwupJzW6HAvinktr9ozdKyg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.4.0", + "@smithy/node-http-handler": "^2.3.0", + "@smithy/types": "^2.9.0", + "@smithy/util-base64": "^2.1.0", + "@smithy/util-buffer-from": "^2.1.0", + "@smithy/util-hex-encoding": "^2.1.0", + "@smithy/util-utf8": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1214,9 +1228,9 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.0.tgz", + "integrity": "sha512-ZHYFGyF9o/MHGMGtsHfkxnn2DhGRZlDIFGNgipu4K3x8jMEVahQ+tGnlkFVMM2QrSQHCcjICbBTJ5JEgaD5+Jg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1225,11 +1239,11 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.0.tgz", + "integrity": "sha512-RnNNedYLpsNPQocMhr0nGEz0mGKdzI5dBi0h7vvmimULtBlyElgX1/hXozlkurIgx8R3bSy14/oRtmDsFClifg==", "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-buffer-from": "^2.1.0", "tslib": "^2.5.0" }, "engines": { @@ -1332,9 +1346,9 @@ "peer": true }, "node_modules/aws-cdk": { - "version": "2.115.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.115.0.tgz", - "integrity": "sha512-jf+5j+ygk/DqxLzYyjFnCOOlRgvL/fwcYhyanhpb1OEQEe1FF6NGUb1TYsnQc3Ly67qLOKkQgdeyeXgzkKoSOQ==", + "version": "2.122.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.122.0.tgz", + "integrity": "sha512-WqiVTedcuW4LjH4WqtQncliUdeDa9j9xgu3II8Qd1HmCZotbzBorYIHDvOJ+m3ovIzd9DL+hNq9PPUqxtBe0VQ==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -1347,9 +1361,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.115.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.115.0.tgz", - "integrity": "sha512-PGIwmjo9BcviKxuMfMlUCwevUjwXnaS5h8fxZOM6bN1HXCS/wIusft4tMmkiNYjPiNE1sHJbCDIbxxntCQ/7jg==", + "version": "2.122.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.122.0.tgz", + "integrity": "sha512-NBUfYk/SialvKFsvBG/Ucd7lM+BID3Uy3EEOnIBbioDpnMotm5SDaU/RUm4APS4sxzQZX1DjduD5ZUFNHnEWhQ==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -1387,11 +1401,13 @@ }, "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/aws-cdk-lib/node_modules/ajv": { "version": "8.12.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1407,6 +1423,7 @@ }, "node_modules/aws-cdk-lib/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1415,6 +1432,7 @@ }, "node_modules/aws-cdk-lib/node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1429,6 +1447,7 @@ }, "node_modules/aws-cdk-lib/node_modules/astral-regex": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1437,11 +1456,13 @@ }, "node_modules/aws-cdk-lib/node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/brace-expansion": { "version": "1.1.11", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1451,6 +1472,7 @@ }, "node_modules/aws-cdk-lib/node_modules/case": { "version": "1.6.3", + "dev": true, "inBundle": true, "license": "(MIT OR GPL-3.0-or-later)", "engines": { @@ -1459,6 +1481,7 @@ }, "node_modules/aws-cdk-lib/node_modules/color-convert": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1470,26 +1493,31 @@ }, "node_modules/aws-cdk-lib/node_modules/color-name": { "version": "1.1.4", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/concat-map": { "version": "0.0.1", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { "version": "3.1.3", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/fs-extra": { "version": "11.2.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1503,11 +1531,13 @@ }, "node_modules/aws-cdk-lib/node_modules/graceful-fs": { "version": "4.2.11", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/aws-cdk-lib/node_modules/ignore": { "version": "5.3.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1516,6 +1546,7 @@ }, "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1524,11 +1555,13 @@ }, "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/jsonfile": { "version": "6.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1540,6 +1573,7 @@ }, "node_modules/aws-cdk-lib/node_modules/jsonschema": { "version": "1.4.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1548,11 +1582,13 @@ }, "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { "version": "4.4.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/aws-cdk-lib/node_modules/lru-cache": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -1564,6 +1600,7 @@ }, "node_modules/aws-cdk-lib/node_modules/minimatch": { "version": "3.1.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -1575,6 +1612,7 @@ }, "node_modules/aws-cdk-lib/node_modules/punycode": { "version": "2.3.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1583,6 +1621,7 @@ }, "node_modules/aws-cdk-lib/node_modules/require-from-string": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1591,6 +1630,7 @@ }, "node_modules/aws-cdk-lib/node_modules/semver": { "version": "7.5.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -1605,6 +1645,7 @@ }, "node_modules/aws-cdk-lib/node_modules/slice-ansi": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1621,6 +1662,7 @@ }, "node_modules/aws-cdk-lib/node_modules/string-width": { "version": "4.2.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1634,6 +1676,7 @@ }, "node_modules/aws-cdk-lib/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -1645,6 +1688,7 @@ }, "node_modules/aws-cdk-lib/node_modules/table": { "version": "6.8.1", + "dev": true, "inBundle": true, "license": "BSD-3-Clause", "dependencies": { @@ -1660,6 +1704,7 @@ }, "node_modules/aws-cdk-lib/node_modules/universalify": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1668,6 +1713,7 @@ }, "node_modules/aws-cdk-lib/node_modules/uri-js": { "version": "4.4.1", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -1676,11 +1722,13 @@ }, "node_modules/aws-cdk-lib/node_modules/yallist": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/aws-cdk-lib/node_modules/yaml": { "version": "1.10.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -1783,12 +1831,12 @@ } }, "node_modules/cdk": { - "version": "2.115.0", - "resolved": "https://registry.npmjs.org/cdk/-/cdk-2.115.0.tgz", - "integrity": "sha512-jZQ0NkHz5Qcq+zHt4bk3S7BABlHIIZR1WwYDfAq2IIKH79qCY+OytD9P6lmJm7Lq/h9YMphoxHIJs7dg6qdPMw==", + "version": "2.122.0", + "resolved": "https://registry.npmjs.org/cdk/-/cdk-2.122.0.tgz", + "integrity": "sha512-NrUhVtaId2iYap9MzOsU6GLNCIj/SkY/p0DXxgyNt9onJ23oMNg/8p++fGIoCd86oi2IlZYq+iQj0tuP6hb4oA==", "dev": true, "dependencies": { - "aws-cdk": "2.115.0" + "aws-cdk": "2.122.0" }, "bin": { "cdk": "bin/cdk" @@ -2235,9 +2283,9 @@ } }, "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", + "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/typescript/promisify-anything/package.json b/typescript/promisify-anything/package.json index 462124b1..89e6331c 100644 --- a/typescript/promisify-anything/package.json +++ b/typescript/promisify-anything/package.json @@ -1,6 +1,6 @@ { "name": "promisify-anything", - "version": "1.0.0", + "version": "0.1.0", "description": "", "main": "index.js", "scripts": { @@ -17,18 +17,18 @@ "author": "", "license": "ISC", "dependencies": { - "@aws-sdk/client-athena": "^3.470.0", - "@restatedev/restate-sdk": "^0.5.1", + "@aws-sdk/client-athena": "^3.495.0", + "@restatedev/restate-sdk": "^0.7.0", "@types/uuid": "^9.0.7", "axios-retry": "^4.0.0", "typescript": "^5.3.3" }, "devDependencies": { - "@aws-cdk/aws-glue-alpha": "^2.115.0-alpha.0", - "aws-cdk-lib": "^2.115.0", - "cdk": "^2.115.0", + "@aws-cdk/aws-glue-alpha": "^2.122.0-alpha.0", + "aws-cdk-lib": "^2.121.1", + "cdk": "^2.121.1", "constructs": "^10.3.0", - "prettier": "^3.1.1", + "prettier": "^3.2.4", "ts-node-dev": "^2.0.0" } } From 39014ca8a21dcd120c0ad003c3738489488e490c Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 16:45:24 +0200 Subject: [PATCH 05/16] Rejecting awakeable on failed query --- typescript/promisify-anything/src/service.ts | 37 +++++++++++++------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index bdb67238..917005ac 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -21,13 +21,13 @@ export const internalApi: restate.ServiceApi = { // Public API implementation -const query = async (ctx: restate.RpcContext, param: string) => { +const query = async (ctx: restate.RpcContext, externalRequest: string) => { const uniqueId = ctx.rand.uuidv4(); const awakeable = ctx.awakeable(); ctx.send(internalApi).query(uniqueId, { awakeableId: awakeable.id, - query: param, + query: externalRequest, }); return await awakeable.promise; @@ -43,7 +43,7 @@ const client = new athena.AthenaClient({}); type QueryRequest = { awakeableId: string; - query: string; + query?: string; }; const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { @@ -59,7 +59,7 @@ const queryInternal = async (ctx: restate.RpcContext, requestId: string, request executionId = (await ctx.sideEffect(async () => { const startQueryResult = await client.send( new athena.StartQueryExecutionCommand({ - QueryString: 'SELECT * FROM "demo_db"."table" limit 10;', + QueryString: request.query ?? 'SELECT * FROM "demo_db"."table" limit 10;', WorkGroup: "demo-workgroup", ClientRequestToken: requestId, }), @@ -67,18 +67,31 @@ const queryInternal = async (ctx: restate.RpcContext, requestId: string, request return startQueryResult.QueryExecutionId; })) as string; } catch (err) { - throw new restate.TerminalError("Unable to start query", { cause: err }); + //throw new restate.TerminalError("Unable to start query: " + err); + ctx.rejectAwakeable(request.awakeableId, "Unable to start query: " + err); + return; } - const results = await ctx.sideEffect(async () => { - return await client.send( - new athena.GetQueryResultsCommand({ - QueryExecutionId: executionId, - }), - ); + const result = await ctx.sideEffect(async () => { + try { + return await client.send( + new athena.GetQueryResultsCommand({ + QueryExecutionId: executionId, + }), + ); + } catch (err) { + if (err instanceof athena.InvalidRequestException && err.message.match(/state: FAILED/)) { + return err; // side effect completes with an error result + } + throw err; // side effect will be retried + } }); - ctx.resolveAwakeable(request.awakeableId, { result: results.ResultSet, _id: results.$metadata.requestId }); + if (result instanceof athena.InvalidRequestException) { + ctx.rejectAwakeable(request.awakeableId, "Query execution failed: " + result.message); + } else { + ctx.resolveAwakeable(request.awakeableId, { result: result.ResultSet, _id: result.$metadata.requestId }); + } }; export const internalAthenaApiRouter = restate.keyedRouter({ From e334b2436df4c6feaa5a4221f3d616cd71b17fa9 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 16:57:31 +0200 Subject: [PATCH 06/16] Minor tidy up --- typescript/promisify-anything/src/service.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index 917005ac..147e2796 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -46,9 +46,9 @@ type QueryRequest = { query?: string; }; -const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { - console.log("Starting query: " + request + " with id: " + requestId); +const DEFAULT_QUERY_SQL = 'SELECT * FROM "demo_db"."table" limit 10;'; +const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { // If you want to test the promise integration without actually calling Athena, you can just uncomment this instead: // await ctx.sleep(5000); // ctx.resolveAwakeable(request.awakeableId, { result: "foo", _id: requestId }); @@ -59,7 +59,7 @@ const queryInternal = async (ctx: restate.RpcContext, requestId: string, request executionId = (await ctx.sideEffect(async () => { const startQueryResult = await client.send( new athena.StartQueryExecutionCommand({ - QueryString: request.query ?? 'SELECT * FROM "demo_db"."table" limit 10;', + QueryString: request.query ?? DEFAULT_QUERY_SQL, WorkGroup: "demo-workgroup", ClientRequestToken: requestId, }), @@ -67,7 +67,6 @@ const queryInternal = async (ctx: restate.RpcContext, requestId: string, request return startQueryResult.QueryExecutionId; })) as string; } catch (err) { - //throw new restate.TerminalError("Unable to start query: " + err); ctx.rejectAwakeable(request.awakeableId, "Unable to start query: " + err); return; } From 81b8051f39d11e75b042dac9ff29da7c6c4ef1e6 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 19:25:02 +0200 Subject: [PATCH 07/16] Update service to call GetQueryExecution explicitly --- typescript/promisify-anything/README.md | 2 +- typescript/promisify-anything/src/client.ts | 4 +- typescript/promisify-anything/src/service.ts | 80 ++++++++++---------- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/typescript/promisify-anything/README.md b/typescript/promisify-anything/README.md index 5246d99c..b4fc129d 100644 --- a/typescript/promisify-anything/README.md +++ b/typescript/promisify-anything/README.md @@ -1,4 +1,4 @@ -# Restate Promisify complex dependency example +# Promisify anything: wrap a complex dependency in a durable promise This example shows how to use Restate to promisify a complex dependency, in this case executing queries on AWS Athena. A long-polling HTTP client is set up to simulate long-polling against the Restate ingress endpoint that wraps a query's diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts index 82040e59..035ff10c 100644 --- a/typescript/promisify-anything/src/client.ts +++ b/typescript/promisify-anything/src/client.ts @@ -18,7 +18,7 @@ axiosRetry(axios, { shouldResetTimeout: true, // the timeout set is per request, not for the overall interaction retryDelay: (retryCount, error) => { const delay = axiosRetry.exponentialDelay(retryCount, error, 100); - console.log(`Attempt #${retryCount} failed with ${JSON.stringify(error)}. Backing off for ${delay}ms...`); + console.log(`Attempt #${retryCount} failed with: ${error}. Backing off for ${delay}ms...`); return delay; }, }); @@ -51,6 +51,6 @@ const idempotencyKey = () => { }; (async () => { - const result = await query(process.argv[2] ?? idempotencyKey(), "foo"); + const result = await query(process.argv[2] ?? idempotencyKey(), 'SELECT * FROM "demo_db"."table" limit 10;'); console.log({ status: "SUCCESS", result: result.data }); })(); diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index 147e2796..23f2ef7d 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -49,48 +49,38 @@ type QueryRequest = { const DEFAULT_QUERY_SQL = 'SELECT * FROM "demo_db"."table" limit 10;'; const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { - // If you want to test the promise integration without actually calling Athena, you can just uncomment this instead: - // await ctx.sleep(5000); - // ctx.resolveAwakeable(request.awakeableId, { result: "foo", _id: requestId }); - // return; - - let executionId: string; - try { - executionId = (await ctx.sideEffect(async () => { - const startQueryResult = await client.send( - new athena.StartQueryExecutionCommand({ - QueryString: request.query ?? DEFAULT_QUERY_SQL, - WorkGroup: "demo-workgroup", - ClientRequestToken: requestId, - }), - ); - return startQueryResult.QueryExecutionId; - })) as string; - } catch (err) { - ctx.rejectAwakeable(request.awakeableId, "Unable to start query: " + err); - return; + const executionId = await ctx.sideEffect(async () => { + const startQueryResult = await client.send( + new athena.StartQueryExecutionCommand({ + QueryString: request.query ?? DEFAULT_QUERY_SQL, + WorkGroup: "demo-workgroup", + ClientRequestToken: requestId, + }), + ); + return startQueryResult.QueryExecutionId as string; + }); + const queryId = { QueryExecutionId: executionId }; + + const state = await ctx.sideEffect( + async () => { + const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); + const state = response.QueryExecution?.Status?.State; + if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect + return state; + }, + { + name: "Wait for query execution to reach final state", + }, + ); + + if (state !== "SUCCEEDED") { + ctx.rejectAwakeable(request.awakeableId, "Unable to execute query"); + throw new restate.TerminalError("Unable to execute query"); } - const result = await ctx.sideEffect(async () => { - try { - return await client.send( - new athena.GetQueryResultsCommand({ - QueryExecutionId: executionId, - }), - ); - } catch (err) { - if (err instanceof athena.InvalidRequestException && err.message.match(/state: FAILED/)) { - return err; // side effect completes with an error result - } - throw err; // side effect will be retried - } - }); + const result = await ctx.sideEffect(() => client.send(new athena.GetQueryResultsCommand(queryId))); - if (result instanceof athena.InvalidRequestException) { - ctx.rejectAwakeable(request.awakeableId, "Query execution failed: " + result.message); - } else { - ctx.resolveAwakeable(request.awakeableId, { result: result.ResultSet, _id: result.$metadata.requestId }); - } + ctx.resolveAwakeable(request.awakeableId, { result: result.ResultSet, _id: result.$metadata.requestId }); }; export const internalAthenaApiRouter = restate.keyedRouter({ @@ -102,3 +92,15 @@ restate .bindRouter(publicApi.path, queryRouter) .bindKeyedRouter(internalApi.path, internalAthenaApiRouter) .listen(9080); + +function isQueryStateFinal(state: athena.QueryExecutionState): boolean { + return ["SUCCEEDED", "FAILED", "CANCELLED"].includes(state); +} + +// If you want to test the promise integration without actually calling Athena, you can replace the service definition +// above with the following simple mock instead: +// const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { +// await ctx.sleep(5000); +// ctx.resolveAwakeable(request.awakeableId, { result: "foo", _id: requestId }); +// return; +// }; From 646d486869d458618c8e28005f1effde12c7cacd Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 20:07:21 +0200 Subject: [PATCH 08/16] Rename query API request parameter --- typescript/promisify-anything/src/service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index 23f2ef7d..745352ef 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -21,13 +21,13 @@ export const internalApi: restate.ServiceApi = { // Public API implementation -const query = async (ctx: restate.RpcContext, externalRequest: string) => { +const query = async (ctx: restate.RpcContext, request: string) => { const uniqueId = ctx.rand.uuidv4(); const awakeable = ctx.awakeable(); ctx.send(internalApi).query(uniqueId, { awakeableId: awakeable.id, - query: externalRequest, + query: request, }); return await awakeable.promise; From 1ed7e5953ac24431bb441ab98a5e97181e4ed3e9 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 19 Jan 2024 20:14:11 +0200 Subject: [PATCH 09/16] Slim down tsconfig.json --- typescript/promisify-anything/tsconfig.json | 92 --------------------- 1 file changed, 92 deletions(-) diff --git a/typescript/promisify-anything/tsconfig.json b/typescript/promisify-anything/tsconfig.json index cf07910f..f9c21bd6 100644 --- a/typescript/promisify-anything/tsconfig.json +++ b/typescript/promisify-anything/tsconfig.json @@ -1,108 +1,16 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, "declarationMap": true /* Create sourcemaps for d.ts files. */, "sourceMap": true /* Create source map files for emitted JavaScript files. */, "outDir": "./dist" /* Specify an output folder for all emitted files. */, - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - - /* Type Checking */ "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ "skipLibCheck": true /* Skip type checking all .d.ts files. */, "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */ }, From f698a63c543b0ee5673316bd9b82f29aedb87b85 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 2 Feb 2024 14:33:15 +0200 Subject: [PATCH 10/16] Misc updates - bump AWS SDK version - update instructions with dedicated AWS profile - don't retry 404 from client - indicates deployment problem --- typescript/promisify-anything/README.md | 44 +- typescript/promisify-anything/cdk.json | 3 + .../promisify-anything/package-lock.json | 1081 +++++++++-------- typescript/promisify-anything/package.json | 6 +- typescript/promisify-anything/src/client.ts | 12 +- 5 files changed, 613 insertions(+), 533 deletions(-) create mode 100644 typescript/promisify-anything/cdk.json diff --git a/typescript/promisify-anything/README.md b/typescript/promisify-anything/README.md index b4fc129d..fb00094c 100644 --- a/typescript/promisify-anything/README.md +++ b/typescript/promisify-anything/README.md @@ -29,7 +29,7 @@ npx @restatedev/restate-server Note: the server keeps a persistent store of previous invocations, stored state, idempotency keys in a directory named `target`. If you would later like to drop the stored state without needing to re-register the service deployment again, -you can relaunch the server with the `--wipe worker` flag. +you can relaunch the server with the `--wipe worker` flag. ### [Optional] Deploy the AWS stack @@ -56,9 +56,32 @@ You can confirm that the file landed under the `data/` prefix using the S3 conso ### Start the service +#### Obtain service AWS credentials + The restate service houses the Athena adapter logic and requires AWS credentials. We can use short-term credentials from -the AWS demo stack we deployed earlier. If you've commented out the AWS SDK interactions, you can directly start the -service. +the AWS demo stack we deployed earlier. If you've chosen to skip AWS integration, make sure you've commented out the AWS +SDK interactions and skip ahead to running the service. + +The easiest way to configure your service to operate under the IAM Role we create for the purpose in the AWS stack is to +create a profile. In your `~/.aws/config` file, create a new section that looks like this: + +``` +[profile restate-demo] +source_profile = {{profile for the account where you deployed the stack}} +role_arn = {{role ARN from the stack output}} +region = {{region where you deployed the stack}} +``` + +You can name the profile anything you like; set the `source_profile` to the name of the profile you use to access AWS - +this is probably your default profile that you used to deploy the CDK stack earlier. Specify the profile to use by +setting the `AWS_PROFILE` environment variable: + +```shell +export AWS_PROFILE=restate-demo +``` + +You can proceed to run the service. If you don't want to create an AWS profile, you can use the following commands to +obtain short-term credentials and make them available via environment variables instead: ```shell ROLE_ARN=$(aws cloudformation describe-stacks \ @@ -80,14 +103,19 @@ unset AWS_PROFILE export AWS_REGION=... ``` -You can verify that you've obtained the correct short-term credentials using `aws sts get-caller-identity` - this should -print out the ARN of the "DemoDbAccess" role. Now start the Restate service: +#### Running the service + +You can verify that you've obtained the correct short-term AWS credentials with `aws sts get-caller-identity` - it should +report a valid session under the assumed "DemoDbAccess" role. + +Now start the Restate service: ```shell npm run service ``` -Register the service with Restate - you only need to do this once: +In a new terminal, register the service with the Restate server - you only need to do this once; the registration will +be persisted across Restate server and service restarts until you wipe the Restate meta state. ```shell npx @restatedev/restate deployments register --yes localhost:9080 @@ -136,8 +164,8 @@ Starting query: [object Object] with id: 06d81b82-1a77-4eb2-ae0e-039828efff08 [restate] [2023-12-15T15:20:04.905Z] DEBUG: [query/query] [Ogrphy5abhwAYxuEC5ecQa5i7mwGNNa0g] : Function completed successfully. ``` -Notice how if you re-run the client with the same idempotency token as a previous run using `IDEMPOTENCY_KEY=${TOKEN} npm run client`, -the server will immediately return a cached result: +Notice how if you re-run the client with the same idempotency token as a previous run +using `IDEMPOTENCY_KEY=${TOKEN} npm run client`, the server will immediately return a cached result: ``` Starting query with idempotency key: 6pbxlpuwect ... diff --git a/typescript/promisify-anything/cdk.json b/typescript/promisify-anything/cdk.json new file mode 100644 index 00000000..13e80e66 --- /dev/null +++ b/typescript/promisify-anything/cdk.json @@ -0,0 +1,3 @@ +{ + "app": "npx ts-node --prefer-ts-exts src/aws-stack.ts" +} diff --git a/typescript/promisify-anything/package-lock.json b/typescript/promisify-anything/package-lock.json index c5f5c31e..6bdf4438 100644 --- a/typescript/promisify-anything/package-lock.json +++ b/typescript/promisify-anything/package-lock.json @@ -9,9 +9,9 @@ "version": "0.1.0", "license": "ISC", "dependencies": { - "@aws-sdk/client-athena": "^3.495.0", + "@aws-sdk/client-athena": "^3.504.0", "@restatedev/restate-sdk": "^0.7.0", - "@types/uuid": "^9.0.7", + "@types/uuid": "^9.0.8", "axios-retry": "^4.0.0", "typescript": "^5.3.3" }, @@ -147,49 +147,49 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-athena": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.495.0.tgz", - "integrity": "sha512-ngFIoQtazxSuyo5i8LScfpQwO4xvdZqSeyx2reXQcJVeuUVV69LkCnfmRiHbwDhwgN3kNgTvPSkW7ZH/e8A+tg==", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.504.0.tgz", + "integrity": "sha512-ba+akZa7MAgBEb/gVKwPY/srnluHmOG97ETyVnOUfGRCRAxsFYAOUTnryCQECSZA5jo/dcgRNmhXuVnOu8WuBw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.495.0", - "@aws-sdk/core": "3.495.0", - "@aws-sdk/credential-provider-node": "3.495.0", - "@aws-sdk/middleware-host-header": "3.495.0", - "@aws-sdk/middleware-logger": "3.495.0", - "@aws-sdk/middleware-recursion-detection": "3.495.0", - "@aws-sdk/middleware-signing": "3.495.0", - "@aws-sdk/middleware-user-agent": "3.495.0", - "@aws-sdk/region-config-resolver": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@aws-sdk/util-endpoints": "3.495.0", - "@aws-sdk/util-user-agent-browser": "3.495.0", - "@aws-sdk/util-user-agent-node": "3.495.0", - "@smithy/config-resolver": "^2.1.0", - "@smithy/core": "^1.3.0", - "@smithy/fetch-http-handler": "^2.4.0", - "@smithy/hash-node": "^2.1.0", - "@smithy/invalid-dependency": "^2.1.0", - "@smithy/middleware-content-length": "^2.1.0", - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-retry": "^2.1.0", - "@smithy/middleware-serde": "^2.1.0", - "@smithy/middleware-stack": "^2.1.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/node-http-handler": "^2.3.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", - "@smithy/util-base64": "^2.1.0", - "@smithy/util-body-length-browser": "^2.1.0", - "@smithy/util-body-length-node": "^2.2.0", - "@smithy/util-defaults-mode-browser": "^2.1.0", - "@smithy/util-defaults-mode-node": "^2.1.0", - "@smithy/util-endpoints": "^1.1.0", - "@smithy/util-retry": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/credential-provider-node": "3.504.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-signing": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -198,112 +198,166 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.495.0.tgz", - "integrity": "sha512-Uerh3aDe/JeQNjcyXKI+8VuKPOAB6mCUKlScD0AIca1Kdyk8PsQTq4rDzFCYAQsNS5/BuPN+Ak0NqwsJM0agYA==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.502.0.tgz", + "integrity": "sha512-OZAYal1+PQgUUtWiHhRayDtX0OD+XpXHKAhjYgEIPbyhQaCMp3/Bq1xDX151piWXvXqXLJHFKb8DUEqzwGO9QA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.495.0", - "@aws-sdk/middleware-host-header": "3.495.0", - "@aws-sdk/middleware-logger": "3.495.0", - "@aws-sdk/middleware-recursion-detection": "3.495.0", - "@aws-sdk/middleware-user-agent": "3.495.0", - "@aws-sdk/region-config-resolver": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@aws-sdk/util-endpoints": "3.495.0", - "@aws-sdk/util-user-agent-browser": "3.495.0", - "@aws-sdk/util-user-agent-node": "3.495.0", - "@smithy/config-resolver": "^2.1.0", - "@smithy/core": "^1.3.0", - "@smithy/fetch-http-handler": "^2.4.0", - "@smithy/hash-node": "^2.1.0", - "@smithy/invalid-dependency": "^2.1.0", - "@smithy/middleware-content-length": "^2.1.0", - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-retry": "^2.1.0", - "@smithy/middleware-serde": "^2.1.0", - "@smithy/middleware-stack": "^2.1.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/node-http-handler": "^2.3.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", - "@smithy/util-base64": "^2.1.0", - "@smithy/util-body-length-browser": "^2.1.0", - "@smithy/util-body-length-node": "^2.2.0", - "@smithy/util-defaults-mode-browser": "^2.1.0", - "@smithy/util-defaults-mode-node": "^2.1.0", - "@smithy/util-endpoints": "^1.1.0", - "@smithy/util-retry": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.504.0.tgz", + "integrity": "sha512-ODA33/nm2srhV08EW0KZAP577UgV0qjyr7Xp2yEo8MXWL4ZqQZprk1c+QKBhjr4Djesrm0VPmSD/np0mtYP68A==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-signing": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.504.0" + } + }, "node_modules/@aws-sdk/client-sts": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.495.0.tgz", - "integrity": "sha512-lXQIx7D1MQ5+F8PaSYV7UiSxgP9M5ba/YFx1rcxi5l1GlbAWuHWhrk15qKe9d6vLxa2eTjJFiVzbO7pJqRBEWw==", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.504.0.tgz", + "integrity": "sha512-IESs8FkL7B/uY+ml4wgoRkrr6xYo4PizcNw6JX17eveq1gRBCPKeGMjE6HTDOcIYZZ8rqz/UeuH3JD4UhrMOnA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.495.0", - "@aws-sdk/credential-provider-node": "3.495.0", - "@aws-sdk/middleware-host-header": "3.495.0", - "@aws-sdk/middleware-logger": "3.495.0", - "@aws-sdk/middleware-recursion-detection": "3.495.0", - "@aws-sdk/middleware-user-agent": "3.495.0", - "@aws-sdk/region-config-resolver": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@aws-sdk/util-endpoints": "3.495.0", - "@aws-sdk/util-user-agent-browser": "3.495.0", - "@aws-sdk/util-user-agent-node": "3.495.0", - "@smithy/config-resolver": "^2.1.0", - "@smithy/core": "^1.3.0", - "@smithy/fetch-http-handler": "^2.4.0", - "@smithy/hash-node": "^2.1.0", - "@smithy/invalid-dependency": "^2.1.0", - "@smithy/middleware-content-length": "^2.1.0", - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-retry": "^2.1.0", - "@smithy/middleware-serde": "^2.1.0", - "@smithy/middleware-stack": "^2.1.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/node-http-handler": "^2.3.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", - "@smithy/util-base64": "^2.1.0", - "@smithy/util-body-length-browser": "^2.1.0", - "@smithy/util-body-length-node": "^2.2.0", - "@smithy/util-defaults-mode-browser": "^2.1.0", - "@smithy/util-defaults-mode-node": "^2.1.0", - "@smithy/util-endpoints": "^1.1.0", - "@smithy/util-middleware": "^2.1.0", - "@smithy/util-retry": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "@aws-sdk/core": "3.496.0", + "@aws-sdk/middleware-host-header": "3.502.0", + "@aws-sdk/middleware-logger": "3.502.0", + "@aws-sdk/middleware-recursion-detection": "3.502.0", + "@aws-sdk/middleware-user-agent": "3.502.0", + "@aws-sdk/region-config-resolver": "3.502.0", + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@aws-sdk/util-user-agent-browser": "3.502.0", + "@aws-sdk/util-user-agent-node": "3.502.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.1.1", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.504.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.495.0.tgz", - "integrity": "sha512-TI/jq1cSUR+r1prJ9xXtxMO0u2/jXrWjf3Z2ekForsCObPtR9qkJCYyezargupoSJqZA60KUpOhxrKW/dFJ1rw==", - "dependencies": { - "@smithy/core": "^1.3.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/signature-v4": "^2.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "3.496.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.496.0.tgz", + "integrity": "sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==", + "dependencies": { + "@smithy/core": "^1.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -311,13 +365,32 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.495.0.tgz", - "integrity": "sha512-2CKlHiQRXyVA7t3VGXo39a/UwRrZs/VG0jYZFu60dK9afxesRkA4XOJto765VenT/eR3LkeVW+RBzOISHUFg0Q==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.502.0.tgz", + "integrity": "sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.503.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.503.1.tgz", + "integrity": "sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-stream": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -325,19 +398,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.495.0.tgz", - "integrity": "sha512-DGRfND+FIacuQQNozMa8fS4yUrWZgkB6CEH4ghiqUvtE7h2sGMMVEerlaCGgTnQlpWWvDS656orzwEO3vuMTVw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.495.0", - "@aws-sdk/credential-provider-process": "3.495.0", - "@aws-sdk/credential-provider-sso": "3.495.0", - "@aws-sdk/credential-provider-web-identity": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@smithy/credential-provider-imds": "^2.2.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.504.0.tgz", + "integrity": "sha512-ODICLXfr8xTUd3wweprH32Ge41yuBa+u3j0JUcLdTUO1N9ldczSMdo8zOPlP0z4doqD3xbnqMkjNQWgN/Q+5oQ==", + "dependencies": { + "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/credential-provider-env": "3.502.0", + "@aws-sdk/credential-provider-process": "3.502.0", + "@aws-sdk/credential-provider-sso": "3.504.0", + "@aws-sdk/credential-provider-web-identity": "3.504.0", + "@aws-sdk/types": "3.502.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -345,20 +419,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.495.0.tgz", - "integrity": "sha512-OH3lV7erPLNxkZQ+QBEgX353mseelBaHutyJNFKdgCYMZUhENu2DNTvkasGtwA24TqG0sRiuO2yNhpqP8IF+LA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.495.0", - "@aws-sdk/credential-provider-ini": "3.495.0", - "@aws-sdk/credential-provider-process": "3.495.0", - "@aws-sdk/credential-provider-sso": "3.495.0", - "@aws-sdk/credential-provider-web-identity": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@smithy/credential-provider-imds": "^2.2.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.504.0.tgz", + "integrity": "sha512-6+V5hIh+tILmUjf2ZQWQINR3atxQVgH/bFrGdSR/sHSp/tEgw3m0xWL3IRslWU1e4/GtXrfg1iYnMknXy68Ikw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.502.0", + "@aws-sdk/credential-provider-http": "3.503.1", + "@aws-sdk/credential-provider-ini": "3.504.0", + "@aws-sdk/credential-provider-process": "3.502.0", + "@aws-sdk/credential-provider-sso": "3.504.0", + "@aws-sdk/credential-provider-web-identity": "3.504.0", + "@aws-sdk/types": "3.502.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -366,14 +441,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.495.0.tgz", - "integrity": "sha512-AouHJtg5qXeqzlY5plqbBkQPea1Kd3/tz9wfN+d5gbTUsDBlV7R6IinzhJWWgniS0jsaEOronlCXLIEOWUzTsw==", - "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.502.0.tgz", + "integrity": "sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -381,16 +456,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.495.0.tgz", - "integrity": "sha512-brbgLtws+jmBPm6FrQ0CT2mHCgFKdopwxJj/4+j//OH0aAgzBH5gOztoDu1R556KU9K8Co220J79gJWV3s40zQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.495.0", - "@aws-sdk/token-providers": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.504.0.tgz", + "integrity": "sha512-4MgH2or2SjPzaxM08DCW+BjaX4DSsEGJlicHKmz6fh+w9JmLh750oXcTnbvgUeVz075jcs6qTKjvUcsdGM/t8Q==", + "dependencies": { + "@aws-sdk/client-sso": "3.502.0", + "@aws-sdk/token-providers": "3.504.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -398,13 +473,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.495.0.tgz", - "integrity": "sha512-w4S01mdQZ8kQn4J6CM2Fgral9xtNBh8h5i4DWSOwFxfiokott59zDoFMWJRUdUHzXsnAGULC8+wJ4VeiZZBq1Q==", - "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/types": "^2.9.0", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.504.0.tgz", + "integrity": "sha512-L1ljCvGpIEFdJk087ijf2ohg7HBclOeB1UgBxUBBzf4iPRZTQzd2chGaKj0hm2VVaXz7nglswJeURH5PFcS5oA==", + "dependencies": { + "@aws-sdk/client-sts": "3.504.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -412,13 +488,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.495.0.tgz", - "integrity": "sha512-qqE6mVxbyJwn59NQMvtYyaZT3GEZnmsvBUry3sDtU7Be1g9w5OKhY4CnAAQyXZI288iQUtyxxDh+hnSLy6RFjA==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.502.0.tgz", + "integrity": "sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -426,12 +502,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.495.0.tgz", - "integrity": "sha512-sgmr9fpCSg3rFvMnvfKeN7dhY+AmUpZPPWyc+s1kgQONeLUUxQkbdqR2/V+tz2ZPxUBD2dToTG/JhtMcIKmt4Q==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.502.0.tgz", + "integrity": "sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -439,13 +515,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.495.0.tgz", - "integrity": "sha512-jhuOcLsMrHengJy/oz6Waumwx/vtSMKnEbROR7qZ7CaTDHRUbriPYXGen7CHCs/6aWN0UeI3JBAqwlnSW5tpIg==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.502.0.tgz", + "integrity": "sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -453,16 +529,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.495.0.tgz", - "integrity": "sha512-QZuWRo6JQ7UKeHzqqnP/qmUXirVKXSMXSEFtpOHio/JkQPASVlD1TNs5L6RL7dKrnqLrg/jpTiw4b0UdAU8kOw==", - "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/signature-v4": "^2.1.0", - "@smithy/types": "^2.9.0", - "@smithy/util-middleware": "^2.1.0", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.502.0.tgz", + "integrity": "sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -470,14 +546,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.495.0.tgz", - "integrity": "sha512-n+lC43Z7+LyAF7b63bR+e5pBmBqPaqh4gupEmrORc4wKsX7U4OncDPiVn5jPD7ZC3IZbLeTuDsjQOK8Ev+Hraw==", - "dependencies": { - "@aws-sdk/types": "3.495.0", - "@aws-sdk/util-endpoints": "3.495.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/types": "^2.9.0", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.502.0.tgz", + "integrity": "sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@aws-sdk/util-endpoints": "3.502.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -485,15 +561,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.495.0.tgz", - "integrity": "sha512-ZgixNb+8dWUvc42Uso2fh38U7W7wW4OESUmQIFQzYW58B1ylZ4xuq/mo0xSY5b5j6u/+pJadvlIpx/QYBafVHg==", - "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/types": "^2.9.0", - "@smithy/util-config-provider": "^2.2.0", - "@smithy/util-middleware": "^2.1.0", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.502.0.tgz", + "integrity": "sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==", + "dependencies": { + "@aws-sdk/types": "3.502.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -501,46 +577,15 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.495.0.tgz", - "integrity": "sha512-1JSEx82FMKNNtPoV5NRpFxi0XHgfvonCKb4+2lR/k4nljqeysZPnOaIW/7C1eAwhoJ6buEIVxoHscemBtdKo+A==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.495.0", - "@aws-sdk/middleware-logger": "3.495.0", - "@aws-sdk/middleware-recursion-detection": "3.495.0", - "@aws-sdk/middleware-user-agent": "3.495.0", - "@aws-sdk/region-config-resolver": "3.495.0", - "@aws-sdk/types": "3.495.0", - "@aws-sdk/util-endpoints": "3.495.0", - "@aws-sdk/util-user-agent-browser": "3.495.0", - "@aws-sdk/util-user-agent-node": "3.495.0", - "@smithy/config-resolver": "^2.1.0", - "@smithy/fetch-http-handler": "^2.4.0", - "@smithy/hash-node": "^2.1.0", - "@smithy/invalid-dependency": "^2.1.0", - "@smithy/middleware-content-length": "^2.1.0", - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-retry": "^2.1.0", - "@smithy/middleware-serde": "^2.1.0", - "@smithy/middleware-stack": "^2.1.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/node-http-handler": "^2.3.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", - "@smithy/util-base64": "^2.1.0", - "@smithy/util-body-length-browser": "^2.1.0", - "@smithy/util-body-length-node": "^2.2.0", - "@smithy/util-defaults-mode-browser": "^2.1.0", - "@smithy/util-defaults-mode-node": "^2.1.0", - "@smithy/util-endpoints": "^1.1.0", - "@smithy/util-retry": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "version": "3.504.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.504.0.tgz", + "integrity": "sha512-YIJWWsZi2ClUiILS1uh5L6VjmCUSTI6KKMuL9DkGjYqJ0aI6M8bd8fT9Wm7QmXCyjcArTgr/Atkhia4T7oKvzQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.504.0", + "@aws-sdk/types": "3.502.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -548,11 +593,11 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.495.0.tgz", - "integrity": "sha512-KUpo2U1rD4U6gT1QNPUJGmbQnruvIJmPeuyKndil6h2zkCpG5I0AHE8ixpfuBbizIZQOIA/26pArQivDChOD9A==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.502.0.tgz", + "integrity": "sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -560,13 +605,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.495.0.tgz", - "integrity": "sha512-pMJ6rb16y51I4G33xtinkXAXH/2mQ0WZCwoh1sNkCM2MUfZDw9zAyP+PvB2tpEytQX8Fc7bR4qIP+td+pPEXAg==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.502.0.tgz", + "integrity": "sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/types": "^2.9.0", - "@smithy/util-endpoints": "^1.1.0", + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", + "@smithy/util-endpoints": "^1.1.1", "tslib": "^2.5.0" }, "engines": { @@ -585,24 +630,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.495.0.tgz", - "integrity": "sha512-CIlY54aKahUqF4kygbMkDkFRc9t+8Km/r+IWapy91h0Exy84V+S47MJdAelsMg8Id6hZ47jWmuuzz5UcjU/+sQ==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.502.0.tgz", + "integrity": "sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/types": "^2.9.1", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.495.0.tgz", - "integrity": "sha512-BbEwwh9SCtMrcNES0u4q5/8BjAKkOiHGia0gDSlQHOmEzXxYvhx0ByRMaPeprL06iESFa6HcleJWenWktfxk3g==", + "version": "3.502.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.502.0.tgz", + "integrity": "sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==", "dependencies": { - "@aws-sdk/types": "3.495.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/types": "^2.9.0", + "@aws-sdk/types": "3.502.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -729,11 +774,11 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.0.tgz", - "integrity": "sha512-fyPlWpzXyKzDVRRMUbsfH7AV/2xX+dyZ5RqeEo6Hjz9YUvDMGVSnm88iHH0zqZ+XmH4+sH4+mhwRL76HXX65uw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.1.tgz", + "integrity": "sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -741,14 +786,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.0.tgz", - "integrity": "sha512-NcR1Hw2uZgwHT7/KFsQH76YHb/mNGLFu+hS0ODnoFUpViE8ddIVOXm/8sgwdh0QvFPtWGzPn0Wcp19Cm31wv2A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.1.tgz", + "integrity": "sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==", "dependencies": { - "@smithy/node-config-provider": "^2.2.0", - "@smithy/types": "^2.9.0", - "@smithy/util-config-provider": "^2.2.0", - "@smithy/util-middleware": "^2.1.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -756,17 +801,17 @@ } }, "node_modules/@smithy/core": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.0.tgz", - "integrity": "sha512-XoU9eiICwhxZIyAdugijyD/YqsumDQ3FgGyFSJibO60qoUkdfMGSjnIvrTemjFBdnDsj4B26F/ZRxSR3PUJbJQ==", - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-retry": "^2.1.0", - "@smithy/middleware-serde": "^2.1.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/util-middleware": "^2.1.0", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.1.tgz", + "integrity": "sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -774,14 +819,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.0.tgz", - "integrity": "sha512-uqoRizHR8rKih6SuWcJRSv46tdqZk1zPEk6r909O87XO85j21MfUcxRKzbkORM2JOlaFhCH4geRcvlvYfK6EyQ==", - "dependencies": { - "@smithy/node-config-provider": "^2.2.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.1.tgz", + "integrity": "sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -789,36 +834,36 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.0.tgz", - "integrity": "sha512-1yQnf8bSycsZ5ICXVMf8pEj1DQSUsw6/3H4nEdzH2+E3RZdNGPjVecQEm9kWPW7fvXvNvzT8MvZOQdk1IWoVTg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.1.tgz", + "integrity": "sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.9.0", - "@smithy/util-hex-encoding": "^2.1.0", + "@smithy/types": "^2.9.1", + "@smithy/util-hex-encoding": "^2.1.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.0.tgz", - "integrity": "sha512-fLhPNfbWG8vTcS9PsR1wjHaA54kDcSiAZKVuVAfjHleS7QDWjrCr1SDUqCB2yAc9NBLe2lIDbDL8+i9yoYhxoQ==", - "dependencies": { - "@smithy/protocol-http": "^3.1.0", - "@smithy/querystring-builder": "^2.1.0", - "@smithy/types": "^2.9.0", - "@smithy/util-base64": "^2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.1.tgz", + "integrity": "sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==", + "dependencies": { + "@smithy/protocol-http": "^3.1.1", + "@smithy/querystring-builder": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-base64": "^2.1.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.0.tgz", - "integrity": "sha512-/B7b6NNjw+i4PlwsrYHmxmmrTxp2oRejgZH26HhXE77XWwAiPEI9iHu7GZR9fYhm7Fsj66Z9Bk6JA9aEvUC9/w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.1.tgz", + "integrity": "sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==", "dependencies": { - "@smithy/types": "^2.9.0", - "@smithy/util-buffer-from": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "@smithy/types": "^2.9.1", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -826,18 +871,18 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.0.tgz", - "integrity": "sha512-hvryGI0KChV4jMgK/kwr6U4/HaYldzjiQAZ+c//QAMDoCp0KkP0Xt94XqAkr7Uq08577mAMW5U70YCaAx+KjSQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.1.tgz", + "integrity": "sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.0.tgz", - "integrity": "sha512-XnQvn/6ie5kjFyeW94NqSjGGOdMuB2WnNmDWKHHLVMCR/Emu7B8pcAZX4k8H3tjDujXAQvfBrEgmPRq6FgqmZg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", + "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", "dependencies": { "tslib": "^2.5.0" }, @@ -846,12 +891,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.0.tgz", - "integrity": "sha512-XYhKZPuS8nnecdx0IGGUt1Nt2/ekoVOw1zal4c0ARRaLJEw+umFLxwHUelIeBocbdOcPCeZRE6pdk35Y2T2wpw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.1.tgz", + "integrity": "sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==", "dependencies": { - "@smithy/protocol-http": "^3.1.0", - "@smithy/types": "^2.9.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -859,16 +904,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.0.tgz", - "integrity": "sha512-GMebLCihCxIlbPdA/l6WDpNJppIgW5OeTJkIAbqVArg1vFxZ92XhW+UwN12av5OAXswySGJ80/fpDFP7HmSyYg==", - "dependencies": { - "@smithy/middleware-serde": "^2.1.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/url-parser": "^2.1.0", - "@smithy/util-middleware": "^2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.1.tgz", + "integrity": "sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==", + "dependencies": { + "@smithy/middleware-serde": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-middleware": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -876,17 +921,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.0.tgz", - "integrity": "sha512-lGEVds90hFyIAvypH58rwC6j9mrCR2ZwYbcxow7AgW6sWCCoBppz5FtLpgSg6QV/CTRh8K7w4kxGVx8LqINQBg==", - "dependencies": { - "@smithy/node-config-provider": "^2.2.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/service-error-classification": "^2.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/util-middleware": "^2.1.0", - "@smithy/util-retry": "^2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.1.tgz", + "integrity": "sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/service-error-classification": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -895,11 +940,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.0.tgz", - "integrity": "sha512-iysAUIDKsc354HMnYVQxMJEzNaOrQQvE86b1oSl2fRwcFqn+9TTi028a37PLFE+ccAiyVGjBjB8PBsAz9plUug==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.1.tgz", + "integrity": "sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -907,11 +952,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.0.tgz", - "integrity": "sha512-y5Ph/TWfO7oTfxNqKU+uAK5cFRTYeP16ReOmDweq+zQ8NQODDg7LSxsfQT4Wp0mhIvm0bt3pZp66T1YMtnihWw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.1.tgz", + "integrity": "sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -919,13 +964,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.0.tgz", - "integrity": "sha512-rU82PFR32Bxo4EMGUJ2BGG+K97zUp9j6SWjG83T2itmbXwA/+DoCc4xCON8kcmdej822x1yLcSzFiTeg0b472w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.1.tgz", + "integrity": "sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==", "dependencies": { - "@smithy/property-provider": "^2.1.0", - "@smithy/shared-ini-file-loader": "^2.3.0", - "@smithy/types": "^2.9.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -933,14 +978,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.0.tgz", - "integrity": "sha512-8jcQaOdrD/X0VihhM2W/KtJ5fvKaT8UpNf/pl/epvLQ6MkAttIMaCLex6xk31BpFSPvS2+q65ZdBBjQ3cMOSiA==", - "dependencies": { - "@smithy/abort-controller": "^2.1.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/querystring-builder": "^2.1.0", - "@smithy/types": "^2.9.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.3.1.tgz", + "integrity": "sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==", + "dependencies": { + "@smithy/abort-controller": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/querystring-builder": "^2.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -948,11 +993,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.0.tgz", - "integrity": "sha512-6cpCSsgwbKHnl567SrthpqLgZ7e5jc7qPHG6wz9U2T24vcUp2yiG0vdAlH1QdTH20+/PGamKR0ZM35a08X1Tbg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.1.tgz", + "integrity": "sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -960,11 +1005,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.0.tgz", - "integrity": "sha512-CGNzkKza1yUga7sv+U4gx3jbwSh5x42/9vy0E/NoR2HTFken2MuMc/bClxXAO0Z6EQoTYHHA6FMCREXwSP04lg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.1.1.tgz", + "integrity": "sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -972,12 +1017,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.0.tgz", - "integrity": "sha512-8QColSkqn9TbvpX40zW0T8IrKcLXg7Um4bczm9qIYDRPh8T873WNIOWzYBw8chI8SWizMXbsSR95PFCP/YlgYw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.1.tgz", + "integrity": "sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==", "dependencies": { - "@smithy/types": "^2.9.0", - "@smithy/util-uri-escape": "^2.1.0", + "@smithy/types": "^2.9.1", + "@smithy/util-uri-escape": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -985,11 +1030,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.0.tgz", - "integrity": "sha512-+l17LQQxelslo5CHsLXwSw2F1J6Qmf64OgByreNnLR82gHkJ91ZbMFhxZeLTo2qXxEu0uqraMc4uNw8qE9A6bw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.1.tgz", + "integrity": "sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -997,22 +1042,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.0.tgz", - "integrity": "sha512-yBMJk4IfYqUxsPmc8P0YtWHd/Kbd0PP+kU0dgFksH6eiE2ZQJl7478xNtkUKp2QJLcooYEbA3gBFUza6ukXMiA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.1.tgz", + "integrity": "sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==", "dependencies": { - "@smithy/types": "^2.9.0" + "@smithy/types": "^2.9.1" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.0.tgz", - "integrity": "sha512-jgm7cjj0d08jIB9cp4idtpIUY590Twecv4xpijgl2IzkrPfBddzKTH4Zk+Zwfyk8ecz2T/7ihqtnNcq7Qdj9lw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.1.tgz", + "integrity": "sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -1020,17 +1065,17 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.0.tgz", - "integrity": "sha512-ONi89MBjxNtl497obaO/qGixsOedikTV3CAj3ZBPGY3IKykS8wQ2Wkctsx2T1J5B9OnynH0KuGGmgG91utX/7w==", - "dependencies": { - "@smithy/eventstream-codec": "^2.1.0", - "@smithy/is-array-buffer": "^2.1.0", - "@smithy/types": "^2.9.0", - "@smithy/util-hex-encoding": "^2.1.0", - "@smithy/util-middleware": "^2.1.0", - "@smithy/util-uri-escape": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.1.tgz", + "integrity": "sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==", + "dependencies": { + "@smithy/eventstream-codec": "^2.1.1", + "@smithy/is-array-buffer": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-uri-escape": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1038,15 +1083,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.0.tgz", - "integrity": "sha512-oEaLdVmHcbdK8IHQ4yE7xOYK2nSkF2xXp6nRr5NhfKB5QTKNzpNsXLiGJgfmm7j0ol1S6BhjyBhi7tZ8M0JJtg==", - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.0", - "@smithy/middleware-stack": "^2.1.0", - "@smithy/protocol-http": "^3.1.0", - "@smithy/types": "^2.9.0", - "@smithy/util-stream": "^2.1.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.3.1.tgz", + "integrity": "sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-stream": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1054,9 +1099,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.0.tgz", - "integrity": "sha512-ST1M87Lf2cLHRI+irEFRIHXGY08HHTAUbiRFYkmFyJdTMg3VDxkcm7DwW9/EgV3X8M6wDPrbIkx/RXONyttrQg==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.9.1.tgz", + "integrity": "sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==", "dependencies": { "tslib": "^2.5.0" }, @@ -1065,21 +1110,21 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.0.tgz", - "integrity": "sha512-V3FMzNFCDwQNAgJdxI6Gj48qP9WAyvK59WE90hOoya3m8ey02uLDhWjZkl+505s7iTVVmJ7Mr7nKwG5vU2NIMQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.1.tgz", + "integrity": "sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==", "dependencies": { - "@smithy/querystring-parser": "^2.1.0", - "@smithy/types": "^2.9.0", + "@smithy/querystring-parser": "^2.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.0.tgz", - "integrity": "sha512-zjXlHFm7S+TEDVA3j1rWGpuNDTlTxIWDqzwIfWUENT0VqCGDAdJITd8RYVjduf3u8HWMlgALkrY6B62UTESQ5w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", + "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.0", + "@smithy/util-buffer-from": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1087,17 +1132,17 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.0.tgz", - "integrity": "sha512-fkLY8W+jXGSkymLNe9NB7u6lGflHz6w1R+a3RxLOK6UrtwU4LBLskAP5Ag/zVPUNd5tmfv3/W6cTVzk8IBJuiw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", + "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.0.tgz", - "integrity": "sha512-ZLsqYH+s71y6Oc2Auws6zYI4LzsSi6N8+W+Gq7CwXaZm7QIKGiCeEunEwxo50OGAqJs0g6F9kCIwNxhlK1s4Aw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", + "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1106,11 +1151,11 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.0.tgz", - "integrity": "sha512-3w7AM0moGyBmr9gMBGE7+pqG3cjboRvmMyRhpesbJoOUHO0BV1Qrk00M/wQ3EHJAQXM3dehQfFNUf7sR6nT6+Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", + "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", "dependencies": { - "@smithy/is-array-buffer": "^2.1.0", + "@smithy/is-array-buffer": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1118,9 +1163,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.0.tgz", - "integrity": "sha512-D3Gx0BWXjsn1E25ikUt0+yc8oZnViTa5IHZ1JvD9J1NyyVS4c3IgHqbG64XRverEMnhzUb0EhqMTwQTY12in+w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", + "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", "dependencies": { "tslib": "^2.5.0" }, @@ -1129,13 +1174,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.0.tgz", - "integrity": "sha512-zmXL4aKeBGBz02kDZdks2QfG+HGq99Tp4/ICPmu2OvSbwTOLjmlCnUrtZJTmLhX4etP3o0voOL9gFEa2PSjlJg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.1.tgz", + "integrity": "sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==", "dependencies": { - "@smithy/property-provider": "^2.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1144,16 +1189,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.0.tgz", - "integrity": "sha512-pVBaw2fBJMjjJj+AR69xQhjzYLZ5u9azdKyaAAjR16dthdBOcnczBClBVCfhb/Moj0ivIHnaXJ5AXCdbDok94g==", - "dependencies": { - "@smithy/config-resolver": "^2.1.0", - "@smithy/credential-provider-imds": "^2.2.0", - "@smithy/node-config-provider": "^2.2.0", - "@smithy/property-provider": "^2.1.0", - "@smithy/smithy-client": "^2.3.0", - "@smithy/types": "^2.9.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.1.1.tgz", + "integrity": "sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==", + "dependencies": { + "@smithy/config-resolver": "^2.1.1", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -1161,12 +1206,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.0.tgz", - "integrity": "sha512-gKzfdj5pyEOg1fVOsZVpVPRWAXbWqt9JgZdwU4cjKlJ57Fuccfk0ui5twh1TYvuJWtR2Tw3GwUmUuBM3qRWJJg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.1.tgz", + "integrity": "sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==", "dependencies": { - "@smithy/node-config-provider": "^2.2.0", - "@smithy/types": "^2.9.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -1174,9 +1219,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.0.tgz", - "integrity": "sha512-haxSIaBxn3p/lK+bEyqC32myHffacBLD61/HHzBGcG1Vo8dFTm5y0vhdR5R4wakW7H8Tr/czx+uckDOWZ1Km9Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", + "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", "dependencies": { "tslib": "^2.5.0" }, @@ -1185,11 +1230,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.0.tgz", - "integrity": "sha512-bKfhAsdjRyGmYDsJUW5hPsL3qofgPgLPsuV+V6nNGyD/kjMobwstiIpA3ddGFT+XDwVOIUHElg7I06/wOpwKiQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.1.tgz", + "integrity": "sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==", "dependencies": { - "@smithy/types": "^2.9.0", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -1197,12 +1242,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.0.tgz", - "integrity": "sha512-igJw+/olhAUtocMbEMBjy8SKRTHfefS+qcgmMUVEBLFgLjqMfpc8EDVB1BebNBQ1rre5yLDbi2UHUz48eZNkPQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.1.tgz", + "integrity": "sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==", "dependencies": { - "@smithy/service-error-classification": "^2.1.0", - "@smithy/types": "^2.9.0", + "@smithy/service-error-classification": "^2.1.1", + "@smithy/types": "^2.9.1", "tslib": "^2.5.0" }, "engines": { @@ -1210,17 +1255,17 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.0.tgz", - "integrity": "sha512-lcw9JVXLHvRawaXnfxdnGRw5pQM5c9XMEkBuMec+fIhGuPHIezqhQq7oO0jJcj0xwupJzW6HAvinktr9ozdKyg==", - "dependencies": { - "@smithy/fetch-http-handler": "^2.4.0", - "@smithy/node-http-handler": "^2.3.0", - "@smithy/types": "^2.9.0", - "@smithy/util-base64": "^2.1.0", - "@smithy/util-buffer-from": "^2.1.0", - "@smithy/util-hex-encoding": "^2.1.0", - "@smithy/util-utf8": "^2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.1.tgz", + "integrity": "sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1228,9 +1273,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.0.tgz", - "integrity": "sha512-ZHYFGyF9o/MHGMGtsHfkxnn2DhGRZlDIFGNgipu4K3x8jMEVahQ+tGnlkFVMM2QrSQHCcjICbBTJ5JEgaD5+Jg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", + "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", "dependencies": { "tslib": "^2.5.0" }, @@ -1239,11 +1284,11 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.0.tgz", - "integrity": "sha512-RnNNedYLpsNPQocMhr0nGEz0mGKdzI5dBi0h7vvmimULtBlyElgX1/hXozlkurIgx8R3bSy14/oRtmDsFClifg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", + "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.0", + "@smithy/util-buffer-from": "^2.1.1", "tslib": "^2.5.0" }, "engines": { @@ -1295,9 +1340,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==" + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" }, "node_modules/acorn": { "version": "8.11.2", diff --git a/typescript/promisify-anything/package.json b/typescript/promisify-anything/package.json index 89e6331c..74577852 100644 --- a/typescript/promisify-anything/package.json +++ b/typescript/promisify-anything/package.json @@ -11,15 +11,15 @@ "client": "ts-node src/client.ts", "service": "ts-node src/service.ts", "service:dev": "RESTATE_DEBUG_LOGGING=JOURNAL ts-node-dev --respawn --transpile-only src/service.ts", - "deploy": "npx cdk --app src/aws-stack.ts deploy" + "deploy": "npx cdk deploy" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@aws-sdk/client-athena": "^3.495.0", + "@aws-sdk/client-athena": "^3.504.0", "@restatedev/restate-sdk": "^0.7.0", - "@types/uuid": "^9.0.7", + "@types/uuid": "^9.0.8", "axios-retry": "^4.0.0", "typescript": "^5.3.3" }, diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts index 035ff10c..fc182d26 100644 --- a/typescript/promisify-anything/src/client.ts +++ b/typescript/promisify-anything/src/client.ts @@ -14,18 +14,22 @@ import axiosRetry from "axios-retry"; axiosRetry(axios, { retries: Infinity, - retryCondition: () => true, // requests are explicitly idempotent, retry on any error - shouldResetTimeout: true, // the timeout set is per request, not for the overall interaction - retryDelay: (retryCount, error) => { + // requests are explicitly idempotent, retry on any error + retryCondition(error) { + return error.response?.status != 404; + }, + retryDelay(retryCount, error) { const delay = axiosRetry.exponentialDelay(retryCount, error, 100); console.log(`Attempt #${retryCount} failed with: ${error}. Backing off for ${delay}ms...`); return delay; }, + // the timeout set is per request, not for the overall interaction + shouldResetTimeout: true, }); const query = async (idempotencyKey: string, input: string): Promise => { const url = "http://localhost:8080/query/query"; - const timeout = 500; // short .5s timeout to demonstrate retries + const timeout = 500; // short .5s request timeout to demonstrate retries console.log(`Starting query with idempotency key: ${idempotencyKey} ...`); let response = await axios.post( From b4ab79779cb424828e96f74cdfc47b4211e914ce Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 2 Feb 2024 15:22:49 +0200 Subject: [PATCH 11/16] Simplify service: remove Awakeable use --- typescript/promisify-anything/README.md | 52 ++++---- .../promisify-anything/src/aws-stack.ts | 2 +- typescript/promisify-anything/src/client.ts | 11 +- typescript/promisify-anything/src/service.ts | 111 +++++++----------- 4 files changed, 69 insertions(+), 107 deletions(-) diff --git a/typescript/promisify-anything/README.md b/typescript/promisify-anything/README.md index fb00094c..29f622bd 100644 --- a/typescript/promisify-anything/README.md +++ b/typescript/promisify-anything/README.md @@ -128,16 +128,14 @@ disconnect and retry. This demonstrates the built-in idempotency support that ma client against the Restate ingress endpoint with `npm run client`. You should see the following output: ``` -Starting query with idempotency key: 6pbxlpuwect ... -Attempt #1 failed with AxiosError: timeout of 500ms exceeded. Backing off for 225.4295680836923ms... -Attempt #2 failed with AxiosError: timeout of 500ms exceeded. Backing off for 421.82781013856396ms... +% npm run client +... +Starting query with idempotency key: xkmwm95dxln ... +Attempt #1 failed with: AxiosError: timeout of 500ms exceeded. Backing off for 230.90111823134313ms... +Attempt #2 failed with: AxiosError: timeout of 500ms exceeded. Backing off for 437.00865138660356ms... +Attempt #3 failed with: AxiosError: timeout of 500ms exceeded. Backing off for 934.4729307670398ms... Query finished with status: 200. -{ - status: 'SUCCESS', - result: { - response: { _id: 'd69d08af-299f-4068-9bd2-42d11dca603a', result: [Object] } - } -} +Response: answer = ... ``` Let's look at the server logs: we see that the side effect wrapping the call to retrieve the query results has most @@ -145,37 +143,27 @@ likely been retried several times because Athena takes some time to start, execu Our logic in the service handler didn't have to deal with any of that backing off - Restate did it all for us: ``` -[restate] [2023-12-15T15:20:03.451Z] DEBUG: [query/query] [Ogrphy5abhwAYxuEC5ecQa5i7mwGNNa0g] : Invoking function. -[restate] [2023-12-15T15:20:03.458Z] DEBUG: [internal/query] [pua_tEavBlwAYxuEC58fyigRM4drFneMA] : Invoking function. -Starting query: [object Object] with id: 06d81b82-1a77-4eb2-ae0e-039828efff08 -[restate] [2023-12-15T15:20:03.851Z] DEBUG: Error while executing side effect 'side-effect': InvalidRequestException - Query has not yet finished. Current state: QUEUED -[restate] [2023-12-15T15:20:03.852Z] DEBUG: InvalidRequestException: Query has not yet finished. Current state: QUEUED -... -... +[restate] [2024-02-02T13:12:22.736Z] DEBUG: [query/query] [xOUF1k8jX60AY1p8uXId_O58UCosW6etQ] : Invoking function. +[restate] [2024-02-02T13:12:24.607Z] DEBUG: Error while executing side effect 'side-effect': Error - Non-final state +[restate] [2024-02-02T13:12:24.619Z] DEBUG: Error: Non-final state ... -[restate] [2023-12-15T15:20:03.995Z] DEBUG: Retrying in 40 ms -[restate] [2023-12-15T15:20:04.092Z] DEBUG: Error while executing side effect 'side-effect': InvalidRequestException - Query has not yet finished. Current state: RUNNING -[restate] [2023-12-15T15:20:04.099Z] DEBUG: InvalidRequestException: Query has not yet finished. Current state: RUNNING +[restate] [2024-02-02T13:12:24.620Z] DEBUG: Retrying in 10 ms +[restate] [2024-02-02T13:12:24.837Z] DEBUG: Error while executing side effect 'side-effect': Error - Non-final state ... ... -... -[restate] [2023-12-15T15:20:04.452Z] DEBUG: Retrying in 320 ms -[restate] [2023-12-15T15:20:04.882Z] DEBUG: [internal/query] [pua_tEavBlwAYxuEC58fyigRM4drFneMA] : Function completed successfully. -[restate] [2023-12-15T15:20:04.905Z] DEBUG: [query/query] [Ogrphy5abhwAYxuEC5ecQa5i7mwGNNa0g] : Function completed successfully. +[restate] [2024-02-02T13:12:25.051Z] DEBUG: Retrying in 320 ms +[restate] [2024-02-02T13:12:25.542Z] DEBUG: [query/query] [xOUF1k8jX60AY1p8uXId_O58UCosW6etQ] : Function completed successfully. ``` -Notice how if you re-run the client with the same idempotency token as a previous run -using `IDEMPOTENCY_KEY=${TOKEN} npm run client`, the server will immediately return a cached result: +Notice how if you re-run the client with the same idempotency token as that of a previous run +using `npm run client -- ${TOKEN}`, the server will immediately return a cached result: ``` -Starting query with idempotency key: 6pbxlpuwect ... +% npm run client -- xkmwm95dxln +... +Starting query with idempotency key: xkmwm95dxln ... Query finished with status: 200. -{ - status: 'SUCCESS', - result: { - response: { _id: 'd69d08af-299f-4068-9bd2-42d11dca603a', result: [Object] } - } -} +Response: answer = ... ``` ### Clean up diff --git a/typescript/promisify-anything/src/aws-stack.ts b/typescript/promisify-anything/src/aws-stack.ts index a22f47d7..8a12572e 100755 --- a/typescript/promisify-anything/src/aws-stack.ts +++ b/typescript/promisify-anything/src/aws-stack.ts @@ -33,7 +33,7 @@ class AthenaTableStack extends cdk.Stack { dataFormat: glue.DataFormat.JSON, }); - const workgroup = new athena.CfnWorkGroup(this, "Workgroup", { + new athena.CfnWorkGroup(this, "Workgroup", { name: "demo-workgroup", recursiveDeleteOption: true, state: "ENABLED", diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts index fc182d26..ed6f1d57 100644 --- a/typescript/promisify-anything/src/client.ts +++ b/typescript/promisify-anything/src/client.ts @@ -16,7 +16,7 @@ axiosRetry(axios, { retries: Infinity, // requests are explicitly idempotent, retry on any error retryCondition(error) { - return error.response?.status != 404; + return error.response?.status != 404 && error.response?.status != 500; }, retryDelay(retryCount, error) { const delay = axiosRetry.exponentialDelay(retryCount, error, 100); @@ -27,7 +27,7 @@ axiosRetry(axios, { shouldResetTimeout: true, }); -const query = async (idempotencyKey: string, input: string): Promise => { +const query = async (idempotencyKey: string, query?: string): Promise => { const url = "http://localhost:8080/query/query"; const timeout = 500; // short .5s request timeout to demonstrate retries console.log(`Starting query with idempotency key: ${idempotencyKey} ...`); @@ -35,7 +35,7 @@ const query = async (idempotencyKey: string, input: string): Promise { }; (async () => { - const result = await query(process.argv[2] ?? idempotencyKey(), 'SELECT * FROM "demo_db"."table" limit 10;'); - console.log({ status: "SUCCESS", result: result.data }); + const result = await query(process.argv[2] ?? idempotencyKey()); + const rows = result.data.response?.result?.Rows; + if (rows) console.log(`Response: ${rows[0]?.Data?.[0]?.VarCharValue} = ${rows[1]?.Data?.[0]?.VarCharValue}`); })(); diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index 745352ef..cbac1523 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -12,95 +12,68 @@ import * as restate from "@restatedev/restate-sdk"; import * as athena from "@aws-sdk/client-athena"; -export const publicApi: restate.ServiceApi = { - path: "query", -}; -export const internalApi: restate.ServiceApi = { - path: "internal", -}; - -// Public API implementation - -const query = async (ctx: restate.RpcContext, request: string) => { - const uniqueId = ctx.rand.uuidv4(); - const awakeable = ctx.awakeable(); - - ctx.send(internalApi).query(uniqueId, { - awakeableId: awakeable.id, - query: request, - }); - - return await awakeable.promise; -}; - -export const queryRouter = restate.router({ - query, -}); - -// Internal API implementation - const client = new athena.AthenaClient({}); -type QueryRequest = { - awakeableId: string; - query?: string; +const DEFAULT_QUERY_SQL = 'SELECT sum("table"."value") AS answer FROM "demo_db"."table"'; + +export const publicApi: restate.ServiceApi = { + path: "query", }; -const DEFAULT_QUERY_SQL = 'SELECT * FROM "demo_db"."table" limit 10;'; +const query = async (ctx: restate.RpcContext, query?: string) => { + const requestId = ctx.rand.uuidv4(); // make up a stable idempotency token for calling Athena API -const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { const executionId = await ctx.sideEffect(async () => { - const startQueryResult = await client.send( - new athena.StartQueryExecutionCommand({ - QueryString: request.query ?? DEFAULT_QUERY_SQL, - WorkGroup: "demo-workgroup", - ClientRequestToken: requestId, - }), - ); - return startQueryResult.QueryExecutionId as string; + try { + const startQueryResult = await client.send( + new athena.StartQueryExecutionCommand({ + QueryString: query ?? DEFAULT_QUERY_SQL, + WorkGroup: "demo-workgroup", + ClientRequestToken: requestId, + }), + ); + return startQueryResult.QueryExecutionId as string; + } catch (error) { + if (error instanceof athena.AthenaServiceException) + if (error.$fault === "client") throw new restate.TerminalError(error.message); + + throw error; // rethrow other exceptions -- side effect retry policy will handle them + } }); const queryId = { QueryExecutionId: executionId }; - const state = await ctx.sideEffect( - async () => { - const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); - const state = response.QueryExecution?.Status?.State; - if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect - return state; - }, - { - name: "Wait for query execution to reach final state", - }, - ); + const state = await ctx.sideEffect(async () => { + const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); + const state = response.QueryExecution?.Status?.State; + if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect + return state; + }); if (state !== "SUCCEEDED") { - ctx.rejectAwakeable(request.awakeableId, "Unable to execute query"); - throw new restate.TerminalError("Unable to execute query"); + throw new restate.TerminalError(`Query execution failed: ${state}. Please see logs for error details.`); } const result = await ctx.sideEffect(() => client.send(new athena.GetQueryResultsCommand(queryId))); + return { result: result.ResultSet, _id: executionId }; +}; - ctx.resolveAwakeable(request.awakeableId, { result: result.ResultSet, _id: result.$metadata.requestId }); +// If you want to test client retries and idempotent request processing without an AWS stack, you can replace the +// handler definition above in the queryRouter with the following simple mock instead: +const mockQuery = async (ctx: restate.RpcContext) => { + await ctx.sleep(2000); // simulate a long-running query + return { + result: { Rows: [{ Data: [{ VarCharValue: "answer" }] }, { Data: [{ VarCharValue: "fake" }] }] }, + _id: ctx.rand.uuidv4(), + }; }; -export const internalAthenaApiRouter = restate.keyedRouter({ - query: queryInternal, +export const queryRouter = restate.router({ + query, + // query: mockQuery, }); -restate - .createServer() - .bindRouter(publicApi.path, queryRouter) - .bindKeyedRouter(internalApi.path, internalAthenaApiRouter) - .listen(9080); +restate.createServer().bindRouter(publicApi.path, queryRouter).listen(9080); function isQueryStateFinal(state: athena.QueryExecutionState): boolean { return ["SUCCEEDED", "FAILED", "CANCELLED"].includes(state); } - -// If you want to test the promise integration without actually calling Athena, you can replace the service definition -// above with the following simple mock instead: -// const queryInternal = async (ctx: restate.RpcContext, requestId: string, request: QueryRequest) => { -// await ctx.sleep(5000); -// ctx.resolveAwakeable(request.awakeableId, { result: "foo", _id: requestId }); -// return; -// }; From 2c615d1806a662d7198eb9ec09a69f0449595654 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 2 Feb 2024 17:36:12 +0200 Subject: [PATCH 12/16] Extract query handler into separate TypeScript file --- .../promisify-anything/src/query-athena.ts | 49 +++++++++++++++++++ typescript/promisify-anything/src/service.ts | 49 +------------------ 2 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 typescript/promisify-anything/src/query-athena.ts diff --git a/typescript/promisify-anything/src/query-athena.ts b/typescript/promisify-anything/src/query-athena.ts new file mode 100644 index 00000000..8f71d0b4 --- /dev/null +++ b/typescript/promisify-anything/src/query-athena.ts @@ -0,0 +1,49 @@ +import * as restate from "@restatedev/restate-sdk"; +import * as athena from "@aws-sdk/client-athena"; + +const QUERY_SQL = ` + SELECT sum("table"."value") AS answer + FROM "demo_db"."table" +`; + +export default async function queryAthena(ctx: restate.RpcContext, query?: string) { + const requestId = ctx.rand.uuidv4(); // make up a stable idempotency token for calling Athena API + + const client = new athena.AthenaClient({}); + const executionId = await ctx.sideEffect(async () => { + try { + const startQueryResult = await client.send( + new athena.StartQueryExecutionCommand({ + QueryString: query ?? QUERY_SQL, + WorkGroup: "demo-workgroup", + ClientRequestToken: requestId, + }), + ); + return startQueryResult.QueryExecutionId as string; + } catch (error) { + if (error instanceof athena.AthenaServiceException) + if (error.$fault === "client") throw new restate.TerminalError(error.message); + + throw error; // rethrow other exceptions -- side effect retry policy will handle them + } + }); + const queryId = { QueryExecutionId: executionId }; + + const state = await ctx.sideEffect(async () => { + const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); + const state = response.QueryExecution?.Status?.State; + if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect + return state; + }); + + if (state !== "SUCCEEDED") { + throw new restate.TerminalError(`Query execution failed: ${state}. Please see logs for error details.`); + } + + const result = await ctx.sideEffect(() => client.send(new athena.GetQueryResultsCommand(queryId))); + return { result: result.ResultSet, _id: executionId }; +} + +function isQueryStateFinal(state: athena.QueryExecutionState): boolean { + return ["SUCCEEDED", "FAILED", "CANCELLED"].includes(state); +} diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index cbac1523..c0e2cd47 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -10,53 +10,12 @@ */ import * as restate from "@restatedev/restate-sdk"; -import * as athena from "@aws-sdk/client-athena"; - -const client = new athena.AthenaClient({}); - -const DEFAULT_QUERY_SQL = 'SELECT sum("table"."value") AS answer FROM "demo_db"."table"'; +import queryAthena from "./query-athena"; export const publicApi: restate.ServiceApi = { path: "query", }; -const query = async (ctx: restate.RpcContext, query?: string) => { - const requestId = ctx.rand.uuidv4(); // make up a stable idempotency token for calling Athena API - - const executionId = await ctx.sideEffect(async () => { - try { - const startQueryResult = await client.send( - new athena.StartQueryExecutionCommand({ - QueryString: query ?? DEFAULT_QUERY_SQL, - WorkGroup: "demo-workgroup", - ClientRequestToken: requestId, - }), - ); - return startQueryResult.QueryExecutionId as string; - } catch (error) { - if (error instanceof athena.AthenaServiceException) - if (error.$fault === "client") throw new restate.TerminalError(error.message); - - throw error; // rethrow other exceptions -- side effect retry policy will handle them - } - }); - const queryId = { QueryExecutionId: executionId }; - - const state = await ctx.sideEffect(async () => { - const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); - const state = response.QueryExecution?.Status?.State; - if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect - return state; - }); - - if (state !== "SUCCEEDED") { - throw new restate.TerminalError(`Query execution failed: ${state}. Please see logs for error details.`); - } - - const result = await ctx.sideEffect(() => client.send(new athena.GetQueryResultsCommand(queryId))); - return { result: result.ResultSet, _id: executionId }; -}; - // If you want to test client retries and idempotent request processing without an AWS stack, you can replace the // handler definition above in the queryRouter with the following simple mock instead: const mockQuery = async (ctx: restate.RpcContext) => { @@ -68,12 +27,8 @@ const mockQuery = async (ctx: restate.RpcContext) => { }; export const queryRouter = restate.router({ - query, + query: queryAthena, // query: mockQuery, }); restate.createServer().bindRouter(publicApi.path, queryRouter).listen(9080); - -function isQueryStateFinal(state: athena.QueryExecutionState): boolean { - return ["SUCCEEDED", "FAILED", "CANCELLED"].includes(state); -} From 24d72449e9fccd5304bc55bd5fcb28b700b78950 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Mon, 5 Feb 2024 23:11:36 +0200 Subject: [PATCH 13/16] Comment out unused code --- typescript/promisify-anything/src/service.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/typescript/promisify-anything/src/service.ts b/typescript/promisify-anything/src/service.ts index c0e2cd47..badf1347 100644 --- a/typescript/promisify-anything/src/service.ts +++ b/typescript/promisify-anything/src/service.ts @@ -18,13 +18,13 @@ export const publicApi: restate.ServiceApi = { // If you want to test client retries and idempotent request processing without an AWS stack, you can replace the // handler definition above in the queryRouter with the following simple mock instead: -const mockQuery = async (ctx: restate.RpcContext) => { - await ctx.sleep(2000); // simulate a long-running query - return { - result: { Rows: [{ Data: [{ VarCharValue: "answer" }] }, { Data: [{ VarCharValue: "fake" }] }] }, - _id: ctx.rand.uuidv4(), - }; -}; +// const mockQuery = async (ctx: restate.RpcContext) => { +// await ctx.sleep(2000); // simulate a long-running query +// return { +// result: { Rows: [{ Data: [{ VarCharValue: "answer" }] }, { Data: [{ VarCharValue: "fake" }] }] }, +// _id: ctx.rand.uuidv4(), +// }; +// }; export const queryRouter = restate.router({ query: queryAthena, From 256ff9b76869baef985b18b8bd60c507a14b6ada Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Tue, 6 Feb 2024 10:11:05 +0200 Subject: [PATCH 14/16] Round printed retry delays --- typescript/promisify-anything/src/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/promisify-anything/src/client.ts b/typescript/promisify-anything/src/client.ts index ed6f1d57..a6e0c7a7 100644 --- a/typescript/promisify-anything/src/client.ts +++ b/typescript/promisify-anything/src/client.ts @@ -20,7 +20,7 @@ axiosRetry(axios, { }, retryDelay(retryCount, error) { const delay = axiosRetry.exponentialDelay(retryCount, error, 100); - console.log(`Attempt #${retryCount} failed with: ${error}. Backing off for ${delay}ms...`); + console.log(`Attempt #${retryCount} failed with: ${error}. Backing off for ${Math.round(delay)}ms...`); return delay; }, // the timeout set is per request, not for the overall interaction From 31f1fd93b27885239808d884e4b98de5880f9c97 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 16 Feb 2024 13:55:24 +0200 Subject: [PATCH 15/16] Simplify retryable exception detection --- .../promisify-anything/src/query-athena.ts | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/typescript/promisify-anything/src/query-athena.ts b/typescript/promisify-anything/src/query-athena.ts index 8f71d0b4..92717f26 100644 --- a/typescript/promisify-anything/src/query-athena.ts +++ b/typescript/promisify-anything/src/query-athena.ts @@ -10,40 +10,47 @@ export default async function queryAthena(ctx: restate.RpcContext, query?: strin const requestId = ctx.rand.uuidv4(); // make up a stable idempotency token for calling Athena API const client = new athena.AthenaClient({}); - const executionId = await ctx.sideEffect(async () => { - try { - const startQueryResult = await client.send( - new athena.StartQueryExecutionCommand({ - QueryString: query ?? QUERY_SQL, - WorkGroup: "demo-workgroup", - ClientRequestToken: requestId, - }), - ); - return startQueryResult.QueryExecutionId as string; - } catch (error) { - if (error instanceof athena.AthenaServiceException) - if (error.$fault === "client") throw new restate.TerminalError(error.message); - - throw error; // rethrow other exceptions -- side effect retry policy will handle them - } - }); - const queryId = { QueryExecutionId: executionId }; - - const state = await ctx.sideEffect(async () => { - const response = await client.send(new athena.GetQueryExecutionCommand(queryId)); - const state = response.QueryExecution?.Status?.State; - if (!state || !isQueryStateFinal(state)) throw new Error("Non-final state"); // trigger retry of side effect - return state; - }); + const startQueryOutput = await ctx.sideEffect( + terminateOnError( + (error) => (error instanceof athena.AthenaServiceException ? error.$fault === "client" : false), + async () => + await client.send( + new athena.StartQueryExecutionCommand({ + QueryString: query ?? QUERY_SQL, + WorkGroup: "demo-workgroup", + ClientRequestToken: requestId, + }), + ), + ), + ); + const queryId = { QueryExecutionId: startQueryOutput.QueryExecutionId }; + + const state = await ctx.sideEffect(async () => + assertFinalState((await client.send(new athena.GetQueryExecutionCommand(queryId))).QueryExecution?.Status?.State), + ); if (state !== "SUCCEEDED") { throw new restate.TerminalError(`Query execution failed: ${state}. Please see logs for error details.`); } const result = await ctx.sideEffect(() => client.send(new athena.GetQueryResultsCommand(queryId))); - return { result: result.ResultSet, _id: executionId }; + return { result: result.ResultSet, _id: startQueryOutput }; +} + +function terminateOnError(isTerminal: (e: Error) => boolean, fn: () => Promise): () => Promise { + return async () => { + try { + return await fn(); + } catch (e) { + if (e instanceof Error && isTerminal(e)) throw new restate.TerminalError(e.message); + throw e; + } + }; } -function isQueryStateFinal(state: athena.QueryExecutionState): boolean { - return ["SUCCEEDED", "FAILED", "CANCELLED"].includes(state); +function assertFinalState(state?: athena.QueryExecutionState): athena.QueryExecutionState { + if (state == undefined || !["SUCCEEDED", "FAILED", "CANCELLED"].includes(state)) { + throw new Error(`Non-final state ${state ?? "undefined"}`); + } + return state; } From 2a767ad6fabdd45f4ecd045f56e4a32f11caf2b8 Mon Sep 17 00:00:00 2001 From: Pavel Tcholakov Date: Fri, 16 Feb 2024 16:47:49 +0200 Subject: [PATCH 16/16] More explicit retryable error on non-final state --- typescript/promisify-anything/src/query-athena.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/typescript/promisify-anything/src/query-athena.ts b/typescript/promisify-anything/src/query-athena.ts index 92717f26..6f0b828c 100644 --- a/typescript/promisify-anything/src/query-athena.ts +++ b/typescript/promisify-anything/src/query-athena.ts @@ -48,9 +48,11 @@ function terminateOnError(isTerminal: (e: Error) => boolean, fn: () => Promis }; } +class RetryableError extends Error {} + function assertFinalState(state?: athena.QueryExecutionState): athena.QueryExecutionState { if (state == undefined || !["SUCCEEDED", "FAILED", "CANCELLED"].includes(state)) { - throw new Error(`Non-final state ${state ?? "undefined"}`); + throw new RetryableError(`Non-final state ${state ?? "undefined"}`); } return state; }