Skip to content

Commit fa66c37

Browse files
committed
fix(s3): chunked object deletion
1 parent ba76834 commit fa66c37

File tree

5 files changed

+36
-12
lines changed

5 files changed

+36
-12
lines changed

lib/storage/drivers/s3.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
UploadPartCommand,
1010
} from '@aws-sdk/client-s3'
1111
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
12+
import * as R from 'remeda'
1213
import { z } from 'zod'
1314

1415
import { defineStorageDriver } from '~/lib/storage/defineStorageDriver'
@@ -130,14 +131,18 @@ export const s3Driver = defineStorageDriver({
130131
)
131132
},
132133
async delete({ objectNames }) {
133-
await s3.send(
134-
new DeleteObjectsCommand({
135-
Bucket: options.STORAGE_S3_BUCKET,
136-
Delete: {
137-
Objects: objectNames.map((name) => ({ Key: getObjectKey(name) })),
138-
Quiet: true,
139-
},
140-
}),
134+
await Promise.all(
135+
R.chunk(objectNames, 1000).map((chunkedObjectNames) =>
136+
s3.send(
137+
new DeleteObjectsCommand({
138+
Bucket: options.STORAGE_S3_BUCKET,
139+
Delete: {
140+
Objects: chunkedObjectNames.map((name) => ({ Key: getObjectKey(name) })),
141+
Quiet: true,
142+
},
143+
}),
144+
),
145+
),
141146
)
142147
},
143148
}

lib/storage/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface Storage {
4343
cacheId: number | null
4444
}>
4545
pruneCaches: (olderThanDays?: number) => Promise<void>
46-
pruneUploads: () => Promise<void>
46+
pruneUploads: (olderThanDate: Date) => Promise<void>
4747
}
4848

4949
let storage: Storage
@@ -251,14 +251,14 @@ export async function initializeStorage() {
251251
olderThanDays,
252252
})
253253
},
254-
async pruneUploads() {
254+
async pruneUploads(olderThanDate) {
255255
logger.debug('Prune uploads')
256256

257257
// uploads older than 24 hours
258258
const uploads = await db
259259
.selectFrom('uploads')
260260
.selectAll()
261-
.where('created_at', '<', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString())
261+
.where('created_at', '<', olderThanDate.toISOString())
262262
.execute()
263263

264264
for (const upload of uploads) {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"mysql2": "^3.12.0",
4040
"nitropack": "^2.10.4",
4141
"pg": "^8.13.1",
42+
"remeda": "^2.21.0",
4243
"typescript": "^5.7.3",
4344
"zod": "^3.24.1"
4445
},

plugins/cleanup.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ export default defineNitroPlugin(() => {
2626
logger.info(
2727
`Cleaning up dangling uploads with schedule ${colorize('blue', job.getPattern() ?? '')}${nextRun ? ` (next run: ${nextRun.toLocaleString()})` : ''}`,
2828
)
29+
let lastRun = new Date()
2930
job.schedule(async () => {
3031
const adapter = await useStorageAdapter()
31-
await adapter.pruneUploads()
32+
await adapter.pruneUploads(lastRun)
33+
lastRun = new Date()
3234
})
3335
})

pnpm-lock.yaml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)