@aws-amplify/storage 4.4.3 → 4.4.4-in-app-messaging.35

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +28 -352
  2. package/dist/aws-amplify-storage.js +6523 -5062
  3. package/dist/aws-amplify-storage.js.map +1 -1
  4. package/dist/aws-amplify-storage.min.js +5 -5
  5. package/dist/aws-amplify-storage.min.js.map +1 -1
  6. package/lib/Storage.d.ts +3 -1
  7. package/lib/Storage.js +25 -21
  8. package/lib/Storage.js.map +1 -1
  9. package/lib/common/S3ClientUtils.d.ts +33 -0
  10. package/lib/common/S3ClientUtils.js +179 -0
  11. package/lib/common/S3ClientUtils.js.map +1 -0
  12. package/lib/common/StorageConstants.d.ts +4 -0
  13. package/lib/common/StorageConstants.js +10 -0
  14. package/lib/common/StorageConstants.js.map +1 -0
  15. package/lib/common/StorageErrorStrings.d.ts +5 -1
  16. package/lib/common/StorageErrorStrings.js +5 -0
  17. package/lib/common/StorageErrorStrings.js.map +1 -1
  18. package/lib/common/StorageUtils.d.ts +4 -0
  19. package/lib/common/StorageUtils.js +41 -0
  20. package/lib/common/StorageUtils.js.map +1 -0
  21. package/lib/providers/AWSS3Provider.d.ts +9 -6
  22. package/lib/providers/AWSS3Provider.js +197 -149
  23. package/lib/providers/AWSS3Provider.js.map +1 -1
  24. package/lib/providers/AWSS3ProviderManagedUpload.d.ts +3 -10
  25. package/lib/providers/AWSS3ProviderManagedUpload.js +41 -109
  26. package/lib/providers/AWSS3ProviderManagedUpload.js.map +1 -1
  27. package/lib/providers/AWSS3UploadTask.d.ts +107 -0
  28. package/lib/providers/AWSS3UploadTask.js +610 -0
  29. package/lib/providers/AWSS3UploadTask.js.map +1 -0
  30. package/lib/providers/axios-http-handler.d.ts +5 -1
  31. package/lib/providers/axios-http-handler.js +28 -5
  32. package/lib/providers/axios-http-handler.js.map +1 -1
  33. package/lib/types/AWSS3Provider.d.ts +24 -4
  34. package/lib/types/Provider.d.ts +7 -1
  35. package/lib/types/Storage.d.ts +8 -8
  36. package/lib-esm/Storage.d.ts +3 -1
  37. package/lib-esm/Storage.js +25 -21
  38. package/lib-esm/Storage.js.map +1 -1
  39. package/lib-esm/common/S3ClientUtils.d.ts +33 -0
  40. package/lib-esm/common/S3ClientUtils.js +177 -0
  41. package/lib-esm/common/S3ClientUtils.js.map +1 -0
  42. package/lib-esm/common/StorageConstants.d.ts +4 -0
  43. package/lib-esm/common/StorageConstants.js +8 -0
  44. package/lib-esm/common/StorageConstants.js.map +1 -0
  45. package/lib-esm/common/StorageErrorStrings.d.ts +5 -1
  46. package/lib-esm/common/StorageErrorStrings.js +5 -0
  47. package/lib-esm/common/StorageErrorStrings.js.map +1 -1
  48. package/lib-esm/common/StorageUtils.d.ts +4 -0
  49. package/lib-esm/common/StorageUtils.js +39 -0
  50. package/lib-esm/common/StorageUtils.js.map +1 -0
  51. package/lib-esm/providers/AWSS3Provider.d.ts +9 -6
  52. package/lib-esm/providers/AWSS3Provider.js +192 -144
  53. package/lib-esm/providers/AWSS3Provider.js.map +1 -1
  54. package/lib-esm/providers/AWSS3ProviderManagedUpload.d.ts +3 -10
  55. package/lib-esm/providers/AWSS3ProviderManagedUpload.js +44 -112
  56. package/lib-esm/providers/AWSS3ProviderManagedUpload.js.map +1 -1
  57. package/lib-esm/providers/AWSS3UploadTask.d.ts +107 -0
  58. package/lib-esm/providers/AWSS3UploadTask.js +605 -0
  59. package/lib-esm/providers/AWSS3UploadTask.js.map +1 -0
  60. package/lib-esm/providers/axios-http-handler.d.ts +5 -1
  61. package/lib-esm/providers/axios-http-handler.js +28 -5
  62. package/lib-esm/providers/axios-http-handler.js.map +1 -1
  63. package/lib-esm/types/AWSS3Provider.d.ts +24 -4
  64. package/lib-esm/types/Provider.d.ts +7 -1
  65. package/lib-esm/types/Storage.d.ts +8 -8
  66. package/package.json +3 -3
  67. package/src/Storage.ts +85 -27
  68. package/src/common/S3ClientUtils.ts +168 -0
  69. package/src/common/StorageConstants.ts +10 -0
  70. package/src/common/StorageErrorStrings.ts +5 -0
  71. package/src/common/StorageUtils.ts +51 -0
  72. package/src/providers/AWSS3Provider.ts +251 -88
  73. package/src/providers/AWSS3ProviderManagedUpload.ts +346 -397
  74. package/src/providers/AWSS3UploadTask.ts +543 -0
  75. package/src/providers/axios-http-handler.ts +221 -186
  76. package/src/types/AWSS3Provider.ts +48 -7
  77. package/src/types/Provider.ts +18 -3
  78. package/src/types/Storage.ts +9 -9
@@ -3,6 +3,7 @@ export var StorageErrorStrings;
3
3
  StorageErrorStrings["NO_CREDENTIALS"] = "No credentials";
4
4
  StorageErrorStrings["NO_SRC_KEY"] = "source param should be an object with the property \"key\" with value of type string";
5
5
  StorageErrorStrings["NO_DEST_KEY"] = "destination param should be an object with the property \"key\" with value of type string";
6
+ StorageErrorStrings["INVALID_BLOB"] = "Object must be an instance of Blob";
6
7
  })(StorageErrorStrings || (StorageErrorStrings = {}));
7
8
  export var AWSS3ProviderMultipartCopierErrors;
8
9
  (function (AWSS3ProviderMultipartCopierErrors) {
@@ -12,4 +13,8 @@ export var AWSS3ProviderMultipartCopierErrors;
12
13
  AWSS3ProviderMultipartCopierErrors["NO_COPYSOURCE"] = "You must specify a copy source";
13
14
  AWSS3ProviderMultipartCopierErrors["MAX_NUM_PARTS_EXCEEDED"] = "Only a maximum of 10000 parts are allowed";
14
15
  })(AWSS3ProviderMultipartCopierErrors || (AWSS3ProviderMultipartCopierErrors = {}));
16
+ export var AWSS3ProviderUploadErrorStrings;
17
+ (function (AWSS3ProviderUploadErrorStrings) {
18
+ AWSS3ProviderUploadErrorStrings["UPLOAD_PAUSED_MESSAGE"] = "paused";
19
+ })(AWSS3ProviderUploadErrorStrings || (AWSS3ProviderUploadErrorStrings = {}));
15
20
  //# sourceMappingURL=StorageErrorStrings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorageErrorStrings.js","sourceRoot":"","sources":["../../src/common/StorageErrorStrings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC9B,wDAAiC,CAAA;IACjC,0HAAiG,CAAA;IACjG,gIAAuG,CAAA;AACxG,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B;AAED,MAAM,CAAN,IAAY,kCAMX;AAND,WAAY,kCAAkC;IAC7C,uFAAiD,CAAA;IACjD,+EAAyC,CAAA;IACzC,gGAA0D,CAAA;IAC1D,sFAAgD,CAAA;IAChD,0GAAoE,CAAA;AACrE,CAAC,EANW,kCAAkC,KAAlC,kCAAkC,QAM7C"}
1
+ {"version":3,"file":"StorageErrorStrings.js","sourceRoot":"","sources":["../../src/common/StorageErrorStrings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC9B,wDAAiC,CAAA;IACjC,0HAAiG,CAAA;IACjG,gIAAuG,CAAA;IACvG,0EAAmD,CAAA;AACpD,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAED,MAAM,CAAN,IAAY,kCAMX;AAND,WAAY,kCAAkC;IAC7C,uFAAiD,CAAA;IACjD,+EAAyC,CAAA;IACzC,gGAA0D,CAAA;IAC1D,sFAAgD,CAAA;IAChD,0GAAoE,CAAA;AACrE,CAAC,EANW,kCAAkC,KAAlC,kCAAkC,QAM7C;AAED,MAAM,CAAN,IAAY,+BAEX;AAFD,WAAY,+BAA+B;IAC1C,mEAAgC,CAAA;AACjC,CAAC,EAFW,+BAA+B,KAA/B,+BAA+B,QAE1C"}
@@ -0,0 +1,4 @@
1
+ export declare const byteLength: (x: unknown) => number;
2
+ export declare const dispatchStorageEvent: (track: boolean, event: string, attrs: any, metrics: any, message: string) => void;
3
+ export declare const isFile: (x: unknown) => x is File;
4
+ export declare const isBlob: (x: unknown) => x is Blob;
@@ -0,0 +1,39 @@
1
+ import { Hub } from '@aws-amplify/core';
2
+ import { AMPLIFY_SYMBOL } from './StorageConstants';
3
+ export var byteLength = function (x) {
4
+ if (typeof x === 'string') {
5
+ return x.length;
6
+ }
7
+ else if (isArrayBuffer(x)) {
8
+ return x.byteLength;
9
+ }
10
+ else if (isBlob(x)) {
11
+ return x.size;
12
+ }
13
+ else {
14
+ throw new Error('Cannot determine byte length of ' + x);
15
+ }
16
+ };
17
+ export var dispatchStorageEvent = function (track, event, attrs, metrics, message) {
18
+ if (track) {
19
+ var data = { attrs: attrs };
20
+ if (metrics) {
21
+ data['metrics'] = metrics;
22
+ }
23
+ Hub.dispatch('storage', {
24
+ event: event,
25
+ data: data,
26
+ message: message,
27
+ }, 'Storage', AMPLIFY_SYMBOL);
28
+ }
29
+ };
30
+ export var isFile = function (x) {
31
+ return typeof x !== 'undefined' && x instanceof File;
32
+ };
33
+ export var isBlob = function (x) {
34
+ return typeof x !== 'undefined' && x instanceof Blob;
35
+ };
36
+ var isArrayBuffer = function (x) {
37
+ return typeof x !== 'undefined' && x instanceof ArrayBuffer;
38
+ };
39
+ //# sourceMappingURL=StorageUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageUtils.js","sourceRoot":"","sources":["../../src/common/StorageUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,IAAM,UAAU,GAAG,UAAC,CAAU;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAC1B,OAAO,CAAC,CAAC,MAAM,CAAC;KAChB;SAAM,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;QAC5B,OAAO,CAAC,CAAC,UAAU,CAAC;KACpB;SAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;QACrB,OAAO,CAAC,CAAC,IAAI,CAAC;KACd;SAAM;QACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,CAAC,CAAC;KACxD;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,oBAAoB,GAAG,UACnC,KAAc,EACd,KAAa,EACb,KAAU,EACV,OAAY,EACZ,OAAe;IAEf,IAAI,KAAK,EAAE;QACV,IAAM,IAAI,GAAG,EAAE,KAAK,OAAA,EAAE,CAAC;QACvB,IAAI,OAAO,EAAE;YACZ,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;SAC1B;QACD,GAAG,CAAC,QAAQ,CACX,SAAS,EACT;YACC,KAAK,OAAA;YACL,IAAI,MAAA;YACJ,OAAO,SAAA;SACP,EACD,SAAS,EACT,cAAc,CACd,CAAC;KACF;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,MAAM,GAAG,UAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,MAAM,GAAG,UAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC;AACtD,CAAC,CAAC;AAEF,IAAM,aAAa,GAAG,UAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,YAAY,WAAW,CAAC;AAC7D,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { PutObjectCommandInput } from '@aws-sdk/client-s3';
2
- import { StorageOptions, StorageProvider, S3ProviderGetConfig, S3ProviderGetOuput, S3ProviderPutConfig, S3ProviderRemoveConfig, S3ProviderListOutput, S3ProviderListConfig, S3ProviderPutOutput, S3ProviderCopyConfig, S3ProviderCopyOutput, S3CopySource, S3CopyDestination, S3ProviderRemoveOutput } from '../types';
2
+ import { StorageOptions, StorageProvider, S3ProviderGetConfig, S3ProviderGetOuput, S3ProviderPutConfig, S3ProviderRemoveConfig, S3ProviderListOutput, S3ProviderListConfig, S3ProviderCopyConfig, S3ProviderCopyOutput, S3CopySource, S3CopyDestination, S3ProviderRemoveOutput, S3ProviderPutOutput } from '../types';
3
3
  /**
4
4
  * Provide storage methods to use AWS S3
5
5
  */
@@ -7,6 +7,7 @@ export declare class AWSS3Provider implements StorageProvider {
7
7
  static readonly CATEGORY = "Storage";
8
8
  static readonly PROVIDER_NAME = "AWSS3";
9
9
  private _config;
10
+ private _storage;
10
11
  /**
11
12
  * Initialize Storage with AWS configurations
12
13
  * @param {Object} config - Configuration object for storage
@@ -26,6 +27,7 @@ export declare class AWSS3Provider implements StorageProvider {
26
27
  * @return {Object} - Current configuration
27
28
  */
28
29
  configure(config?: any): object;
30
+ private startResumableUpload;
29
31
  /**
30
32
  * Copy an object from a source object to a new object within the same bucket. Can optionally copy files across
31
33
  * different level or identityId (if source object's level is 'protected').
@@ -48,12 +50,13 @@ export declare class AWSS3Provider implements StorageProvider {
48
50
  get<T extends S3ProviderGetConfig & StorageOptions>(key: string, config?: T): Promise<S3ProviderGetOuput<T>>;
49
51
  /**
50
52
  * Put a file in S3 bucket specified to configure method
51
- * @param {string} key - key of the object
52
- * @param {PutObjectCommandInput["Body"]} object - File to be put in Amazon S3 bucket
53
- * @param {S3ProviderPutConfig} [config] - Optional configuration for the underlying S3 command
54
- * @return {Promise<S3ProviderPutOutput>} - promise resolves to an object with the new object's key on success
53
+ * @param key - key of the object
54
+ * @param object - File to be put in Amazon S3 bucket
55
+ * @param [config] - Optional configuration for the underlying S3 command
56
+ * @return an instance of AWSS3UploadTask or a promise that resolves to an object with the new object's key on
57
+ * success.
55
58
  */
56
- put(key: string, object: PutObjectCommandInput['Body'], config?: S3ProviderPutConfig): Promise<S3ProviderPutOutput>;
59
+ put<T extends S3ProviderPutConfig>(key: string, object: PutObjectCommandInput['Body'], config?: T): S3ProviderPutOutput<T>;
57
60
  /**
58
61
  * Remove the object for specified key
59
62
  * @param {string} key - key of the object
@@ -57,36 +57,22 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
57
57
  * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
58
58
  * and limitations under the License.
59
59
  */
60
- import { ConsoleLogger as Logger, Hub, Credentials, Parser, getAmplifyUserAgent, } from '@aws-amplify/core';
61
- import { S3Client, GetObjectCommand, DeleteObjectCommand, ListObjectsCommand, CopyObjectCommand, } from '@aws-sdk/client-s3';
60
+ import { ConsoleLogger as Logger, Credentials, Parser, StorageHelper, Hub, } from '@aws-amplify/core';
61
+ import { GetObjectCommand, DeleteObjectCommand, ListObjectsCommand, CopyObjectCommand, } from '@aws-sdk/client-s3';
62
62
  import { formatUrl } from '@aws-sdk/util-format-url';
63
63
  import { createRequest } from '@aws-sdk/util-create-request';
64
64
  import { S3RequestPresigner } from '@aws-sdk/s3-request-presigner';
65
- import { AxiosHttpHandler, SEND_DOWNLOAD_PROGRESS_EVENT, SEND_UPLOAD_PROGRESS_EVENT } from './axios-http-handler';
65
+ import { SEND_DOWNLOAD_PROGRESS_EVENT, SEND_UPLOAD_PROGRESS_EVENT, } from './axios-http-handler';
66
66
  import { StorageErrorStrings } from '../common/StorageErrorStrings';
67
+ import { dispatchStorageEvent } from '../common/StorageUtils';
68
+ import { createPrefixMiddleware, prefixMiddlewareOptions, getPrefix, autoAdjustClockskewMiddleware, autoAdjustClockskewMiddlewareOptions, createS3Client, } from '../common/S3ClientUtils';
67
69
  import { AWSS3ProviderManagedUpload } from './AWSS3ProviderManagedUpload';
70
+ import { AWSS3UploadTask, TaskEvents } from './AWSS3UploadTask';
71
+ import { UPLOADS_STORAGE_KEY } from '../common/StorageConstants';
68
72
  import * as events from 'events';
69
73
  var logger = new Logger('AWSS3Provider');
70
- var AMPLIFY_SYMBOL = (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function'
71
- ? Symbol.for('amplify_default')
72
- : '@@amplify_default');
73
- var SET_CONTENT_LENGTH_HEADER = 'contentLengthMiddleware';
74
74
  var DEFAULT_STORAGE_LEVEL = 'public';
75
75
  var DEFAULT_PRESIGN_EXPIRATION = 900;
76
- var dispatchStorageEvent = function (track, event, attrs, metrics, message) {
77
- if (track) {
78
- var data = { attrs: attrs };
79
- if (metrics) {
80
- data['metrics'] = metrics;
81
- }
82
- Hub.dispatch('storage', {
83
- event: event,
84
- data: data,
85
- message: message,
86
- }, 'Storage', AMPLIFY_SYMBOL);
87
- }
88
- };
89
- var localTestingStorageEndpoint = 'http://localhost:20005';
90
76
  /**
91
77
  * Provide storage methods to use AWS S3
92
78
  */
@@ -96,7 +82,15 @@ var AWSS3Provider = /** @class */ (function () {
96
82
  * @param {Object} config - Configuration object for storage
97
83
  */
98
84
  function AWSS3Provider(config) {
85
+ var _this = this;
99
86
  this._config = config ? config : {};
87
+ this._storage = new StorageHelper().getStorage();
88
+ Hub.listen('auth', function (data) {
89
+ var payload = data.payload;
90
+ if (payload.event === 'signOut' || payload.event === 'signIn') {
91
+ _this._storage.removeItem(UPLOADS_STORAGE_KEY);
92
+ }
93
+ });
100
94
  logger.debug('Storage Options', this._config);
101
95
  }
102
96
  /**
@@ -127,6 +121,64 @@ var AWSS3Provider = /** @class */ (function () {
127
121
  }
128
122
  return this._config;
129
123
  };
124
+ AWSS3Provider.prototype.startResumableUpload = function (addTaskInput, config) {
125
+ var s3Client = addTaskInput.s3Client, emitter = addTaskInput.emitter, key = addTaskInput.key, file = addTaskInput.file, params = addTaskInput.params;
126
+ var progressCallback = config.progressCallback, completeCallback = config.completeCallback, errorCallback = config.errorCallback, _a = config.track, track = _a === void 0 ? false : _a;
127
+ if (!(file instanceof Blob)) {
128
+ throw new Error(StorageErrorStrings.INVALID_BLOB);
129
+ }
130
+ emitter.on(TaskEvents.UPLOAD_PROGRESS, function (event) {
131
+ if (progressCallback) {
132
+ if (typeof progressCallback === 'function') {
133
+ progressCallback(event);
134
+ }
135
+ else {
136
+ logger.warn('progressCallback should be a function, not a ' +
137
+ typeof progressCallback);
138
+ }
139
+ }
140
+ });
141
+ emitter.on(TaskEvents.UPLOAD_COMPLETE, function (event) {
142
+ if (completeCallback) {
143
+ if (typeof completeCallback === 'function') {
144
+ completeCallback(event);
145
+ }
146
+ else {
147
+ logger.warn('completeCallback should be a function, not a ' +
148
+ typeof completeCallback);
149
+ }
150
+ }
151
+ });
152
+ emitter.on(TaskEvents.ERROR, function (err) {
153
+ if (errorCallback) {
154
+ if (typeof errorCallback === 'function') {
155
+ errorCallback(err);
156
+ }
157
+ else {
158
+ logger.warn('errorCallback should be a function, not a ' + typeof errorCallback);
159
+ }
160
+ }
161
+ });
162
+ // we want to keep this function sync so we defer this promise to AWSS3UploadTask to resolve when it's needed
163
+ // when its doing a final check with _listSingleFile function
164
+ var prefixPromise = Credentials.get().then(function (credentials) {
165
+ var cred = Credentials.shear(credentials);
166
+ return getPrefix(__assign(__assign({}, config), { credentials: cred }));
167
+ });
168
+ var task = new AWSS3UploadTask({
169
+ s3Client: s3Client,
170
+ file: file,
171
+ emitter: emitter,
172
+ level: config.level,
173
+ storage: this._storage,
174
+ params: params,
175
+ prefixPromise: prefixPromise,
176
+ });
177
+ dispatchStorageEvent(track, 'upload', { method: 'put', result: 'success' }, null, "Upload Task created successfully for " + key);
178
+ // automatically start the upload task
179
+ task.resume();
180
+ return task;
181
+ };
130
182
  /**
131
183
  * Copy an object from a source object to a new object within the same bucket. Can optionally copy files across
132
184
  * different level or identityId (if source object's level is 'protected').
@@ -195,7 +247,6 @@ var AWSS3Provider = /** @class */ (function () {
195
247
  if (acl)
196
248
  params.ACL = acl;
197
249
  s3 = this._createNewS3Client(opt);
198
- s3.middlewareStack.remove(SET_CONTENT_LENGTH_HEADER);
199
250
  _c.label = 2;
200
251
  case 2:
201
252
  _c.trys.push([2, 4, , 5]);
@@ -275,7 +326,8 @@ var AWSS3Provider = /** @class */ (function () {
275
326
  });
276
327
  }
277
328
  else {
278
- logger.warn('progressCallback should be a function, not a ' + typeof progressCallback);
329
+ logger.warn('progressCallback should be a function, not a ' +
330
+ typeof progressCallback);
279
331
  }
280
332
  }
281
333
  return [4 /*yield*/, s3.send(getObjectCommand)];
@@ -300,7 +352,9 @@ var AWSS3Provider = /** @class */ (function () {
300
352
  case 6:
301
353
  request = _b.sent();
302
354
  _a = formatUrl;
303
- return [4 /*yield*/, signer.presign(request, { expiresIn: expires || DEFAULT_PRESIGN_EXPIRATION })];
355
+ return [4 /*yield*/, signer.presign(request, {
356
+ expiresIn: expires || DEFAULT_PRESIGN_EXPIRATION,
357
+ })];
304
358
  case 7:
305
359
  url = _a.apply(void 0, [_b.sent()]);
306
360
  dispatchStorageEvent(track, 'getSignedUrl', { method: 'get', result: 'success' }, null, "Signed URL: " + url);
@@ -317,104 +371,102 @@ var AWSS3Provider = /** @class */ (function () {
317
371
  };
318
372
  /**
319
373
  * Put a file in S3 bucket specified to configure method
320
- * @param {string} key - key of the object
321
- * @param {PutObjectCommandInput["Body"]} object - File to be put in Amazon S3 bucket
322
- * @param {S3ProviderPutConfig} [config] - Optional configuration for the underlying S3 command
323
- * @return {Promise<S3ProviderPutOutput>} - promise resolves to an object with the new object's key on success
374
+ * @param key - key of the object
375
+ * @param object - File to be put in Amazon S3 bucket
376
+ * @param [config] - Optional configuration for the underlying S3 command
377
+ * @return an instance of AWSS3UploadTask or a promise that resolves to an object with the new object's key on
378
+ * success.
324
379
  */
325
380
  AWSS3Provider.prototype.put = function (key, object, config) {
326
- return __awaiter(this, void 0, void 0, function () {
327
- var credentialsOK, opt, bucket, track, progressCallback, contentType, contentDisposition, contentEncoding, cacheControl, expires, metadata, tagging, acl, serverSideEncryption, SSECustomerAlgorithm, SSECustomerKey, SSECustomerKeyMD5, SSEKMSKeyId, type, prefix, final_key, params, emitter, uploader, response, error_4;
328
- return __generator(this, function (_a) {
329
- switch (_a.label) {
330
- case 0: return [4 /*yield*/, this._ensureCredentials()];
331
- case 1:
332
- credentialsOK = _a.sent();
333
- if (!credentialsOK || !this._isWithCredentials(this._config)) {
334
- throw new Error(StorageErrorStrings.NO_CREDENTIALS);
335
- }
336
- opt = Object.assign({}, this._config, config);
337
- bucket = opt.bucket, track = opt.track, progressCallback = opt.progressCallback;
338
- contentType = opt.contentType, contentDisposition = opt.contentDisposition, contentEncoding = opt.contentEncoding, cacheControl = opt.cacheControl, expires = opt.expires, metadata = opt.metadata, tagging = opt.tagging, acl = opt.acl;
339
- serverSideEncryption = opt.serverSideEncryption, SSECustomerAlgorithm = opt.SSECustomerAlgorithm, SSECustomerKey = opt.SSECustomerKey, SSECustomerKeyMD5 = opt.SSECustomerKeyMD5, SSEKMSKeyId = opt.SSEKMSKeyId;
340
- type = contentType ? contentType : 'binary/octet-stream';
341
- prefix = this._prefix(opt);
342
- final_key = prefix + key;
343
- logger.debug('put ' + key + ' to ' + final_key);
344
- params = {
345
- Bucket: bucket,
346
- Key: final_key,
347
- Body: object,
348
- ContentType: type,
349
- };
350
- if (cacheControl) {
351
- params.CacheControl = cacheControl;
352
- }
353
- if (contentDisposition) {
354
- params.ContentDisposition = contentDisposition;
355
- }
356
- if (contentEncoding) {
357
- params.ContentEncoding = contentEncoding;
358
- }
359
- if (expires) {
360
- params.Expires = expires;
361
- }
362
- if (metadata) {
363
- params.Metadata = metadata;
364
- }
365
- if (tagging) {
366
- params.Tagging = tagging;
367
- }
368
- if (serverSideEncryption) {
369
- params.ServerSideEncryption = serverSideEncryption;
370
- }
371
- if (SSECustomerAlgorithm) {
372
- params.SSECustomerAlgorithm = SSECustomerAlgorithm;
373
- }
374
- if (SSECustomerKey) {
375
- params.SSECustomerKey = SSECustomerKey;
376
- }
377
- if (SSECustomerKeyMD5) {
378
- params.SSECustomerKeyMD5 = SSECustomerKeyMD5;
379
- }
380
- if (SSEKMSKeyId) {
381
- params.SSEKMSKeyId = SSEKMSKeyId;
382
- }
383
- emitter = new events.EventEmitter();
384
- uploader = new AWSS3ProviderManagedUpload(params, opt, emitter);
385
- if (acl) {
386
- params.ACL = acl;
387
- }
388
- _a.label = 2;
389
- case 2:
390
- _a.trys.push([2, 4, , 5]);
391
- if (progressCallback) {
392
- if (typeof progressCallback === 'function') {
393
- emitter.on(SEND_UPLOAD_PROGRESS_EVENT, function (progress) {
394
- progressCallback(progress);
395
- });
396
- }
397
- else {
398
- logger.warn('progressCallback should be a function, not a ' + typeof progressCallback);
399
- }
400
- }
401
- return [4 /*yield*/, uploader.upload()];
402
- case 3:
403
- response = _a.sent();
404
- logger.debug('upload result', response);
405
- dispatchStorageEvent(track, 'upload', { method: 'put', result: 'success' }, null, "Upload success for " + key);
406
- return [2 /*return*/, {
407
- key: key,
408
- }];
409
- case 4:
410
- error_4 = _a.sent();
411
- logger.warn('error uploading', error_4);
412
- dispatchStorageEvent(track, 'upload', { method: 'put', result: 'failed' }, null, "Error uploading " + key);
413
- throw error_4;
414
- case 5: return [2 /*return*/];
381
+ var opt = Object.assign({}, this._config, config);
382
+ var bucket = opt.bucket, track = opt.track, progressCallback = opt.progressCallback, level = opt.level, resumable = opt.resumable;
383
+ var contentType = opt.contentType, contentDisposition = opt.contentDisposition, contentEncoding = opt.contentEncoding, cacheControl = opt.cacheControl, expires = opt.expires, metadata = opt.metadata, tagging = opt.tagging, acl = opt.acl;
384
+ var serverSideEncryption = opt.serverSideEncryption, SSECustomerAlgorithm = opt.SSECustomerAlgorithm, SSECustomerKey = opt.SSECustomerKey, SSECustomerKeyMD5 = opt.SSECustomerKeyMD5, SSEKMSKeyId = opt.SSEKMSKeyId;
385
+ var type = contentType ? contentType : 'binary/octet-stream';
386
+ var params = {
387
+ Bucket: bucket,
388
+ Key: key,
389
+ Body: object,
390
+ ContentType: type,
391
+ };
392
+ if (cacheControl) {
393
+ params.CacheControl = cacheControl;
394
+ }
395
+ if (contentDisposition) {
396
+ params.ContentDisposition = contentDisposition;
397
+ }
398
+ if (contentEncoding) {
399
+ params.ContentEncoding = contentEncoding;
400
+ }
401
+ if (expires) {
402
+ params.Expires = expires;
403
+ }
404
+ if (metadata) {
405
+ params.Metadata = metadata;
406
+ }
407
+ if (tagging) {
408
+ params.Tagging = tagging;
409
+ }
410
+ if (serverSideEncryption) {
411
+ params.ServerSideEncryption = serverSideEncryption;
412
+ }
413
+ if (SSECustomerAlgorithm) {
414
+ params.SSECustomerAlgorithm = SSECustomerAlgorithm;
415
+ }
416
+ if (SSECustomerKey) {
417
+ params.SSECustomerKey = SSECustomerKey;
418
+ }
419
+ if (SSECustomerKeyMD5) {
420
+ params.SSECustomerKeyMD5 = SSECustomerKeyMD5;
421
+ }
422
+ if (SSEKMSKeyId) {
423
+ params.SSEKMSKeyId = SSEKMSKeyId;
424
+ }
425
+ var emitter = new events.EventEmitter();
426
+ var uploader = new AWSS3ProviderManagedUpload(params, opt, emitter);
427
+ if (acl) {
428
+ params.ACL = acl;
429
+ }
430
+ if (resumable === true) {
431
+ var s3Client = this._createNewS3Client(opt);
432
+ // we are using aws sdk middleware to inject the prefix to key, this way we don't have to call
433
+ // this._ensureCredentials() which allows us to make this function sync so we can return non-Promise like UploadTask
434
+ s3Client.middlewareStack.add(createPrefixMiddleware(opt, key), prefixMiddlewareOptions);
435
+ var addTaskInput = {
436
+ bucket: bucket,
437
+ key: key,
438
+ s3Client: s3Client,
439
+ file: object,
440
+ emitter: emitter,
441
+ accessLevel: level,
442
+ params: params,
443
+ };
444
+ // explicitly asserting the type here as Typescript could not infer that resumable is of type true
445
+ return this.startResumableUpload(addTaskInput, config);
446
+ }
447
+ try {
448
+ if (progressCallback) {
449
+ if (typeof progressCallback === 'function') {
450
+ emitter.on(SEND_UPLOAD_PROGRESS_EVENT, function (progress) {
451
+ progressCallback(progress);
452
+ });
453
+ }
454
+ else {
455
+ logger.warn('progressCallback should be a function, not a ' +
456
+ typeof progressCallback);
415
457
  }
458
+ }
459
+ return uploader.upload().then(function (response) {
460
+ logger.debug('upload result', response);
461
+ dispatchStorageEvent(track, 'upload', { method: 'put', result: 'success' }, null, "Upload success for " + key);
462
+ return { key: key };
416
463
  });
417
- });
464
+ }
465
+ catch (error) {
466
+ logger.warn('error uploading', error);
467
+ dispatchStorageEvent(track, 'upload', { method: 'put', result: 'failed' }, null, "Error uploading " + key);
468
+ throw error;
469
+ }
418
470
  };
419
471
  /**
420
472
  * Remove the object for specified key
@@ -424,7 +476,7 @@ var AWSS3Provider = /** @class */ (function () {
424
476
  */
425
477
  AWSS3Provider.prototype.remove = function (key, config) {
426
478
  return __awaiter(this, void 0, void 0, function () {
427
- var credentialsOK, opt, bucket, track, prefix, final_key, s3, params, deleteObjectCommand, response, error_5;
479
+ var credentialsOK, opt, bucket, track, prefix, final_key, s3, params, deleteObjectCommand, response, error_4;
428
480
  return __generator(this, function (_a) {
429
481
  switch (_a.label) {
430
482
  case 0: return [4 /*yield*/, this._ensureCredentials()];
@@ -453,9 +505,9 @@ var AWSS3Provider = /** @class */ (function () {
453
505
  dispatchStorageEvent(track, 'delete', { method: 'remove', result: 'success' }, null, "Deleted " + key + " successfully");
454
506
  return [2 /*return*/, response];
455
507
  case 4:
456
- error_5 = _a.sent();
457
- dispatchStorageEvent(track, 'delete', { method: 'remove', result: 'failed' }, null, "Deletion of " + key + " failed with " + error_5);
458
- throw error_5;
508
+ error_4 = _a.sent();
509
+ dispatchStorageEvent(track, 'delete', { method: 'remove', result: 'failed' }, null, "Deletion of " + key + " failed with " + error_4);
510
+ throw error_4;
459
511
  case 5: return [2 /*return*/];
460
512
  }
461
513
  });
@@ -470,7 +522,7 @@ var AWSS3Provider = /** @class */ (function () {
470
522
  */
471
523
  AWSS3Provider.prototype.list = function (path, config) {
472
524
  return __awaiter(this, void 0, void 0, function () {
473
- var credentialsOK, opt, bucket, track, maxKeys, prefix, final_path, s3, params, listObjectsCommand, response, list, error_6;
525
+ var credentialsOK, opt, bucket, track, maxKeys, prefix, final_path, s3, params, listObjectsCommand, response, list, error_5;
474
526
  return __generator(this, function (_a) {
475
527
  switch (_a.label) {
476
528
  case 0: return [4 /*yield*/, this._ensureCredentials()];
@@ -512,10 +564,10 @@ var AWSS3Provider = /** @class */ (function () {
512
564
  logger.debug('list', list);
513
565
  return [2 /*return*/, list];
514
566
  case 4:
515
- error_6 = _a.sent();
516
- logger.warn('list error', error_6);
517
- dispatchStorageEvent(track, 'list', { method: 'list', result: 'failed' }, null, "Listing items failed: " + error_6.message);
518
- throw error_6;
567
+ error_5 = _a.sent();
568
+ logger.warn('list error', error_5);
569
+ dispatchStorageEvent(track, 'list', { method: 'list', result: 'failed' }, null, "Listing items failed: " + error_5.message);
570
+ throw error_5;
519
571
  case 5: return [2 /*return*/];
520
572
  }
521
573
  });
@@ -523,7 +575,7 @@ var AWSS3Provider = /** @class */ (function () {
523
575
  };
524
576
  AWSS3Provider.prototype._ensureCredentials = function () {
525
577
  return __awaiter(this, void 0, void 0, function () {
526
- var credentials, cred, error_7;
578
+ var credentials, cred, error_6;
527
579
  return __generator(this, function (_a) {
528
580
  switch (_a.label) {
529
581
  case 0:
@@ -538,8 +590,8 @@ var AWSS3Provider = /** @class */ (function () {
538
590
  this._config.credentials = cred;
539
591
  return [2 /*return*/, true];
540
592
  case 2:
541
- error_7 = _a.sent();
542
- logger.warn('ensure credentials error', error_7);
593
+ error_6 = _a.sent();
594
+ logger.warn('ensure credentials error', error_6);
543
595
  return [2 /*return*/, false];
544
596
  case 3: return [2 /*return*/];
545
597
  }
@@ -553,8 +605,14 @@ var AWSS3Provider = /** @class */ (function () {
553
605
  var credentials = config.credentials, level = config.level;
554
606
  var customPrefix = config.customPrefix || {};
555
607
  var identityId = config.identityId || credentials.identityId;
556
- var privatePath = (customPrefix.private !== undefined ? customPrefix.private : 'private/') + identityId + '/';
557
- var protectedPath = (customPrefix.protected !== undefined ? customPrefix.protected : 'protected/') + identityId + '/';
608
+ var privatePath = (customPrefix.private !== undefined ? customPrefix.private : 'private/') +
609
+ identityId +
610
+ '/';
611
+ var protectedPath = (customPrefix.protected !== undefined
612
+ ? customPrefix.protected
613
+ : 'protected/') +
614
+ identityId +
615
+ '/';
558
616
  var publicPath = customPrefix.public !== undefined ? customPrefix.public : 'public/';
559
617
  switch (level) {
560
618
  case 'private':
@@ -569,18 +627,8 @@ var AWSS3Provider = /** @class */ (function () {
569
627
  * Creates an S3 client with new V3 aws sdk
570
628
  */
571
629
  AWSS3Provider.prototype._createNewS3Client = function (config, emitter) {
572
- var region = config.region, credentials = config.credentials, cancelTokenSource = config.cancelTokenSource, dangerouslyConnectToHttpEndpointForTesting = config.dangerouslyConnectToHttpEndpointForTesting;
573
- var localTestingConfig = {};
574
- if (dangerouslyConnectToHttpEndpointForTesting) {
575
- localTestingConfig = {
576
- endpoint: localTestingStorageEndpoint,
577
- tls: false,
578
- bucketEndpoint: false,
579
- forcePathStyle: true,
580
- };
581
- }
582
- var s3client = new S3Client(__assign(__assign({ region: region,
583
- credentials: credentials, customUserAgent: getAmplifyUserAgent() }, localTestingConfig), { requestHandler: new AxiosHttpHandler({}, emitter, cancelTokenSource) }));
630
+ var s3client = createS3Client(config, emitter);
631
+ s3client.middlewareStack.add(autoAdjustClockskewMiddleware(s3client.config), autoAdjustClockskewMiddlewareOptions);
584
632
  return s3client;
585
633
  };
586
634
  AWSS3Provider.CATEGORY = 'Storage';