Skip to content

Commit 9dfb6ec

Browse files
committed
fix(storage/s3): final upload
1 parent ec8b3bf commit 9dfb6ec

File tree

3 files changed

+13
-21
lines changed

3 files changed

+13
-21
lines changed

lib/storage/drivers/s3.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import {
1010
S3Client,
1111
} from '@aws-sdk/client-s3'
1212
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
13-
import * as R from 'remeda'
1413

14+
import * as R from 'remeda'
1515
import { z } from 'zod'
1616
import { parseEnv, StorageDriver } from '~/lib/storage/defineStorageDriver'
17-
import { createTempDir } from '~/lib/utils'
17+
import { createTempDir, streamToBuffer } from '~/lib/utils'
1818

1919
export class S3StorageDriver extends StorageDriver {
2020
s3
@@ -95,20 +95,15 @@ export class S3StorageDriver extends StorageDriver {
9595
)
9696
}
9797

98-
async uploadPart(opts: {
99-
objectName: string
100-
uploadId: string
101-
partNumber: number
102-
data: ReadableStream
103-
}) {
98+
async uploadPart(opts: { uploadId: string; partNumber: number; data: ReadableStream }) {
10499
await this.s3.send(
105100
new PutObjectCommand({
106101
Bucket: this.bucket,
107102
Key: this.getUploadPartObjectName({
108103
uploadId: opts.uploadId,
109104
partNumber: opts.partNumber,
110105
}),
111-
Body: opts.data,
106+
Body: await streamToBuffer(opts.data),
112107
}),
113108
)
114109
}
@@ -121,41 +116,40 @@ export class S3StorageDriver extends StorageDriver {
121116
const tempDir = await createTempDir()
122117
const outputTempFilePath = path.join(tempDir, 'output')
123118

119+
await fs.writeFile(outputTempFilePath, '')
124120
const outputTempFile = await fs.open(outputTempFilePath, 'r+')
125121

126122
let currentChunk = 0
127123
for (const partNumber of opts.partNumbers) {
128124
const part = await this.s3.send(
129125
new GetObjectCommand({
130126
Bucket: this.bucket,
131-
Key: this.addUploadFolderPrefix({
127+
Key: this.getUploadPartObjectName({
128+
partNumber,
132129
uploadId: opts.uploadId,
133-
objectName: this.getUploadPartObjectName({
134-
partNumber,
135-
uploadId: opts.uploadId,
136-
}),
137130
}),
138131
}),
139132
)
140133

141134
if (!part.Body) throw new Error(`Part ${partNumber} is missing`)
142135

143-
const partStream = part.Body as ReadableStream
144-
136+
const partStream = part.Body.transformToWebStream()
145137
const bufferWriteStream = new WritableStream<Buffer>({
146138
async write(chunk) {
139+
const start = currentChunk
147140
currentChunk += chunk.length
148-
await outputTempFile.write(chunk, 0, chunk.length, currentChunk)
141+
await outputTempFile.write(chunk, 0, chunk.length, start)
149142
},
150143
})
151144
await partStream.pipeTo(bufferWriteStream)
152145
}
153146

147+
const readStream = createReadStream(outputTempFilePath)
154148
await this.s3.send(
155149
new PutObjectCommand({
156150
Bucket: this.bucket,
157151
Key: this.addBaseFolderPrefix(opts.finalOutputObjectName),
158-
Body: await createReadStream(outputTempFilePath),
152+
Body: readStream,
159153
}),
160154
)
161155

lib/storage/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,8 @@ export const useStorageAdapter = createSingletonPromise(async () => {
9292

9393
const partNumber = chunkIndex + 1
9494

95-
const objectName = getObjectNameFromKey(upload.key, upload.version)
9695
try {
9796
await driver.uploadPart({
98-
objectName,
9997
uploadId: upload.id,
10098
partNumber,
10199
data: chunkStream,

tests/e2e.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ for (const version of versions) {
2626
delete process.env.ACTIONS_RUNTIME_TOKEN
2727
})
2828

29-
for (const size of [5 * MB, 50 * MB, 500 * MB, 1024 * MB])
29+
for (const size of [1, 5 * MB, 50 * MB, 500 * MB, 1024 * MB])
3030
test(`${size} Bytes`, { timeout: 90_000 }, async () => {
3131
// save
3232
const expectedContents = crypto.randomBytes(size)

0 commit comments

Comments
 (0)