@@ -378,38 +378,26 @@ export class S3Store extends DataStore {
378378 private async retrieveParts (
379379 id : string ,
380380 partNumberMarker ?: string
381- ) : Promise < Array < AWS . Part > | undefined > {
381+ ) : Promise < Array < AWS . Part > > {
382382 const params : AWS . ListPartsCommandInput = {
383383 Bucket : this . bucket ,
384384 Key : id ,
385385 UploadId : this . cache . get ( id ) ?. [ 'upload-id' ] ,
386- }
387- if ( partNumberMarker ) {
388- params . PartNumberMarker = partNumberMarker
386+ PartNumberMarker : partNumberMarker ,
389387 }
390388
391389 const data = await this . client . listParts ( params )
392390
393- // INFO: NextPartNumberMarker should be undefined when there are no more parts to retrieve,
394- // instead it keeps giving `0` so to prevent an infinite loop we check the number.
395- if ( data . NextPartNumberMarker && Number ( data . NextPartNumberMarker ) > 0 ) {
396- return this . retrieveParts ( id , data . NextPartNumberMarker ) . then ( ( parts ) => {
397- if ( parts && data . Parts ) {
398- return [ ...data . Parts , ...parts ]
399- }
400- return data . Parts
401- } )
402- }
391+ let parts = data . Parts ?? [ ]
403392
404- const parts = data . Parts
393+ if ( data . IsTruncated ) {
394+ const rest = await this . retrieveParts ( id , data . NextPartNumberMarker )
395+ parts = [ ...parts , ...rest ]
396+ }
405397
406- if ( parts && ! partNumberMarker ) {
407- return (
408- parts
409- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
410- . sort ( ( a , b ) => a . PartNumber ! - b . PartNumber ! )
411- . filter ( ( value , index ) => value . PartNumber === index + 1 )
412- )
398+ if ( ! partNumberMarker ) {
399+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
400+ parts . sort ( ( a , b ) => a . PartNumber ! - b . PartNumber ! )
413401 }
414402
415403 return parts
@@ -490,7 +478,8 @@ export class S3Store extends DataStore {
490478 // Metadata request needs to happen first
491479 const metadata = await this . getMetadata ( id )
492480 const parts = await this . retrieveParts ( id )
493- const partNumber = parts ?. length ?? 0
481+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
482+ const partNumber : number = parts . length > 0 ? parts [ parts . length - 1 ] . PartNumber ! : 0
494483 const nextPartNumber = partNumber + 1
495484
496485 const bytesUploaded = await this . processUpload (
@@ -505,7 +494,7 @@ export class S3Store extends DataStore {
505494 if ( metadata . file . size === newOffset ) {
506495 try {
507496 const parts = await this . retrieveParts ( id )
508- await this . finishMultipartUpload ( metadata , parts as Array < AWS . Part > )
497+ await this . finishMultipartUpload ( metadata , parts )
509498 this . clearCache ( id )
510499 } catch ( error ) {
511500 log ( `[${ id } ] failed to finish upload` , error )
0 commit comments