@aws-amplify/storage 5.0.9-storage-part-size.4 → 5.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/lib/providers/AWSS3ProviderManagedUpload.d.ts +2 -2
- package/lib/providers/AWSS3ProviderManagedUpload.js +55 -67
- package/lib/providers/AWSS3ProviderManagedUpload.js.map +1 -1
- package/lib-esm/providers/AWSS3ProviderManagedUpload.d.ts +2 -2
- package/lib-esm/providers/AWSS3ProviderManagedUpload.js +55 -67
- package/lib-esm/providers/AWSS3ProviderManagedUpload.js.map +1 -1
- package/package.json +3 -3
- package/src/providers/AWSS3ProviderManagedUpload.ts +30 -52
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [5.0.9](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/storage@5.0.8...@aws-amplify/storage@5.0.9) (2023-01-10)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @aws-amplify/storage
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [5.0.8](https://github.com/aws-amplify/amplify-js/compare/@aws-amplify/storage@5.0.7...@aws-amplify/storage@5.0.8) (2022-12-27)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @aws-amplify/storage
|
|
@@ -9,19 +9,19 @@ export declare interface Part {
|
|
|
9
9
|
_lastUploadedBytes: number;
|
|
10
10
|
}
|
|
11
11
|
export declare class AWSS3ProviderManagedUpload {
|
|
12
|
+
protected minPartSize: number;
|
|
13
|
+
private queueSize;
|
|
12
14
|
private body;
|
|
13
15
|
private params;
|
|
14
16
|
private opts;
|
|
15
17
|
private completedParts;
|
|
16
18
|
private s3client;
|
|
17
19
|
private uploadId;
|
|
18
|
-
private partSize;
|
|
19
20
|
private bytesUploaded;
|
|
20
21
|
private totalBytesToUpload;
|
|
21
22
|
private emitter;
|
|
22
23
|
constructor(params: PutObjectRequest, opts: any, emitter: events.EventEmitter);
|
|
23
24
|
upload(): Promise<string | import("@aws-sdk/client-s3/types/").PutObjectCommandOutput>;
|
|
24
|
-
private calculatePartSize;
|
|
25
25
|
private createParts;
|
|
26
26
|
private createMultiPartUpload;
|
|
27
27
|
/**
|
|
@@ -8,19 +8,18 @@ var client_s3_1 = require("@aws-sdk/client-s3");
|
|
|
8
8
|
var axios_http_handler_1 = require("./axios-http-handler");
|
|
9
9
|
var events = tslib_1.__importStar(require("events"));
|
|
10
10
|
var S3ClientUtils_1 = require("../common/S3ClientUtils");
|
|
11
|
-
var MB = 1024 * 1024;
|
|
12
|
-
var GB = 1024 * MB;
|
|
13
|
-
var TB = 1024 * GB;
|
|
14
|
-
var DEFAULT_PART_SIZE = 5 * MB;
|
|
15
|
-
var MAX_OBJECT_SIZE = 5 * TB;
|
|
16
|
-
var MAX_PARTS_COUNT = 10000;
|
|
17
|
-
var DEFAULT_QUEUE_SIZE = 4;
|
|
18
11
|
var logger = new core_1.ConsoleLogger('AWSS3ProviderManagedUpload');
|
|
19
12
|
var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
20
13
|
function AWSS3ProviderManagedUpload(params, opts, emitter) {
|
|
14
|
+
// Defaults
|
|
15
|
+
this.minPartSize = 5 * 1024 * 1024; // in MB
|
|
16
|
+
this.queueSize = 4;
|
|
17
|
+
// Data for current upload
|
|
18
|
+
this.body = null;
|
|
19
|
+
this.params = null;
|
|
21
20
|
this.opts = null;
|
|
22
21
|
this.completedParts = [];
|
|
23
|
-
this.
|
|
22
|
+
this.uploadId = null;
|
|
24
23
|
// Progress reporting
|
|
25
24
|
this.bytesUploaded = 0;
|
|
26
25
|
this.totalBytesToUpload = 0;
|
|
@@ -32,85 +31,79 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
32
31
|
}
|
|
33
32
|
AWSS3ProviderManagedUpload.prototype.upload = function () {
|
|
34
33
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
35
|
-
var putObjectCommand,
|
|
34
|
+
var _a, putObjectCommand, _b, numberOfPartsToUpload, parts, start, error_1;
|
|
36
35
|
var _this = this;
|
|
37
|
-
return tslib_1.__generator(this, function (
|
|
38
|
-
switch (
|
|
36
|
+
return tslib_1.__generator(this, function (_c) {
|
|
37
|
+
switch (_c.label) {
|
|
39
38
|
case 0:
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
_c.trys.push([0, 10, , 12]);
|
|
40
|
+
_a = this;
|
|
41
|
+
return [4 /*yield*/, this.validateAndSanitizeBody(this.params.Body)];
|
|
42
|
+
case 1:
|
|
43
|
+
_a.body = _c.sent();
|
|
42
44
|
this.totalBytesToUpload = this.byteLength(this.body);
|
|
43
|
-
if (!(this.totalBytesToUpload <=
|
|
45
|
+
if (!(this.totalBytesToUpload <= this.minPartSize)) return [3 /*break*/, 2];
|
|
44
46
|
// Multipart upload is not required. Upload the sanitized body as is
|
|
45
47
|
this.params.Body = this.body;
|
|
46
48
|
putObjectCommand = new client_s3_1.PutObjectCommand(this.params);
|
|
47
49
|
return [2 /*return*/, this.s3client.send(putObjectCommand)];
|
|
48
|
-
case 1:
|
|
49
|
-
// Step 1: Determine appropriate part size.
|
|
50
|
-
this.calculatePartSize();
|
|
51
|
-
// Step 2: Initiate the multi part upload
|
|
52
|
-
_a = this;
|
|
53
|
-
return [4 /*yield*/, this.createMultiPartUpload()];
|
|
54
50
|
case 2:
|
|
55
|
-
// Step
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
// Step 1: Initiate the multi part upload
|
|
52
|
+
_b = this;
|
|
53
|
+
return [4 /*yield*/, this.createMultiPartUpload()];
|
|
54
|
+
case 3:
|
|
55
|
+
// Step 1: Initiate the multi part upload
|
|
56
|
+
_b.uploadId = _c.sent();
|
|
57
|
+
numberOfPartsToUpload = Math.ceil(this.totalBytesToUpload / this.minPartSize);
|
|
58
58
|
parts = this.createParts();
|
|
59
59
|
start = 0;
|
|
60
|
-
|
|
61
|
-
case 3:
|
|
62
|
-
if (!(start < numberOfPartsToUpload)) return [3 /*break*/, 6];
|
|
63
|
-
// Upload as many as `queueSize` parts simultaneously
|
|
64
|
-
return [4 /*yield*/, this.uploadParts(this.uploadId, parts.slice(start, start + DEFAULT_QUEUE_SIZE))];
|
|
60
|
+
_c.label = 4;
|
|
65
61
|
case 4:
|
|
62
|
+
if (!(start < numberOfPartsToUpload)) return [3 /*break*/, 7];
|
|
66
63
|
// Upload as many as `queueSize` parts simultaneously
|
|
67
|
-
|
|
68
|
-
_b.label = 5;
|
|
64
|
+
return [4 /*yield*/, this.uploadParts(this.uploadId, parts.slice(start, start + this.queueSize))];
|
|
69
65
|
case 5:
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
// Upload as many as `queueSize` parts simultaneously
|
|
67
|
+
_c.sent();
|
|
68
|
+
_c.label = 6;
|
|
72
69
|
case 6:
|
|
70
|
+
start += this.queueSize;
|
|
71
|
+
return [3 /*break*/, 4];
|
|
72
|
+
case 7:
|
|
73
73
|
parts.map(function (part) {
|
|
74
74
|
_this.removeEventListener(part);
|
|
75
75
|
});
|
|
76
76
|
return [4 /*yield*/, this.finishMultiPartUpload(this.uploadId)];
|
|
77
|
-
case
|
|
77
|
+
case 8:
|
|
78
78
|
// Step 3: Finalize the upload such that S3 can recreate the file
|
|
79
|
-
return [2 /*return*/,
|
|
80
|
-
case
|
|
81
|
-
case
|
|
82
|
-
error_1 =
|
|
79
|
+
return [2 /*return*/, _c.sent()];
|
|
80
|
+
case 9: return [3 /*break*/, 12];
|
|
81
|
+
case 10:
|
|
82
|
+
error_1 = _c.sent();
|
|
83
83
|
// if any error is thrown, call cleanup
|
|
84
84
|
return [4 /*yield*/, this.cleanup(this.uploadId)];
|
|
85
|
-
case
|
|
85
|
+
case 11:
|
|
86
86
|
// if any error is thrown, call cleanup
|
|
87
|
-
|
|
87
|
+
_c.sent();
|
|
88
88
|
logger.error('Error. Cancelling the multipart upload.');
|
|
89
89
|
throw error_1;
|
|
90
|
-
case
|
|
90
|
+
case 12: return [2 /*return*/];
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
};
|
|
95
|
-
AWSS3ProviderManagedUpload.prototype.calculatePartSize = function () {
|
|
96
|
-
var partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
97
|
-
while (partsCount > MAX_PARTS_COUNT) {
|
|
98
|
-
this.partSize *= 2;
|
|
99
|
-
partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
95
|
AWSS3ProviderManagedUpload.prototype.createParts = function () {
|
|
103
96
|
try {
|
|
104
97
|
var parts = [];
|
|
105
98
|
for (var bodyStart = 0; bodyStart < this.totalBytesToUpload;) {
|
|
106
|
-
var bodyEnd = Math.min(bodyStart + this.
|
|
99
|
+
var bodyEnd = Math.min(bodyStart + this.minPartSize, this.totalBytesToUpload);
|
|
107
100
|
parts.push({
|
|
108
101
|
bodyPart: this.body.slice(bodyStart, bodyEnd),
|
|
109
102
|
partNumber: parts.length + 1,
|
|
110
103
|
emitter: new events.EventEmitter(),
|
|
111
104
|
_lastUploadedBytes: 0,
|
|
112
105
|
});
|
|
113
|
-
bodyStart += this.
|
|
106
|
+
bodyStart += this.minPartSize;
|
|
114
107
|
}
|
|
115
108
|
return parts;
|
|
116
109
|
}
|
|
@@ -228,10 +221,6 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
228
221
|
this.completedParts = [];
|
|
229
222
|
this.bytesUploaded = 0;
|
|
230
223
|
this.totalBytesToUpload = 0;
|
|
231
|
-
if (!uploadId) {
|
|
232
|
-
// This is a single part upload;
|
|
233
|
-
return [2 /*return*/];
|
|
234
|
-
}
|
|
235
224
|
input = {
|
|
236
225
|
Bucket: this.params.Bucket,
|
|
237
226
|
Key: this.params.Key,
|
|
@@ -293,20 +282,19 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
293
282
|
}
|
|
294
283
|
};
|
|
295
284
|
AWSS3ProviderManagedUpload.prototype.validateAndSanitizeBody = function (body) {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
return sanitizedBody;
|
|
285
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
286
|
+
return tslib_1.__generator(this, function (_a) {
|
|
287
|
+
if (this.isGenericObject(body)) {
|
|
288
|
+
// Any javascript object
|
|
289
|
+
return [2 /*return*/, JSON.stringify(body)];
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// Files, arrayBuffer etc
|
|
293
|
+
return [2 /*return*/, body];
|
|
294
|
+
}
|
|
295
|
+
return [2 /*return*/];
|
|
296
|
+
});
|
|
297
|
+
});
|
|
310
298
|
};
|
|
311
299
|
AWSS3ProviderManagedUpload.prototype.isGenericObject = function (body) {
|
|
312
300
|
if (body !== null && typeof body === 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AWSS3ProviderManagedUpload.js","sourceRoot":"","sources":["../../src/providers/AWSS3ProviderManagedUpload.ts"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;;;AAEtC,0CAA4D;AAC5D,gDAW4B;AAC5B,2DAI8B;AAC9B,qDAAiC;AACjC,yDAMiC;AAEjC,IAAM,
|
|
1
|
+
{"version":3,"file":"AWSS3ProviderManagedUpload.js","sourceRoot":"","sources":["../../src/providers/AWSS3ProviderManagedUpload.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,19 +9,19 @@ export declare interface Part {
|
|
|
9
9
|
_lastUploadedBytes: number;
|
|
10
10
|
}
|
|
11
11
|
export declare class AWSS3ProviderManagedUpload {
|
|
12
|
+
protected minPartSize: number;
|
|
13
|
+
private queueSize;
|
|
12
14
|
private body;
|
|
13
15
|
private params;
|
|
14
16
|
private opts;
|
|
15
17
|
private completedParts;
|
|
16
18
|
private s3client;
|
|
17
19
|
private uploadId;
|
|
18
|
-
private partSize;
|
|
19
20
|
private bytesUploaded;
|
|
20
21
|
private totalBytesToUpload;
|
|
21
22
|
private emitter;
|
|
22
23
|
constructor(params: PutObjectRequest, opts: any, emitter: events.EventEmitter);
|
|
23
24
|
upload(): Promise<string | import("@aws-sdk/client-s3/types/").PutObjectCommandOutput>;
|
|
24
|
-
private calculatePartSize;
|
|
25
25
|
private createParts;
|
|
26
26
|
private createMultiPartUpload;
|
|
27
27
|
/**
|
|
@@ -6,19 +6,18 @@ import { PutObjectCommand, CreateMultipartUploadCommand, UploadPartCommand, Comp
|
|
|
6
6
|
import { SEND_UPLOAD_PROGRESS_EVENT, SEND_DOWNLOAD_PROGRESS_EVENT, } from './axios-http-handler';
|
|
7
7
|
import * as events from 'events';
|
|
8
8
|
import { createPrefixMiddleware, prefixMiddlewareOptions, autoAdjustClockskewMiddleware, autoAdjustClockskewMiddlewareOptions, createS3Client, } from '../common/S3ClientUtils';
|
|
9
|
-
var MB = 1024 * 1024;
|
|
10
|
-
var GB = 1024 * MB;
|
|
11
|
-
var TB = 1024 * GB;
|
|
12
|
-
var DEFAULT_PART_SIZE = 5 * MB;
|
|
13
|
-
var MAX_OBJECT_SIZE = 5 * TB;
|
|
14
|
-
var MAX_PARTS_COUNT = 10000;
|
|
15
|
-
var DEFAULT_QUEUE_SIZE = 4;
|
|
16
9
|
var logger = new Logger('AWSS3ProviderManagedUpload');
|
|
17
10
|
var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
18
11
|
function AWSS3ProviderManagedUpload(params, opts, emitter) {
|
|
12
|
+
// Defaults
|
|
13
|
+
this.minPartSize = 5 * 1024 * 1024; // in MB
|
|
14
|
+
this.queueSize = 4;
|
|
15
|
+
// Data for current upload
|
|
16
|
+
this.body = null;
|
|
17
|
+
this.params = null;
|
|
19
18
|
this.opts = null;
|
|
20
19
|
this.completedParts = [];
|
|
21
|
-
this.
|
|
20
|
+
this.uploadId = null;
|
|
22
21
|
// Progress reporting
|
|
23
22
|
this.bytesUploaded = 0;
|
|
24
23
|
this.totalBytesToUpload = 0;
|
|
@@ -30,85 +29,79 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
30
29
|
}
|
|
31
30
|
AWSS3ProviderManagedUpload.prototype.upload = function () {
|
|
32
31
|
return __awaiter(this, void 0, void 0, function () {
|
|
33
|
-
var putObjectCommand,
|
|
32
|
+
var _a, putObjectCommand, _b, numberOfPartsToUpload, parts, start, error_1;
|
|
34
33
|
var _this = this;
|
|
35
|
-
return __generator(this, function (
|
|
36
|
-
switch (
|
|
34
|
+
return __generator(this, function (_c) {
|
|
35
|
+
switch (_c.label) {
|
|
37
36
|
case 0:
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
_c.trys.push([0, 10, , 12]);
|
|
38
|
+
_a = this;
|
|
39
|
+
return [4 /*yield*/, this.validateAndSanitizeBody(this.params.Body)];
|
|
40
|
+
case 1:
|
|
41
|
+
_a.body = _c.sent();
|
|
40
42
|
this.totalBytesToUpload = this.byteLength(this.body);
|
|
41
|
-
if (!(this.totalBytesToUpload <=
|
|
43
|
+
if (!(this.totalBytesToUpload <= this.minPartSize)) return [3 /*break*/, 2];
|
|
42
44
|
// Multipart upload is not required. Upload the sanitized body as is
|
|
43
45
|
this.params.Body = this.body;
|
|
44
46
|
putObjectCommand = new PutObjectCommand(this.params);
|
|
45
47
|
return [2 /*return*/, this.s3client.send(putObjectCommand)];
|
|
46
|
-
case 1:
|
|
47
|
-
// Step 1: Determine appropriate part size.
|
|
48
|
-
this.calculatePartSize();
|
|
49
|
-
// Step 2: Initiate the multi part upload
|
|
50
|
-
_a = this;
|
|
51
|
-
return [4 /*yield*/, this.createMultiPartUpload()];
|
|
52
48
|
case 2:
|
|
53
|
-
// Step
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
// Step 1: Initiate the multi part upload
|
|
50
|
+
_b = this;
|
|
51
|
+
return [4 /*yield*/, this.createMultiPartUpload()];
|
|
52
|
+
case 3:
|
|
53
|
+
// Step 1: Initiate the multi part upload
|
|
54
|
+
_b.uploadId = _c.sent();
|
|
55
|
+
numberOfPartsToUpload = Math.ceil(this.totalBytesToUpload / this.minPartSize);
|
|
56
56
|
parts = this.createParts();
|
|
57
57
|
start = 0;
|
|
58
|
-
|
|
59
|
-
case 3:
|
|
60
|
-
if (!(start < numberOfPartsToUpload)) return [3 /*break*/, 6];
|
|
61
|
-
// Upload as many as `queueSize` parts simultaneously
|
|
62
|
-
return [4 /*yield*/, this.uploadParts(this.uploadId, parts.slice(start, start + DEFAULT_QUEUE_SIZE))];
|
|
58
|
+
_c.label = 4;
|
|
63
59
|
case 4:
|
|
60
|
+
if (!(start < numberOfPartsToUpload)) return [3 /*break*/, 7];
|
|
64
61
|
// Upload as many as `queueSize` parts simultaneously
|
|
65
|
-
|
|
66
|
-
_b.label = 5;
|
|
62
|
+
return [4 /*yield*/, this.uploadParts(this.uploadId, parts.slice(start, start + this.queueSize))];
|
|
67
63
|
case 5:
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
// Upload as many as `queueSize` parts simultaneously
|
|
65
|
+
_c.sent();
|
|
66
|
+
_c.label = 6;
|
|
70
67
|
case 6:
|
|
68
|
+
start += this.queueSize;
|
|
69
|
+
return [3 /*break*/, 4];
|
|
70
|
+
case 7:
|
|
71
71
|
parts.map(function (part) {
|
|
72
72
|
_this.removeEventListener(part);
|
|
73
73
|
});
|
|
74
74
|
return [4 /*yield*/, this.finishMultiPartUpload(this.uploadId)];
|
|
75
|
-
case
|
|
75
|
+
case 8:
|
|
76
76
|
// Step 3: Finalize the upload such that S3 can recreate the file
|
|
77
|
-
return [2 /*return*/,
|
|
78
|
-
case
|
|
79
|
-
case
|
|
80
|
-
error_1 =
|
|
77
|
+
return [2 /*return*/, _c.sent()];
|
|
78
|
+
case 9: return [3 /*break*/, 12];
|
|
79
|
+
case 10:
|
|
80
|
+
error_1 = _c.sent();
|
|
81
81
|
// if any error is thrown, call cleanup
|
|
82
82
|
return [4 /*yield*/, this.cleanup(this.uploadId)];
|
|
83
|
-
case
|
|
83
|
+
case 11:
|
|
84
84
|
// if any error is thrown, call cleanup
|
|
85
|
-
|
|
85
|
+
_c.sent();
|
|
86
86
|
logger.error('Error. Cancelling the multipart upload.');
|
|
87
87
|
throw error_1;
|
|
88
|
-
case
|
|
88
|
+
case 12: return [2 /*return*/];
|
|
89
89
|
}
|
|
90
90
|
});
|
|
91
91
|
});
|
|
92
92
|
};
|
|
93
|
-
AWSS3ProviderManagedUpload.prototype.calculatePartSize = function () {
|
|
94
|
-
var partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
95
|
-
while (partsCount > MAX_PARTS_COUNT) {
|
|
96
|
-
this.partSize *= 2;
|
|
97
|
-
partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
93
|
AWSS3ProviderManagedUpload.prototype.createParts = function () {
|
|
101
94
|
try {
|
|
102
95
|
var parts = [];
|
|
103
96
|
for (var bodyStart = 0; bodyStart < this.totalBytesToUpload;) {
|
|
104
|
-
var bodyEnd = Math.min(bodyStart + this.
|
|
97
|
+
var bodyEnd = Math.min(bodyStart + this.minPartSize, this.totalBytesToUpload);
|
|
105
98
|
parts.push({
|
|
106
99
|
bodyPart: this.body.slice(bodyStart, bodyEnd),
|
|
107
100
|
partNumber: parts.length + 1,
|
|
108
101
|
emitter: new events.EventEmitter(),
|
|
109
102
|
_lastUploadedBytes: 0,
|
|
110
103
|
});
|
|
111
|
-
bodyStart += this.
|
|
104
|
+
bodyStart += this.minPartSize;
|
|
112
105
|
}
|
|
113
106
|
return parts;
|
|
114
107
|
}
|
|
@@ -226,10 +219,6 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
226
219
|
this.completedParts = [];
|
|
227
220
|
this.bytesUploaded = 0;
|
|
228
221
|
this.totalBytesToUpload = 0;
|
|
229
|
-
if (!uploadId) {
|
|
230
|
-
// This is a single part upload;
|
|
231
|
-
return [2 /*return*/];
|
|
232
|
-
}
|
|
233
222
|
input = {
|
|
234
223
|
Bucket: this.params.Bucket,
|
|
235
224
|
Key: this.params.Key,
|
|
@@ -291,20 +280,19 @@ var AWSS3ProviderManagedUpload = /** @class */ (function () {
|
|
|
291
280
|
}
|
|
292
281
|
};
|
|
293
282
|
AWSS3ProviderManagedUpload.prototype.validateAndSanitizeBody = function (body) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
}
|
|
307
|
-
return sanitizedBody;
|
|
283
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
284
|
+
return __generator(this, function (_a) {
|
|
285
|
+
if (this.isGenericObject(body)) {
|
|
286
|
+
// Any javascript object
|
|
287
|
+
return [2 /*return*/, JSON.stringify(body)];
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
// Files, arrayBuffer etc
|
|
291
|
+
return [2 /*return*/, body];
|
|
292
|
+
}
|
|
293
|
+
return [2 /*return*/];
|
|
294
|
+
});
|
|
295
|
+
});
|
|
308
296
|
};
|
|
309
297
|
AWSS3ProviderManagedUpload.prototype.isGenericObject = function (body) {
|
|
310
298
|
if (body !== null && typeof body === 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AWSS3ProviderManagedUpload.js","sourceRoot":"","sources":["../../src/providers/AWSS3ProviderManagedUpload.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;;AAEtC,OAAO,EAAE,aAAa,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACN,gBAAgB,EAEhB,4BAA4B,EAC5B,iBAAiB,EACjB,8BAA8B,EAE9B,gBAAgB,EAChB,2BAA2B,GAG3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,0BAA0B,EAC1B,4BAA4B,GAE5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,6BAA6B,EAC7B,oCAAoC,EACpC,cAAc,GACd,MAAM,yBAAyB,CAAC;AAEjC,IAAM,
|
|
1
|
+
{"version":3,"file":"AWSS3ProviderManagedUpload.js","sourceRoot":"","sources":["../../src/providers/AWSS3ProviderManagedUpload.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-amplify/storage",
|
|
3
|
-
"version": "5.0.9
|
|
3
|
+
"version": "5.0.9",
|
|
4
4
|
"description": "Storage category of aws-amplify",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"module": "./lib-esm/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"src"
|
|
45
45
|
],
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@aws-amplify/core": "5.0.9
|
|
47
|
+
"@aws-amplify/core": "5.0.9",
|
|
48
48
|
"@aws-sdk/client-s3": "3.6.1",
|
|
49
49
|
"@aws-sdk/s3-request-presigner": "3.6.1",
|
|
50
50
|
"@aws-sdk/util-create-request": "3.6.1",
|
|
@@ -102,5 +102,5 @@
|
|
|
102
102
|
"devDependencies": {
|
|
103
103
|
"@types/sinon": "^7.5.1"
|
|
104
104
|
},
|
|
105
|
-
"gitHead": "
|
|
105
|
+
"gitHead": "5e4beb9b69a91ffb6fc79cf6305e27cf9794cacf"
|
|
106
106
|
}
|
|
@@ -28,15 +28,6 @@ import {
|
|
|
28
28
|
createS3Client,
|
|
29
29
|
} from '../common/S3ClientUtils';
|
|
30
30
|
|
|
31
|
-
const MB = 1024 * 1024;
|
|
32
|
-
const GB = 1024 * MB;
|
|
33
|
-
const TB = 1024 * GB;
|
|
34
|
-
|
|
35
|
-
const DEFAULT_PART_SIZE = 5 * MB;
|
|
36
|
-
const MAX_OBJECT_SIZE = 5 * TB;
|
|
37
|
-
const MAX_PARTS_COUNT = 10000;
|
|
38
|
-
const DEFAULT_QUEUE_SIZE = 4;
|
|
39
|
-
|
|
40
31
|
const logger = new Logger('AWSS3ProviderManagedUpload');
|
|
41
32
|
|
|
42
33
|
export declare interface Part {
|
|
@@ -48,19 +39,22 @@ export declare interface Part {
|
|
|
48
39
|
}
|
|
49
40
|
|
|
50
41
|
export class AWSS3ProviderManagedUpload {
|
|
42
|
+
// Defaults
|
|
43
|
+
protected minPartSize = 5 * 1024 * 1024; // in MB
|
|
44
|
+
private queueSize = 4;
|
|
45
|
+
|
|
51
46
|
// Data for current upload
|
|
52
|
-
private body;
|
|
53
|
-
private params: PutObjectRequest;
|
|
47
|
+
private body = null;
|
|
48
|
+
private params: PutObjectRequest = null;
|
|
54
49
|
private opts = null;
|
|
55
50
|
private completedParts: CompletedPart[] = [];
|
|
56
51
|
private s3client: S3Client;
|
|
57
|
-
private uploadId
|
|
58
|
-
private partSize = DEFAULT_PART_SIZE;
|
|
52
|
+
private uploadId = null;
|
|
59
53
|
|
|
60
54
|
// Progress reporting
|
|
61
55
|
private bytesUploaded = 0;
|
|
62
56
|
private totalBytesToUpload = 0;
|
|
63
|
-
private emitter: events.EventEmitter
|
|
57
|
+
private emitter: events.EventEmitter = null;
|
|
64
58
|
|
|
65
59
|
constructor(params: PutObjectRequest, opts, emitter: events.EventEmitter) {
|
|
66
60
|
this.params = params;
|
|
@@ -71,34 +65,33 @@ export class AWSS3ProviderManagedUpload {
|
|
|
71
65
|
|
|
72
66
|
public async upload() {
|
|
73
67
|
try {
|
|
74
|
-
this.body = this.validateAndSanitizeBody(this.params.Body);
|
|
68
|
+
this.body = await this.validateAndSanitizeBody(this.params.Body);
|
|
75
69
|
this.totalBytesToUpload = this.byteLength(this.body);
|
|
76
|
-
if (this.totalBytesToUpload <=
|
|
70
|
+
if (this.totalBytesToUpload <= this.minPartSize) {
|
|
77
71
|
// Multipart upload is not required. Upload the sanitized body as is
|
|
78
72
|
this.params.Body = this.body;
|
|
79
73
|
const putObjectCommand = new PutObjectCommand(this.params);
|
|
80
74
|
return this.s3client.send(putObjectCommand);
|
|
81
75
|
} else {
|
|
82
|
-
// Step 1:
|
|
83
|
-
this.calculatePartSize();
|
|
84
|
-
// Step 2: Initiate the multi part upload
|
|
76
|
+
// Step 1: Initiate the multi part upload
|
|
85
77
|
this.uploadId = await this.createMultiPartUpload();
|
|
86
78
|
|
|
87
|
-
// Step
|
|
79
|
+
// Step 2: Upload chunks in parallel as requested
|
|
88
80
|
const numberOfPartsToUpload = Math.ceil(
|
|
89
|
-
this.totalBytesToUpload / this.
|
|
81
|
+
this.totalBytesToUpload / this.minPartSize
|
|
90
82
|
);
|
|
91
83
|
|
|
92
84
|
const parts: Part[] = this.createParts();
|
|
93
85
|
for (
|
|
94
86
|
let start = 0;
|
|
95
87
|
start < numberOfPartsToUpload;
|
|
96
|
-
start +=
|
|
88
|
+
start += this.queueSize
|
|
97
89
|
) {
|
|
90
|
+
|
|
98
91
|
// Upload as many as `queueSize` parts simultaneously
|
|
99
92
|
await this.uploadParts(
|
|
100
|
-
this.uploadId
|
|
101
|
-
parts.slice(start, start +
|
|
93
|
+
this.uploadId,
|
|
94
|
+
parts.slice(start, start + this.queueSize)
|
|
102
95
|
);
|
|
103
96
|
}
|
|
104
97
|
|
|
@@ -107,7 +100,7 @@ export class AWSS3ProviderManagedUpload {
|
|
|
107
100
|
});
|
|
108
101
|
|
|
109
102
|
// Step 3: Finalize the upload such that S3 can recreate the file
|
|
110
|
-
return await this.finishMultiPartUpload(this.uploadId
|
|
103
|
+
return await this.finishMultiPartUpload(this.uploadId);
|
|
111
104
|
}
|
|
112
105
|
} catch (error) {
|
|
113
106
|
// if any error is thrown, call cleanup
|
|
@@ -117,20 +110,12 @@ export class AWSS3ProviderManagedUpload {
|
|
|
117
110
|
}
|
|
118
111
|
}
|
|
119
112
|
|
|
120
|
-
private calculatePartSize() {
|
|
121
|
-
let partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
122
|
-
while (partsCount > MAX_PARTS_COUNT) {
|
|
123
|
-
this.partSize *= 2;
|
|
124
|
-
partsCount = Math.ceil(this.totalBytesToUpload / this.partSize);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
113
|
private createParts(): Part[] {
|
|
129
114
|
try {
|
|
130
115
|
const parts: Part[] = [];
|
|
131
116
|
for (let bodyStart = 0; bodyStart < this.totalBytesToUpload; ) {
|
|
132
117
|
const bodyEnd = Math.min(
|
|
133
|
-
bodyStart + this.
|
|
118
|
+
bodyStart + this.minPartSize,
|
|
134
119
|
this.totalBytesToUpload
|
|
135
120
|
);
|
|
136
121
|
parts.push({
|
|
@@ -139,7 +124,7 @@ export class AWSS3ProviderManagedUpload {
|
|
|
139
124
|
emitter: new events.EventEmitter(),
|
|
140
125
|
_lastUploadedBytes: 0,
|
|
141
126
|
});
|
|
142
|
-
bodyStart += this.
|
|
127
|
+
bodyStart += this.minPartSize;
|
|
143
128
|
}
|
|
144
129
|
return parts;
|
|
145
130
|
} catch (error) {
|
|
@@ -227,18 +212,13 @@ export class AWSS3ProviderManagedUpload {
|
|
|
227
212
|
}
|
|
228
213
|
}
|
|
229
214
|
|
|
230
|
-
private async cleanup(uploadId: string
|
|
215
|
+
private async cleanup(uploadId: string) {
|
|
231
216
|
// Reset this's state
|
|
232
217
|
this.body = null;
|
|
233
218
|
this.completedParts = [];
|
|
234
219
|
this.bytesUploaded = 0;
|
|
235
220
|
this.totalBytesToUpload = 0;
|
|
236
221
|
|
|
237
|
-
if (!uploadId) {
|
|
238
|
-
// This is a single part upload;
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
222
|
const input = {
|
|
243
223
|
Bucket: this.params.Bucket,
|
|
244
224
|
Key: this.params.Key,
|
|
@@ -297,23 +277,21 @@ export class AWSS3ProviderManagedUpload {
|
|
|
297
277
|
}
|
|
298
278
|
}
|
|
299
279
|
|
|
300
|
-
private validateAndSanitizeBody(body: any): any {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
280
|
+
private async validateAndSanitizeBody(body: any): Promise<any> {
|
|
281
|
+
if (this.isGenericObject(body)) {
|
|
282
|
+
// Any javascript object
|
|
283
|
+
return JSON.stringify(body);
|
|
284
|
+
} else {
|
|
285
|
+
// Files, arrayBuffer etc
|
|
286
|
+
return body;
|
|
287
|
+
}
|
|
304
288
|
/* TODO: streams and files for nodejs
|
|
305
289
|
if (
|
|
306
290
|
typeof body.path === 'string' &&
|
|
307
291
|
require('fs').lstatSync(body.path).size > 0
|
|
308
292
|
) {
|
|
309
|
-
|
|
293
|
+
return body;
|
|
310
294
|
} */
|
|
311
|
-
if (this.byteLength(sanitizedBody) > MAX_OBJECT_SIZE) {
|
|
312
|
-
throw new Error(
|
|
313
|
-
`File size bigger than S3 Object limit of 5TB, got ${this.totalBytesToUpload} Bytes`
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
return sanitizedBody;
|
|
317
295
|
}
|
|
318
296
|
|
|
319
297
|
private isGenericObject(body: any): body is Object {
|