From ecceda2fbab5104216a3bc8312af8c0426d19a99 Mon Sep 17 00:00:00 2001 From: luzzifoss Date: Wed, 17 Jan 2024 17:21:24 +0000 Subject: [PATCH 1/2] feat: support additional upload to s3 service of choice --- .env.example | 10 +- Dockerfile | 6 +- package.json | 5 +- pnpm-lock.yaml | 1065 ++++++++++++++++++++++++++++++++++++++- src/index.js | 52 +- src/routes/data/json.js | 35 +- src/utils.js | 44 ++ 7 files changed, 1175 insertions(+), 42 deletions(-) create mode 100644 src/utils.js diff --git a/.env.example b/.env.example index 95d9096..ee1b377 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,8 @@ -HOST=127.0.0.1 -PORT=1234 +HOST="127.0.0.1" +PORT="1234" W3UP_PRINCIPAL_KEY="foo" -W3UP_DELEGATION_PROOF="bar" +W3UP_DELEGATION_PROOF="foo" +S3_ENDPOINT="http://foo.bar" +S3_BUCKET="foo" +S3_ACCESS_KEY_ID="foo" +S3_SECRET_ACCESS_KEY="foo" diff --git a/Dockerfile b/Dockerfile index e544c0a..b1b50a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,9 +24,9 @@ FROM base as runner COPY --from=prod-deps /app/node_modules /app/node_modules COPY --from=build /app/out/index.mjs /app/index.mjs -RUN addgroup -S w3up-uploader-runners -RUN adduser -S -G w3up-uploader-runners w3up-uploader-runner -USER w3up-uploader-runner +RUN addgroup -S data-uploader-runners +RUN adduser -S -G data-uploader-runners data-uploader-runner +USER data-uploader-runner ARG HOST ENV HOST=$HOST diff --git a/package.json b/package.json index e522100..c5918ee 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "type": "module", "private": true, - "name": "@carrot-kpi/w3up-uploader", + "name": "@carrot-kpi/data-uploader", "version": "0.1.0", "author": "Federico Luzzi ", "license": "GPL-3.0-or-later", - "description": "A service to facilitate data uploads to web3.storage through their w3up service.", + "description": "A service to facilitate data uploads to web3.storage through their w3up service and to a S3 service of choice.", "scripts": { "prepare": "node ./scripts/prepare.js", "commitlint": "commitlint -e", @@ -30,6 +30,7 @@ "prettier": "^3.2.4" }, "dependencies": { + "@aws-sdk/client-s3": "^3.490.0", "@hapi/boom": "^10.0.1", "@hapi/hapi": "^21.3.2", "@ipld/car": "^5.2.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3957d78..9d721ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@aws-sdk/client-s3': + specifier: ^3.490.0 + version: 3.490.0 '@hapi/boom': specifier: ^10.0.1 version: 10.0.1 @@ -121,6 +124,591 @@ packages: z-schema: 5.0.5 dev: true + /@aws-crypto/crc32@3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.489.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/crc32c@3.0.0: + resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.489.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/ie11-detection@3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha1-browser@3.0.0: + resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-locate-window': 3.465.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser@3.0.0: + resolution: {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.489.0 + '@aws-sdk/util-locate-window': 3.465.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js@3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.489.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto@3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util@3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/client-s3@3.490.0: + resolution: {integrity: sha512-fBj3CJ3+5R+l/sc93Z9mKw8gM2b9K6vEhC9qSCG2XNymLd9YqlRft1peQ7VymrWywAHX3Koz1GCUrFEVNONiMw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 3.0.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.490.0 + '@aws-sdk/core': 3.490.0 + '@aws-sdk/credential-provider-node': 3.490.0 + '@aws-sdk/middleware-bucket-endpoint': 3.489.0 + '@aws-sdk/middleware-expect-continue': 3.489.0 + '@aws-sdk/middleware-flexible-checksums': 3.489.0 + '@aws-sdk/middleware-host-header': 3.489.0 + '@aws-sdk/middleware-location-constraint': 3.489.0 + '@aws-sdk/middleware-logger': 3.489.0 + '@aws-sdk/middleware-recursion-detection': 3.489.0 + '@aws-sdk/middleware-sdk-s3': 3.489.0 + '@aws-sdk/middleware-signing': 3.489.0 + '@aws-sdk/middleware-ssec': 3.489.0 + '@aws-sdk/middleware-user-agent': 3.489.0 + '@aws-sdk/region-config-resolver': 3.489.0 + '@aws-sdk/signature-v4-multi-region': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-endpoints': 3.489.0 + '@aws-sdk/util-user-agent-browser': 3.489.0 + '@aws-sdk/util-user-agent-node': 3.489.0 + '@aws-sdk/xml-builder': 3.485.0 + '@smithy/config-resolver': 2.0.23 + '@smithy/core': 1.2.2 + '@smithy/eventstream-serde-browser': 2.0.16 + '@smithy/eventstream-serde-config-resolver': 2.0.16 + '@smithy/eventstream-serde-node': 2.0.16 + '@smithy/fetch-http-handler': 2.3.2 + '@smithy/hash-blob-browser': 2.0.17 + '@smithy/hash-node': 2.0.18 + '@smithy/hash-stream-node': 2.0.18 + '@smithy/invalid-dependency': 2.0.16 + '@smithy/md5-js': 2.0.18 + '@smithy/middleware-content-length': 2.0.18 + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-retry': 2.0.26 + '@smithy/middleware-serde': 2.0.16 + '@smithy/middleware-stack': 2.0.10 + '@smithy/node-config-provider': 2.1.9 + '@smithy/node-http-handler': 2.2.2 + '@smithy/protocol-http': 3.0.12 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + '@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.24 + '@smithy/util-defaults-mode-node': 2.0.32 + '@smithy/util-endpoints': 1.0.8 + '@smithy/util-retry': 2.0.9 + '@smithy/util-stream': 2.0.24 + '@smithy/util-utf8': 2.0.2 + '@smithy/util-waiter': 2.0.16 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.490.0: + resolution: {integrity: sha512-yfxoHmCL1w/IKmFRfzCxdVCQrGlSQf4eei9iVEm5oi3iE8REFyPj3o/BmKQEHG3h2ITK5UbdYDb5TY4xoYHsyA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.490.0 + '@aws-sdk/middleware-host-header': 3.489.0 + '@aws-sdk/middleware-logger': 3.489.0 + '@aws-sdk/middleware-recursion-detection': 3.489.0 + '@aws-sdk/middleware-user-agent': 3.489.0 + '@aws-sdk/region-config-resolver': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-endpoints': 3.489.0 + '@aws-sdk/util-user-agent-browser': 3.489.0 + '@aws-sdk/util-user-agent-node': 3.489.0 + '@smithy/config-resolver': 2.0.23 + '@smithy/core': 1.2.2 + '@smithy/fetch-http-handler': 2.3.2 + '@smithy/hash-node': 2.0.18 + '@smithy/invalid-dependency': 2.0.16 + '@smithy/middleware-content-length': 2.0.18 + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-retry': 2.0.26 + '@smithy/middleware-serde': 2.0.16 + '@smithy/middleware-stack': 2.0.10 + '@smithy/node-config-provider': 2.1.9 + '@smithy/node-http-handler': 2.2.2 + '@smithy/protocol-http': 3.0.12 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + '@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.24 + '@smithy/util-defaults-mode-node': 2.0.32 + '@smithy/util-endpoints': 1.0.8 + '@smithy/util-retry': 2.0.9 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.490.0: + resolution: {integrity: sha512-n2vQ5Qu2qi2I0XMI+IH99ElpIRHOJTa1+sqNC4juMYxKQBMvw+EnsqUtaL3QvTHoyxNB/R7mpkeBB6SzPQ1TtA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.490.0 + '@aws-sdk/credential-provider-node': 3.490.0 + '@aws-sdk/middleware-host-header': 3.489.0 + '@aws-sdk/middleware-logger': 3.489.0 + '@aws-sdk/middleware-recursion-detection': 3.489.0 + '@aws-sdk/middleware-user-agent': 3.489.0 + '@aws-sdk/region-config-resolver': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-endpoints': 3.489.0 + '@aws-sdk/util-user-agent-browser': 3.489.0 + '@aws-sdk/util-user-agent-node': 3.489.0 + '@smithy/config-resolver': 2.0.23 + '@smithy/core': 1.2.2 + '@smithy/fetch-http-handler': 2.3.2 + '@smithy/hash-node': 2.0.18 + '@smithy/invalid-dependency': 2.0.16 + '@smithy/middleware-content-length': 2.0.18 + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-retry': 2.0.26 + '@smithy/middleware-serde': 2.0.16 + '@smithy/middleware-stack': 2.0.10 + '@smithy/node-config-provider': 2.1.9 + '@smithy/node-http-handler': 2.2.2 + '@smithy/protocol-http': 3.0.12 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + '@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.24 + '@smithy/util-defaults-mode-node': 2.0.32 + '@smithy/util-endpoints': 1.0.8 + '@smithy/util-middleware': 2.0.9 + '@smithy/util-retry': 2.0.9 + '@smithy/util-utf8': 2.0.2 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.490.0: + resolution: {integrity: sha512-TSBWkXtxMU7q1Zo6w3v5wIOr/sj7P5Jw3OyO7lJrFGsPsDC2xwpxkVqTesDxkzgMRypO52xjYEmveagn1xxBHg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.2.2 + '@smithy/protocol-http': 3.0.12 + '@smithy/signature-v4': 2.0.19 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.489.0: + resolution: {integrity: sha512-5PqYsx9G5SB2tqPT9/z/u0EkF6D4wP6HTMWQs+DfMdmwXihrqQAgeYaTtV3KbXqb88p6sfacwxhUvE6+Rm494w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/property-provider': 2.0.17 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-ini@3.490.0: + resolution: {integrity: sha512-7m63zyCpVqj9FsoDxWMWWRvL6c7zZzOcXYkHZmHujVVlmAXH0RT/vkXFkYgt+Ku+ov+v5NQrzwO5TmVoRt6O8g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.489.0 + '@aws-sdk/credential-provider-process': 3.489.0 + '@aws-sdk/credential-provider-sso': 3.490.0 + '@aws-sdk/credential-provider-web-identity': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@smithy/credential-provider-imds': 2.1.5 + '@smithy/property-provider': 2.0.17 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.490.0: + resolution: {integrity: sha512-Gh33u2O5Xbout8G3z/Z5H/CZzdG1ophxf/XS3iMFxA1cazQ7swY1UMmGvB7Lm7upvax5anXouItD1Ph3gzKc4w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.489.0 + '@aws-sdk/credential-provider-ini': 3.490.0 + '@aws-sdk/credential-provider-process': 3.489.0 + '@aws-sdk/credential-provider-sso': 3.490.0 + '@aws-sdk/credential-provider-web-identity': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@smithy/credential-provider-imds': 2.1.5 + '@smithy/property-provider': 2.0.17 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process@3.489.0: + resolution: {integrity: sha512-3vKQYJZ5cZYjy0870CPmbmKRBgATw2xCygxhn4m4UDCjOXVXcGUtYD51DMWsvBo3S0W8kH+FIJV4yuEDMFqLFQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/property-provider': 2.0.17 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-sso@3.490.0: + resolution: {integrity: sha512-3UUBUoPbFvT58IhS4Vb23omYj/QPNkjgxu9p9ruQ3KSjLkanI4w8t/l/jljA65q83P7CoLnM5UKG9L7RA8/V1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.490.0 + '@aws-sdk/token-providers': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@smithy/property-provider': 2.0.17 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity@3.489.0: + resolution: {integrity: sha512-mjIuE2Wg1H/ds0nXQ/7vfusEDudmdd8YzKZI1y5O4n60iZZtyB2RNIECtvLMx1EQAKclidY7/06qQkArrGau5Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/property-provider': 2.0.17 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-bucket-endpoint@3.489.0: + resolution: {integrity: sha512-6rJ5bpNMKo7sEKQ6p2DMbQwM+ahMYASRxfdyH7hs18blvlcS20H1RYpNmJMqPPjxMwUWruty2JPMIRl4DFcv8w==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-arn-parser': 3.465.0 + '@smithy/node-config-provider': 2.1.9 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + '@smithy/util-config-provider': 2.1.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-expect-continue@3.489.0: + resolution: {integrity: sha512-2RZfnVZFaGHwzPDQJsyf9SXufu1gUd4VsMhm7dC7SWF85XmpDrozbFznS/tD22QdtyWjerLoydZJMq229hpPqg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.489.0: + resolution: {integrity: sha512-Cy3rBUMr4P7raxzrJFWNRshfKrKV2EojawaC9Bfk/T8aFlV+FmVrRg4ISAXMOfS5pfy3xfAbvkzjOaeqCsGfrA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/types': 3.489.0 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.489.0: + resolution: {integrity: sha512-Cl7HJ1jhOfllwf0CRx1eB4ypRGMqdGKWpc0eSTXty7wWSvCdMZUhwfjQqu2bIOIlgYxg/gFu6TVmVZ6g4O8PlA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-location-constraint@3.489.0: + resolution: {integrity: sha512-NIVr+kHR2N6gxFeE3TNw2mEBxgj0N9xXBLy3dNYMMlAUvQlT/0z9HlC9+3XqcTS/Z5ElF/+pei6nqXTVt0He9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.489.0: + resolution: {integrity: sha512-+EVDnWese61MdImcBNAgz/AhTcIZJaska/xsU3GWU9CP905x4a4qZdB7fExFMDu1Jlz5pJqNteFYYHCFMJhHfg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.489.0: + resolution: {integrity: sha512-m4rU+fTzziQcu9DKjRNZ4nQlXENEd2ZnJblJV4ONdWqqEjbmOgOj3P6aCCQlJdIbzuNvX1FBOZ5tY59ZpERo7Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-s3@3.489.0: + resolution: {integrity: sha512-/GGASx7mK9qEgy1znvleYMZKVqm3sOdGghqKdy2zgoGcH2jH+fZrLM0lDMT9bvdITmOCbJJs2rVHP3xm/ZWcXg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-arn-parser': 3.465.0 + '@smithy/node-config-provider': 2.1.9 + '@smithy/protocol-http': 3.0.12 + '@smithy/signature-v4': 2.0.19 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/util-config-provider': 2.1.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.489.0: + resolution: {integrity: sha512-rlHcWYZn6Ym3v/u0DvKNDiD7ogIzEsHlerm0lowTiQbszkFobOiUClRTALwvsUZdAAztl706qO1OKbnGnD6Ubw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/property-provider': 2.0.17 + '@smithy/protocol-http': 3.0.12 + '@smithy/signature-v4': 2.0.19 + '@smithy/types': 2.8.0 + '@smithy/util-middleware': 2.0.9 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-ssec@3.489.0: + resolution: {integrity: sha512-5RQg8dqERAmi1OfVEV9fbTA5NKmcvKDYP79YtH08IEFIsHWU1Y5NoqL7mXkkNyBrJNBVyasYijAbTzOuM707eg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.489.0: + resolution: {integrity: sha512-M54Cv2fAN3GGgdfUjLtZ4wFUIrfM/ivbXv4DgpcNsacEQ2g4H+weQgKp41X7XZW8MWAzl+k1zJaryK69RYNQkQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-endpoints': 3.489.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/region-config-resolver@3.489.0: + resolution: {integrity: sha512-UvrnB78XTz9ddby7mr0vuUHn2MO3VTjzaIu+GQhyedMGQU0QlIQrYOlzbbu4LC5rL1O8FxFLUxRe/AAjgwyuGw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/node-config-provider': 2.1.9 + '@smithy/types': 2.8.0 + '@smithy/util-config-provider': 2.1.0 + '@smithy/util-middleware': 2.0.9 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.489.0: + resolution: {integrity: sha512-kYFM7Opu36EkFlzXdVNOBFpQApgnuaTu/U/qYhGyuzeD+HNnYgZEsd/tDro1DQ074jVy3GN9ttJSYxq5I4oTkA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@smithy/protocol-http': 3.0.12 + '@smithy/signature-v4': 2.0.19 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/token-providers@3.489.0: + resolution: {integrity: sha512-hSgjB8CMQoA8EIQ0ripDjDtbBcWDSa+7vSBYPIzksyknaGERR/GUfGXLV2dpm5t17FgFG6irT5f3ZlBzarL8Dw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/middleware-host-header': 3.489.0 + '@aws-sdk/middleware-logger': 3.489.0 + '@aws-sdk/middleware-recursion-detection': 3.489.0 + '@aws-sdk/middleware-user-agent': 3.489.0 + '@aws-sdk/region-config-resolver': 3.489.0 + '@aws-sdk/types': 3.489.0 + '@aws-sdk/util-endpoints': 3.489.0 + '@aws-sdk/util-user-agent-browser': 3.489.0 + '@aws-sdk/util-user-agent-node': 3.489.0 + '@smithy/config-resolver': 2.0.23 + '@smithy/fetch-http-handler': 2.3.2 + '@smithy/hash-node': 2.0.18 + '@smithy/invalid-dependency': 2.0.16 + '@smithy/middleware-content-length': 2.0.18 + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-retry': 2.0.26 + '@smithy/middleware-serde': 2.0.16 + '@smithy/middleware-stack': 2.0.10 + '@smithy/node-config-provider': 2.1.9 + '@smithy/node-http-handler': 2.2.2 + '@smithy/property-provider': 2.0.17 + '@smithy/protocol-http': 3.0.12 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + '@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.24 + '@smithy/util-defaults-mode-node': 2.0.32 + '@smithy/util-endpoints': 1.0.8 + '@smithy/util-retry': 2.0.9 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types@3.489.0: + resolution: {integrity: sha512-kcDtLfKog/p0tC4gAeqJqWxAiEzfe2LRPnKamvSG2Mjbthx4R/alE2dxyIq/wW+nvRv0fqR3OD5kD1+eVfdr/w==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-arn-parser@3.465.0: + resolution: {integrity: sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.489.0: + resolution: {integrity: sha512-uGyG1u84ATX03mf7bT4xD9XD/vlYJGD5+RxMN/UpzeTfzXfh+jvCQWbOQ44z8ttFJWYQQqrLxkfpF/JgvALzLA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/types': 2.8.0 + '@smithy/util-endpoints': 1.0.8 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-locate-window@3.465.0: + resolution: {integrity: sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.489.0: + resolution: {integrity: sha512-85B9KMsuMpAZauzWQ16r52ZBAHYnznW6BVitnBglsibN7oJKn10Hggt4QGuRhvQFCxQ8YhvBl7r+vQGFO4hxIw==} + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/types': 2.8.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-node@3.489.0: + resolution: {integrity: sha512-CYdkBHig8sFNc0dv11Ni9WXvZQHeI5+z77OrDHKkbidFx/V4BDTuwZw4K1vWg62pzFOEfzunJFiULRcDZWJR3w==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/types': 3.489.0 + '@smithy/node-config-provider': 2.1.9 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/xml-builder@3.485.0: + resolution: {integrity: sha512-xQexPM6LINOIkf3NLFywplcbApifZRMWFN41TDWYSNgCUa5uC9fntfenw8N/HTx1n+McRCWSAFBTjDqY/2OLCQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -990,6 +1578,461 @@ packages: /@sideway/pinpoint@2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + /@smithy/abort-controller@2.0.16: + resolution: {integrity: sha512-4foO7738k8kM9flMHu3VLabqu7nPgvIj8TB909S0CnKx0YZz/dcDH3pZ/4JHdatfxlZdKF1JWOYCw9+v3HVVsw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader-native@2.0.1: + resolution: {integrity: sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==} + dependencies: + '@smithy/util-base64': 2.0.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader@2.0.0: + resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.0.23: + resolution: {integrity: sha512-XakUqgtP2YY8Mi+Nlif5BiqJgWdvfxJafSpOSQeCOMizu+PUhE4fBQSy6xFcR+eInrwVadaABNxoJyGUMn15ew==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.1.9 + '@smithy/types': 2.8.0 + '@smithy/util-config-provider': 2.1.0 + '@smithy/util-middleware': 2.0.9 + tslib: 2.6.2 + dev: false + + /@smithy/core@1.2.2: + resolution: {integrity: sha512-uLjrskLT+mWb0emTR5QaiAIxVEU7ndpptDaVDrTwwhD+RjvHhjIiGQ3YL5jKk1a5VSDQUA2RGkXvJ6XKRcz6Dg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-retry': 2.0.26 + '@smithy/middleware-serde': 2.0.16 + '@smithy/protocol-http': 3.0.12 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/util-middleware': 2.0.9 + tslib: 2.6.2 + dev: false + + /@smithy/credential-provider-imds@2.1.5: + resolution: {integrity: sha512-VfvE6Wg1MUWwpTZFBnUD7zxvPhLY8jlHCzu6bCjlIYoWgXCDzZAML76IlZUEf45nib3rjehnFgg0s1rgsuN/bg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.1.9 + '@smithy/property-provider': 2.0.17 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.0.16: + resolution: {integrity: sha512-umYh5pdCE9GHgiMAH49zu9wXWZKNHHdKPm/lK22WYISTjqu29SepmpWNmPiBLy/yUu4HFEGJHIFrDWhbDlApaw==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.8.0 + '@smithy/util-hex-encoding': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-browser@2.0.16: + resolution: {integrity: sha512-W+BdiN728R57KuZOcG0GczpIOEFf8S5RP/OdVH7T3FMCy8HU2bBU0vB5xZZR5c00VRdoeWrohNv3XlHoZuGRoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-config-resolver@2.0.16: + resolution: {integrity: sha512-8qrE4nh+Tg6m1SMFK8vlzoK+8bUFTlIhXidmmQfASMninXW3Iu0T0bI4YcIk4nLznHZdybQ0qGydIanvVZxzVg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-node@2.0.16: + resolution: {integrity: sha512-NRNQuOa6mQdFSkqzY0IV37swHWx0SEoKxFtUfdZvfv0AVQPlSw4N7E3kcRSCpnHBr1kCuWWirdDlWcjWuD81MA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-universal@2.0.16: + resolution: {integrity: sha512-ZyLnGaYQMLc75j9kKEVMJ3X6bdBE9qWxhZdTXM5RIltuytxJC3FaOhawBxjE+IL1enmWSIohHGZCm/pLwEliQA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.3.2: + resolution: {integrity: sha512-O9R/OlnAOTsnysuSDjt0v2q6DcSvCz5cCFC/CFAWWcLyBwJDeFyGTCTszgpQTb19+Fi8uRwZE5/3ziAQBFeDMQ==} + dependencies: + '@smithy/protocol-http': 3.0.12 + '@smithy/querystring-builder': 2.0.16 + '@smithy/types': 2.8.0 + '@smithy/util-base64': 2.0.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-blob-browser@2.0.17: + resolution: {integrity: sha512-/mPpv1sRiRDdjO4zZuO8be6eeabmg5AVgKDfnmmqkpBtRyMGSJb968fjRuHt+FRAsIGywgIKJFmUUAYjhsi1oQ==} + dependencies: + '@smithy/chunked-blob-reader': 2.0.0 + '@smithy/chunked-blob-reader-native': 2.0.1 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/hash-node@2.0.18: + resolution: {integrity: sha512-gN2JFvAgnZCyDN9rJgcejfpK0uPPJrSortVVVVWsru9whS7eQey6+gj2eM5ln2i6rHNntIXzal1Fm9XOPuoaKA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/hash-stream-node@2.0.18: + resolution: {integrity: sha512-OuFk+ITpv8CtxGjQcS8GA04faNycu9UMm6YobvQzjeEoXZ0dLF6sRfuzD+3S8RHPKpTyLuXtKG1+GiJycZ5TcA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/invalid-dependency@2.0.16: + resolution: {integrity: sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/is-array-buffer@2.0.0: + resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/md5-js@2.0.18: + resolution: {integrity: sha512-bHwZ8/m6RbERQdVW5rJ2LzeW8qxfXv6Q/S7Fiudhso4pWRrksqLx3nsGZw7bmqqfN4zLqkxydxSa9+4c7s5zxg==} + dependencies: + '@smithy/types': 2.8.0 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.0.18: + resolution: {integrity: sha512-ZJ9uKPTfxYheTKSKYB+GCvcj+izw9WGzRLhjn8n254q0jWLojUzn7Vw0l4R/Gq7Wdpf/qmk/ptD+6CCXHNVCaw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.3.0: + resolution: {integrity: sha512-VsOAG2YQ8ykjSmKO+CIXdJBIWFo6AAvG6Iw95BakBTqk66/4BI7XyqLevoNSq/lZ6NgZv24sLmrcIN+fLDWBCg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.0.16 + '@smithy/node-config-provider': 2.1.9 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + '@smithy/url-parser': 2.0.16 + '@smithy/util-middleware': 2.0.9 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-retry@2.0.26: + resolution: {integrity: sha512-Qzpxo0U5jfNiq9iD38U3e2bheXwvTEX4eue9xruIvEgh+UKq6dKuGqcB66oBDV7TD/mfoJi9Q/VmaiqwWbEp7A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.1.9 + '@smithy/protocol-http': 3.0.12 + '@smithy/service-error-classification': 2.0.9 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + '@smithy/util-middleware': 2.0.9 + '@smithy/util-retry': 2.0.9 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-serde@2.0.16: + resolution: {integrity: sha512-5EAd4t30pcc4M8TSSGq7q/x5IKrxfXR5+SrU4bgxNy7RPHQo2PSWBUco9C+D9Tfqp/JZvprRpK42dnupZafk2g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.0.10: + resolution: {integrity: sha512-I2rbxctNq9FAPPEcuA1ntZxkTKOPQFy7YBPOaD/MLg1zCvzv21CoNxR0py6J8ZVC35l4qE4nhxB0f7TF5/+Ldw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/node-config-provider@2.1.9: + resolution: {integrity: sha512-tUyW/9xrRy+s7RXkmQhgYkAPMpTIF8izK4orhHjNFEKR3QZiOCbWB546Y8iB/Fpbm3O9+q0Af9rpywLKJOwtaQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/property-provider': 2.0.17 + '@smithy/shared-ini-file-loader': 2.2.8 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.2.2: + resolution: {integrity: sha512-XO58TO/Eul/IBQKFKaaBtXJi0ItEQQCT+NI4IiKHCY/4KtqaUT6y/wC1EvDqlA9cP7Dyjdj7FdPs4DyynH3u7g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.0.16 + '@smithy/protocol-http': 3.0.12 + '@smithy/querystring-builder': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/property-provider@2.0.17: + resolution: {integrity: sha512-+VkeZbVu7qtQ2DjI48Qwaf9fPOr3gZIwxQpuLJgRRSkWsdSvmaTCxI3gzRFKePB63Ts9r4yjn4HkxSCSkdWmcQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.0.12: + resolution: {integrity: sha512-Xz4iaqLiaBfbQpB9Hgi3VcZYbP7xRDXYhd8XWChh4v94uw7qwmvlxdU5yxzfm6ACJM66phHrTbS5TVvj5uQ72w==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.0.16: + resolution: {integrity: sha512-Q/GsJT0C0mijXMRs7YhZLLCP5FcuC4797lYjKQkME5CZohnLC4bEhylAd2QcD3gbMKNjCw8+T2I27WKiV/wToA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + '@smithy/util-uri-escape': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.0.16: + resolution: {integrity: sha512-c4ueAuL6BDYKWpkubjrQthZKoC3L5kql5O++ovekNxiexRXTlLIVlCR4q3KziOktLIw66EU9SQljPXd/oN6Okg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/service-error-classification@2.0.9: + resolution: {integrity: sha512-0K+8GvtwI7VkGmmInPydM2XZyBfIqLIbfR7mDQ+oPiz8mIinuHbV6sxOLdvX1Jv/myk7XTK9orgt3tuEpBu/zg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + dev: false + + /@smithy/shared-ini-file-loader@2.2.8: + resolution: {integrity: sha512-E62byatbwSWrtq9RJ7xN40tqrRKDGrEL4EluyNpaIDvfvet06a/QC58oHw2FgVaEgkj0tXZPjZaKrhPfpoU0qw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/signature-v4@2.0.19: + resolution: {integrity: sha512-nwc3JihdM+kcJjtORv/n7qRHN2Kfh7S2RJI2qr8pz9UcY5TD8rSCRGQ0g81HgyS3jZ5X9U/L4p014P3FonBPhg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.0.16 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/types': 2.8.0 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-middleware': 2.0.9 + '@smithy/util-uri-escape': 2.0.0 + '@smithy/util-utf8': 2.0.2 + tslib: 2.6.2 + dev: false + + /@smithy/smithy-client@2.2.1: + resolution: {integrity: sha512-SpD7FLK92XV2fon2hMotaNDa2w5VAy5/uVjP9WFmjGSgWM8pTPVkHcDl1yFs5Z8LYbij0FSz+DbCBK6i+uXXUA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.3.0 + '@smithy/middleware-stack': 2.0.10 + '@smithy/protocol-http': 3.0.12 + '@smithy/types': 2.8.0 + '@smithy/util-stream': 2.0.24 + tslib: 2.6.2 + dev: false + + /@smithy/types@2.8.0: + resolution: {integrity: sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/url-parser@2.0.16: + resolution: {integrity: sha512-Wfz5WqAoRT91TjRy1JeLR0fXtkIXHGsMbgzKFTx7E68SrZ55TB8xoG+vm11Ru4gheFTMXjAjwAxv1jQdC+pAQA==} + dependencies: + '@smithy/querystring-parser': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-base64@2.0.1: + resolution: {integrity: sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-browser@2.0.1: + resolution: {integrity: sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-node@2.1.0: + resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-buffer-from@2.0.0: + resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-config-provider@2.1.0: + resolution: {integrity: sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-browser@2.0.24: + resolution: {integrity: sha512-TsP5mBuLgO2C21+laNG2nHYZEyUdkbGURv2tHvSuQQxLz952MegX95uwdxOY2jR2H4GoKuVRfdJq7w4eIjGYeg==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 2.0.17 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-node@2.0.32: + resolution: {integrity: sha512-d0S33dXA2cq1NyorVMroMrEtqKMr3MlyLITcfTBf9pXiigYiPMOtbSI7czHIfDbuVuM89Cg0urAgpt73QV9mPQ==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.0.23 + '@smithy/credential-provider-imds': 2.1.5 + '@smithy/node-config-provider': 2.1.9 + '@smithy/property-provider': 2.0.17 + '@smithy/smithy-client': 2.2.1 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@1.0.8: + resolution: {integrity: sha512-l8zVuyZZ61IzZBYp5NWvsAhbaAjYkt0xg9R4xUASkg5SEeTT2meHOJwJHctKMFUXe4QZbn9fR2MaBYjP2119+w==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.1.9 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-hex-encoding@2.0.0: + resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-middleware@2.0.9: + resolution: {integrity: sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-retry@2.0.9: + resolution: {integrity: sha512-46BFWe9RqB6g7f4mxm3W3HlqknqQQmWHKlhoqSFZuGNuiDU5KqmpebMbvC3tjTlUkqn4xa2Z7s3Hwb0HNs5scw==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/service-error-classification': 2.0.9 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-stream@2.0.24: + resolution: {integrity: sha512-hRpbcRrOxDriMVmbya+Mv77VZVupxRAsfxVDKS54XuiURhdiwCUXJP0X1iJhHinuUf6n8pBF0MkG9C8VooMnWw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.3.2 + '@smithy/node-http-handler': 2.2.2 + '@smithy/types': 2.8.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.6.2 + dev: false + + /@smithy/util-uri-escape@2.0.0: + resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-utf8@2.0.2: + resolution: {integrity: sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-waiter@2.0.16: + resolution: {integrity: sha512-5i4YONHQ6HoUWDd+X0frpxTXxSXgJhUFl+z0iMy/zpUmVeCQY2or3Vss6DzHKKMMQL4pmVHpQm9WayHDorFdZg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.0.16 + '@smithy/types': 2.8.0 + tslib: 2.6.2 + dev: false + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -1490,6 +2533,10 @@ packages: engines: {node: '>=10.4.0'} dev: false + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2386,6 +3433,13 @@ packages: engines: {node: '>=6'} dev: false + /fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq@1.16.0: resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: @@ -4099,6 +5153,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} dev: false @@ -4201,11 +5259,9 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true /tsutils@3.21.0(typescript@5.3.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -4332,6 +5388,11 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: diff --git a/src/index.js b/src/index.js index 18e3f2d..0d18717 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,6 @@ import { server as createServer } from "@hapi/hapi"; -import { create as createW3UpClient } from "@web3-storage/w3up-client"; -import { parse as parsePrincipalKey } from "@ucanto/principal/ed25519"; -import { importDAG } from "@ucanto/core/delegation"; -import { CarReader } from "@ipld/car"; import { getStoreJsonDataRoute } from "./routes/data/json.js"; +import { getS3Client, getW3UpClient } from "./utils.js"; const DEV = process.env.NODE_ENV !== "production"; @@ -22,28 +19,6 @@ const start = async () => { const HOST = requireEnv({ name: "HOST" }); const PORT = requireEnv({ name: "PORT" }); - const W3UP_PRINCIPAL_KEY = requireEnv({ - name: "W3UP_PRINCIPAL_KEY", - }); - const W3UP_DELEGATION_PROOF = requireEnv({ - name: "W3UP_DELEGATION_PROOF", - }); - - const w3UpPrincipal = parsePrincipalKey(W3UP_PRINCIPAL_KEY); - const w3UpClient = await createW3UpClient({ principal: w3UpPrincipal }); - - const proofBlocks = []; - const reader = await CarReader.fromBytes( - Buffer.from(W3UP_DELEGATION_PROOF, "base64"), - ); - for await (const block of reader.blocks()) { - proofBlocks.push(block); - } - const proof = importDAG(proofBlocks); - - const space = await w3UpClient.addSpace(proof); - await w3UpClient.setCurrentSpace(space.did()); - const server = createServer({ host: HOST, port: PORT, @@ -53,6 +28,23 @@ const start = async () => { }, }); + const W3UP_PRINCIPAL_KEY = requireEnv({ name: "W3UP_PRINCIPAL_KEY" }); + const W3UP_DELEGATION_PROOF = requireEnv({ name: "W3UP_DELEGATION_PROOF" }); + const w3UpClient = await getW3UpClient({ + principalKey: W3UP_PRINCIPAL_KEY, + delegationProof: W3UP_DELEGATION_PROOF, + }); + + const S3_ENDPOINT = requireEnv({ name: "S3_ENDPOINT" }); + const S3_BUCKET = requireEnv({ name: "S3_BUCKET" }); + const S3_ACCESS_KEY_ID = requireEnv({ name: "S3_ACCESS_KEY_ID" }); + const S3_SECRET_ACCESS_KEY = requireEnv({ name: "S3_SECRET_ACCESS_KEY" }); + const s3Client = getS3Client({ + endpoint: S3_ENDPOINT, + accessKeyId: S3_ACCESS_KEY_ID, + secretAccessKey: S3_SECRET_ACCESS_KEY, + }); + const serverPlugins = [ { plugin: (await import("hapi-pino")).default, @@ -89,7 +81,13 @@ const start = async () => { } await server.register(serverPlugins); - server.route(await getStoreJsonDataRoute({ w3UpClient })); + server.route( + await getStoreJsonDataRoute({ + w3UpClient, + s3Client, + s3Bucket: S3_BUCKET, + }), + ); try { await server.start(); diff --git a/src/routes/data/json.js b/src/routes/data/json.js index 8719154..0c0ef94 100644 --- a/src/routes/data/json.js +++ b/src/routes/data/json.js @@ -1,11 +1,20 @@ import { badGateway } from "@hapi/boom"; import joi from "joi"; +import { PutObjectCommand } from "@aws-sdk/client-s3"; /** - * @param {{ w3UpClient: import("@web3-storage/w3up-client").Client }} params + * @param {{ + * w3UpClient: import("@web3-storage/w3up-client").Client, + * s3Client: import("@aws-sdk/client-s3").S3Client, + * s3Bucket: string + * }} params * @returns {import("@hapi/hapi").ServerRoute} */ -export const getStoreJsonDataRoute = async ({ w3UpClient }) => { +export const getStoreJsonDataRoute = async ({ + w3UpClient, + s3Client, + s3Bucket, +}) => { return { method: "POST", path: "/data/json", @@ -51,17 +60,33 @@ export const getStoreJsonDataRoute = async ({ w3UpClient }) => { /** @type {{ data: object }} */ const payload = request.payload; const { data } = payload; - const content = Buffer.from(JSON.stringify(data)).toString(); - const blob = new Blob([content]); + const dataString = JSON.stringify(data); + /** @type {string} */ let cid; try { - cid = await w3UpClient.uploadFile(blob); + cid = ( + await w3UpClient.uploadFile(new Blob([dataString])) + ).toString(); } catch (error) { request.logger.error(error, "Could not upload data to w3up"); return badGateway("Could not upload data to w3up"); } + try { + const put = new PutObjectCommand({ + ACL: "public-read", + Bucket: s3Bucket, + Body: dataString, + Key: cid, + ContentType: "application/json", + }); + await s3Client.send(put); + } catch (error) { + request.logger.error(error, "Could not upload data to s3"); + return badGateway("Could not upload data to s3"); + } + return h.response({ cid }).code(200); }, }; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..ea00e3e --- /dev/null +++ b/src/utils.js @@ -0,0 +1,44 @@ +import { create as createW3UpClient } from "@web3-storage/w3up-client"; +import { parse as parsePrincipalKey } from "@ucanto/principal/ed25519"; +import { importDAG } from "@ucanto/core/delegation"; +import { CarReader } from "@ipld/car"; +import { S3Client } from "@aws-sdk/client-s3"; + +/** + * @param {{ principalKey: string, delegationProof: string }} params + * @returns {import("@web3-storage/w3up-client").Client} + */ +export const getW3UpClient = async ({ principalKey, delegationProof }) => { + const w3UpPrincipal = parsePrincipalKey(principalKey); + const w3UpClient = await createW3UpClient({ principal: w3UpPrincipal }); + + const proofBlocks = []; + const reader = await CarReader.fromBytes( + Buffer.from(delegationProof, "base64"), + ); + for await (const block of reader.blocks()) { + proofBlocks.push(block); + } + const proof = importDAG(proofBlocks); + + const space = await w3UpClient.addSpace(proof); + await w3UpClient.setCurrentSpace(space.did()); + + return w3UpClient; +}; + +/** + * @param {{ endpoint: string, accessKeyId: string; secretAccessKey: string }} params + * @returns {import("@aws-sdk/client-s3").S3Client} + */ +export const getS3Client = ({ endpoint, accessKeyId, secretAccessKey }) => { + return new S3Client({ + forcePathStyle: false, // Configures to use subdomain/virtual calling format. + endpoint: endpoint, + region: "us-east-1", + credentials: { + accessKeyId, + secretAccessKey, + }, + }); +}; From 72758f9f1b544888e63ed857229cf356d4b65faa Mon Sep 17 00:00:00 2001 From: luzzifoss Date: Wed, 17 Jan 2024 18:50:10 +0000 Subject: [PATCH 2/2] chore: minor syntax upate --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index ea00e3e..57c83b4 100644 --- a/src/utils.js +++ b/src/utils.js @@ -34,7 +34,7 @@ export const getW3UpClient = async ({ principalKey, delegationProof }) => { export const getS3Client = ({ endpoint, accessKeyId, secretAccessKey }) => { return new S3Client({ forcePathStyle: false, // Configures to use subdomain/virtual calling format. - endpoint: endpoint, + endpoint, region: "us-east-1", credentials: { accessKeyId,