@@ -6,15 +6,15 @@ import {
6
6
GetObjectCommand ,
7
7
HeadBucketCommand ,
8
8
ListObjectsV2Command ,
9
- PutObjectCommand ,
10
9
S3Client ,
11
10
} from '@aws-sdk/client-s3'
12
- import { getSignedUrl } from '@aws-sdk/s3-request-presigner '
11
+ import { Upload } from '@aws-sdk/lib-storage '
13
12
13
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
14
14
import * as R from 'remeda'
15
15
import { z } from 'zod'
16
16
import { parseEnv , StorageDriver } from '~/lib/storage/defineStorageDriver'
17
- import { createTempDir , streamToBuffer } from '~/lib/utils'
17
+ import { createTempDir } from '~/lib/utils'
18
18
19
19
export class S3StorageDriver extends StorageDriver {
20
20
s3
@@ -96,16 +96,20 @@ export class S3StorageDriver extends StorageDriver {
96
96
}
97
97
98
98
async uploadPart ( opts : { uploadId : string ; partNumber : number ; data : ReadableStream } ) {
99
- await this . s3 . send (
100
- new PutObjectCommand ( {
99
+ const upload = new Upload ( {
100
+ client : this . s3 ,
101
+ params : {
101
102
Bucket : this . bucket ,
102
103
Key : this . getUploadPartObjectName ( {
103
104
uploadId : opts . uploadId ,
104
105
partNumber : opts . partNumber ,
105
106
} ) ,
106
- Body : await streamToBuffer ( opts . data ) ,
107
- } ) ,
108
- )
107
+ Body : opts . data ,
108
+ } ,
109
+ partSize : 64 * 1024 * 1024 , // 64 MB
110
+ queueSize : 1 ,
111
+ } )
112
+ await upload . done ( )
109
113
}
110
114
111
115
async completeMultipartUpload ( opts : {
@@ -147,13 +151,17 @@ export class S3StorageDriver extends StorageDriver {
147
151
await outputTempFile . close ( )
148
152
149
153
const readStream = createReadStream ( outputTempFilePath )
150
- await this . s3 . send (
151
- new PutObjectCommand ( {
154
+ const upload = new Upload ( {
155
+ client : this . s3 ,
156
+ params : {
152
157
Bucket : this . bucket ,
153
158
Key : this . addBaseFolderPrefix ( opts . finalOutputObjectName ) ,
154
159
Body : readStream ,
155
- } ) ,
156
- )
160
+ } ,
161
+ partSize : 64 * 1024 * 1024 , // 64 MB
162
+ queueSize : 1 ,
163
+ } )
164
+ await upload . done ( )
157
165
158
166
await Promise . all ( [
159
167
this . cleanupMultipartUpload ( opts . uploadId ) ,
0 commit comments