Skip to content

Commit 7ae0bf7

Browse files
authored
@tus/s3-store: Fix incorrect part retreival procedure (#507)
* @tus/s3-store: Fix incorrect part retreival procedure * change that function always returns an array
1 parent 9149b84 commit 7ae0bf7

File tree

1 file changed

+13
-24
lines changed

1 file changed

+13
-24
lines changed

packages/s3-store/index.ts

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)