From ac1ebeb776b114b157071de6cd7fba9e8823b2d8 Mon Sep 17 00:00:00 2001 From: hesprs <190185753+hesprs@users.noreply.github.com> Date: Wed, 23 Sep 2026 21:28:01 +0800 Subject: [PATCH] fix(s3): retry individual delete when batch delete is unavailable --- bun.lock | 64 ++++++++++------------ docs/src/pages/en/deep-dive/modules/s3.md | 2 +- harness.tgz | Bin 9228 -> 9412 bytes modules.json | 2 +- packages/s3/src/index.ts | 1 - packages/s3/src/s3/fs.ts | 35 ++++++++---- 6 files changed, 57 insertions(+), 47 deletions(-) diff --git a/bun.lock b/bun.lock index a1aabb2d..d227a115 100644 --- a/bun.lock +++ b/bun.lock @@ -62,7 +62,7 @@ }, "packages/plugin": { "name": "@hesprs/sync-engine-sdk", - "version": "3.1.7", + "version": "3.1.9", "dependencies": { "obsidian": "^1.13.1", }, @@ -127,41 +127,41 @@ "@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1048.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.974.11", "@aws-sdk/credential-provider-node": "^3.972.42", "@aws-sdk/eventstream-handler-node": "^3.972.16", "@aws-sdk/middleware-eventstream": "^3.972.12", "@aws-sdk/middleware-websocket": "^3.972.19", "@aws-sdk/token-providers": "3.1048.0", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/fetch-http-handler": "^5.4.2", "@smithy/node-http-handler": "^4.7.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ=="], - "@aws-sdk/core": ["@aws-sdk/core@3.978.0", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@aws-sdk/xml-builder": "^3.972.40", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.33.3", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA=="], + "@aws-sdk/core": ["@aws-sdk/core@3.978.1", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@aws-sdk/xml-builder": "^3.972.41", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.35.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-LbY9aGsEiznDWmUc30Nwv3aIX/+dbwTx8KfS0yOC3NPYMO+O91e6jkT1azf34FwjOndq8/Q+RcVVZz5xnerwdg=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.72", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-xTKO/FWJPozTIXbozVnVGoNBhaGba8TBcx+KyUjRVeOlXE+dUc7GTR1cLvu0uTdIdmemzaFbqqCshXeZA1fZew=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.73", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.74", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-u91E/hT8f4d1xy0Jl7VG4nVKJ3lxbrZkoBTeSVoJdWBiSEUMwMS/9+e0H/aJVQV//Lt5wuzP+E69v4aRSsNTmw=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-login": "^3.972.78", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.17", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/credential-provider-env": "^3.972.72", "@aws-sdk/credential-provider-http": "^3.972.74", "@aws-sdk/credential-provider-login": "^3.972.79", "@aws-sdk/credential-provider-process": "^3.972.72", "@aws-sdk/credential-provider-sso": "^3.973.16", "@aws-sdk/credential-provider-web-identity": "^3.972.78", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/credential-provider-imds": "^4.5.2", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ged4KXdBkvIC81bLvNHHuQKdKak/VXhQTR1NWYTTqW0474nlmsxy9O/vlgTIohDDWH3xpBdtVMZRyjb+DnocDA=="], - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.79", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-L+Z85anONJd8MaiuraO4wRxATCdEejBZ3K3eymzWI5JPXa9sOS9CkIm72PBKqXKX+Z9p9NGMX5AIMXm0LEflgw=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.83", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-ini": "^3.973.16", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.84", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.72", "@aws-sdk/credential-provider-http": "^3.972.74", "@aws-sdk/credential-provider-ini": "^3.973.17", "@aws-sdk/credential-provider-process": "^3.972.72", "@aws-sdk/credential-provider-sso": "^3.973.16", "@aws-sdk/credential-provider-web-identity": "^3.972.78", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/credential-provider-imds": "^4.5.2", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oHt854odINVwzwsh+c5x69j0ajm4DbqqqVJ+O1ECsCIZeMDAbzFpXItaqP7UZstJj/ATdTk/KFSH0LaNAgV+kA=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.72", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-rLIp2xbMjX/k9/od7APpqq1ZgXXnV0pOL1Th3ZsL8Wu0TRtBsDTVS8iPqcfRFcHakFxPvR04OSTv2ka2qOb/2A=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.15", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/token-providers": "3.1129.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/token-providers": "3.1138.0", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-IGihaJfFZYacJJr/odqILCoK7W/mvrZ7cuK7ECn3sAu4vLC6u0V8bS7mCGbdugJ8Aum2tnvqmx0F2MRFp2rn9g=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.77", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-/y9WvNtlcPBGLR0qc1a+9J/xtYZfVczvLUOuXaVWylzttH7ewsxwHtjmiJSolNrVSDorIxHGHMU61CbonRkmwA=="], - "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.34", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-cTeVzpu1xEAkryTZBYhGwnQ6gOGyp8ZYZvmn0Sg/nI/ABmy/CRHHxPDJDUi9PxwxUtGGaatvfRUB3FCgT/rSWw=="], + "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.35", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-a8xilRoRaalvSPZdfrs0VY3/BPc0uYhXW56Z/k6nmZ5Vk430LHeowf9APIPq8utM3tMJSNGSSuJMlB9YrPsN+A=="], - "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.29", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-dlRzHCgyB8W6hLuDC5pcT5q+ziPt00n4QGgGBE17ucLVU4zMa6lsbuUdQ2Pm75Z5VA8GF+R/+SgrRcaTdIzSIQ=="], + "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.30", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-B6gvZlcnRBNWraKgyEjKsbhv+VjtbyHmpU7hmtTHzXpDSxHPpCJnYLpglEOOsF+SFne20DbZC5IVC1aNr2Pb4A=="], - "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.53", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-bIrDaMENQmYRBHntOiOheqkiw5+fhKW4Lqb+mS1uqF0VwvdWI22fW2HFgWrng66CmYd+4k8ePlpj38sEfTuMLQ=="], + "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.54", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-bhESdru8u8KosziH8jcVta/NM/dNreeRz2+2aU86si5bfBYOiJ6IiqD+9U4URUcU5WJO3Yw+jO3GLDIHlscXMQ=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.46", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/signature-v4-multi-region": "^3.996.47", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/fetch-http-handler": "^5.8.0", "@smithy/node-http-handler": "^4.12.1", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-oRxtBcka/JGHGs9l9p9IVajGoTP8vTPmoAzdHGy4Qcy9P5vPnDf6nhIeM/COQNY9k/OahImTRaLkHftoXvfcmQ=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.46", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.47", "", { "dependencies": { "@aws-sdk/types": "^3.974.6", "@smithy/signature-v4": "^5.7.3", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-Zk08macMvQTHzQJCLJVkOlviVoqwYMrpXv4lmLN7b7sAbiMoOK7Go0NYdR5UeF+MW8LIbRmwrNy9u/5VvX1U5g=="], "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1048.0", "", { "dependencies": { "@aws-sdk/core": "^3.974.11", "@aws-sdk/nested-clients": "^3.997.9", "@aws-sdk/types": "^3.973.8", "@smithy/core": "^3.24.2", "@smithy/types": "^4.14.1", "tslib": "^2.6.2" } }, "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA=="], - "@aws-sdk/types": ["@aws-sdk/types@3.974.5", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ=="], + "@aws-sdk/types": ["@aws-sdk/types@3.974.6", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-v/clNZzZnDxGyvpHMOGpJKVXFAExJzUNAAjaWGdcx8QAcXLGwTaOkw33p5SHAi0YAioK32xB3hWwOekRVfmfKg=="], "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.10", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ycwH6Zd2GhuSqdXX9ihbCjeGTB6xOJs+O3+Jb8/zDG9978XU80qs75dfkPJRMNKe5MvBZPuNeFpd4JZKPoUF4g=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.40", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.41", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ=="], "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.3.0", "", {}, "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ=="], @@ -277,23 +277,23 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], - "@firecrawl/pdf-inspector": ["@firecrawl/pdf-inspector@1.20.0", "", { "optionalDependencies": { "@firecrawl/pdf-inspector-darwin-arm64": "1.20.0", "@firecrawl/pdf-inspector-linux-arm64-gnu": "1.20.0", "@firecrawl/pdf-inspector-linux-arm64-musl": "1.20.0", "@firecrawl/pdf-inspector-linux-x64-gnu": "1.20.0", "@firecrawl/pdf-inspector-linux-x64-musl": "1.20.0", "@firecrawl/pdf-inspector-win32-x64-msvc": "1.20.0" }, "bin": { "pdf-inspector": "bin/pdf-inspector.mjs" } }, "sha512-9VmMGgdVZD3uuYssx425xrif/B/1E2ruQWVMe4zjFurmVM0rwGVOdcTLISc3VOoUp+4WEWRG43jceY2fDIhHrQ=="], + "@firecrawl/pdf-inspector": ["@firecrawl/pdf-inspector@1.24.0", "", { "optionalDependencies": { "@firecrawl/pdf-inspector-darwin-arm64": "1.24.0", "@firecrawl/pdf-inspector-linux-arm64-gnu": "1.24.0", "@firecrawl/pdf-inspector-linux-arm64-musl": "1.24.0", "@firecrawl/pdf-inspector-linux-x64-gnu": "1.24.0", "@firecrawl/pdf-inspector-linux-x64-musl": "1.24.0", "@firecrawl/pdf-inspector-win32-x64-msvc": "1.24.0" }, "bin": { "pdf-inspector": "bin/pdf-inspector.mjs" } }, "sha512-6pVCXUt461NlArGtX8Glu0S9q46zoyBQs0hmrL8vsywbHI7vc4OV/yz4S9JScOqtXZXdHHdMcAUnbMQxtOevXg=="], - "@firecrawl/pdf-inspector-darwin-arm64": ["@firecrawl/pdf-inspector-darwin-arm64@1.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OVUhApwrdDq6AXqGPxW4KqLoRfu9bl79bhFDoxA2yGr/JEh0474mWiaL1SROETD8JdO/5S2WaSFkx4KxdV6Jbw=="], + "@firecrawl/pdf-inspector-darwin-arm64": ["@firecrawl/pdf-inspector-darwin-arm64@1.24.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-x/79aLWs51X4ViZwyz1BnVduw9oxt2EHmCVuGqFOLBzi3PKEEh3MKnBoaWcFJ/sjuKdRjSVpMLYlKaNVpK5fGw=="], - "@firecrawl/pdf-inspector-linux-arm64-gnu": ["@firecrawl/pdf-inspector-linux-arm64-gnu@1.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0D7j4zPycEHtqjY55afVSo1oUf9k4uP3kVjXmBj0zbY0/KCMGk4ftKZveSYb7rcDS2TmTSoi5R8Il9RBeqntKw=="], + "@firecrawl/pdf-inspector-linux-arm64-gnu": ["@firecrawl/pdf-inspector-linux-arm64-gnu@1.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-drf5nOK8TRsMbV2TkM8R75mlxDi2Q5+wKwhE1xwbglxB2MFaeFCTtZTCpK/P8uGcQ+3c4vBZ4LJE6wm2TuqQ+Q=="], - "@firecrawl/pdf-inspector-linux-arm64-musl": ["@firecrawl/pdf-inspector-linux-arm64-musl@1.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-lnVK1Pdg0H0sFdzUdE0x52Az8/J1iUM9sMQmRxYdKYebNNk/ykKNmZUG1JPkvdk9xUmNhztxdQPm8x/q8OvsrQ=="], + "@firecrawl/pdf-inspector-linux-arm64-musl": ["@firecrawl/pdf-inspector-linux-arm64-musl@1.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vYe9BLD31I+YxJEddc0D4eXQf18w0lCefNoh6aILuBmqDO7F580kkvVz5+WUzThWD48luf3SJ+qLMA6/BzeaEQ=="], - "@firecrawl/pdf-inspector-linux-x64-gnu": ["@firecrawl/pdf-inspector-linux-x64-gnu@1.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-NFbMOBJPQDfWUlbfw6YxlH6H9mvQt95/337SaDK5I8T708otHtwif9y+mwDXgNDPpvQSoRIWmSjHl9XGfL9i4A=="], + "@firecrawl/pdf-inspector-linux-x64-gnu": ["@firecrawl/pdf-inspector-linux-x64-gnu@1.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-enHovs11QKXJX8E+fhGm75TsTPLnbyy106offL+SWwYbN2yppaBH2+h1av+nV5cjqQRL0VlubUKG7FPmKBR5ZQ=="], - "@firecrawl/pdf-inspector-linux-x64-musl": ["@firecrawl/pdf-inspector-linux-x64-musl@1.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-BiXADDZNpuxeHScmZh1myNb0YHYrF6EUFPzV+rAmsSp9Rb3zSBV6D8AVTL4DkiC6Jlf52kL+BGMrb0u3tYb0kg=="], + "@firecrawl/pdf-inspector-linux-x64-musl": ["@firecrawl/pdf-inspector-linux-x64-musl@1.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tOwSbgXmp/dr7DCQ0YItozZfvk8J3szsdipeeXa0nIGdiMn/v7AuL6QYEgbTx5fasy+l6D2EGP8wKlJPcndO9w=="], - "@firecrawl/pdf-inspector-win32-x64-msvc": ["@firecrawl/pdf-inspector-win32-x64-msvc@1.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-dsMksR+kBzOEMrWlAamyqU7KJ/S3mLYMPNSLqK4AYG9UoWmnGudw92Z9Ou3J9OcLT2K5LiDvkE2qF+NwW5/oyQ=="], + "@firecrawl/pdf-inspector-win32-x64-msvc": ["@firecrawl/pdf-inspector-win32-x64-msvc@1.24.0", "", { "os": "win32", "cpu": "x64" }, "sha512-NXhg/U+UzhfmrzSFesLIgHLDDE6irS2vt0OtnxwiWJRVsceZgUy59/tKSplg56+MO3/T4XiWeoCZHXnKl+6mqw=="], "@google/genai": ["@google/genai@1.52.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q=="], - "@hesprs/harness": ["@hesprs/harness@./harness.tgz", { "dependencies": { "@earendil-works/pi-agent-core": "^0.85.1", "@earendil-works/pi-coding-agent": "^0.85.1", "@earendil-works/pi-tui": "^0.85.1", "@firecrawl/pdf-inspector": "^1.20.0", "defuddle": "^0.19.3", "typebox": "^1.3.32" } }, "sha512-L3jlGBrlauJzO/6s0g2JE3D9RgLCS21vBOX6Kv60T9EOTSuYNTrnCxB2RcLiRmiIw2N9peBR5/3vssGltAeHNw=="], + "@hesprs/harness": ["@hesprs/harness@./harness.tgz", { "dependencies": { "@earendil-works/pi-agent-core": "^0.85.1", "@earendil-works/pi-coding-agent": "^0.85.1", "@earendil-works/pi-tui": "^0.85.1", "@firecrawl/pdf-inspector": "^1.20.0", "defuddle": "^0.19.3", "typebox": "^1.3.32" } }, "sha512-aSgTuVvSEiJ9RXzJ8wtsEUy8vtLsLVxVMA5PwEWgEG1B/7VfnXGI3Fx/vUDTQ1eW4HIclHleOW1DiFtDlKiNPA=="], "@hesprs/sync-engine-sdk": ["@hesprs/sync-engine-sdk@workspace:packages/plugin"], @@ -551,7 +551,7 @@ "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="], - "@smithy/core": ["@smithy/core@3.34.1", "", { "dependencies": { "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw=="], + "@smithy/core": ["@smithy/core@3.35.0", "", { "dependencies": { "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-zRMhfkByhT2snNdr1si24vJitU6Cr9ix2MikUfWmkAgp4jrNP0GcKSP5YvwQ+TlI8AZXER5QOGJn3JsVtSD9/A=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.5.2", "", { "dependencies": { "@smithy/core": "^3.33.2", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg=="], @@ -563,7 +563,7 @@ "@smithy/signature-v4": ["@smithy/signature-v4@5.7.3", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow=="], - "@smithy/types": ["@smithy/types@4.18.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A=="], + "@smithy/types": ["@smithy/types@4.19.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q=="], "@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], @@ -1011,7 +1011,7 @@ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + "lru-cache": ["lru-cache@11.5.3", "", {}, "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg=="], "magic-regexp": ["magic-regexp@0.10.0", "", { "dependencies": { "estree-walker": "^3.0.3", "magic-string": "^0.30.12", "mlly": "^1.7.2", "regexp-tree": "^0.1.27", "type-level-regexp": "~0.1.17", "ufo": "^1.5.4", "unplugin": "^2.0.0" } }, "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg=="], @@ -1211,7 +1211,7 @@ "type-level-regexp": ["type-level-regexp@0.1.17", "", {}, "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg=="], - "typebox": ["typebox@1.3.33", "", {}, "sha512-25XRfVMsTPaaS4RvZf+wsM8U34cKWSRHBTbHSlCvEqGkvqXNHyfrynOC1h2ma1m8A5UpCJglVRAPK5ORpfPyFg=="], + "typebox": ["typebox@1.3.34", "", {}, "sha512-wbnzrXXDW8xEFHDZZs2jo1MkhaYlKAY4FRhpBc1+2LF1fZVBGCXGdLEhA/Z/NBbgzJMFfeM8m7elKPa/+KxaUQ=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], @@ -1297,11 +1297,9 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@aws-sdk/client-bedrock-runtime/@smithy/node-http-handler": ["@smithy/node-http-handler@4.12.1", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw=="], - "@aws-sdk/credential-provider-http/@smithy/node-http-handler": ["@smithy/node-http-handler@4.12.1", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw=="], - "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1129.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA=="], + "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1138.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.1", "@aws-sdk/nested-clients": "^3.997.46", "@aws-sdk/types": "^3.974.6", "@smithy/core": "^3.35.0", "@smithy/types": "^4.19.0", "tslib": "^2.6.2" } }, "sha512-GpyAr0DD63YOEmYFM6Df+gJuIgC92MMTiBK4FTKfxii5MJ9ge20epR7LyroulscYlG89J+ZB2ivFDPjvfQhzdw=="], "@aws-sdk/nested-clients/@smithy/node-http-handler": ["@smithy/node-http-handler@4.12.1", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw=="], @@ -1335,8 +1333,6 @@ "domutils/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - "gcp-metadata/google-logging-utils": ["google-logging-utils@1.2.0", "", {}, "sha512-WE9av4wKDZgRjBwgVUabocx8T6/7o3Ca1Fat46FXDhXVAFibzNadedcOXrdgd1Kzmk8tsk/9ZH89Wyf/SqeZ3A=="], - "htmlparser2/domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], "htmlparser2/domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], diff --git a/docs/src/pages/en/deep-dive/modules/s3.md b/docs/src/pages/en/deep-dive/modules/s3.md index 626bf6fb..c8f9b5c9 100644 --- a/docs/src/pages/en/deep-dive/modules/s3.md +++ b/docs/src/pages/en/deep-dive/modules/s3.md @@ -131,4 +131,4 @@ The final part may be smaller than 5 MiB. On failure, active part uploads finish ### Batch Deletes -The S3 optimizer groups delete atoms into `DeleteObjects` requests with at most 1000 keys each. Requests contain XML and a `Content-MD5` header. The service result is handled per key: successful keys resolve, while keys reported in an S3 error result reject individually. If the whole batch request fails, every key in that batch fails. +The S3 optimizer groups delete atoms into `DeleteObjects` requests with at most 1000 keys each. Requests contain XML and a `Content-MD5` header. The service result is handled per key: successful keys resolve, while keys reported in an S3 error result reject individually. If the whole batch request fails, each key is retried with an individual `DELETE` request and handled independently. diff --git a/harness.tgz b/harness.tgz index 122bf14a9739a644772e5f197f85fb63b6b50707..484181c3e7afc683da684fc73bed6982fce2384d 100644 GIT binary patch literal 9412 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 diff --git a/modules.json b/modules.json index 082cde95..862d3764 100644 --- a/modules.json +++ b/modules.json @@ -12,7 +12,7 @@ { "id": "s3", "name": "S3", - "version": "0.1.7", + "version": "0.1.8", "description": "S3 and S3-compatible backend support.", "icon": "server", "main": "https://sync.consensia.cc/modules/s3.js", diff --git a/packages/s3/src/index.ts b/packages/s3/src/index.ts index 3b611317..b0f616aa 100644 --- a/packages/s3/src/index.ts +++ b/packages/s3/src/index.ts @@ -15,7 +15,6 @@ import type { Binary, RecordStore, StoreOperations, - Stat, RecordStat, } from '@hesprs/sync-engine-sdk'; import type { App } from 'obsidian'; diff --git a/packages/s3/src/s3/fs.ts b/packages/s3/src/s3/fs.ts index fc0f1f8a..2b320a8f 100644 --- a/packages/s3/src/s3/fs.ts +++ b/packages/s3/src/s3/fs.ts @@ -10,7 +10,7 @@ import type { } from '@hesprs/sync-engine-sdk'; import { chunkSize, concurrency } from '@hesprs/sync-engine-sdk'; import { concatBinary, textToUint8Array } from '@repo/shared/binary'; -import { getStatus } from '@repo/shared/error'; +import { getMessage, getStatus } from '@repo/shared/error'; import normalizeEtag from '@repo/shared/normalize-etag'; import parseXML from '@repo/shared/parse-xml'; import { dirname, encodeUrl, isFolder } from '@repo/shared/path'; @@ -64,7 +64,7 @@ const sizeMissing = new Error('S3 did not return size for objects!'); function buildDeleteObjectsXml(keys: Array): string { const objects = keys.map((key) => `${escapeXml(key)}`).join(''); - return `true${objects}`; + return `true${objects}`; } function escapeXml(str: string): string { @@ -212,14 +212,29 @@ export default class S3Fs implements RootFs { { bucket: this.bucket, endpoint: this.endpoint, key: '/', urlStyle: this.urlStyle }, { delete: '' }, ); - const response = await this.requestOrThrow(url, { - body: textToUint8Array(body), - headers: { - 'Content-MD5': await md5Base64(body), - 'Content-Type': 'application/xml', - }, - method: 'POST', - }); + let response: RequestResponse; + try { + response = await this.requestOrThrow(url, { + body: textToUint8Array(body), + headers: { + 'Content-MD5': await md5Base64(body), + 'Content-Type': 'application/xml', + }, + method: 'POST', + }); + } catch { + await Promise.all( + batch.map(async (key) => { + try { + await this.delete(key); + result[key] = true; + } catch (error) { + result[key] = getMessage(error); + } + }), + ); + continue; + } Object.assign(result, parseBatchDeleteResponse(response.text(), batch)); } return result;