diff --git a/README.md b/README.md index cee6282..11950b7 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,11 @@ code center ``` unzip -x app.config.json5 +``` + +``` +"@kevisual/oss": "file:/home/ubuntu/kevisual/dev3/kevisual-oss", +``` +``` +TODO: /home/ubuntu/kevisual/code-center/src/routes/file/module/get-minio-list.ts ``` \ No newline at end of file diff --git a/package.json b/package.json index 11117d0..115309a 100644 --- a/package.json +++ b/package.json @@ -71,12 +71,13 @@ "zod-to-json-schema": "^3.25.1" }, "devDependencies": { + "@aws-sdk/client-s3": "^3.978.0", + "@kevisual/oss": "file:/home/ubuntu/kevisual/dev3/kevisual-oss", "@kevisual/code-center-module": "0.0.24", "@kevisual/context": "^0.0.4", "@kevisual/file-listener": "^0.0.2", "@kevisual/local-app-manager": "0.1.32", "@kevisual/logger": "^0.0.4", - "@kevisual/oss": "0.0.16", "@kevisual/permission": "^0.0.3", "@kevisual/router": "0.0.60", "@kevisual/types": "^0.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6633552..704c34c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,6 +79,9 @@ importers: specifier: ^3.25.1 version: 3.25.1(zod@4.3.6) devDependencies: + '@aws-sdk/client-s3': + specifier: ^3.978.0 + version: 3.978.0 '@kevisual/code-center-module': specifier: 0.0.24 version: 0.0.24(dotenv@17.2.3) @@ -95,8 +98,8 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/oss': - specifier: 0.0.16 - version: 0.0.16 + specifier: file:/home/ubuntu/kevisual/dev3/kevisual-oss + version: file:../dev3/kevisual-oss '@kevisual/permission': specifier: ^0.0.3 version: 0.0.3 @@ -200,6 +203,189 @@ importers: packages: + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.978.0': + resolution: {integrity: sha512-2chs05VbfgRNb5ZEYIwooeHCaL+DjwvrW3ElkslI71ltEqVNdeWvB7hbkLWPPKazV3kjY3H90pLDY8mMqsET+A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sso@3.975.0': + resolution: {integrity: sha512-HpgJuleH7P6uILxzJKQOmlHdwaCY+xYC6VgRDzlwVEqU/HXjo4m2gOAyjUbpXlBOCWfGgMUzfBlNJ9z3MboqEQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.972.0': + resolution: {integrity: sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.4': + resolution: {integrity: sha512-8Rk+kPP74YiR47x54bxYlKZswsaSh0a4XvvRUMLvyS/koNawhsGu/+qSZxREqUeTO+GkKpFvSQIsAZR+deUP+g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/crc64-nvme@3.972.0': + resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.2': + resolution: {integrity: sha512-wzH1EdrZsytG1xN9UHaK12J9+kfrnd2+c8y0LVoS4O4laEjPoie1qVK3k8/rZe7KOtvULzyMnO3FT4Krr9Z0Dg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.4': + resolution: {integrity: sha512-OC7F3ipXV12QfDEWybQGHLzoeHBlAdx/nLzPfHP0Wsabu3JBffu5nlzSaJNf7to9HGtOW8Bpu8NX0ugmDrCbtw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.2': + resolution: {integrity: sha512-Jrb8sLm6k8+L7520irBrvCtdLxNtrG7arIxe9TCeMJt/HxqMGJdbIjw8wILzkEHLMIi4MecF2FbXCln7OT1Tag==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.2': + resolution: {integrity: sha512-mlaw2aiI3DrimW85ZMn3g7qrtHueidS58IGytZ+mbFpsYLK5wMjCAKZQtt7VatLMtSBG/dn/EY4njbnYXIDKeQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.3': + resolution: {integrity: sha512-iu+JwWHM7tHowKqE+8wNmI3sM6mPEiI9Egscz2BEV7adyKmV95oR9tBO4VIOl72FGDi7X9mXg19VtqIpSkEEsA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.2': + resolution: {integrity: sha512-NLKLTT7jnUe9GpQAVkPTJO+cs2FjlQDt5fArIYS7h/Iw/CvamzgGYGFRVD2SE05nOHCMwafUSi42If8esGFV+g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.2': + resolution: {integrity: sha512-YpwDn8g3gCGUl61cCV0sRxP2pFIwg+ZsMfWQ/GalSyjXtRkctCMFA+u0yPb/Q4uTfNEiya1Y4nm0C5rIHyPW5Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.2': + resolution: {integrity: sha512-x9DAiN9Qz+NjJ99ltDiVQ8d511M/tuF/9MFbe2jUgo7HZhD6+x4S3iT1YcP07ndwDUjmzKGmeOEgE24k4qvfdg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.972.2': + resolution: {integrity: sha512-ofuXBnitp9j8t05O4NQVrpMZDECPtUhRIWdLzR35baR5njOIPY7YqNtJE+yELVpSn2m4jt2sV1ezYMBY4/Lo+w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-expect-continue@3.972.2': + resolution: {integrity: sha512-d9bBQlGk1T5j5rWfof20M2tErddOSoSLDauP2/yyuXfeOfQRCSBUZNrApSxjJ9Hw+/RDGR/XL+LEOqmXxSlV3A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.972.2': + resolution: {integrity: sha512-GgWVZJdzXzqhXxzNAYB3TnZCj7d5rZNdovqSIV91e97nowHVaExRoyaZ3H/Ydqot7veHGPTl8nBp464zZeLDTQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.2': + resolution: {integrity: sha512-42hZ8jEXT2uR6YybCzNq9OomqHPw43YIfRfz17biZjMQA4jKSQUaHIl6VvqO2Ddl5904pXg2Yd/ku78S0Ikgog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-location-constraint@3.972.2': + resolution: {integrity: sha512-pyayzpq+VQiG1o9pEUyr6BXEJ2g2t4JIPdNxDkIHp2AhR63Gy/10WQkXTBOgRnfQ7/aLPLOnjRIWwOPp0CfUlA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.2': + resolution: {integrity: sha512-iUzdXKOgi4JVDDEG/VvoNw50FryRCEm0qAudw12DcZoiNJWl0rN6SYVLcL1xwugMfQncCXieK5UBlG6mhH7iYA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.2': + resolution: {integrity: sha512-/mzlyzJDtngNFd/rAYvqx29a2d0VuiYKN84Y/Mu9mGw7cfMOCyRK+896tb9wV6MoPRHUX7IXuKCIL8nzz2Pz5A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.972.0': + resolution: {integrity: sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.972.4': + resolution: {integrity: sha512-lradfn72Td7lswhZKi86VKRNkDtmQR7bq9shX1kaPK1itjThxfcx7ogXSvMm/0cuqoYGic8UUXQOaK4kpU933g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-ssec@3.972.2': + resolution: {integrity: sha512-HJ3OmQnlQ1es6esrDWnx3nVPhBAN89WaFCzsDcb6oT7TMjBPUfZ5+1BpI7B0Hnme8cc6kp7qc4cgo2plrlROJA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.4': + resolution: {integrity: sha512-6sU8jrSJvY/lqSnU6IYsa8SrCKwOZ4Enl6O4xVJo8RCq9Bdr5Giuw2eUaJAk9GPcpr4OFcmSFv3JOLhpKGeRZA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.975.0': + resolution: {integrity: sha512-OkeFHPlQj2c/Y5bQGkX14pxhDWUGUFt3LRHhjcDKsSCw6lrxKcxN3WFZN0qbJwKNydP+knL5nxvfgKiCLpTLRA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.2': + resolution: {integrity: sha512-/7vRBsfmiOlg2X67EdKrzzQGw5/SbkXb7ALHQmlQLkZh8qNgvS2G2dDC6NtF3hzFlpP3j2k+KIEtql/6VrI6JA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.972.0': + resolution: {integrity: sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.975.0': + resolution: {integrity: sha512-AWQt64hkVbDQ+CmM09wnvSk2mVyH4iRROkmYkr3/lmUtFNbE2L/fnw26sckZnUcFCsHPqbkQrcsZAnTcBLbH4w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.972.0': + resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-arn-parser@3.972.0': + resolution: {integrity: sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-arn-parser@3.972.2': + resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.972.0': + resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.2': + resolution: {integrity: sha512-gz76bUyebPZRxIsBHJUd/v+yiyFzm9adHbr8NykP2nm+z/rFyvQneOHajrUejtmnc5tTBeaDPL4X25TnagRk4A==} + + '@aws-sdk/util-user-agent-node@3.972.2': + resolution: {integrity: sha512-vnxOc4C6AR7hVbwyFo1YuH0GB6dgJlWt8nIOOJpnzJAWJPkUMPJ9Zv2lnKsSU7TTZbhP2hEO8OZ4PYH59XFv8Q==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.972.0': + resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.2': + resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -692,8 +878,8 @@ packages: '@kevisual/logger@0.0.4': resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==} - '@kevisual/oss@0.0.16': - resolution: {integrity: sha512-kGnXySE4h8jcGrywL1RZWhOXzN3jyO8WVsX4W4zaFbfotH/zD9nIe8OfUS6a6Jci0ZL14OmDzoyaCLWHzHy0Lg==} + '@kevisual/oss@file:../dev3/kevisual-oss': + resolution: {directory: ../dev3/kevisual-oss, type: directory} '@kevisual/permission@0.0.3': resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==} @@ -785,6 +971,222 @@ packages: '@pm2/pm2-version-check@1.0.4': resolution: {integrity: sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==} + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.22.0': + resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.8': + resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.8': + resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.8': + resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.8': + resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.8': + resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.2.9': + resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.2.8': + resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.2.8': + resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.12': + resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.29': + resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.8': + resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.11.1': + resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.28': + resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.31': + resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.10': + resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.8': + resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -959,6 +1361,9 @@ packages: bodec@0.1.0: resolution: {integrity: sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==} + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1422,6 +1827,10 @@ packages: resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} hasBin: true + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + fclone@1.0.11: resolution: {integrity: sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==} @@ -2275,6 +2684,9 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2458,6 +2870,539 @@ packages: snapshots: + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.978.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.4 + '@aws-sdk/credential-provider-node': 3.972.3 + '@aws-sdk/middleware-bucket-endpoint': 3.972.2 + '@aws-sdk/middleware-expect-continue': 3.972.2 + '@aws-sdk/middleware-flexible-checksums': 3.972.2 + '@aws-sdk/middleware-host-header': 3.972.2 + '@aws-sdk/middleware-location-constraint': 3.972.2 + '@aws-sdk/middleware-logger': 3.972.2 + '@aws-sdk/middleware-recursion-detection': 3.972.2 + '@aws-sdk/middleware-sdk-s3': 3.972.4 + '@aws-sdk/middleware-ssec': 3.972.2 + '@aws-sdk/middleware-user-agent': 3.972.4 + '@aws-sdk/region-config-resolver': 3.972.2 + '@aws-sdk/signature-v4-multi-region': 3.972.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.2 + '@aws-sdk/util-user-agent-node': 3.972.2 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-blob-browser': 4.2.9 + '@smithy/hash-node': 4.2.8 + '@smithy/hash-stream-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/md5-js': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.8 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.975.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.4 + '@aws-sdk/middleware-host-header': 3.972.2 + '@aws-sdk/middleware-logger': 3.972.2 + '@aws-sdk/middleware-recursion-detection': 3.972.2 + '@aws-sdk/middleware-user-agent': 3.972.4 + '@aws-sdk/region-config-resolver': 3.972.2 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.2 + '@aws-sdk/util-user-agent-node': 3.972.2 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.972.0': + dependencies: + '@aws-sdk/types': 3.972.0 + '@aws-sdk/xml-builder': 3.972.0 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/core@3.973.4': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/crc64-nvme@3.972.0': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.2': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.2': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/credential-provider-env': 3.972.2 + '@aws-sdk/credential-provider-http': 3.972.4 + '@aws-sdk/credential-provider-login': 3.972.2 + '@aws-sdk/credential-provider-process': 3.972.2 + '@aws-sdk/credential-provider-sso': 3.972.2 + '@aws-sdk/credential-provider-web-identity': 3.972.2 + '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.972.2': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.3': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.2 + '@aws-sdk/credential-provider-http': 3.972.4 + '@aws-sdk/credential-provider-ini': 3.972.2 + '@aws-sdk/credential-provider-process': 3.972.2 + '@aws-sdk/credential-provider-sso': 3.972.2 + '@aws-sdk/credential-provider-web-identity': 3.972.2 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.972.2': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.2': + dependencies: + '@aws-sdk/client-sso': 3.975.0 + '@aws-sdk/core': 3.973.4 + '@aws-sdk/token-providers': 3.975.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.2': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.972.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.973.4 + '@aws-sdk/crc64-nvme': 3.972.0 + '@aws-sdk/types': 3.973.1 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.0': + dependencies: + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-arn-parser': 3.972.0 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.972.0 + '@smithy/core': 3.22.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.975.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.4 + '@aws-sdk/middleware-host-header': 3.972.2 + '@aws-sdk/middleware-logger': 3.972.2 + '@aws-sdk/middleware-recursion-detection': 3.972.2 + '@aws-sdk/middleware-user-agent': 3.972.4 + '@aws-sdk/region-config-resolver': 3.972.2 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.2 + '@aws-sdk/util-user-agent-node': 3.972.2 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.972.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.975.0': + dependencies: + '@aws-sdk/core': 3.973.4 + '@aws-sdk/nested-clients': 3.975.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.972.0': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/types@3.973.1': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.972.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.972.2': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.972.0': + dependencies: + '@aws-sdk/types': 3.972.0 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.4': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.2': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.13.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.972.2': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.4 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.0': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.2': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} + '@drizzle-team/brocli@0.10.2': {} '@esbuild-kit/core-utils@3.3.2': @@ -2805,7 +3750,7 @@ snapshots: '@kevisual/logger@0.0.4': {} - '@kevisual/oss@0.0.16': {} + '@kevisual/oss@file:../dev3/kevisual-oss': {} '@kevisual/permission@0.0.3': {} @@ -2923,6 +3868,344 @@ snapshots: transitivePeerDependencies: - supports-color + '@smithy/abort-controller@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.2.1': + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/core@3.22.0': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.8': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.8': + dependencies: + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.2.9': + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.12': + dependencies: + '@smithy/core': 3.22.0 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.29': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.8': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.8': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + + '@smithy/shared-ini-file-loader@4.4.3': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.8': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.11.1': + dependencies: + '@smithy/core': 3.22.0 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 + tslib: 2.8.1 + + '@smithy/types@4.12.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.8': + dependencies: + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.28': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.31': + dependencies: + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.8': + dependencies: + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.10': + dependencies: + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.8': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + '@socket.io/component-emitter@3.1.2': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -3103,6 +4386,8 @@ snapshots: bodec@0.1.0: {} + bowser@2.13.1: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -3514,6 +4799,10 @@ snapshots: dependencies: strnum: 1.0.5 + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.2 + fclone@1.0.11: {} file-uri-to-path@1.0.0: {} @@ -4456,6 +5745,8 @@ snapshots: strnum@1.0.5: {} + strnum@2.1.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 diff --git a/src/app.ts b/src/app.ts index cf40ab8..2043359 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,10 +1,9 @@ import { App } from '@kevisual/router'; import * as redisLib from './modules/redis.ts'; -import * as minioLib from './modules/minio.ts'; import * as sequelizeLib from './modules/sequelize.ts'; import { useContextKey } from '@kevisual/context'; import { SimpleRouter } from '@kevisual/router/simple'; -import { OssBase } from '@kevisual/oss/services'; +import { s3Client, oss as s3Oss } from './modules/s3.ts'; import { BailianProvider } from '@kevisual/ai'; import * as schema from './db/schema.ts'; import { drizzle } from 'drizzle-orm/node-postgres'; @@ -18,16 +17,11 @@ export const runtime = useContextKey('runtime', () => { }); export const oss = useContextKey( 'oss', - () => - new OssBase({ - client: minioLib.minioClient, - bucketName: minioLib.bucketName, - prefix: '', - }), + () => s3Oss, ); +export { s3Client } export const redis = useContextKey('redis', () => redisLib.redis); export const subscriber = useContextKey('subscriber', () => redisLib.subscriber); -export const minioClient = useContextKey('minioClient', () => minioLib.minioClient); export const sequelize = useContextKey('sequelize', () => sequelizeLib.sequelize); export const db = useContextKey('db', () => { const db = drizzle(config.DATABASE_URL || ''); diff --git a/src/db/drizzle/schema.ts b/src/db/drizzle/schema.ts index 4572925..af47af1 100644 --- a/src/db/drizzle/schema.ts +++ b/src/db/drizzle/schema.ts @@ -492,4 +492,22 @@ export const queryViews = pgTable("query_views", { }, (table) => [ index('query_views_uid_idx').using('btree', table.uid.asc().nullsLast()), index('query_title_idx').using('btree', table.title.asc().nullsLast()), +]); + +export const flowme = pgTable("flowme", { + id: uuid().primaryKey().notNull().defaultRandom(), + uid: uuid(), + title: text('title').default(''), + description: text('description').default(''), + tags: jsonb().default([]), + link: text('link').default(''), + data: jsonb().default({}), + + type: text('type').default(''), + + createdAt: timestamp('createdAt').notNull().defaultNow(), + updatedAt: timestamp('updatedAt').notNull().defaultNow(), +}, (table) => [ + index('flowme_uid_idx').using('btree', table.uid.asc().nullsLast()), + index('flowme_title_idx').using('btree', table.title.asc().nullsLast()), ]); \ No newline at end of file diff --git a/src/modules/config.ts b/src/modules/config.ts index 2e9e261..0b910d5 100644 --- a/src/modules/config.ts +++ b/src/modules/config.ts @@ -1,6 +1,6 @@ import { useConfig } from '@kevisual/use-config'; import { useFileStore } from '@kevisual/use-config'; -import { minioResources } from './minio.ts'; +import { minioResources } from './s3.ts'; export const config = useConfig() as any; export const port = config.PORT ? Number(config.PORT) : 4005; diff --git a/src/modules/fm-manager/proxy/ai-proxy.ts b/src/modules/fm-manager/proxy/ai-proxy.ts index c09a061..4290a9c 100644 --- a/src/modules/fm-manager/proxy/ai-proxy.ts +++ b/src/modules/fm-manager/proxy/ai-proxy.ts @@ -1,4 +1,4 @@ -import { bucketName, minioClient } from '@/modules/minio.ts'; +import { oss } from '@/app.ts'; import { IncomingMessage, ServerResponse } from 'http'; import { filterKeys } from './http-proxy.ts'; import { getUserFromRequest } from '../utils.ts'; @@ -11,6 +11,7 @@ import { parseSearchValue } from '@kevisual/router/src/server/parse-body.ts'; import { logger } from '@/modules/logger.ts'; import { pipeBusboy } from '../pipe-busboy.ts'; import { pipeMinioStream } from '../pipe.ts'; +import { Readable } from 'stream'; type FileList = { name: string; @@ -112,7 +113,8 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy const etag = stat.etag; const lastModified = stat.lastModified.toISOString(); - const objectStream = await minioClient.getObject(bucketName, objectName); + const objectStream = await oss.getObject(objectName); + // const objectStream = await minioClient.getObject(bucketName, objectName); const headers = { 'Content-Length': contentLength, etag, @@ -124,8 +126,7 @@ const getAiProxy = async (req: IncomingMessage, res: ServerResponse, opts: Proxy ...headers, }); // objectStream.pipe(res, { end: true }); - // @ts-ignore - pipeMinioStream(objectStream, res); + pipeMinioStream(objectStream.Body as Readable, res); return true; } catch (error) { console.error(`Proxy request error: ${error.message}`); @@ -164,9 +165,6 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: let fileSize: number | undefined = undefined; if (_fileSize) { fileSize = parseInt(_fileSize, 10); - } else if (req.headers['content-length']) { - // 如果 URL 参数没有 size,尝试从请求头获取 - fileSize = parseInt(req.headers['content-length'], 10); } let meta = parseSearchValue(params.get('meta'), { decode: true }); if (!hash && !force) { @@ -214,7 +212,7 @@ export const postProxy = async (req: IncomingMessage, res: ServerResponse, opts: ...getMetadata(pathname), ...meta, }, - { check: false, isStream: true, size: fileSize }, + { check: false, isStream: true }, ); end({ success: true, name, info, isNew: true, hash, meta: meta?.metaData, statMeta }, '上传成功', 200); @@ -301,8 +299,9 @@ export const deleteProxy = async (req: IncomingMessage, res: ServerResponse, opt if (objectName.endsWith('/')) { const objects = await oss.listObjects(objectName, { recursive: true }); if (objects.length > 0) { - const objectNames = objects.map((obj: any) => obj.name); - await minioClient.removeObjects(bucketName, objectNames); + for (const obj of objects) { + await oss.deleteObject(obj.name); + } } end({ success: true, objectName, deletedCount: objects.length }, 'delete success', 200); } else { @@ -357,17 +356,16 @@ export const renameProxy = async (req: IncomingMessage, res: ServerResponse, opt const oldKey = obj.name; const newKey = oldKey.replace(objectName, newObjectName); console.log('rename dir object', oldKey, newKey); - await minioClient.copyObject(bucketName, newKey, `/${bucketName}/${oldKey}`); + await oss.copyObject(oldKey, newKey); copiedCount++; } - // 删除原对象 - const objectNames = objects.map((obj: any) => obj.name); - if (objectNames.length > 0) { - await minioClient.removeObjects(bucketName, objectNames); + for (const obj of objects) { + console.log('deleted object', obj.name); + await oss.deleteObject(obj.name); } } else { // 重命名文件 - await minioClient.copyObject(bucketName, newObjectName, `/${bucketName}/${objectName}`); + await oss.copyObject(objectName, newObjectName); await oss.deleteObject(objectName); copiedCount = 1; } @@ -384,7 +382,6 @@ type ProxyOptions = { oss?: OssBase; }; export const aiProxy = async (req: IncomingMessage, res: ServerResponse, opts: ProxyOptions) => { - const oss = new OssBase({ bucketName, client: minioClient }); if (!opts.oss) { opts.oss = oss; } diff --git a/src/modules/fm-manager/proxy/http-proxy.ts b/src/modules/fm-manager/proxy/http-proxy.ts index c914a8e..55521b4 100644 --- a/src/modules/fm-manager/proxy/http-proxy.ts +++ b/src/modules/fm-manager/proxy/http-proxy.ts @@ -1,6 +1,6 @@ -import { pipeline, Readable } from 'node:stream'; -import { promisify } from 'node:util'; -import { bucketName, minioClient, minioResources } from '@/modules/minio.ts'; +import { Readable } from 'node:stream'; +import { minioResources } from '@/modules/s3.ts'; +import { oss } from '@/app.ts'; import fs from 'node:fs'; import { IncomingMessage, ServerResponse } from 'node:http'; import http from 'node:http'; @@ -11,14 +11,18 @@ import path from 'path'; import { getTextContentType } from '@/modules/fm-manager/index.ts'; import { logger } from '@/modules/logger.ts'; import { pipeStream } from '../pipe.ts'; -const pipelineAsync = promisify(pipeline); +import { GetObjectCommandOutput } from '@aws-sdk/client-s3'; export async function downloadFileFromMinio(fileUrl: string, destFile: string) { const objectName = fileUrl.replace(minioResources + '/', ''); - const objectStream = await minioClient.getObject(bucketName, objectName); - const destStream = fs.createWriteStream(destFile); - await pipelineAsync(objectStream, destStream); - console.log(`minio File downloaded to ${minioResources}/${objectName} \n ${destFile}`); + const objectStream = await oss.getObject(objectName) as GetObjectCommandOutput; + const body = objectStream.Body as Readable; + + const chunks: Uint8Array[] = []; + for await (const chunk of body) { + chunks.push(chunk); + } + fs.writeFileSync(destFile, Buffer.concat(chunks)); } export const filterKeys = (metaData: Record, clearKeys: string[] = []) => { const keys = Object.keys(metaData); @@ -43,8 +47,8 @@ export async function minioProxy( const { createNotFoundPage, isDownload = false } = opts; const objectName = fileUrl.replace(minioResources + '/', ''); try { - const stat = await minioClient.statObject(bucketName, objectName); - if (stat.size === 0) { + const stat = await oss.statObject(objectName); + if (stat?.size === 0) { createNotFoundPage('Invalid proxy url'); return true; } @@ -54,7 +58,8 @@ export async function minioProxy( const lastModified = stat.lastModified.toISOString(); const fileName = objectName.split('/').pop(); const ext = path.extname(fileName || ''); - const objectStream = await minioClient.getObject(bucketName, objectName); + const objectStreamOutput = await oss.getObject(objectName); + const objectStream = objectStreamOutput.Body as Readable; const headers = { 'Content-Length': contentLength, etag, @@ -151,6 +156,7 @@ export const httpProxy = async ( return createNotFoundPage('Invalid proxy url:' + error.message); } } else { + console.log('Proxying file: headers', headers); res.writeHead(proxyRes.statusCode, { ...headers, }); diff --git a/src/modules/fm-manager/proxy/minio-proxy.ts b/src/modules/fm-manager/proxy/minio-proxy.ts index 015a894..1398dba 100644 --- a/src/modules/fm-manager/proxy/minio-proxy.ts +++ b/src/modules/fm-manager/proxy/minio-proxy.ts @@ -1,6 +1,7 @@ import http from 'node:http'; -import { minioClient } from '@/modules/minio.ts'; import { pipeMinioStream } from '../pipe.ts'; +import { oss } from '@/app.ts'; +import { Readable } from 'node:stream'; type ProxyInfo = { path?: string; target: string; @@ -15,9 +16,8 @@ export const minioProxyOrigin = async (req: http.IncomingMessage, res: http.Serv if (objectName.startsWith(bucketName)) { objectName = objectName.slice(bucketName.length); } - const objectStream = await minioClient.getObject(bucketName, objectName); - // objectStream.pipe(res); - pipeMinioStream(objectStream, res); + const objectStream = await oss.getObject(objectName); + pipeMinioStream(objectStream.Body as Readable, res); } catch (error) { console.error('Error fetching object from MinIO:', error); res.statusCode = 500; diff --git a/src/modules/minio.ts b/src/modules/minio.ts index 994e0c9..af99e83 100644 --- a/src/modules/minio.ts +++ b/src/modules/minio.ts @@ -1,38 +1,13 @@ -import { Client, ClientOptions } from 'minio'; +import { Client, } from 'minio'; import { useConfig } from '@kevisual/use-config'; const config = useConfig(); -import { OssBase } from '@kevisual/oss/services'; const minioConfig = { endPoint: config.MINIO_ENDPOINT || 'localhost', + // @ts-ignore port: parseInt(config.MINIO_PORT || '9000'), useSSL: config.MINIO_USE_SSL === 'true', accessKey: config.MINIO_ACCESS_KEY, secretKey: config.MINIO_SECRET_KEY, }; -const { port, endPoint, useSSL } = minioConfig; -// console.log('minioConfig', minioConfig); export const minioClient = new Client(minioConfig); -export const bucketName = config.MINIO_BUCKET_NAME || 'resources'; -export const minioUrl = `http${useSSL ? 's' : ''}://${endPoint}:${port || 9000}`; -export const minioResources = `${minioUrl}/resources`; - -if (!minioClient) { - throw new Error('Minio client not initialized'); -} -// 验证权限 -(async () => { - const bucketExists = await minioClient.bucketExists(bucketName); - if (!bucketExists) { - await minioClient.makeBucket(bucketName); - } - console.log('bucketExists', bucketExists); - // const res = await minioClient.putObject(bucketName, 'root/test/0.0.1/a.txt', 'test'); - // console.log('minio putObject', res); -})(); - -export const oss = new OssBase({ - client: minioClient, - bucketName: bucketName, - prefix: '', -}); diff --git a/src/modules/s3.ts b/src/modules/s3.ts new file mode 100644 index 0000000..d84efd2 --- /dev/null +++ b/src/modules/s3.ts @@ -0,0 +1,44 @@ +import { CreateBucketCommand, HeadObjectCommand, S3Client, } from '@aws-sdk/client-s3'; +import { OssBase } from '@kevisual/oss/s3.ts'; +import { useConfig } from '@kevisual/use-config'; +const config = useConfig(); + +export const bucketName = config.S3_BUCKET_NAME || 'resources'; + +export const s3Client = new S3Client({ + credentials: { + accessKeyId: config.S3_ACCESS_KEY_ID || '', + secretAccessKey: config.S3_SECRET_ACCESS_KEY || '', + }, + region: config.S3_REGION, + endpoint: config.S3_ENDPOINT, + // minio配置 + forcePathStyle: true, +}); + +// 判断 bucketName 是否存在,不存在则创建 +(async () => { + try { + await s3Client.send(new HeadObjectCommand({ Bucket: bucketName, Key: '' })); + console.log(`Bucket ${bucketName} exists.`); + } catch (error) { + console.log(`Bucket ${bucketName} does not exist. Creating...`); + if (config.S3_ENDPOINT?.includes?.('9000')) { + // 创建 bucket + await s3Client.send(new CreateBucketCommand({ Bucket: bucketName })); + console.log(`Bucket ${bucketName} created.`); + } + } +})(); + +if (!s3Client) { + throw new Error('S3 client not initialized'); +} + +export const oss = new OssBase({ + client: s3Client, + bucketName: bucketName, + prefix: '', +}) + +export const minioResources = `${config.S3_ENDPOINT}/${bucketName}`; \ No newline at end of file diff --git a/src/modules/user-app/index.ts b/src/modules/user-app/index.ts index cbdc749..a287d14 100644 --- a/src/modules/user-app/index.ts +++ b/src/modules/user-app/index.ts @@ -7,7 +7,7 @@ import { nanoid } from 'nanoid'; import { pipeline } from 'stream'; import { promisify } from 'util'; import { getAppLoadStatus, setAppLoadStatus } from './get-app-status.ts'; -import { minioResources } from '../minio.ts'; +import { minioResources } from '../s3.ts'; import { downloadFileFromMinio, fetchApp, fetchDomain, fetchTest } from '@/modules/fm-manager/index.ts'; import { logger } from '../logger.ts'; export * from './get-app-status.ts'; diff --git a/src/routes-simple/code/upload.ts b/src/routes-simple/code/upload.ts index cbeb3c5..b3ad6e2 100644 --- a/src/routes-simple/code/upload.ts +++ b/src/routes-simple/code/upload.ts @@ -4,8 +4,7 @@ import { router, clients, writeEvents } from '../router.ts'; import { error } from '../middleware/auth.ts'; import fs from 'fs'; import { useFileStore } from '@kevisual/use-config'; -import { app, minioClient } from '@/app.ts'; -import { bucketName } from '@/modules/minio.ts'; +import { app, oss } from '@/app.ts'; import { getContentType } from '@/utils/get-content-type.ts'; import path from 'path'; import { createWriteStream } from 'fs'; @@ -123,7 +122,7 @@ router.post('/api/micro-app/upload', async (req, res) => { const minioPath = `private/${tokenUser.username}/${appKey}/${relativePath}`; // 上传到 MinIO 并保留文件夹结构 const isHTML = relativePath.endsWith('.html'); - await minioClient.fPutObject(bucketName, minioPath, tempPath, { + await oss.fPutObject(minioPath, tempPath, { 'Content-Type': getContentType(relativePath), 'app-source': 'user-micro-app', 'Cache-Control': isHTML ? 'no-cache' : 'max-age=31536000, immutable', // 缓存一年 diff --git a/src/routes-simple/handle-request.ts b/src/routes-simple/handle-request.ts index 3064310..9bd7bd4 100644 --- a/src/routes-simple/handle-request.ts +++ b/src/routes-simple/handle-request.ts @@ -2,9 +2,8 @@ import { useFileStore } from '@kevisual/use-config'; import http from 'node:http'; import fs from 'fs'; import Busboy from 'busboy'; -import { app, minioClient } from '@/app.ts'; +import { app, oss } from '@/app.ts'; -import { bucketName } from '@/modules/minio.ts'; import { getContentType } from '@/utils/get-content-type.ts'; import { User } from '@/models/user.ts'; import { router, error, checkAuth, writeEvents } from './router.ts'; @@ -151,7 +150,7 @@ router.post('/api/app/upload', async (req, res) => { const minioPath = `${username || tokenUser.username}/${appKey}/${version}/${relativePath}`; // 上传到 MinIO 并保留文件夹结构 const isHTML = relativePath.endsWith('.html'); - await minioClient.fPutObject(bucketName, minioPath, tempPath, { + await oss.fPutObject(minioPath, tempPath, { 'Content-Type': getContentType(relativePath), 'app-source': 'user-app', 'Cache-Control': isHTML ? 'no-cache' : 'max-age=31536000, immutable', // 缓存一年 diff --git a/src/routes-simple/minio/download.ts b/src/routes-simple/minio/download.ts deleted file mode 100644 index 58ba56d..0000000 --- a/src/routes-simple/minio/download.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { minioClient } from '@/app.ts'; -import { bucketName } from '@/modules/minio.ts'; - -import { router } from '../router.ts'; - -router.post('/api/minio', async (ctx) => { - let { username, appKey } = { username: '', appKey: '' }; - const path = `${username}/${appKey}`; - const res = await minioClient.listObjectsV2(bucketName, path, true); - const file = res.filter((item) => item.isFile); - const fileList = file.map((item) => { - return { - name: item.name, - size: item.size, - }; - }); - // ctx.body = fileList; -}); diff --git a/src/routes-simple/minio/get-minio-resource.ts b/src/routes-simple/minio/get-minio-resource.ts deleted file mode 100644 index 8ba855b..0000000 --- a/src/routes-simple/minio/get-minio-resource.ts +++ /dev/null @@ -1,107 +0,0 @@ -/** - * 更新时间:2025-03-17 - * 第二次更新:2025-03-22 - */ -import { minioClient } from '@/app.ts'; -import { IncomingMessage, ServerResponse } from 'http'; -import { bucketName } from '@/modules/minio.ts'; -import { getLoginUser } from '../middleware/auth.ts'; -import { BucketItemStat } from 'minio'; -import { UserPermission, Permission } from '@kevisual/permission'; -import { pipeMinioStream } from '@/modules/fm-manager/index.ts'; - -/** - * 过滤 metaData 中的 key, 去除 password, accesskey, secretkey, - * 并返回过滤后的 metaData - * @param metaData - * @returns - */ -const filterKeys = (metaData: Record, clearKeys: string[] = []) => { - const keys = Object.keys(metaData); - // remove X-Amz- meta data - const removeKeys = ['password', 'accesskey', 'secretkey', ...clearKeys]; - const filteredKeys = keys.filter((key) => !removeKeys.includes(key)); - return filteredKeys.reduce((acc, key) => { - acc[key] = metaData[key]; - return acc; - }, {} as Record); -}; - -export const NotFoundFile = (res: ServerResponse, msg?: string, code = 404) => { - res.writeHead(code, { 'Content-Type': 'text/plain' }); - res.end(msg || 'Not Found File'); - return; -}; -export const shareType = ['public', 'private', 'protected'] as const; -export type ShareType = (typeof shareType)[number]; - -export const authMinio = async (req: IncomingMessage, res: ServerResponse, objectName: string) => { - let stat: BucketItemStat; - try { - stat = await minioClient.statObject(bucketName, objectName); - } catch (e) { - return NotFoundFile(res); - } - const [userKey, ...rest] = objectName.split('/'); - const _url = new URL(req.url || '', 'http://localhost'); - const password = _url.searchParams.get('p') || ''; - const isDownload = !!_url.searchParams.get('download'); - const metaData = stat.metaData || {}; - const filteredMetaData = filterKeys(metaData, ['size', 'etag', 'last-modified']); - if (stat.size === 0) { - return NotFoundFile(res); - } - const { tokenUser } = await getLoginUser(req); - const username = tokenUser?.username; - const owner = userKey; - const permission = new UserPermission({ - permission: metaData as Permission, - owner, - }); - const checkPermissionResult = permission.checkPermissionSuccess({ - username, - password, - }); - if (!checkPermissionResult.success) { - return NotFoundFile(res, checkPermissionResult.message, checkPermissionResult.code); - } - - const contentLength = stat.size; - const etag = stat.etag; - const lastModified = stat.lastModified.toISOString(); - const filename = objectName.split('/').pop() || 'no-file-name-download'; // Extract filename from objectName - const fileExtension = filename.split('.').pop()?.toLowerCase() || ''; - const viewableExtensions = [ - 'jpg', - 'jpeg', - 'png', - 'gif', - 'svg', - 'webp', - 'mp4', - 'webm', - 'mp3', - 'wav', - 'ogg', - 'pdf', - 'doc', - 'docx', - 'xls', - 'xlsx', - 'ppt', - 'pptx', - ]; - const contentDisposition = viewableExtensions.includes(fileExtension) && !isDownload ? 'inline' : `attachment; filename="${filename}"`; - - res.writeHead(200, { - 'Content-Length': contentLength, - etag, - 'last-modified': lastModified, - 'Content-Disposition': contentDisposition, - ...filteredMetaData, - }); - const objectStream = await minioClient.getObject(bucketName, objectName); - - // objectStream.pipe(res, { end: true }); - pipeMinioStream(objectStream, res); -}; diff --git a/src/routes-simple/resources/chunk.ts b/src/routes-simple/resources/chunk.ts index 4ba2e7c..a1a0ec4 100644 --- a/src/routes-simple/resources/chunk.ts +++ b/src/routes-simple/resources/chunk.ts @@ -161,9 +161,8 @@ router.post('/api/s1/resources/upload/chunk', async (req, res) => { if (share) { metadata.share = 'public'; } - const bucketName = oss.bucketName; // All chunks uploaded, now upload to MinIO - await oss.client.fPutObject(bucketName, minioPath, finalFilePath, { + await oss.fPutObject(minioPath, finalFilePath, { 'Content-Type': getContentType(relativePath), 'app-source': 'user-app', 'Cache-Control': relativePath.endsWith('.html') ? 'no-cache' : 'max-age=31536000, immutable', diff --git a/src/routes-simple/resources/get-resources.ts b/src/routes-simple/resources/get-resources.ts deleted file mode 100644 index 5c95ad1..0000000 --- a/src/routes-simple/resources/get-resources.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { router } from '@/app.ts'; - -import { authMinio } from '../minio/get-minio-resource.ts'; - -// 功能可以抽离为某一个dns请求的服务 - -router.all('/api/s1/share/*splat', async (req, res) => { - try { - const url = req.url; - const _url = new URL(url || '', 'http://localhost'); - let objectName = _url.pathname.replace('/api/s1/share/', ''); - objectName = decodeURIComponent(objectName); - await authMinio(req, res, objectName); - } catch (e) { - console.log('get share resource error url', req.url); - console.error('get share resource is error.', e.message); - res.end('get share resource is error.'); - } -}); diff --git a/src/routes-simple/resources/upload.ts b/src/routes-simple/resources/upload.ts index 8fb457b..fca2495 100644 --- a/src/routes-simple/resources/upload.ts +++ b/src/routes-simple/resources/upload.ts @@ -1,9 +1,8 @@ import { useFileStore } from '@kevisual/use-config'; import { checkAuth, error, router, writeEvents, getKey } from '../router.ts'; import Busboy from 'busboy'; -import { app, minioClient } from '@/app.ts'; +import { app } from '@/app.ts'; -import { bucketName } from '@/modules/minio.ts'; import { getContentType } from '@/utils/get-content-type.ts'; import { User } from '@/models/user.ts'; import fs from 'fs'; @@ -15,6 +14,7 @@ import { validateDirectory } from './util.ts'; import { pick } from 'es-toolkit'; import { getFileStat } from '@/routes/file/index.ts'; import { logger } from '@/modules/logger.ts'; +import { oss } from '@/modules/s3.ts'; const cacheFilePath = useFileStore('cache-file', { needExists: true }); @@ -233,7 +233,7 @@ router.post('/api/s1/resources/upload', async (req, res) => { metadata.share = 'public'; } Object.assign(metadata, meta); - await minioClient.fPutObject(bucketName, minioPath, tempPath, { + await oss.fPutObject(minioPath, tempPath, { 'Content-Type': getContentType(relativePath), 'app-source': 'user-app', 'Cache-Control': isHTML ? 'no-cache' : 'max-age=31536000, immutable', // 缓存一年 diff --git a/src/routes/file/list.ts b/src/routes/file/list.ts index 82d9558..439b43e 100644 --- a/src/routes/file/list.ts +++ b/src/routes/file/list.ts @@ -2,7 +2,6 @@ import { app } from '@/app.ts'; import { getFileStat, getMinioList, deleteFile, updateFileStat, deleteFiles } from './module/get-minio-list.ts'; import path from 'path'; import { CustomError } from '@kevisual/router'; -import { get } from 'http'; import { callDetectAppVersion } from '../app-manager/export.ts'; /** diff --git a/src/routes/file/module/get-minio-list.ts b/src/routes/file/module/get-minio-list.ts index 824258f..19dc091 100644 --- a/src/routes/file/module/get-minio-list.ts +++ b/src/routes/file/module/get-minio-list.ts @@ -1,7 +1,6 @@ import dayjs from 'dayjs'; -import { minioClient } from '../../../modules/minio.ts'; -import { bucketName } from '../../../modules/minio.ts'; -import { BucketItemStat, CopyDestinationOptions, CopySourceOptions } from 'minio'; +import { oss } from '@/app.ts'; +import { StatObjectResult } from '@kevisual/oss'; type MinioListOpt = { prefix: string; recursive?: boolean; @@ -20,33 +19,13 @@ export type MinioList = (MinioFile | MinioDirectory)[]; export const getMinioList = async (opts: MinioListOpt): Promise => { const prefix = opts.prefix; const recursive = opts.recursive ?? false; - const res = await new Promise((resolve, reject) => { - let res: any[] = []; - let hasError = false; - minioClient - .listObjectsV2(bucketName, prefix, recursive) - .on('data', (data) => { - res.push(data); - }) - .on('error', (err) => { - console.error('minio error', opts.prefix, err); - hasError = true; - }) - .on('end', () => { - if (hasError) { - reject(); - return; - } else { - resolve(res); - } - }); - }); + const res = await oss.listObjects(prefix, { recursive }); return res as IS_FILE extends true ? MinioFile[] : MinioDirectory[]; }; -export const getFileStat = async (prefix: string, isFile?: boolean): Promise => { +export const getFileStat = async (prefix: string, isFile?: boolean): Promise => { try { - const obj = await minioClient.statObject(bucketName, prefix); - if (isFile && obj.size === 0) { + const obj = await oss.statObject(prefix); + if (isFile && obj?.size === 0) { return null; } return obj; @@ -69,10 +48,7 @@ export const deleteFile = async (prefix: string): Promise<{ code: number; messag message: 'file not found', }; } - await minioClient.removeObject(bucketName, prefix, { - versionId: 'null', - forceDelete: true, // 强制删除 - }); + await oss.deleteObject(prefix); return { code: 200, message: 'delete success', @@ -89,7 +65,9 @@ export const deleteFile = async (prefix: string): Promise<{ code: number; messag // 批量删除文件 export const deleteFiles = async (prefixs: string[]): Promise => { try { - await minioClient.removeObjects(bucketName, prefixs); + for (const prefix of prefixs) { + await oss.deleteObject(prefix); + } return true; } catch (e) { console.error('delete Files Error not handle', e); @@ -135,14 +113,9 @@ export const updateFileStat = async ( message?: string; }> => { try { - const source = new CopySourceOptions({ Bucket: bucketName, Object: prefix }); - const destination = new CopyDestinationOptions({ - Bucket: bucketName, - Object: prefix, - UserMetadata: newMetadata, - MetadataDirective: 'REPLACE', + const copyResult = await oss.replaceObject(prefix, { + ...newMetadata }); - const copyResult = await minioClient.copyObject(source, destination); console.log('copyResult', copyResult); console.log(`Metadata for ${prefix} updated successfully.`); return { @@ -171,23 +144,13 @@ export const mvUserAToUserB = async (usernameA: string, usernameB: string, clear const newPrefix = `${usernameB}/`; const listSource = await getMinioList({ prefix: oldPrefix, recursive: true }); for (const item of listSource) { - const source = new CopySourceOptions({ Bucket: bucketName, Object: item.name }); - const stat = await getFileStat(item.name); const newName = item.name.slice(oldPrefix.length); - // @ts-ignore - const metadata = stat?.userMetadata || stat.metaData; - const destination = new CopyDestinationOptions({ - Bucket: bucketName, - Object: `${newPrefix}${newName}`, - UserMetadata: metadata, - MetadataDirective: 'COPY', - }); - await minioClient.copyObject(source, destination); + await oss.copyObject(item.name, `${newPrefix}${newName}`); } if (clearOldUser) { const files = await getMinioList({ prefix: oldPrefix, recursive: true }); for (const file of files) { - await minioClient.removeObject(bucketName, file.name); + await oss.deleteObject(file.name); } } }; @@ -202,7 +165,7 @@ export const backupUserA = async (usernameA: string, id: string, backName?: stri for (const item of deleteBackup) { const files = await getMinioList({ prefix: item.prefix, recursive: true }); for (const file of files) { - await minioClient.removeObject(bucketName, file.name); + await oss.deleteObject(file.name); } } } @@ -215,6 +178,6 @@ export const backupUserA = async (usernameA: string, id: string, backName?: stri export const deleteUser = async (username: string) => { const list = await getMinioList({ prefix: `${username}/`, recursive: true }); for (const item of list) { - await minioClient.removeObject(bucketName, item.name); + await oss.deleteObject(item.name); } }; diff --git a/src/routes/micro-app/module/install-app.ts b/src/routes/micro-app/module/install-app.ts index e1fba33..e1f7349 100644 --- a/src/routes/micro-app/module/install-app.ts +++ b/src/routes/micro-app/module/install-app.ts @@ -1,5 +1,4 @@ -import { minioClient } from '@/app.ts'; -import { bucketName } from '@/modules/minio.ts'; +import { oss } from '@/app.ts'; import { fileIsExist } from '@kevisual/use-config'; import { spawn, spawnSync } from 'child_process'; import { getFileStat, getMinioList, MinioFile } from '@/routes/file/index.ts'; @@ -8,6 +7,7 @@ import fs from 'fs'; import path from 'path'; import { appsPath } from '../lib/index.ts'; import { installAppFromKey } from './manager.ts'; +import { Readable } from 'stream'; export type InstallAppOpts = { needInstallDeps?: boolean; // minio中 @@ -46,7 +46,7 @@ export const installApp = async (opts: InstallAppOpts) => { if (!fileIsExist(dir)) { fs.mkdirSync(dir, { recursive: true }); } - const fileStream = await minioClient.getObject(bucketName, `${name}`); + const fileStream = (await oss.getObject(`${name}`)).Body as Readable; const writeStream = fs.createWriteStream(outputPath); fileStream.pipe(writeStream); diff --git a/src/test/get-minio-list.ts b/src/test/get-minio-list.ts deleted file mode 100644 index fb192ef..0000000 --- a/src/test/get-minio-list.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { bucketName, minioClient } from '@/modules/minio.ts'; -import { S3Error } from 'minio'; -const main = async () => { - const res = await new Promise((resolve, reject) => { - let res: any[] = []; - let hasError = false; - minioClient - .listObjectsV2(bucketName, 'root/codeflow/0.0.1/') - .on('data', (data) => { - res.push(data); - }) - .on('error', (err) => { - console.error('error', err); - hasError = true; - }) - .on('end', () => { - if (hasError) { - reject(); - return; - } else { - resolve(res); - } - }); - }); - console.log(res); -}; -// main(); - -const main2 = async () => { - try { - const obj = await minioClient.statObject(bucketName, 'root/codeflow/0.0.1/README.md'); - - console.log(obj); - } catch (e) { - console.log('', e.message, '\n\r', e.code); - // console.error(e); - } -}; - -main2(); diff --git a/src/test/s3-stat.ts b/src/test/s3-stat.ts new file mode 100644 index 0000000..d534fd9 --- /dev/null +++ b/src/test/s3-stat.ts @@ -0,0 +1,4 @@ +import { oss } from '@/modules/s3.ts' + +const stat = await oss.statObject('root/codepod/0.0.3/index.html'); +console.log('Object Stat:', stat); \ No newline at end of file