Skip to content

Commit 084fe1e

Browse files
committed
chore: startsAfter in remove stale
1 parent 45eb971 commit 084fe1e

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

packages/app/server/routes/rm/stale.post.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ export default eventHandler(async (event) => {
1111
});
1212
}
1313

14-
const { bucket, cursor, remove } = await readBody<{ bucket: 'packages' | 'templates'; cursor: string | null; remove: boolean }>(event);
14+
const { bucket, startAfter, remove } = await readBody<{ bucket: 'packages' | 'templates'; startAfter: string | null; remove: boolean }>(event);
1515

1616
setResponseHeader(event, "Content-Type", "application/json");
1717

1818
const result = await iterateAndDelete(event, signal, {
1919
prefix: bucket === 'packages' ? usePackagesBucket.base : useTemplatesBucket.base,
20-
cursor: cursor || undefined,
20+
startAfter: startAfter || undefined,
2121
}, remove);
2222

2323
return result;
@@ -47,10 +47,10 @@ async function mapWithConcurrency<T, R>(
4747
return results;
4848
}
4949

50-
async function iterateAndDelete(event: H3Event, signal: AbortSignal, opts: R2ListOptions, remove: boolean) {
50+
async function iterateAndDelete(event: H3Event, signal: AbortSignal, opts: R2ListOptions & { startAfter?: string }, remove: boolean) {
5151
const binding = useBinding(event);
5252
let truncated = true;
53-
let cursor: string | undefined = opts.cursor;
53+
let startAfter: string | undefined = opts.startAfter;
5454
const removedItems: Array<{ key: string; uploaded: Date; downloadedAt?: Date }> = [];
5555
const downloadedAtBucket = useDownloadedAtBucket(event);
5656
const today = Date.parse(new Date().toString());
@@ -59,9 +59,10 @@ async function iterateAndDelete(event: H3Event, signal: AbortSignal, opts: R2Lis
5959
const next = await binding.list({
6060
...opts,
6161
limit: 1000,
62-
cursor,
62+
startAfter,
6363
});
6464

65+
let lastNonRemovedKey: string | undefined = undefined;
6566
await mapWithConcurrency(next.objects, CONCURRENCY, async (object) => {
6667
if (signal.aborted) return;
6768
const uploaded = Date.parse(object.uploaded.toString());
@@ -81,6 +82,7 @@ async function iterateAndDelete(event: H3Event, signal: AbortSignal, opts: R2Lis
8182
}
8283
const downloadedAt = await downloadedAtBucket.getItem(object.key);
8384
if (!downloadedAt) {
85+
lastNonRemovedKey = object.key;
8486
return;
8587
}
8688
const downloadedAtDate = new Date(downloadedAt);
@@ -100,16 +102,18 @@ async function iterateAndDelete(event: H3Event, signal: AbortSignal, opts: R2Lis
100102
await binding.delete(object.key);
101103
await downloadedAtBucket.removeItem(object.key);
102104
}
105+
} else {
106+
lastNonRemovedKey = object.key;
103107
}
104108
});
105109

106110
truncated = next.truncated;
107-
if (next.truncated) {
108-
cursor = next.cursor;
111+
if (next.truncated && lastNonRemovedKey) {
112+
startAfter = lastNonRemovedKey;
109113
}
110114

111115
return {
112-
cursor,
116+
startAfter,
113117
truncated,
114118
removedItems,
115119
};

script/remove-stale.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ if (!endpoint || !staleKey) {
88
}
99

1010
async function processBucket(bucket) {
11-
let cursor = null;
11+
let startAfter = null;
1212
let batch = 0;
1313
let truncated = true;
1414
while (truncated) {
1515
const body = {
1616
bucket,
17-
cursor,
17+
startAfter,
1818
remove,
1919
};
2020
try {
@@ -34,7 +34,7 @@ async function processBucket(bucket) {
3434

3535
const json = await res.json();
3636
console.log(`[${bucket}] Batch ${batch} - Removed items:`, json.removedItems.length);
37-
cursor = json.cursor;
37+
startAfter = json.startAfter;
3838
truncated = json.truncated;
3939
batch++;
4040
if (!truncated) {

0 commit comments

Comments
 (0)