Skip to content

Commit 957496c

Browse files
committed
Merge branch 'develop' into 178-publish-collection
2 parents 942ae75 + 4537ac8 commit 957496c

File tree

3 files changed

+9
-54
lines changed

3 files changed

+9
-54
lines changed

src/files/infra/clients/DirectUploadClient.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ export class DirectUploadClient implements IDirectUploadClient {
1919
private filesRepository: IFilesRepository
2020
private maxMultipartRetries: number
2121

22-
private readonly progressAfterUrlGeneration: number = 10
23-
private readonly progressAfterFileUpload: number = 100
24-
2522
private readonly fileUploadTimeoutMs: number = 60_000
2623

2724
constructor(filesRepository: IFilesRepository, maxMultipartRetries = 5) {
@@ -43,14 +40,12 @@ export class DirectUploadClient implements IDirectUploadClient {
4340
throw new UrlGenerationError(file.name, datasetId, error.message)
4441
})
4542
}
46-
progress(this.progressAfterUrlGeneration)
4743

4844
if (destination.urls.length === 1) {
49-
await this.uploadSinglepartFile(datasetId, file, destination, abortController)
45+
await this.uploadSinglepartFile(datasetId, file, destination, progress, abortController)
5046
} else {
5147
await this.uploadMultipartFile(datasetId, file, destination, progress, abortController)
5248
}
53-
progress(this.progressAfterFileUpload)
5449

5550
return destination.storageId
5651
}
@@ -59,18 +54,20 @@ export class DirectUploadClient implements IDirectUploadClient {
5954
datasetId: number | string,
6055
file: File,
6156
destination: FileUploadDestination,
57+
progress: (now: number) => void,
6258
abortController: AbortController
6359
): Promise<void> {
6460
try {
6561
const arrayBuffer = await file.arrayBuffer()
6662
await axios.put(destination.urls[0], arrayBuffer, {
6763
headers: {
6864
'Content-Type': 'application/octet-stream',
69-
'Content-Length': file.size.toString(),
7065
'x-amz-tagging': 'dv-state=temp'
7166
},
7267
timeout: this.fileUploadTimeoutMs,
73-
signal: abortController.signal
68+
signal: abortController.signal,
69+
onUploadProgress: (progressEvent) =>
70+
progress(Math.round((progressEvent.loaded * 100) / file.size))
7471
})
7572
} catch (error) {
7673
if (axios.isCancel(error)) {
@@ -92,8 +89,6 @@ export class DirectUploadClient implements IDirectUploadClient {
9289
const maxRetries = this.maxMultipartRetries
9390
const limitConcurrency = pLimit(1)
9491

95-
const progressPartSize = 80 / destination.urls.length
96-
9792
const uploadPart = async (
9893
destinationUrl: string,
9994
index: number,
@@ -106,17 +101,17 @@ export class DirectUploadClient implements IDirectUploadClient {
106101
try {
107102
const response = await axios.put(destinationUrl, fileSlice, {
108103
headers: {
109-
'Content-Type': 'application/octet-stream',
110-
'Content-Length': fileSlice.size
104+
'Content-Type': 'application/octet-stream'
111105
},
112106
maxBodyLength: Infinity,
113107
maxContentLength: Infinity,
114108
timeout: this.fileUploadTimeoutMs,
115-
signal: abortController.signal
109+
signal: abortController.signal,
110+
onUploadProgress: (progressEvent) =>
111+
progress(Math.round(((offset + progressEvent.loaded) * 100) / file.size))
116112
})
117113
const eTag = response.headers['etag'].replace(/"/g, '')
118114
eTags[`${index + 1}`] = eTag
119-
progress(Math.round(this.progressAfterUrlGeneration + progressPartSize * (index + 1)))
120115
} catch (error) {
121116
if (axios.isCancel(error)) {
122117
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint)

test/integration/files/DirectUpload.test.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,6 @@ describe('Direct Upload', () => {
9595

9696
expect(await singlepartFileExistsInBucket(singlepartFileUrl)).toBe(true)
9797

98-
expect(progressMock).toHaveBeenCalledWith(10)
99-
expect(progressMock).toHaveBeenCalledWith(100)
100-
expect(progressMock).toHaveBeenCalledTimes(2)
101-
10298
// Test FilesRepository.addUploadedFileToDataset method
10399

104100
let datasetFiles = await filesRepositorySut.getDatasetFiles(
@@ -156,12 +152,6 @@ describe('Direct Upload', () => {
156152
)
157153
expect(actualStorageId).toBe(destination.storageId)
158154

159-
expect(progressMock).toHaveBeenCalledWith(10)
160-
expect(progressMock).toHaveBeenCalledWith(50)
161-
expect(progressMock).toHaveBeenCalledWith(90)
162-
expect(progressMock).toHaveBeenCalledWith(100)
163-
expect(progressMock).toHaveBeenCalledTimes(4)
164-
165155
// Test FilesRepository.addUploadedFileToDataset method
166156

167157
let datasetFiles = await filesRepositorySut.getDatasetFiles(
@@ -221,10 +211,6 @@ describe('Direct Upload', () => {
221211
destination
222212
)
223213
).rejects.toThrow(FileUploadCancelError)
224-
225-
expect(progressMock).not.toHaveBeenCalledWith(50)
226-
expect(progressMock).not.toHaveBeenCalledWith(90)
227-
expect(progressMock).not.toHaveBeenCalledWith(100)
228214
})
229215

230216
const createTestFileUploadDestination = async (file: File, testDatasetId: number) => {

test/unit/files/DirectUploadClient.test.ts

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ describe('uploadFile', () => {
5050
await expect(sut.uploadFile(1, testFile, progressMock, abortController)).rejects.toThrow(
5151
UrlGenerationError
5252
)
53-
54-
expect(progressMock).not.toHaveBeenCalled()
5553
})
5654

5755
test('should return FileUploadError when there is an error on single file upload', async () => {
@@ -70,9 +68,6 @@ describe('uploadFile', () => {
7068
await expect(sut.uploadFile(1, testFile, progressMock, abortController)).rejects.toThrow(
7169
FileUploadError
7270
)
73-
74-
expect(progressMock).toHaveBeenCalledWith(10)
75-
expect(progressMock).toHaveBeenCalledTimes(1)
7671
})
7772

7873
test('should storage identifier on operation success', async () => {
@@ -90,10 +85,6 @@ describe('uploadFile', () => {
9085

9186
const actual = await sut.uploadFile(1, testFile, progressMock, abortController)
9287

93-
expect(progressMock).toHaveBeenCalledWith(10)
94-
expect(progressMock).toHaveBeenCalledWith(100)
95-
expect(progressMock).toHaveBeenCalledTimes(2)
96-
9788
expect(actual).toEqual(testDestination.storageId)
9889
})
9990
})
@@ -138,9 +129,6 @@ describe('uploadFile', () => {
138129
params: {}
139130
}
140131
)
141-
142-
expect(progressMock).toHaveBeenCalledWith(10)
143-
expect(progressMock).toHaveBeenCalledTimes(1)
144132
})
145133

146134
test('should return MultipartAbortError when there is an error on multipart file upload and abort endpoint call fails', async () => {
@@ -160,9 +148,6 @@ describe('uploadFile', () => {
160148
await expect(sut.uploadFile(1, testFile, progressMock, abortController)).rejects.toThrow(
161149
MultipartAbortError
162150
)
163-
164-
expect(progressMock).toHaveBeenCalledWith(10)
165-
expect(progressMock).toHaveBeenCalledTimes(1)
166151
})
167152

168153
test('should return MultipartCompletionError when there is an error on multipart file completion', async () => {
@@ -186,11 +171,6 @@ describe('uploadFile', () => {
186171
)
187172

188173
expect(axios.put).toHaveBeenCalledTimes(3)
189-
190-
expect(progressMock).toHaveBeenCalledWith(10)
191-
expect(progressMock).toHaveBeenCalledWith(50)
192-
expect(progressMock).toHaveBeenCalledWith(90)
193-
expect(progressMock).toHaveBeenCalledTimes(3)
194174
})
195175

196176
test('should return storage identifier on operation success', async () => {
@@ -215,12 +195,6 @@ describe('uploadFile', () => {
215195
const actual = await sut.uploadFile(1, testFile, progressMock, abortController)
216196

217197
expect(actual).toEqual(testMultipartDestination.storageId)
218-
219-
expect(progressMock).toHaveBeenCalledWith(10)
220-
expect(progressMock).toHaveBeenCalledWith(50)
221-
expect(progressMock).toHaveBeenCalledWith(90)
222-
expect(progressMock).toHaveBeenCalledWith(100)
223-
expect(progressMock).toHaveBeenCalledTimes(4)
224198
})
225199
})
226200
})

0 commit comments

Comments
 (0)