@@ -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 } ;
0 commit comments